此代码完美显示第一行但不再显示。 我尝试了 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>';
答案 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>