codeigniter查询返回空数组的根本原因是查询构造器延迟执行且未调用get()等执行方法,常见于sql server驱动未显式执行、缓存路径不可写、save_queries关闭导致last_query()失效,以及变量名不一致或事务未提交等问题。

查询执行了但 $query->result() 返回空数组
这不是数据库没数据,而是查询对象根本没拿到结果。常见于 SQL Server(sqlsrv)驱动下未显式调用执行方法,或 CI3 中误把构造链当执行链。
-
$this->db->select('id')->from('users')->where('status', 1)这行不执行任何 SQL,$query->result()必然为空——必须接get()或get_compiled_select() - SQL Server 驱动下,
$query = $this->db->get('users')可能返回 false 而非 Query 对象,要先判空:if (!$query) { log_message('error', $this->db->error()); } - CI3 默认开启
cache_on时,若缓存路径不可写或权限不足,查询会静默失败并返回空,不是报错而是“假装成功”
$this->db->last_query() 拿不到刚写的 SQL
根本原因不是函数坏了,是 CodeIgniter 的查询构造器延迟执行 + save_queries 关闭导致的。
- 只调用
select()、where()不触发 SQL 生成,last_query()返回上一条残留语句或空字符串 - 检查
application/config/database.php中'save_queries' => TRUE是否生效——上线环境常被手动设为FALSE,调试前务必确认 - 可靠写法:在
get()后立刻捕获,且避免后续查询覆盖:$query = $this->db->get('users'); echo htmlspecialchars($this->db->last_query()); die;
模型里查出数据,视图里 $data 却是空的
变量名不一致是最隐蔽也最常踩的坑,尤其在多层嵌套或重命名重构后。
- 控制器传参键名必须和视图中使用的变量名完全一致:
$data['users'] = $model->get_all();→ 视图里只能用$users,不能写$user_list或$result - CI4 中若用
return view('page', $data),但$data是 null 或未定义数组,视图会收不到任何变量,表现为“有 HTML 框架但没内容” - CI3 的
load->view()不校验键是否存在,也不会 warn,直接跳过——建议在视图开头加<?php if (!isset($users)) { echo 'DEBUG: $users not passed'; } ?>
插入后 $this->db->insert_id() 返回 0
不是自增失败,而是驱动不支持或表结构没配好。MySQL 和 SQL Server 表现完全不同。
- SQL Server(
sqlsrv)默认不支持insert_id(),它依赖SELECT SCOPE_IDENTITY(),需确保插入语句末尾没分号、没多余空格,且表有IDENTITY列 - MySQL 下返回 0,大概率是插入语句没成功执行(比如字段类型不匹配、NOT NULL 字段插了 NULL),别只看
insert_id(),先查$this->db->error() - CI3 中若用了事务且未 commit,
insert_id()在事务内有效,但外部拿不到;CI4 的insert()方法在事务中会自动绑定上下文,但手动query()不会
db_debug 和 save_queries,而测试服务器关了却不自知。每次遇到“查不到数据”,第一反应不该是改代码,而是确认那两行配置值是否真为 TRUE。











