CodeIgniter 3 中 row() 查询无结果时返回 null,直接访问属性会报错;应先用 isset() 或 row_array() 判断,推荐配合 limit(1) 使用,并在模糊场景改用 row_array() 提升安全性。

在 CodeIgniter 3 中,row() 是获取单条数据库记录最常用的方法,但它极易因忽略空结果而引发 PHP 错误。关键不在于“怎么调”,而在于“怎么安全地调”。
row() 返回 null 的真实原因
当查询无匹配数据时,row() 明确返回 null,而非空对象或空数组。直接链式访问属性(如 $query->row()->name)会触发 “Trying to get property of non-object” 错误。
- 这是 CI3 的设计行为,并非 Bug
- 即使 SQL 语法正确、连接正常,只要 WHERE 条件没命中,就返回 null
- 常见于按 ID 查询、唯一字段查找、统计汇总类查询(如 SUM + GROUP BY 后无数据)
安全调用的三种写法
避免运行时错误,必须先判断结果是否存在:
-
isset() 判断:
$row = $query->row(); if (isset($row->name)) { echo $row->name; } -
三元运算符简化:
$name = $query->row() ? $query->row()->name : 'N/A';(注意:两次调用 row(),不推荐高频场景) -
更推荐:row_array() + array_key_exists():
$row = $query->row_array(); if (is_array($row) && array_key_exists('name', $row)) { echo $row['name']; }—— 类型更明确,调试友好,兼容性更强
配合 where 和 limit 使用的注意事项
row() 本身不带 LIMIT,但它的语义是“取第一行”,所以常和 limit(1) 配合使用,提高数据库效率并明确意图:
- ✅ 推荐写法:
$this->db->where('id', $id)->limit(1)->get('users')->row(); - ❌ 不推荐:
$this->db->where('id', $id)->get('users')->row();(虽能工作,但未显式限制,对优化器不友好) - 日期等条件务必格式统一,例如:
$this->db->where('created_at >=', '2026-08-01');,避免传入时间戳或格式混乱字符串
替代方案:什么时候该换用 result() 或 row_array()
row() 适合确定只有一条、且需快速提取的场景;但若逻辑中存在“可能一条,也可能没有”的模糊判断,建议统一用 row_array():
- 返回数组,可直接用
empty()、isset()或array_key_exists()判断,无类型风险 - 便于后续转 JSON、写入日志或做默认值 fallback(如
$data['status'] ?? 'pending') - 与模型层返回约定更一致,减少控制器中混合对象/数组的混乱

















