Как вы используете предложения 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 я не могу найти хорошую документацию, так как вы решили проблему?

Related of "Как вы используете предложения IN с подготовленными операциями mysqli"

Посмотрите на ответ на аналогичный вопрос, заданный здесь ранее (второй пример кода):

У меня есть массив целых чисел, как я могу использовать каждый из них в запросе 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();