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 天前
动态图机制:为什么 PyTorch 调试起来更舒服
人工智能·pytorch·python
chushiyunen1 天前
langchain4j笔记、tools
笔记·python·flask
计算机安禾1 天前
【数据库系统原理】第19篇:计算机存储层次结构与数据库文件的物理组织
数据库·oracle
JAVA面经实录9171 天前
操作系统面试题
java·服务器·数据库·计算机网络·面试
程序员三藏1 天前
Web自动化测试详解
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
摇滚侠1 天前
mariadb-libs 被 mysql-community-libs-5.7.28-1.el7.x86_64 取代
数据库·mysql·mariadb
在放️1 天前
Python 爬虫 · 第三方代理接入与合规使用
开发语言·爬虫·python
DIY源码阁1 天前
JavaSwing饮品管理系统 - MySQL版
java·数据库·mysql·eclipse
专注搞钱1 天前
GPT-4o写设备Recipe:从3小时到10分钟
数据库·人工智能·gpt·半导体
财经资讯数据_灵砚智能1 天前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年6月14日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能