Я переношу старый код на новый интерфейс 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)?
Это сводится к:
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();