PHP怎么记录SQL日志_PDOStatement拦截查询语句【详解】

最稳妥方案是用PDO::ATTR_STATEMENT_CLASS注入继承PDOStatement的自定义类,在execute()中记录this-\>queryString(需启用PDO::ATTR_EMULATE_PREPARES=true才能看到带值SQL),或改用PDO::query()/exec()包装器记录原始SQL。怎么让 PDO 自动记录所有执行的 SQL 语句不能靠 PDOStatement 拦截------它本身不提供钩子,也不暴露原始 SQL。真正能记录的,是 PDO 实例在 prepare/execute 阶段的行为,得从构造和调用链下手。最稳妥的做法:用 PDO::ATTR_STATEMENT_CLASS 注入自定义语句类,把 execute() 和 prepare() 包一层。不是"拦截",而是"替换实现"。必须继承 PDOStatement,否则 PDO 内部会拒绝注册重写 execute() 时,this->queryString 是预处理后的完整 SQL(含参数值,如果用了 emulated prepare)若启用了 PDO::ATTR_EMULATE_PREPARES = true(默认 MySQL),才能拿到带值的 SQL;关掉的话只能拿到带问号的模板日志建议写到 error_log() 或 PSR-3 logger,别直接 echo/print,避免干扰响应PDO::ATTR_STATEMENT_CLASS 的正确写法和常见报错写错类名、没声明构造函数、忘记 extends PDOStatement,都会导致 PDOException: SQLSTATEHY000: General error 或静默失败。正确结构示例:立即学习"PHP免费学习笔记(深入)"; arXiv Xplorer ArXiv 语义搜索引擎,帮您快速轻松的查找,保存和下载arXiv文章。

相关推荐
费弗里1 分钟前
里程碑式更新!Dash 4.2新版本新增websocket型回调
python·dash
XZ-0700016 分钟前
MySQL-前缀索引
数据库·mysql
专注VB编程开发20年8 分钟前
淘宝上架销售技巧:Excel管理系统开发 / VBA / ERP / OA办公管理
java·数据库·excel
J2虾虾17 分钟前
Spring AI Alibaba - Structured Output 结构化输出
人工智能·python·spring
Leon-Ning Liu28 分钟前
【真实经验分享】Grid管理仓库 (GIMR/MGMTDB) 迁移重建实战指南
数据库
RSTJ_162533 分钟前
PYTHON+AI LLM DAY SIXTY-FOUR
开发语言·python
广州灵眸科技有限公司35 分钟前
瑞芯微RV1126B开发板(EASY-EAI-PI2) 开发套件组装上电
网络·数据库·人工智能·算法·飞书
文盲青年36 分钟前
数据库移除0宽字符
数据库·oracle
甄心爱学习1 小时前
【项目实训(个人11)】
python·个人开发
wei_shuo1 小时前
SQL 高级特性实战:窗口函数、JSONB 与多数据库兼容完全指南
数据库·kingbasees