【问题标题】:PDO with "WHERE... IN" queries [duplicate]带有“WHERE ... IN”查询的 PDO [重复]
【发布时间】: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。如果您愿意,请随意编辑。

标签: php pdo


【解决方案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_fillstr_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();

【讨论】:

    猜你喜欢
    • 2014-05-02
    • 2020-11-11
    • 2023-03-25
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    相关资源
    最近更新 更多