假设我需要循环两次,我得到的结果是PDO准备语句如下:
第一个循环正常,下一个循环不是
var_dump(q->fetch())
的值为空数组。有什么想法吗?
<?php
$q=$dbconnection->prepare("SELECT * from users WHERE role=?");
$q->execute(array('$id')); //Boolean true or false
// first loop
while ($row = $q->fetch(PDO::FETCH_ASSOC)){
echo "<br/>" . $row['user_id'] . "--". $row['fname']. "</br>";
}
// second loop this loop will NOT echo any thing ?!
while ($row = $q->fetch(PDO::FETCH_ASSOC))
{
echo "<br/>" . $row['user_id'] . "--". $row['fname']. "</br>";
}
答案 0 :(得分:4)
循环行时,清空结果集。如果要循环多次,可以使用fetchAll()
,将其存储在变量中,并使用foreach
循环循环到所需位置。
$q = $dbconnection->prepare("SELECT * from users WHERE role=?");
$q->execute(array($id)); //Boolean true or false
$res = $q->fetchAll();
foreach ($res as $row) {
echo "<br/>" . $row['user_id'] . "--". $row['fname']. "</br>";
}
foreach ($res as $row) {
echo "<br/>" . $row['user_id'] . "--". $row['fname']. "</br>";
}
或者,您可以再次执行查询,但如果这样做,则对数据库进行双重查询。因此,您要查询两次相同的数据,这不是非常有效。
你还有execute(array('$id'))
,它是确切的字符串$id
,而不是变量表示。见the PHP manual on strings。所以它应该是execute(array($id))
。
答案 1 :(得分:2)
如果你需要两次迭代,你应该一次又一次地行,你应该执行一个副本,例如存储行
while ($row = $q->fetch(PDO::FETCH_ASSOC)){
echo "<br/>" . $row['user_id'] . "--". $row['fname']. "</br>";
$my_rows[] = $row;
}
// second loop this loop will NOT echo any thing ?!
foreach($my_rows as $key=>$value){
echo "<br/>" . $value['user_id'] . "--". $value['fname']. "</br>";
}