【问题标题】:why is PDO returning only one row here?为什么 PDO 在这里只返回一行?
【发布时间】:2012-08-29 04:50:14
【问题描述】:

当将逗号分隔的 id 列表绑定到我准备好的语句时,我只返回一行,而我期望的是 3。

<?php

$dbh = new PDO("mysql:host=127.0.0.1;dbname=database", "user", "password");
$stmt = $dbh->prepare('SELECT * FROM Person WHERE PersonID IN (:p)');
$stmt->bindValue(":p", "3,4,5");
$stmt->execute();
$result =  $stmt->fetchAll(PDO::FETCH_ASSOC);

?>

<pre>
<?php print_r($result); ?>
</pre>

如果我将 stmt 更改为

SELECT * FROM Person WHERE PersonID IN (3,4,5)

我按预期返回了 3 行,我很困惑!

【问题讨论】:

  • 您是否尝试过在bindValue() 中使用参数PDO::PARAM_STR

标签: php database pdo


【解决方案1】:

因为 bind 本质上会将其包裹在引号中并将其视为单个值。然后 MySQL 将其转换回整数,因此它仍然可以找到第一项的匹配项。

您需要分别执行 IN (:p1, :p2, :p3) 和绑定值

【讨论】:

  • 嗯,id 的数量各不相同,所以我应该创建一个循环来动态创建所有这些占位符。或者有没有更好的方法
【解决方案2】:

这应该可行,它会动态构建您应该在语句中使用的占位符:

$idList = array(3, 4, 5);
$argList = join(',', array_fill(0, count($idList), '?'));

$stmt = $dbh->prepare("SELECT * FROM Person WHERE PersonID IN ($argList)");
$stmt->execute($idList);
$result =  $stmt->fetchAll(PDO::FETCH_ASSOC);

【讨论】:

  • isn't PDO 在某些时候比 mysql_*queries 更复杂和令人困惑吗?
  • @diEcho 可以说是的,但是这种“复杂性”确实具有防止 sql 注入的好处:)
  • 在类似的注释上,“克里斯”对类似问题的回答看起来不错:PHP PDO: Can I bind an array to an IN() condition?
  • @johowie 好发现!我也试图寻找它,但你的搜索词可能更好:)
猜你喜欢
  • 2019-07-22
  • 2023-03-05
  • 1970-01-01
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
相关资源
最近更新 更多