以下查询返回所有想要的结果(如果在phpmyadmin中输入:
)SELECT postid, voting
FROM postvotes
WHERE userid = 1
AND postid IN
(1007,1011,1012,1013,1014,
1015,1016,1017,1018,1019,1020,1021,1023,1025,1026,
1027,1028,1029,1030,1031)
但是PDO无法fetchAll()。它只返回第一个匹配,如fetch()。
怎么了?
PHP代码:
private function userPostVotings( $postIDs ) {
// $postIDs contains a string like 1,2,3,4,5,6,7...
// generated through implode(',', idArray)
try {
$userPostVote = $this->_db->prepare('SELECT postid, voting
FROM postvotes
WHERE userid = ?
AND postid IN ( ? )');
$userPostVote->setFetchMode(\PDO::FETCH_ASSOC);
$userPostVote->execute( array( $this->_requester['id'], $postIDs ) );
while ( $res = $userPostVote->fetch() ) {
var_dump( $res );
}
} catch (\PDOException $p) {}
}
如果我回显出此方法中使用的查询并通过phpmyadmin触发它,我会得到正确数量的结果。然而,PDO只给出了第一个。无论是带有fetch()还是fetchAll()的循环。
答案 0 :(得分:3)
您无法在PDO中的预准备语句中绑定数组。
答案 1 :(得分:2)
当然不是PDO的fetchAll(),而是你的查询。
哪个不是
IN (1007,1011,1012,1013,1014)
但
IN ('1007,1011,1012,1013,1014')
当然它只会找到第一个值,因为此字符串将被转换为第一个数字
必须创建一个包含表示每个数组成员的占位符的查询,然后绑定此数组值以供执行:
$ids = array(1,2,3);
$stm = $pdo->prepare("SELECT * FROM t WHERE id IN (?,?,?)");
$stm->execute($ids);
为了使这个查询更灵活,最好用动态创建一个字符串:
$ids = array(1,2,3);
$in = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT * FROM table WHERE column IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($ids);
$data = $stm->fetchAll();