必须启用 save_queries 配置且执行查询后调用 last_query() 才有效;若为 false 或未执行 get()/insert() 等方法,将返回空字符串。

确认 save_queries 是否启用
这是最常被忽略的一步:$this->db->last_query() 能否返回 SQL,完全取决于配置项 save_queries 是否为 TRUE。CodeIgniter 3.1.13 默认开启,但很多项目上线前会手动关掉——所以别急着怀疑函数失效,先打开 application/config/database.php,检查 'save_queries' => TRUE 这一行是否存在且未被注释。
如果它被设为 FALSE(尤其在生产环境常见),last_query() 永远返回空字符串,无论你执行了多少次查询。
- 确保该配置在当前运行环境生效:若使用了多环境(如
development/production),需确认ENVIRONMENT常量值,并检查对应环境配置是否覆盖了该选项 -
db_debug设为TRUE不影响last_query(),但它控制错误是否抛出;两者独立,别混淆
执行查询后立即调用 last_query()
last_query() 不是“写完 where 就能看”,而是“执行完 get()/insert()/update() 才有”。Query Builder 是延迟执行的,只调用 select()、where() 不会生成 SQL,此时调用 last_query() 返回的是上一条已执行语句或空字符串。
- 正确顺序:
$query = $this->db->get('users');→ 紧接着$sql = $this->db->last_query(); - 调试时加
die防止后续查询覆盖结果:echo '<pre class="brush:php;toolbar:false;">' . htmlspecialchars($this->db->last_query()) . '</pre>'; die; - 若封装在模型方法中,
last_query()必须放在get()或result()之后,不能丢在方法末尾随便写
启用 Profiler 查看完整查询列表
单条 last_query() 只能看最后一条,而 Profiler 能列出所有已执行 SQL、耗时、绑定参数(对带问号占位符的查询特别有用)。
- 在控制器任意位置加:
$this->output->enable_profiler(TRUE); - 页面底部会出现「Database」面板,显示全部执行过的查询(注意:不显示未执行的构造链,也不显示事务内 prepare 语句)
- 前提是
save_queries为TRUE,否则 Profiler 的 Database 面板为空 - 仅限开发环境使用,切勿在生产环境开启
SQL Server(sqlsrv)驱动下额外注意字符集
如果你用的是 sqlsrv 驱动(比如连 SQL Server),last_query() 能正常返回,但中文等非 ASCII 字符可能乱码或截断——这不是调试功能问题,而是连接层配置缺失。
- 在
database.php的数据库配置中,必须显式设置:'char_set' => 'utf8'和'dbcollat' => 'SQL_Latin1_General_CP1_CI_AS'(SQL Server 推荐匹配 collation) - 缺少
char_set导致last_query()输出含中文的 SQL 时显示为问号或乱码,容易误判为 SQL 构造错误 - 该配置不影响查询执行,但直接影响你看到的调试输出是否可信
真正卡住人的地方往往不是函数怎么用,而是 save_queries 被静默关闭、或者在没执行查询时就急着调 last_query()。调试前花 10 秒确认这两点,比反复翻文档快得多。











