mysqli_stmt :: bind_param () - укажите другой тип данных, кроме «s» для каждого параметра

0

У mysqli_stmt нет функции query_params(), я должен был написать свой собственный. Параметр arry связан с оператором bind_param(). Мне нужно указать типы переменных динамически. Я мог бы сделать это с чем-то вроде:

$sType = '';
foreach ($aParameters as $iIndex => $mParameter) {
  if     (is_string($mParameter)) {$sType .= 's';}
  elseif (   is_int($mParameter)) {$sType .= 'i';}
  elseif ( is_float($mParameter)) {$sType .= 'd';}
  elseif (  is_null($mParameter)) {$sType .= 's';}
  elseif (  is_bool($mParameter)) {
    $sType .= 'i';
    $aParameters[$iIndex] = boolval($mParameter);}
  else {
    // trow new Exception(...);
  }
}

Но, как выясняется, mysql/mariadb будет посылать логические значения, целые числа и плавающие строки как строки, где сервер базы данных с радостью передает их соответствующему типу данных столбца. Похоже, я мог просто пропустить этот шаг и отправить по умолчанию каждый параметр в виде строки.

Существуют ли какие-либо модификации для указания другого типа данных, чем "s" для каждого параметра?

EDIT: Я только что нашел эту тему SO, которая показывает, как использовать тип "b" и mysqli_stmt::send_long_data когда бинарный пакет превысит параметр max_allowed_packet. Я также прочитал, что это улучшит производительность над решениями, которые используют bin2hex() чтобы включить отправку байтовой строки в виде текста.

  • 2
    Абсолютно без причины, если вы делаете это таким образом. Причина в том, что вы всегда хотели, чтобы определенный параметр был связан как целое число или число с плавающей точкой. В MySQL бессмысленно определять тип связываемого объекта на основе типа данных переменной, которую вы связываете.
  • 0
    Рассматривать их всех , как s строки, если вы не кант в некоторых b двоичных на нулевую ссылке.
Показать ещё 1 комментарий
Теги:
mysqli
bindparam

1 ответ

1

Единственный раз, когда я нашел важным использовать целочисленный параметр, - это предложение LIMIT.

SELECT
...
LIMIT ?, ?

MySQL не принимает цитированные строковые литералы в этом контексте и не принимает параметры со строковым типом. Вы должны использовать целое число.

См. Параметрированный запрос PDO и предложение LIMIT - не работает для моих тестов. Это был вопрос о PDO, и я не тестировал mysqli, но я считаю, что требование MySQL на стороне сервера для использования целочисленных параметров в этом случае. Поэтому он также должен применяться к mysqli.

Во всех остальных случаях (AFAIK) MySQL может преобразовывать строки в целые числа, читая ведущие цифры в строке и игнорируя любые следующие символы.

  • 0
    Спасибо, что покопались в моем вопросе. Я протестировал предложение LIMIT, но не могу воспроизвести его с помощью PHP 7.0, клиент MySQLi подключен к MariaDB 10.0. Когда я выпускаю call_user_func_array([$rStmt, 'bind_param'], $aCall); (Массив $ aCall - это обходной путь для ошибки PHP # 44139.) Тогда предложение LIMIT принимает строки как тип.
  • 0
    Хорошо, возможно, это просто проблема при использовании PDO с эмулированной подготовкой, как я написал в другом ответе, с которым я связан.
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню