我正在修改一些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准备好的声明中使用项目列表的正确方法是什么?
答案 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();
}