PDO с запросами "WHERE ... IN" - PullRequest
20 голосов
/ 03 марта 2010

Я переделываю некоторый код PHP, чтобы использовать PDO для доступа к базе данных, но у меня проблема с запросом "WHERE ... IN".

Я пытаюсь удалить некоторые вещи из базы данных, основываясь на том, какие элементы в форме проверены. Длина и содержание списка будут разными, но для этого примера представьте, что это так:

$idlist = '260,201,221,216,217,169,210,212,213';

Тогда запрос выглядит так:

$query = "DELETE from `foo` WHERE `id` IN (:idlist)";
$st = $db->prepare($query);
$st->execute(array(':idlist' => $idlist));

Когда я это делаю, удаляется только первый идентификатор. (Я предполагаю, что он выбрасывает запятую и все после нее.)

Я также пытался сделать $idlist массивом, но тогда он ничего не удаляет.

Как правильно использовать список элементов в подготовленном операторе PDO?

Ответы [ 3 ]

29 голосов
/ 03 марта 2010

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

$idlist = array('260','201','221','216','217','169','210','212','213');

$questionmarks = str_repeat("?,", count($idlist)-1) . "?";

$stmt = $dbh->prepare("DELETE FROM `foo` WHERE `id` IN ($questionmarks)");

и цикл для привязки параметров.

3 голосов
/ 13 апреля 2018

Это тоже может быть полезно:

https://phpdelusions.net/pdo#in

$arr = [1,2,3];
$in  = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT * FROM table WHERE column IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($arr);
$data = $stm->fetchAll();
0 голосов
/ 03 марта 2010

Я бы сделал $ idlist и массив, а затем просто перебрал бы массив, используя foreach, чтобы удалить конкретный элемент.

$idlist = array('260','201','221','216','217','169','210','212','213');

$stmt = $dbh->prepare("DELETE FROM `foo` WHERE `id` = ?");
$stmt->bindParam(1, $id);

foreach ($idlist as $item){
    $id = $item;
    $stmt->execute();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...