您现在的位置是:烟消火灭网 > 热点

thinkphp5打印sql

烟消火灭网2026-10-17 07:44:46【热点】2人已围观

简介ThinkPHP5里调试SQL,最直接的办法就是打开数据库日志。别绕弯子,框架自带的`getLastSql()`方法,够用,但不够痛快。 你写了个查询,页面刷出来数据不对,或者压根没数据。第一反应是啥

ThinkPHP5里调试SQL,打印最直接的打印办法就是打开数据库日志。别绕弯子,打印框架自带的打印`getLastSql()`方法,够用,打印但不够痛快。打印 你写了个查询,打印页面刷出来数据不对,打印或者压根没数据。打印第一反应是打印啥?猜?别猜。直接在你控制器里,打印模型查询语句后面加一行: ```php echo Db::getLastSql(); ``` 这行代码会把你最后执行的打印那条SQL原样吐出来。带参数绑定的打印,它也会把问号替换成实际值,打印方便你复制到Navicat里跑。打印看报错,看结果集,一目了然。 但这个方法有个毛病——它只能拿到“最后一次”执行的SQL。你要是循环里查了十次,它只显示第十次。这时候得用更狠的招:开启框架的SQL日志记录。 在`application/database.php`里,找到`'debug' => false`,改成`'debug' => true`。然后去`runtime/log/`目录,找到当天的日志文件。打开它,里面会记录下这个请求周期内所有执行的SQL语句,包括执行时间、参数、甚至错误信息。这招适合排查复杂逻辑,比如关联查询、嵌套循环。 不过说实话,日志文件翻起来费劲,尤其是日志多的时候,眼睛都看花了。我一般直接在公共函数文件里挂个钩子,用ThinkPHP5的`listen`方法监听`sql`事件: ```php \think\Hook::listen('sql', $sql); ``` 在`application/tags.php`里注册一个行为,或者干脆在入口文件`public/index.php`里直接写: ```php \think\Hook::listen('sql', function($sql) { dump($sql); }); ``` 这样每次执行SQL,页面底部就会实时打印出完整的SQL语句,带时间戳,带参数。调试完记得删掉,别留在生产环境里。 还有个土办法,但很实用。你直接在模型方法里用`fetchSql(true)`,它不执行查询,只返回生成的SQL字符串: ```php $sql = Db::name('user')->where('id', 1)->fetchSql(true)->find(); ``` 配合`halt($sql)`,直接中断输出,看SQL长啥样。这招尤其适合复杂查询构建时,你想确认`where`条件拼接得对不对,`join`有没有写错。 说个真实案例。我之前接手一个老项目,列表页数据慢得像蜗牛。页面加载要三秒。我打开日志一看,好家伙,一个列表页执行了87条SQL。每条都是简单的单表查询,但循环里嵌套了查询,典型的N+1问题。我用了`with()`预加载,把关联查询合并成两条SQL,页面直接飙到0.3秒。这就是打印SQL的威力——你得先看到它,才能知道问题出在哪。 最后提一嘴,ThinkPHP5的`Db::getLastSql()`在模型查询后调用有效,但如果你用了`query()`方法原生查询,它可能不记录。这时候直接看日志文件最靠谱。别嫌麻烦,调试SQL是基本功,省下来的时间足够你喝两杯咖啡了。

很赞哦!(27)