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

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?

4b9b3361

Ответ 1

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

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

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

Ответ 2

Я бы сделал $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();
}