
php 报错“trying to access array offset on value of type bool”表明 `fetch()` 返回了 `false`(查询失败或无数据),而非预期的关联数组,根本原因是错误混用了 pdo 的预处理语句与普通查询的取值方式。
当你使用 $conn->prepare() + $stmt->execute() 执行查询时,$stmt->fetch() 是完全可用的——但前提是必须确保:
- 预处理语句执行成功(execute() 返回 true);
- 数据库连接正常且表结构匹配(字段名如 date、line 等在 bustracker 表中真实存在);
- fetch() 调用前未耗尽结果集(例如多次调用 fetch() 而未重置)。
而你当前报错的核心在于:$result->fetch() 在首次调用时就返回了 false,说明查询未返回任何有效行(可能因 SQL 错误、空表、权限问题或字段名不匹配)。此时 $row 是布尔值 false,后续 $row['id'] 就会触发「尝试对布尔值访问数组下标」的致命警告。
✅ 正确做法(推荐使用 PDO 预处理,兼顾安全与可维护性):
prepare("SELECT id, date, line, block, start FROM bustracker ORDER BY id ASC");
if (!$stmt->execute()) {
error_log("Query failed: " . implode(", ", $stmt->errorInfo()));
die("数据库查询失败,请检查配置和表结构。");
}
// 2. 安全遍历结果(使用 fetch(PDO::FETCH_ASSOC) 明确指定返回关联数组)
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$id = (int)$row['id']; // 强制转为整型,防 XSS 和类型隐患
?>
Edit
Delete
⚠️ 关键注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 不要用 ->query() 替代 ->prepare():虽然 query() + fetch_array()(MySQLi)看似简单,但你的代码明显基于 PDO($conn->prepare),混用 MySQLi 方法(如 fetch_array())会导致致命错误。PDO 对应的是 fetch() 或 fetch(PDO::FETCH_ASSOC)。
-
始终验证查询结果:execute() 可能失败(如 SQL 语法错误、表不存在),需检查返回值或启用 PDO 错误模式:
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
- 字段名大小写敏感:确认数据库中列名确实是小写的 date、line 等(部分系统区分大小写)。
- 输出过滤必不可少:所有 echo 前务必用 htmlspecialchars() 防止 XSS 攻击,尤其当字段含用户输入内容时。
-
空结果友好提示:可在 while 循环外添加:
rowCount() === 0): ?>暂无数据
总结:该问题本质是「未校验查询执行状态 + 误判 fetch() 返回值类型」。坚持使用 PDO 预处理、显式指定 FETCH_ASSOC、逐层排查连接/SQL/字段三要素,即可彻底解决表格空白与 PHP 警告。











