为什么PDO在这里只返回一行



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

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

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

这应该有效,它动态地构建了您应该在语句中使用的占位符:

$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);

最新更新