mysqli_stmt :: bind_param () - укажите другой тип данных, кроме «s» для каждого параметра - PullRequest
0 голосов
/ 02 июля 2018

A 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" для каждого параметра?

РЕДАКТИРОВАТЬ: я только что нашел этот раздел SO , который показывает, как использовать тип "b" и mysqli_stmt::send_long_data, когда двоичный пакет будет превышать max_allowed_packet настройка. Я также читал, что это улучшит производительность по сравнению с решениями, которые используют bin2hex(), чтобы превратить отправку байтовой строки в текст.

1 Ответ

0 голосов
/ 02 июля 2018

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

SELECT
...
LIMIT ?, ?

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

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

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

...