У 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()
чтобы включить отправку байтовой строки в виде текста.
Единственный раз, когда я нашел важным использовать целочисленный параметр, - это предложение LIMIT
.
SELECT
...
LIMIT ?, ?
MySQL не принимает цитированные строковые литералы в этом контексте и не принимает параметры со строковым типом. Вы должны использовать целое число.
См. Параметрированный запрос PDO и предложение LIMIT - не работает для моих тестов. Это был вопрос о PDO, и я не тестировал mysqli, но я считаю, что требование MySQL на стороне сервера для использования целочисленных параметров в этом случае. Поэтому он также должен применяться к mysqli.
Во всех остальных случаях (AFAIK) MySQL может преобразовывать строки в целые числа, читая ведущие цифры в строке и игнорируя любые следующие символы.
call_user_func_array([$rStmt, 'bind_param'], $aCall);
(Массив $ aCall - это обходной путь для ошибки PHP # 44139.) Тогда предложение LIMIT
принимает строки как тип.
s
строки, если вы не кант в некоторыхb
двоичных на нулевую ссылке.