gpt4 book ai didi

php - 绑定(bind)字符串时,将 WHERE IN (...) 与 PDO 一起使用不起作用

转载 作者:行者123 更新时间:2023-11-29 01:41:14 25 4
gpt4 key购买 nike

我有一个如下所示的查询:

  UPDATE table SET column = UNIX_TIMESTAMP()
WHERE id IN (:idString)

其中 idString 是逗号分隔的字符串,并以数组形式传递给 execute()。令我惊讶的是,执行此查询时,只有 idString 中第一个 id 的行被更新。

在我的头撞墙之后,我最终决定这样尝试:

  UPDATE table SET column = UNIX_TIMESTAMP()
WHERE id IN (' . $idString . ')

第二个查询按预期工作。

当我使用 PDO 绑定(bind) ID 字符串时,为什么查询不起作用?

最佳答案

在 SQL 中,字符串

'1,2,3,5,12'

是一个单一的值,并将其转换为数字上下文,它将只有前导数字的值,因此只有值 1

这与多个值的集合有很大不同:

'1', '2', '3', '5', '12'

任何时候您使用绑定(bind)参数,无论您作为参数值传递什么,都只会变成一个单一值,即使您传递一串以逗号分隔的值也是如此。

如果要将一组多个值传递给 SQL 查询中的参数,则必须有多个参数占位符:

UPDATE table SET column = UNIX_TIMESTAMP()
WHERE id IN (:id1, :id2, :id3, :id4, :id5)

然后分解你的值字符串并将它们作为数组传递:

$idlist = array('id1' => 1, 'id2' => 2, 'id3' => 3, 'id4' => 5, 'id5' => 12);
$pdoStmt->execute($idlist);

对于这种情况,我建议使用位置参数而不是命名参数,因为您可以传递一个简单的数组而不是关联数组:

$pdoStmt = $pdo->prepare("UPDATE table SET column = UNIX_TIMESTAMP()
WHERE id IN (?, ?, ?, ?, ?)");
$idlist = explode(",", "1,2,3,5,12");
$pdoStmt->execute($idlist);

@mario 添加评论,您可以使用 FIND_IN_SET() .该查询看起来允许您传递一个格式化为逗号分隔值字符串的字符串:

$pdoStmt = $pdo->prepare("UPDATE table SET column = UNIX_TIMESTAMP()
WHERE FIND_IN_SET(id, :idString)");
$pdoStmt->execute(["idString" => "1,2,3,5,12"]);

但是,我通常不推荐该功能,因为它破坏了使用索引缩小搜索范围的任何机会。它实际上必须检查表中的每一行,并且在更新期间,这意味着它必须锁定表中的每一行。

关于php - 绑定(bind)字符串时,将 WHERE IN (...) 与 PDO 一起使用不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21174161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com