Как вы используете предложения IN с подготовленными операторами mysqli [дубликат]
Вопрос
На этот вопрос уже есть ответ здесь:
Я переношу старый код в новый интерфейс msqli, используя подготовленные операторы. У меня возникают проблемы с операторами SQL, содержащими предложение IN.Обычно я бы сделал это:
$ids = '123,535,345,567,878'
$sql = "SELECT * FROM table WHERE id IN ($ids)";
$res = mysql_query($sql);
Преобразовав это в mysqli и подготовленные операторы, я попробовал несколько решений:
$ids = '123,535,345,567,878'
$ids = implode($ids,',');
$result = $msqli->prepare("SELECT foo,blar FROM table WHERE id IN (?));
$result->bind_param("i", $ids);
$result->execute();
Вышеупомянутое не удается, и вычисление количества элементов в массиве, изменение количества вопросительных знаков в строке SQL и вызов bind_parm для каждого элемента в массиве также завершаются неудачей.Просто использовать строку, разделенную запятыми, также не получится.
Я не могу найти в Google хорошей документации по этому вопросу, так как же вы решили проблему?
Решение
Посмотрите ответ на аналогичный вопрос, который задавался здесь ранее (второй пример кода):
У меня есть массив целых чисел, как мне использовать каждое из них в запросе MySQL (в php)?
Это сводится к:
- создайте строку SQL с нужным количеством вопросительных знаков
- использовать
call_user_func_array()
чтобы связать ваш массив со строкой запроса
Другие советы
Невозможно связать список переменной длины с одной связанной переменной.
Аналогично, если бы вы привязали строку $ids
на самом деле вы получите:
SELECT foo,blar FROM table WHERE id IN ('123,535,345,567,878')
(Обратите внимание на кавычки вокруг списка идентификаторов).
Создание собственного запроса с нужным количеством вопросительных знаков и связанных параметров должно было действительно сработать — возможно, вам придется попробовать еще раз и сообщить о фактической ошибке.
С другой стороны, это может быть один из тех случаев, когда, к сожалению, необходимо вручную создать собственный SQL и не использовать связанные параметры.
Я думал, что смысл подготовленных заявлений заключается в том, что в этой ситуации вы можете просто сделать:
$stmt = $this->mysqli->prepare("UPDATE radcheck SET attribute = ?, value = ? WHERE username = ? AND attribute LIKE 'CS-Total-Octets%'");
foreach ($usernames as $username)
{
$stmt->bind_param('sss', $bandwidth_types[$bandwidth_type], $bandwidth_bytes, $username);
$stmt->execute();
}
$stmt->close();