Yaf 中的 PDO SQL 调试

By | 2017年6月11日 | 阅读:612 次

前言
在使用 yaf 的过程中,发现并没有像 laravel 那样有封装好的 ORM,我觉得这和 yaf 的框架理念有关,就是追求简单高效,PHP 已经使用 PDO 对 SQL 操作进行了封装,鸟哥也比较推荐使用 PDO 方式连接和操作数据库,同时能从底层解决了SQL注入的问题 ,参考了 stackoverflow 的文章,封装了一个内部类解决了 SQL 调试时参数替换的问题


  1. 问题起因及解决办法
  2. PDO 为什么不存在 Last Query SQL 概念

1. 问题及解决

1.1 PDO SQL 调试问题

在使用 yaf 开发 API 时,数据库操作使用原生的 PDO,SQL 执行出错时使用 PDOStatement::debugDumpParams() 来打印一条 SQL 预处理命令,但是输出的错误信息中参数的值不会被替换进去,根据输出信息并不能判断 SQL 执行在哪里出错,比如 not null 字段传 null值 并不能在输出信息中发现

1.2 自定义信息输出类

  • 首先来看下效果:在用户注册接口中将 PDO 执行的 SQL 带上参数值输出;

  • 代码实现:自定义PDOStatement::queryString 的输出格式 同时 使用输入值进行参数替换

  • 使用自定义格式类


2. PDO 为什么不存在 Last Query SQL 概念

  • PDO 将客户端执行的 SQL 分成了两步
    • 第一步传递要执行的 SQL “模板”,编译后建立该 SQL 的内部引用;
    • 第二步传递要查询的参数值,不会做语义解释,重用了以前的执行计划,能很好的防御 SQL 注入;
  • 类比 function,参数值作为编译后的 SQL 输入执行查询,发送一次执行一次,所以不存在 last query sql 的概念


后记
刚解决完 PDO SQL 调试问题,发现自己对 PDO 重用了以前的执行计划来防御 SQL 注入还不是很了解,简直狗带,后边学 Web 安全时候认真学下233

One thought on “Yaf 中的 PDO SQL 调试

发表评论

电子邮件地址不会被公开。