php 查询数据库后需将 `
` 移至循环外部,否则每行数据都会生成一个独立且嵌套错误的表格结构,导致仅首行显示正常。
在使用 PHP(如 MySQLi 面向对象方式)从数据库获取多行记录并输出为 HTML 表格时,一个常见但容易被忽视的错误是:将 闭合标签错误地写在 while 循环内部。这会导致 HTML 结构严重错乱——浏览器会尝试自动修复非法嵌套(如
),最终仅首行可见,其余内容或丢失、或错位、或被忽略。
正确的做法是: 开始标签和表头 | ... |
在循环前一次性输出;所有数据行
| ... |
在循环内逐行生成;而
必须严格置于循环之后、条件块结束之前。
以下是修正后的完整示例代码(含基础安全与可读性优化):
query($Sql);
if ($Result && $Result->num_rows > 0) {
// 开始表格,输出表头
echo '';
echo '';
echo '| Registration Number | ';
echo 'Name | ';
echo '
';
echo '';
// 循环输出每一行数据(注意:此处不输出
!)
while ($Row = $Result->fetch_assoc()) {
// 推荐使用花括号语法避免解析歧义,并转义输出防止 XSS
echo '
';
echo '| ' . htmlspecialchars($Row['Registration_Number']) . ' | ';
echo '' . htmlspecialchars($Row['Name']) . ' | ';
echo '
';
}
echo ''; // ✅ 正确位置:循环结束后统一关闭表格
} else {
echo '
No records found.
';
}
$conn->close();
?>
✅ 关键要点总结:
-
必须成对出现在同一逻辑层级,不可被循环拆分;
- 使用 htmlspecialchars() 转义输出内容,防范跨站脚本(XSS)风险;
- 建议区分 (表头)与
(数据体),提升语义化与可维护性;
- 检查 $Result 是否为有效结果集($Result && ...),避免调用空对象方法导致致命错误;
- border="2" 属于过时的内联样式,生产环境建议改用 CSS 控制边框(如 style="border-collapse: collapse;")。
遵循以上结构,即可稳定、安全、语义化地将数据库结果渲染为标准 HTML 表格。