带有“WHERE ... IN”查询的PDO

时间:2010-03-03 17:39:38

标签: php pdo

我正在修改一些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));

执行此操作时,仅删除第一个ID。 (我假设它会抛出逗号及其后的所有内容。)

我也尝试将$idlist作为一个数组,但之后它不会删除任何内容。

在PDO准备好的声明中使用项目列表的正确方法是什么?

3 个答案:

答案 0 :(得分:29)

由于您不能将值(数字)与控制流逻辑(逗号)与预准备语句混合使用,因此每个值需要一个占位符。

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

并循环以绑定参数。

答案 1 :(得分:3)

这也可能有用:

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

答案 2 :(得分:-3)

我会创建$ 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();
}