PDO с запросами «WHERE … IN»

Я перерабатываю некоторый 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?

Related of "PDO с запросами «WHERE … IN»"

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

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

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

Я бы сделал $ idlist и array, а затем просто прокрутил массив, используя 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(); }