为什么我不能用PDO循环两次$ q-> fetch()

时间:2017-09-03 11:28:59

标签: php mysql pdo

假设我需要循环两次,我得到的结果是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>";
                }

2 个答案:

答案 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>";
  }