CodeIgniter 查询总是失败?把最后一条 SQL 打出来

在 CodeIgniter 老项目里排查数据库问题,经常会碰到这种情况:SQL 和绑定参数一起传给 query(),最后只拿到一个 false。继续盯着 $sql 变量看,未必能看出框架刚刚记录了哪条查询。

$query = $this->db->query($sql, array($fields, $fields1));

这时可以紧跟着打印 last_query()

print_r($this->db->last_query());

last_query() 查的是 SQL,不是结果

这个方法返回的是上一条运行过的查询字符串。它和 $query 不是一回事:想看 SQL,用 last_query();想看这次调用返回了什么,才是打印 $query

print_r($this->db->last_query()); // 查询字符串
print_r($query);                  // query() 的返回值

把两者分开后,排查会清楚很多。至少不会再对着查询结果找 SQL,也不会把一段 SQL 字符串当成结果集处理。

查询比较多时,打开 Profiler

如果一个页面里跑了好几条查询,只盯着最后一条就不够了。CodeIgniter 的 Profiler 可以放在 Controller 方法中开启:

$this->output->enable_profiler(TRUE);

开启后,页面底部会集中显示基准测试结果、这次请求运行过的查询以及 $_POST 数据。这样更容易把某条 SQL 放回整个请求过程里看,而不是到处插入 print_r()

实际排查时,两种方式按问题大小选就行:只想确认刚刚那条 SQL,用 last_query();需要一起看页面请求里的多条查询和提交数据,用 Profiler。对于仍在使用 $this->db 这套接口的 CodeIgniter 项目,这两段代码也很适合留作临时调试入口。

1 Like