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

StackOverflow https://stackoverflow.com/questions/772913

  •  12-09-2019
  •  | 
  •  

Вопрос

Я переношу старый код в новый интерфейс 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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top