Ответ 1
Здесь идет решение или фактическая проблема привязки переменной количества значений к подготовленному оператору 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()
, которая была внезапно изменена.