Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

У меня есть массив целых чисел, как я могу использовать каждый из них в запросе mysql (в php)?

Это сводится к:

  • создать строку SQL с нужным количеством вопросительных знаков
  • используйте call_user_func_array() для привязки вашего массива к строке запроса

Ответ 2

Невозможно связать список переменной длины с одной связанной переменной.

Аналогично, если вы должны были привязать строку $ids, вы на самом деле закончите:

SELECT foo,blar FROM table WHERE id IN ('123,535,345,567,878')

(Обратите внимание на цитаты вокруг списка идентификаторов).

Создание собственного запроса с правильным количеством вопросительных знаков и связанных параметров должно было действительно работать - вам может потребоваться повторить попытку и сообщить о фактической ошибке.

В качестве альтернативы это может быть одним из тех случаев, когда, к сожалению, необходимо вручную обрабатывать свой собственный SQL и не использовать связанные параметры.

Ответ 3

Я думал, что смысл подготовленных заявлений был так в этой ситуации, что вы могли просто сделать:

$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();