PDO只返回第一行数据集

时间:2013-05-20 11:58:14

标签: php sql pdo row

此代码完美显示第一行但不再显示。 我尝试了 fetchAll(),并且可以获得要显示的正确行数,但每行只填充一列,并且数据值将替换为“Array”。我尝试过循环。这让我很生气!

/* SQL */
$sql = "SELECT * FROM exam WHERE exam.Level = ? AND exam.Centre!=''";

/* parameter */
$level = 'B2';

/* prepare */
$stmt = $db->prepare($sql);

/* Execute */
$stmt->execute(array($level));

/* Fetch */
$row = $stmt->fetch(PDO::FETCH_ASSOC);      

/* Display */
    echo '<table>
        <tr>';
    if ($row)
      {
        foreach ($row as $key => $value) 
         {
            echo '<td>';
            echo $value;
            echo '</td>';
         }
      }    
     echo '</tr>
         </table>';

2 个答案:

答案 0 :(得分:3)

这是因为你只获取一行。你应该使用fetchAll();而不是fetch()

变化

$row = $stmt->fetch(PDO::FETCH_ASSOC); 

 $row = $stmt->fetchAll(PDO::FETCH_ASSOC); 

或使用带有fetch()的while循环。 Morover,如果你不需要预处理语句,可以使用query()并通过foreach()

进行迭代

答案 1 :(得分:3)

令人困惑的是fetch()方法,它只返回一行,fetchAll()返回所有行。但只要后者返回嵌套数组,您就需要两个嵌套foreach语句。

此外,建议将业务逻辑(或数据操作)与显示逻辑分开 此外,您的代码包含一些不必要的多余东西,最好删除。

所以正确的版本是:

/* Business logic */
$sql   = "SELECT * FROM exam WHERE Level = ? AND Centre!=''";
$level = 'B2';
$stmt  = $db->prepare($sql);
$stmt->execute(array($level));
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);      

/* Display logic */
?>
<table>
<? foreach ($data as $row): ?> 
  <tr>
<?     foreach ($row as $value): ?> 
    <td><?=$value?></td>
<?     endforeach ?> 
  </tr>
</table>
相关问题