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: SQLSTATE[HY000]: General error 或静默失败。正确结构示例:立即学习"PHP免费学习笔记(深入)"; arXiv Xplorer ArXiv 语义搜索引擎,帮您快速轻松的查找,保存和下载arXiv文章。

相关推荐
jeCA EURG2 小时前
完美解决phpstudy安装后mysql无法启动
数据库·mysql
JaydenAI2 小时前
[FastMCP设计、原理与应用-14]FastMCP——架构之魂,构建MCP应用的统一入口与调度中枢
python·ai编程·ai agent·mcp·fastmcp
2401_882273722 小时前
如何通过MongoDB GridFS实现文件的分块下载
jvm·数据库·python
weixin_580614002 小时前
CSS如何实现动态背景色线性渐变_利用CSS变量控制渐变方向
jvm·数据库·python
施棠海2 小时前
SQLite姓氏数据库首字母检索开发
数据库·oracle
weixin_408717772 小时前
mysql如何查询所有列_mysql select星号性能分析
jvm·数据库·python
a9511416422 小时前
mysql权限表查询性能如何优化_MySQL系统权限缓存原理
jvm·数据库·python
23471021272 小时前
4.21 学习笔记
软件测试·笔记·python·学习
weixin_408099672 小时前
OCR + 自动翻译:跨境电商批量铺货方案(支持多语言自动识别)
python·ocr·机器翻译·api接口·跨境电商·ocr识别·电商自动化