带有“WHERE ... IN”查询的 PDO [重复]
Posted
技术标签:
【中文标题】带有“WHERE ... IN”查询的 PDO [重复]【英文标题】:PDO with "WHERE... IN" queries [duplicate] 【发布时间】:2011-01-23 07:59:34 【问题描述】:我正在修改一些 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 准备好的语句中使用项目列表的正确方法是什么?
【问题讨论】:
您不得在问题中添加解决方案。如果您认为答案更好,请回答您自己的问题或建议对原始答案进行修改。 @PhoneixS 很好的建议,但我最后一次接触这个问题是在 2010 年,从那年开始就没有真正使用过 PHP。如果您愿意,请随意编辑。 【参考方案1】:我会创建 $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();
【讨论】:
可行的方法,但价格昂贵!将其保留在一个查询中会很多更好。 实际上很好地使用了 prepared 语句。但如前所述 - 太贵了。【参考方案2】:由于您不能将值(数字)与控制流逻辑(逗号)与准备好的语句混合在一起,因此每个值需要一个占位符。
$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)");
并循环绑定参数。
【讨论】:
很好,谢谢。不过我是这样使用它的:implode(',',str_split(str_repeat('?',count($idList))));
或:implode(',', array_fill(0, count($idList), '?'));
(如果 count > 0 这也是答案所必需的),请参阅array_fill
、str_repeat
@NathanLong 解决方案:<input type="checkbox" name="foos[]" value="bar">
在提交时,我得到一个名为$_POST['foos']
的变量,它是所有选中框的值的数组。然后: //与数组条目一样多的问号;最后一个不需要逗号 $questionmarks = str_repeat("?,", count($_POST['foos'])-1) . "?"; $query = "DELETE from
employee_customeraccount` WHERE id
IN ($questionmarks)"; $st = $db->prepare($query); //每个问号用数组中的下一项填充$st->execute($_POST['foos']);` 有效!
@hakre 提到的内容加上 ->execute(array_values($idlist ));获取数字键,无论 $idList 来自哪里。【参考方案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();
【讨论】:
以上是关于带有“WHERE ... IN”查询的 PDO [重复]的主要内容,如果未能解决你的问题,请参考以下文章
具有多个带有 AND 类型逻辑连接的 where IN 子句的配置单元查询
Doctrine DBAL - 带有附加参数的 WHERE IN 数组
在 Doctrine 2 中执行 WHERE .. IN 子查询