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文章。

相关推荐
aifannihao26 分钟前
Rust 1.100 的 DropGuard:用 Python 实测失败回滚与吞异常
python·rust·异常处理·标准库·contextlib
code2cat33 分钟前
【随笔】MCP工具重试:任务已经创建,响应丢了怎么办
数据库·mcp
用户019027581612 小时前
天勤 tqsdk 能做 A 股行情吗?期货强项与股票数据选型
python
wuyk5552 小时前
Spider-第10讲-SQLite持久化与去重
数据库·爬虫·sqlite
2601_967979123 小时前
pip在Python中的9个必须知道的用法
python·pip·版本控制·包管理工具·requirements.txt
曲径海盗4 小时前
【Python 学习第 58 天】列表方法
python·学习笔记·编程入门
乌暮4 小时前
Spring AOP 与 Spring 事务:用大白话彻底理解原理与实践
java·数据库·spring boot·后端·sql·学习·spring
DeepVisionary4 小时前
Runway开源机器人大模型Praxis-1,推演延迟压到62毫秒
python·自动化
金銀銅鐵4 小时前
带您看懂字节码指令(三):一行加法里有什么
java·jvm
小此方4 小时前
Re:Mysql数据库基础篇(十二):什么是事务、事务解决了什么问题、事务的四大属性、事务的操作方式
数据库·mysql