PHP怎么记录SQL日志_PDOStatement拦截查询语句【详解】
最稳妥方案是用PDO::ATTR_STATEMENT_CLASS注入继承PDOStatement的自定义类在execute()中记录$this-queryString需启用PDO::ATTR_EMULATE_PREPAREStrue才能看到带值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文章。