Php PDO将只返回数据集的第一行

Php PDO将只返回数据集的第一行,php,sql,pdo,row,Php,Sql,Pdo,Row,此代码完美地显示第一行,但仅此而已。 我尝试了fetchAll,可以获得正确的行数来显示,但是每行只填充一列,并且数据值被单词数组替换。我已经试过了。它快把我逼疯了 /* SQL */ $sql = "SELECT * FROM exam WHERE exam.Level = ? AND exam.Centre!=''"; /* parameter */ $level = 'B2'; /* prepare */ $stmt = $db->prepare($sql); /* Execu

此代码完美地显示第一行,但仅此而已。 我尝试了fetchAll,可以获得正确的行数来显示,但是每行只填充一列,并且数据值被单词数组替换。我已经试过了。它快把我逼疯了

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

因为你只拿到一行。你应该使用fetchAll;取而代之

改变

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

或者将while循环与fetch一起使用。此外,如果您不需要准备好的语句,您可以使用query并通过foreach对其进行迭代,这会混淆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>

我在上面提到,我已经尝试了fetchAll和while循环。$row=$stmt->fetchAllPDO::FETCH_ASSOC;打印r$行;它输出什么?也许问题出在你的问题上。好的!打印我所有的数据。那么为什么它不会在表格中格式化呢?当我使用fetch时,它会,但当然只有第一行。是的,谢谢你!小编辑:每个值都在重复,所以我只是将PDO::FETCH_ASSOC参数添加到对fetchAll的调用中。@user2304574您宁愿使用一次,而不是在每个查询中手动设置它
/* 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>