本文详解为何使用 pdo 的 `prepare()` + `execute()` 后调用 `fetch()` 会返回布尔值而非数组,导致“trying to access array offset on value of type bool”错误,并提供安全、兼容的解决方案。
你遇到的错误——PHP Warning: Trying to access array offset on value of type bool——根本原因在于混淆了 PDO 和 MySQLi 的 API 行为。
在你的代码中:
$result = $conn->prepare("SELECT * FROM bustracker ORDER BY id ASC");
$result->execute();
for($i=0; $row = $result->fetch(); $i++){ // ❌ 错误:PDO::fetch() 返回关联/索引数组,但此处循环逻辑有隐患看似无误,实则存在两个关键问题:
$result->fetch() 本身是合法的(PDO 支持),但你的 $conn 很可能实际是 MySQLi 连接对象(例如 mysqli),而非 PDO 实例。
✅ mysqli::prepare()->execute() 返回布尔值;
✅ mysqli_stmt::fetch() 需配合 bind_result() 使用,不能直接 $stmt->fetch() 并当数组用;
❌ 而你却像对待 mysqli_result::fetch_array() 一样直接访问 $row['id'],导致 $row 是 false(布尔值),引发类型错误。
即便 $conn 是 PDO,for 循环中 $row = $result->fetch() 的写法虽可运行,但未做空结果集校验,且易因逻辑混乱导致意外行为。
✅ 正确做法(推荐使用 MySQLi 面向对象风格,与你当前环境最匹配):
query("SELECT * FROM bustracker ORDER BY id ASC");
// ✅ 检查查询是否成功,并确保有数据
if ($result && $result->num_rows > 0) {
while ($row = $result->fetch_assoc()) { // ← 关键:用 fetch_assoc() 获取关联数组
$id = $row['id'];
?>
" class="btn btn-info">Edit
" data-toggle="modal" class="btn btn-danger">Delete
No records found. ";
}
?>? 关键改进说明:
⚠️ 如果你坚持使用 PDO(更安全、支持预处理):
请确认 $conn 是 new PDO(...) 实例,并改用:
$stmt = $conn->prepare("SELECT * FROM bustracker ORDER BY id ASC");
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { // ← 显式指定 FETCH_ASSOC
// ... 同上输出逻辑
}? 总结:
错误本质是 API 误用——把 MySQLi 的语句对象当成了 PDO,或未正确使用其结果集方法。优先采用 query() + fetch_assoc() 组合,简洁、直观、容错强。同时务必对所有用户可控输出进行 HTML 转义,兼顾功能与安全。
# mysql
# php
# word
# html
# access
# 安全传输
# lsp
# xss
# Array
# if
# 关联数组
# for
# while
# 面向对象
# mysqli
# pdo
# bool
# 循环
# 对象
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Python网络超时处理_健壮性设计说明【指导】
c++ unordered_map怎么用 c++哈希表用法【教程】
Win11怎么关闭SmartScreen_禁用Windows Defender筛选器教程【步骤】
如何快速验证Golang安装是否成功_运行go version和hello world示例
如何使用Golang benchmark测量函数延迟_统计执行耗时
Win10如何卸载自带Edge_Win10彻底卸载Edge浏览器教程【攻略】
Win11怎么设置快速访问主页_Windows11资源管理器文件夹选项
Windows11怎么自定义任务栏_Windows11任务栏自定义教程【步骤】
LINUX怎么查看进程_LINUX ps命令查看运行服务
如何使用Golang处理网络超时错误_Golang请求超时异常处理方法
Win10文件历史记录怎么用 Win10开启自动备份文件教程【防丢】
如何使用Golang指针与接口结合_实现方法调用和动态类型
如何使用Golang操作指针变量_Golang解引用与赋值实践
Linux如何安装Tomcat应用服务器_Linux环境部署与端口修改【教程】
Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数
Windows7如何安装系统镜像_Windows7系统安装教程【步骤】
如何使用Golang进行HTTP服务性能测试_测量吞吐量和延迟
Win11怎么设置开机密码_Windows11账户登录选项PIN码
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
Win10怎样安装Word样式库_Win10安装Word样式教程【步骤】
Mac电脑进水了怎么办_MacBook进水后紧急处理方法【必看】
如何使用 Python 合并文件夹内多个 Excel 文件并避免权限错误
Python列表推导式与字典推导式教程_简化代码高效写法
Win11怎么查看已连接wifi密码 Win11查已连wifi密码步骤【教程】
Mac上的iMovie如何剪辑视频?(新手入门教程)
Python面向对象实战讲解_类与设计模式深入理解
Win11关机快捷键是什么_Win11快速关机方法【大全】
Windows10系统怎么查看显卡型号_Win10 dxdiag显示选项卡
Win11如何设置文件权限 Win11 NTFS文件夹所有权与安全设置【高级】
Win10怎么限制单程序CPU占用上限_Win10任务管理器亲和性或第三方工具均衡负载【技巧】
Win11怎样安装微信开发者工具_Win11安装开发者工具教程【步骤】
如何高效识别并拦截拼接式恶意域名 spam
如何提升Golang程序I/O性能_Golang I/O密集型程序优化示例
c++中explicit(bool)的用法 c++条件性explicit【C++20】
php修改数据怎么批量改状态_批量更新status字段值技巧【操作】
Win11笔记本怎么看电池健康度_Win11电池报告生成命令【详解】
如何使用Golang实现错误包装与传递_Golangfmt.Errorf%w使用实践
Win11键盘快捷键大全_Windows 11常用高效快捷键汇总【技巧】
Win11怎么连接投影仪_Win11多显示器投屏设置指南【步骤】
php下载安装后memory_limit怎么设置_内存限制调整【技巧】
Win11怎么设置环境变量_Win11配置Path路径变量【详解】
Mac如何解压zip和rar文件?(推荐免费工具)
Win11时间格式怎么改成12小时制 Win11时间格式切换教程【步骤】
Win11怎么设置开机问候语_自定义Win11锁屏提示信息【技巧】
Python实现图数据库操作_Neo4j核心CRUD与图算法解析
如何在Golang中写入JSON文件_保存结构体数据到文件
如何理解Go指针和内存分配关系_Go Pointer内存Model解析
c++ reinterpret_cast怎么用 c++最危险的类型转换【详解】
Windows10系统怎么查看设备管理器_Win10快捷键Win+X菜单使用
如何使用Golang实现微服务状态监控_Golang服务运行状态采集方法
2026-01-04
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。