Сейчас мне нужно использовать следующую структуру, чтобы справиться с привязкой нескольких параметров в запросе MySQL:
if ($words_total == 1)
{
$statement -> bind_param("s", $words[0]);
}
else if ($words_total == 2)
{
$statement -> bind_param("ss", $words[0], $words[1]);
}
else if ($words_total == 3)
{
$statement -> bind_param("sss", $words[0], $words[1], $words[2]);
}
//and so on....
Я определяю количество вопросительных знаков, используя приведенный ниже код, и вставляю его в свой запрос:
$marks = "";
for($i = 1; $i<=$words_total; $i++) {
if ($i == $words_total)
{
$marks .= "?";
}
else
{
$marks .= "?,";
}
}
Мой вопрос, конечно, должен быть способ обработки столько входов в запрос, сколько мне нужно динамически. Жесткое кодирование bind_param () кажется очень плохим способом обработки этого.
Я использую PHP версии 5.4.10
Здесь идет решение или актуальная проблема привязки переменного числа значений к подготовленному выражению mysqli:
<?php
$values = array('b','c','d');
$in = str_repeat("?,", count($values));
$in = trim($in, ",");
$sql = "SELECT * from users where username in($in)";
$stm = $con->prepare($sql);
$types = str_repeat("s", count($values));
if (strnatcmp(phpversion(),'5.3') >= 0)
{
$bind = array();
foreach($values as $key => $val)
{
$bind[$key] = &$values[$key];
}
} else {
$bind = $values;
}
array_unshift($bind, $types);
call_user_func_array(array($stm, 'bind_param'), $bind);
#var_dump($sql, $types, $bind, $con->error);
$stm->execute();
$res = $stm->get_result();
while($row = $res->fetch_assoc()) var_dump($row);
Комментируемая строка предназначена только для тестирования разработки. Очень полезно.
Но вашей первоначальной проблемой было отсутствие сообщений об ошибках.
Это испортило вас не только в этом конкретном случае, но и весь ваш опыт работы с PHP.
Каждый раз, когда что-то идет не так, PHP сообщит вам — что случилось и кого винить. Только если ты позволишь это. И ты всегда должен.
Вы можете прочитать это ответ об основах сообщения об ошибках
Имея сообщение об ошибке, вы можете просто найти его в Google и найти решение за считанные секунды. Или, по крайней мере, вы будете знать, какая у вас проблема. Что на самом деле поведение call_user_func_array()
функция, которая была внезапно изменена.
Других решений пока нет …