3

此代码完美显示第一行,但仅此而已。我已经尝试过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>';
4

2 回答 2

3

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

改变

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

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

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

于 2013-05-20T12:02:18.087 回答
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>
于 2013-05-20T12:24:44.550 回答