MySQLi_STMT обертки, позволяет заполнителей


Я сделал простой враппер для MySQLi_STMT, позволяя использовать заполнители и избавляет вас от необходимости вручную связывать переменные. Весь код находится в нижней части этот вопрос (он довольно большой, с комментариями). Пожалуйста, дайте мне обратную связь, критика, все что угодно (читаемость и дизайн API для начала).

Использование:

$mysqli = new MySQLi('localhost', 'user', 'pwd', 'testdb');
$statement = new Carrot\Database\MySQLi\StatementWrapper($mysqli,
   'SELECT
       id, name, balance
    FROM
       accounts
    WHERE
       name LIKE #name_like,
       balance > #balance_lower_limit'
);

$statement->execute(array('#name_like' => 'John%', '#balance_lower_limit' => 50000));

while ($row = $statement->fetchObject())
{
    echo $row->id, $row->name, $row->balance;
}

Я завернула большое MySQLi_STMT методы/свойства (как set_attr и get_attr) так что код может быть слишком длинным (около 900 строк), является ли это проблемой?

Код на Pastebin: http://pastebin.com/gikrWxFR - накладка: http://www.pastie.org/1965280 - или вот: пару блоков комментариев удалены, чтобы соответствовать:

namespace Carrot\Database\MySQLi;

class StatementWrapper
{
    /**
     * @var string Statement string with placeholders, injected during construction.
     */
    protected $statement_string_with_placeholders;

    /**
     * @var string Processed statement string, used in constructing the MySQLi_STMT object, placeholders replaced with '?'.
     */
    protected $statement_string;

    /**
     * @var MySQLi_STMT Instance of MySQLi_STMT, constructed using {@see $statement_string}.
     */
    protected $statement_object;

    /**
     * @var array List of placeholders with the hash (#) prefix, extracted from {@see $statement_string_with_placeholders}.
     */
    protected $placeholders;

    /**
     * @var array List of placeholders with 'blob' data type, set by the user - see {@see }.
     */
    protected $blob_params = array();

    /**
     * @var mixed Contains the result of MySQLi_STMT::result_metadata() call.
     */
    protected $result_metadata;

    /**
     * @var array Parameters used to execute the query.
     */
    protected $params;

    /**
     * @var string Parameter types in string, as per MySQLi_STMT::bind_param() specification.
     */
    protected $param_types;

    /**
     * @var array Result row, filled with new values every time a new row is fetched.
     */
    protected $result_row;

    /**
     * @var array Contains references to the {@see $params} property, used for binding in bind_param().
     */
    protected $references_params;

    /**
     * @var array Contains references to the {@see $result_row} property, used for binding in bind_result().
     */
    protected $references_result_row;

    /**
     * @var bool If set to true, any subsequent execution that fails/returns false will trigger an exception.
     */
    protected $throw_exception_when_execution_fails = false;

    /**
     * @var bool True if result set has been buffered using MySQLi_STMT::store_result(), false otherwise.
     */
    protected $result_is_buffered = false;

    public function __construct(\MySQLi $mysqli, $statement_string_with_placeholders)
    {
        $this->statement_string_with_placeholders = $statement_string_with_placeholders;
        $this->placeholders = $this->extractPlaceholders($statement_string_with_placeholders);
        $this->statement_string = $this->replacePlaceholdersWithQuestionMarks($statement_string_with_placeholders);
        $this->statement_object = $mysqli->prepare($this->statement_string);

        if (empty($this->statement_object) or !is_a($this->statement_object, '\MySQLi_STMT'))
        {
            throw new \RuntimeException("StatementWrapper error, fails to prepare the statement. Error number: '{$mysqli->errno}', Error message: '{$mysqli->error}', Processed statement: '{$this->statement_string}', Original statement: '{$this->statement_string_with_placeholders}'.");
        }

        $this->result_metadata = $this->statement_object->result_metadata();
        $this->createParameterVariablesAndReferences();
        $this->createResultVariablesAndReferences();
        $this->bindResult();
    }

    /**
     * Executes the statement.
     *
     * Pass the parameters as associative array. Previously used
     * parameters will be used if you don't pass parameter array.
     * You don't need to pass anything if your statement doesn't
     * need parameters. 
     *
     * <code>
     * $statement = new StatementWrapper($mysqli, 'INSERT INTO accounts (id, first_name) VALUES (#id, #first_name));
     * $statement->execute(array('#id' => 'AB12345', '#first_name' => 'John'));
     * 
 * 
 * Не выдает RuntimeException, если выполнение завершается неудачей и
 * throw_exception_when_execution_fails $ - это правда.
 * 
 * @бросает к RuntimeException
 * @см. $throw_exception_when_execution_fails
 * @парам массиве $params необязательно. Параметры, используемые для исполнения, если оставить пустым будет использовать ранее установленные параметры.
 * @return возвращает логическое значение true, если инструкция выполнена успешно, false в противном случае.
*
*/
 общественные функции execute(массиве $params = массив())
{
 если (!пустой (для вывода$params))
{
$этом->setAndBindParameters (для вывода$params);
}

 $результат = $этом->statement_object->выполнить();

 если (!$результат && $этом->throw_exception_when_execution_fails)
{
 бросить новый к RuntimeException \("StatementWrapper ошибка выполнения! Ошибка #{$этом->statement_object->errno значение}: '{$этом->statement_object->ошибка}', утверждение '{$этом->statement_string}'.");
}

 // После каждого выполнения, вам нужно позвонить MySQLi_STMT::store_result() снова.
 $этом->result_is_buffered = ложь;

 вернуть $результат;
}

/**
 * Извлекает результате перечисленных массива, используя MySQLi_STMT::fetch () можно.
 * 
 * Вызовы этого метода игнорируется, если в заявлении нет 
 * результат. Использовать в цикле while() для итерации результирующий набор:
*
 * 
     * while ($row = $statement->fetchArray())
     * {
     *     echo "ID: {$row[0]}, Name: {$row[1]}";
     * }
     * 
*
 * @возвращение смешанной строку результата как перечислимый массив. False, если строк больше нет или отказа в получении.
*
*/
 fetchArray общественные функции()
{
 если (is_object($этом->result_metadata) && is_a($этом->result_metadata, '\MySQLi_Result'))
{
 $результат = $этом->statement_object->получить();

 если ($результат === верно)
{
 $строка = массив();

 по каждому элементу ($этом->result_row как $содержание)
{
 $строки[] = $содержание;
}

 возвращение $строки;
}

 возвращает false;
}
}

/**
 * Получает результат в виде ассоциативного массива с помощью MySQLi_STMT::fetch () можно.
 * 
 * Вызовы этого метода игнорируется, если в заявлении нет 
 * результат. Использовать в цикле while() для итерации результирующий набор:
*
 * 
     * while ($row = $statement->fetchAssociativeArray())
     * {
     *     echo "ID: {$row['id']}, Name: {$row['name']}";
     * }
     * 
*
 * @возвращение смешанной строку результата как ассоциативный массив. False, если строк больше нет или отказа в получении.
*
*/
 fetchAssociativeArray общественные функции()
{
 если (is_object($этом->result_metadata) && is_a($этом->result_metadata, '\MySQLi_Result'))
{
 $результат = $этом->statement_object->получить();

 если ($результат === верно)
{
 $строка = массив();

 по каждому элементу ($этом->result_row как $имя_поля => $содержание)
{
 $строки[$имя_поля] = $содержание;
}

 возвращение $строки;
}

 возвращает false;
}
}

/**
 * Получает результат в виде стандартного объекта PHP с использованием MySQLi_STMT::fetch () можно.
 * 
 * Вызовы этого метода игнорируется, если в заявлении нет 
 * результат. Использовать в цикле while() для итерации результирующий набор:
*
 * 
     * while ($row = $statement->fetchObject())
     * {
     *     echo "ID: {$row->id}, Name: {$row->name}";
     * }
     * 
*
 * @возвращение смешанной строку результата как стандартный объект PHP. False, если строк больше нет или отказа в получении.
*
*/
 fetchObject общественные функции()
{
 если (is_object($этом->result_metadata) && is_a($этом->result_metadata, '\MySQLi_Result'))
{
 $результат = $этом->statement_object->получить();

 если ($результат === верно)
{
 $строка = массив();

 по каждому элементу ($этом->result_row как $имя_поля => $содержание)
{
 $строки[$имя_поля] = $содержание;
}

 возвращение (объект) $строки;
}

 возвращает false;
}
}

/**
 * Марка заполнителя параметр как 'клякса' тип.
*
 * Для каждого выполнения инструкции, параметры автоматически
 * назначается соответствующий тип при определении переменной параметра тип
 * используя is_integer(), is_float(), и is_string(). Тип параметра 
 * по умолчанию в строку. Если вам нужно отправить параметр типа BLOB-объектов
 * используйте этот метод, чтобы пометить заполнитель как таковой.
*
 * 
     * $statement->markParamAsBlob('#blob_param');
     * 
*
 * @см. $blob_params
 * @парам строку $заполнитель заполнитель вы хотите пометить как клякса, с хэш (#).
*
*/
 markParamAsBlob государственной функции($заполнитель)
{
 если (!использования isset($этом->заполнители[$заполнитель]))
{
 бросить новый к RuntimeException \("ошибка StatementWrapper в маркировке параметр, как клякса. Заполнитель '{$заполнителя}' не определен.");
}

 $этом->blob_params[] = $заполнителя;
}

/**
 * Говорит классу бросать/не бросать исключения, когда выполнение оператора завершается.
*
 * Поведение по умолчанию, чтобы не бросать исключение, когда запрос не выполняется
 * и просто возвращать false. Это делает его легче для одного заявления,
 * однако, если вам нужно, чтобы обработать транзакцию, вы можете сказать это
 * класс бросать исключение, если выполнение завершается неудачей (по любой причине).
*
 * 
     * $statement->throwExceptionWhenExecutionFails(true);
     * 
*
 * @param параметр типа bool $боол передать истинный бросать исключения, и false в противном случае.
*
*/
 throwExceptionWhenExecutionFails государственной функции($боол)
{
 $этом->throw_exception_when_execution_fails = $боол;
}

/**
 * Смотрите, если результирующий набор буферизацию или нет.
*
 * Результирующий набор буферизируется, если MySQLi_STMT::store_result() является
 * вызывается после каждого выполнения оператора. Фантик ноты этот
 * при установке $result_is_buffered свойству значение true каждый раз
 * MySQLi_STMT::store_result() называется.
*
 * Фантик не буфера результат по умолчанию, после
 * Стандартный MySQLi_STMT поведения.
*
 * Если результирующий набор не буферизованная, MySQLi_STMT->число_строк() будет
 * не возвращает правильный ответ.
*
 * @возвращает логическое значение true, если буфер, false в противном случае.
*
*/
 общественные функции resultIsBuffered()
{
 вернуть $это->result_is_buffered;
}

/**
 * Возвращает метаданные результата.
*
 * Этот метод не обернуть/колл MySQLi_STMT::result_metadata(),
 * он просто возвращает сохраненное значение с MySQLi_STMT::result_metadata()
 * уже позвонила в строительстве.
*
 * @возвращение смешанной экземпляр MySQLi_Result или false, если нет результата.
*
*/
 общественные getResultMetadata функция()
{
 вернуть $это->result_metadata;
}

/**
 * Уничтожает этот объект.
*
 * Звонки MySQLi_STMT::close() для безопасности.
*
*/
 общественная функция __самоуничтожения()
{
 $этом->result_is_buffered = ложь;
$этом->statement_object->закрыть();
}

 // ---------------------------------------------------------------

/**
 * Обертка для MySQLi_STMT->affected_rows.
 * 
 * @возвращение смешанной -1 свидетельствует об ошибке запроса.
*
*/
 getAffectedRows общественные функции()
{
 вернуть $это->statement_object->affected_rows;
}

/**
 * Обертка для MySQLi_STMT::attr_get().
 * 
 * @парам инт $attr объекта атрибута, который вы хотите получить.
 * @возвращение смешанной false, если атрибут не найден, в противном случае возвращает значение атрибута.
*
*/
 общественной функцией getattr($attr, который)
{
 вернуть $это->statement_object->attr_get($attr, который);
}

/**
 * Обертка для MySQLi_STMT::attr_set().
*
 * @парам инт $attr объекта атрибута, который вы хотите установить.
 * режим @целочисленный параметр $присваиваемое значение атрибута.
*
*/
 setAttr государственной функции($attr, который, $режим)
{
 $этом->statement_object->attr_set($attr, который, $режим);
}

/**
 * Обертка для MySQLi_STMT::data_seek().
*
 * @парам инт $офсетной
*
*/
 dataSeek государственной функции($смещение)
{
$этом->statement_object->data_seek($смещение);
}

/**
 * Обертка для MySQLi_STMT->errno значение.
*
 * @return: число ошибок за последние выполнения.
*
*/
 общественные getErrorNo функция()
{
 вернуть $это->statement_object->errno значение;
}

/**
 * Обертка для MySQLi_STMT->ошибка.
 * 
 * @возвращает строку сообщения об ошибке для последнего выполнения.
*
*/
 getErrorMessage общественные функции()
{
 вернуть $это->statement_object->ошибка;
}

/**
 * Обертка для MySQLi_STMT->field_count.
*
 * @return: число полей в данной инструкции.
*
*/
 getFieldCount общественные функции()
{
 вернуть $это->statement_object->field_count;
}

/**
 * Обертка для MySQLi_STMT::free_result().
*
 * Этот метод также отмечает, что буфер результата была одобрена
 * установка $result_is_buffered свойство в false.
*
 * При запуске подготовленный оператор, который возвращает результирующий набор, это
 * блокирует подключение, если вы free_result() или store_result().
*
*/
 freeResult общественные функции()
{
$этом->statement_object->free_result();
 $этом->result_is_buffered = ложь;
}

/**
 * Обертка для MySQLi_STMT::get_warnings().
*
 * @возвращение смешанной
*
*/
 getWarnings общественные функции()
{
 вернуть $это->statement_object->get_warnings();
}

/**
 * Обертка для MySQLi_STMT->insert_id.
*
 * @возвращает int ID, генерируемый из предыдущей вставки.
*
*/
 getInsertID общественные функции()
{
 вернуть $это->statement_object->insert_id;
}

/**
 * Обертка для MySQLi_STMT->число_строк.
*
 * Этот метод не возвращает неверный подсчет строк, она возвращает значение false
 * если результирующий набор не буферизуется.
 * 
 * @возвращения смешанное число строк, если результат буферизируется, false, если результирующий набор не буферизуется.
*
*/
 getNumRows общественные функции()
{
 Если ($этом->result_is_buffered)
{
 вернуть $это->statement_object->число_строк;
}

 возвращает false;
}

/**
 * Обертка для MySQLi_STMT->param_count.
*
 * @возвращает int $param_count количество параметров в отчете.
*
*/
 getParamCount общественные функции()
{
 вернуть $это->statement_object->param_count;
}

/**
 * Обертка для MySQLi_STMT::сбросить().
*
 * MySQLi_STMT::сброс параметров не отвяжется. После сброса, вы
 * можно смело повторно выполнить его, даже если в запросе есть параметры.
*
 * @возвращает bool значение true в случае успешного завершения, false в случае неудачи.
*
*/
 общественная функция Reset()
{
 вернуть $это->statement_object->сброс();
}

/**
 * Обертка для MySQLi_STMT->код sqlstate.
*
 * @возвращает строку ошибки кодом sqlstate от предыдущей операции заявление.
*
*/
 getSQLState общественные функции()
{
 вернуть $это->statement_object->код sqlstate;
}

/**
 * Обертка для MySQLi_STMT::store_result().
*
 * Этот метод также устанавливает $result_is_buffered свойство в true,
 * что вы getNumRows() метод, чтобы возвратить допустимое значение. Это
 * метод должен быть вызван *после* выполнения.
*
 * @возвращает bool значение true в случае успешного завершения, false в случае неудачи.
*
*/
 storeResult общественные функции()
{
 $этом->result_is_buffered = $этом->statement_object->store_result();
 вернуть $это->result_is_buffered;
}

 // ---------------------------------------------------------------

/**
 * Экстракты заполнитель имена из оригинальной постановки строку.
*
 * Заполнителя определяется с помощью этого регулярного выражения:
*
 * 
     * #[a-zA-Z0-9_#]+
     * 
*
 * Поскольку хэш-символ (#) используется в MySQL для пометки комментариев,
 * скорее всего, вы не будете использовать его в запросе других, чем для
 * маркировка заполнителей. Список примеров заполнитель, который будет
 * матч:
*
 * 
     * #placeholder
     * #123placeholder
     * #_place_holder
     * ##placeholder
     * #place#holder
     * 
*
 * statement_string_with_placeholders @строковый параметр $
 * @возвращает массив массив, содержащий имена заполнитель.
*
*/
 защищен extractPlaceholders функция($statement_string_with_placeholders)
{
 preg_match_all('/#[а-Яа-З0-9_#]+/', $statement_string_with_placeholders, $играм);

 если (использования isset($соответствует[0]) && is_array($соответствует[0]))
{
 возврат $соответствует[0];
}

 возвращает массив();
}

/**
 * Замещающий текст (строки#) с '?'.
*
 * Этот эффект создает строке инструкции, что мы можем использовать его
 * для создания объекта заявление в mysqli. Он заменяет это
 * шаблон:
*
 * 
     * #[a-zA-Z0-9_#]+
     * 
*
 * вопросительный знак ('?'). Возвращает пустой массив, если никакие заполнитель
 * не найдено.
*
 * statement_string_with_placeholders @строковый параметр $
 * @возвращает строку строка инструкции безопасно для использования в качестве аргумента экземпляр MySQLi_STMT.
*
*/
 защищен replacePlaceholdersWithQuestionMarks функция($statement_string_with_placeholders)
{
 вернуть код preg_replace('/#[а-Яа-З0-9_#]+/', '?', $statement_string_with_placeholders);
}

/**
 * Создает массив параметров для параметров магазина и набор ссылок, которая ссылается на него.
 * 
 * Мы создаем массив параметров к параметрам магазин, установленный пользователем,
 * и мы создаем массив, который ссылается на эти параметры
 * используемые в качестве аргументов, когда мы использовать call_user_func() для вызова
 * MySQLi_STMT::bind_param().
 * 
 * @см. Для вывода $params
 * @см. $references_params
 * @см. Метод __Construct()
 * 
*/
 защищен createParameterVariablesAndReferences функция()
{
 $placeholder_count = сумма($этом->заполнители);

 Если ($этом->statement_object->param_count != $placeholder_count)
{
 бросить новый к RuntimeException \("ошибка StatementWrapper, не удается подготовить заявление. Параметр count ({$этом->statement_object->param_count}) и заполнитель граф ({$placeholder_count}) не совпадают.");
}

 $этом->references_params['тип'] = &$этом->param_types;

 по каждому элементу ($этом->заполнители, как $заполнитель)
{
 $этом->параметр params[$заполнитель] = значение null;
 $этом->references_params[$заполнитель] = &$этом->параметр params[$заполнитель];
}
}

/**
 * Создает массив для хранения обработанному ряду результата и набор ссылок, которая ссылается на него.
*
 * Мы создаем результат переменных строку как массив, чтобы хранить каждое значение
 * каждый раз, когда мы извлекаем с помощью MySQLi_STMT::fetch () можно. Мы создаем
 * ссылки на эти строки результата переменные должны быть переданы, когда мы
 * использовать call_user_func() для вызова MySQLi_STMT::bind_result().
*
 * @см. $result_row
 * @см. $references_result_row
 * @см. Метод __Construct()
*
*/
 защищен createResultVariablesAndReferences функция()
{
 если (is_object($этом->result_metadata) && is_a($этом->result_metadata, '\MySQLi_Result'))
{
 по каждому элементу ($этом->result_metadata->fetch_fields() как $поле)
{
 $этом->result_row[$поле->имя] = значение null;
 $этом->references_result_row[$поле->Имя] = &$этом->result_row[$поле->Имя];
}
}
}

/**
 * Персонализация результатов поиска ссылок через MySQLi_STMT::bind_result().
 * 
 * Нужно только один раз привязать результат, следовательно этот метод называется
 * только в конструкторе.
*
 * @см. $result_row
 * @см. $references_result_row
 * @см. Метод __Construct()
*
*/
 защищен bindResult функция()
{
 если (is_object($этом->result_metadata) && is_a($этом->result_metadata, '\MySQLi_Result'))
{
 call_user_func_array(массив($этом->statement_object, 'bind_result'), $этом->references_result_row);
}
}

/**
 * Устанавливает и привязывает параметры для следующего выполнения.
*
 * Будет выдает RuntimeException, если параметр count массиве нет
 * соответствие параметров/количество заполнителя.
*
 * Не выдает RuntimeException, если индекс параметра не содержит
 * все заполнители, как ее индексов.
 * 
 * @бросает к RuntimeException
 * @см. В разделе execute()
 * массив @параметр $params и полный набор параметров, проиндексированных с местозаполнителями.
*
*/
 защищен setAndBindParameters функции(массиве $params)
{
 // Игнорирование вызова метода, если у нас пока нет параметры для обработки
 Если ($этом->statement_object->param_count <= 0)
{
возврат;
}

 $user_param_count = счет (для вывода$params);
 $param_type_string = ";

 Если ($этом->statement_object->param_count != $user_param_count)
{
 бросить новый к RuntimeException \("ошибка StatementWrapper при настройке и параметры связывания. Количество аргументов ({$user_param_count}) не совпадает нужно считать параметр ({$этом->statement_object->param_count}).");
}

 по каждому элементу ($этом->параметры как $заполнитель => $param) - в
{
 если (!использования isset (для вывода$params[$заполнитель]))
{
 бросить новый к RuntimeException \("ошибка StatementWrapper при настройке и параметры связывания. Обязательный параметр '{$заполнителя}' не определяется при попытке установить параметр.");
}

 $этом->параметр params[$заполнитель] = для вывода $params[$заполнитель];
}

$этом->createParamTypeString();
$этом->bindParam();
}

/**
 * Заполняет типы строковый параметр в $references_param собственность.
 * 
 * MySQLi_STMT::bind_param() требует от нас, чтобы указать типы параметров 
 * при привязке. Допустимые типы параметра (по 5.3.6):
*
 * 
     * i - integer
     * d - double
     * s - string
     * b - blob (will be sent in packets)
     * 
*
 * Этот метод определяет, если параметр-целое число или с плавающей точкой (двойной)
 * и по умолчанию строку. Чтобы пометить параметр как Blob, класс использования 
 * способ markParamAsBlob().
*
 * @см. $references_params
 * @см. setAndBindParameters()
 * @см. markParamAsBlob()
*
*/
 защищен createParamTypeString функция()
{
 $этом->references_params['тип'] = ";

 по каждому элементу ($этом->параметры как $заполнитель => $param) - в
{
 если (in_array($заполнителя, $этом->blob_params))
{
 $этом->references_params['тип'] .= "б";
}
 остальное, если (is_integer($param) - в)
{
 $этом->references_params['тип'] .= "я";
}
 остальное, если (is_float($param) - в)
{
 $этом->references_params['тип'] .= 'д';
}
еще
{
 $этом->references_params['тип'] .= 'ы';
}
}
}

/**
 * Связывает параметр-массив ссылок, используя MySQLi_STMT::bind_param().
*
 * Этот метод вызывается каждый раз, когда пользователь предоставляет новые аргументы.
 * Предполагается, что типы строковый параметр уже создан.
*
 * @см. $references_params
 * @см. createParameterVariablesAndReferences()
*
*/
 защищенные функции bindParam()
{
 call_user_func_array(массив($этом->statement_object, 'bind_param'), $этом->references_params);
}
}


543
2
задан 24 мая 2011 в 09:05 Источник Поделиться
Комментарии
1 ответ

Перед чтением собственно реализации:

То, что вы делаете это ПДО-как заполнитель синтаксис с # Вместо : и без необходимости привязки параметров напрямую, а передавать только в массиве.

Я вижу "потребность" что-то вроде этого в качестве обязательных параметров с ПДО не совсем то, что рамки, кажется, хотят, чтобы их пользователи. ЗФ ЭЗС/пытается определить коды, СФ и так далее на имя образцы.

В $заявлению, он сам может выполнить и затем $строки = $Заявление->выборка.

Это кажется мне немного странным, так как большинство вещей, которые позволяют за выполнение и ожидать подготовитьации, когда дело доходит до запросов, но это просто способ именования.

Заявление-это просто один класс выступает в качестве выполнения запроса и провайдер результата. Это может быть разделена на две.

Реализация:

метод __Construct

Вы делаете очень большую работу в конструкторе. Из проверочного пункта, что может стать проблемой, хотя бы Мишко не согласен с выполнением работы в конструкторе.


mysqli_prepare() возвращает объект заявление или false, если произошла ошибка.

Проверьте, не пуст и is_a. См. также: оператор instanceof вместо is_a для этого дела.


выполнение

если(!пустой (для вывода$params)) для массива равен если($params)будет

и мне не нравится ", как сделать переключатель обработка ошибки", если это базовый класс фреймворка. Он должен работать только в одну сторону.. думаю. Я вижу смысл давать пользователю выбор, но тогда вы должны по крайней мере использовать коды возврата, если вы не исключения.

принести*

Выборка функции выглядит как дублировать код

mysqli_stmt::значение attr_*

Каков ваш usecase для этих функций? Эти действительно нужны?


Кроме того, код, кажется, вроде нормально.. учитывая, как плохо mysqli_stmt->персонализация* функции с опорой на ссылки.

Я не смотрел глубоко в #фу парам заменить логике, но я не уверен, Если $этом->statement_object->param_count != $placeholder_count это правильный способ обработки ошибок нет. Я не могу использовать дважды один и тот же прототип? Чтобы я должен использовать их все? Если так, почему он не убедится... и так далее.

Надеется, что хоть немного помогла

2
ответ дан 24 мая 2011 в 01:05 Источник Поделиться