【问题标题】:PDO will only return first row of data setPDO 只会返回数据集的第一行
【发布时间】:2013-05-20 11:58:13
【问题描述】:

此代码完美显示第一行,但仅此而已。 我已经尝试过 fetchAll() ,并且可以获得要显示的正确行数,但每行只填充一列,并且数据值被单词“Array”替换。我试过 while 循环。快把我逼疯了!

/* 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>';

【问题讨论】:

    标签: php sql pdo row


    【解决方案1】:

    您混淆了 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>
    

    【讨论】:

    • 是的,谢谢 YCS!次要编辑:每个值都在重复,所以我只是将PDO::FETCH_ASSOC 参数添加到您对fetchAll() 的调用中。
    • @user2304574 你宁愿set it as a default value 一次,而不是在每个查询中手动设置它
    【解决方案2】:

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

    改变

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

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

    或使用带有 fetch() 的 while 循环。 Morover,如果你不需要准备好的语句,你可以使用 query() 并通过 foreach() 迭代它

    【讨论】:

    • 我在上面提到我已经尝试过 fetchAll() 和一个 while 循环。
    • $row = $stmt-&gt;fetchAll(PDO::FETCH_ASSOC); print_r($row);它输出什么?也许问题出在您的查询中。
    • 好的!这打印了我所有的数据。那么为什么它不会在表格中格式化呢?当我使用 fetch() 时它会这样做,但当然只有第一行。
    猜你喜欢
    • 2019-12-30
    • 2019-07-22
    • 2013-12-01
    • 2017-04-17
    • 2023-04-08
    • 2018-05-10
    • 2013-08-10
    • 1970-01-01
    相关资源
    最近更新 更多