PDO与“WHERE...IN“查询

2022-08-30 17:09:19

我正在重新设计一些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 预准备语句中使用项目列表的正确方法是什么?


答案 1

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

$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

这可能也会有所帮助:

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

推荐