1

将逗号分隔的 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 行,我很困惑!

4

2 回答 2

3

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

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

于 2012-08-29T04:53:18.837 回答
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);
于 2012-08-29T05:12:00.527 回答