ci的query()返回ci_db_result对象,需调用result_array()或row_array()转数组;前者得二维关联数组,后者得一维数组;直接print_r($query)不可见数据,因数据存于私有属性。

query() 返回的对象怎么转成数组
CodeIgniter 的 query() 方法默认返回一个 CI_DB_result 对象,不是数组。直接 print_r($query) 看不到数据,必须调用结果方法提取。
- 用
$query->result_array()获取关联索引的二维数组(每行是普通数组) - 用
$query->result()得到对象数组,再用(array)强转单行可行,但不推荐——嵌套对象属性会丢失或报错 - 如果只查一行且确定有结果,可用
$query->row_array()直接得一维数组 -
result_array()和row_array()是最安全、最常用的转换方式,底层已处理空结果、字段名大小写等细节
Active Record 查询后怎么拿到数组
用 get()、get_where() 或 get_compiled_select() 配合 query() 执行后,流程和原生 query() 一致,仍需调用结果方法。
-
$this->db->select('*')->from('users')->where('id', 1)->get()->row_array()→ 返回一维数组 -
$this->db->get('posts')->result_array()→ 返回二维数组,键名全为小写(MySQL 默认行为,与字段定义大小写无关) - 注意:Active Record 不支持在
get()后链式调用result_array(),必须先执行get()得到结果对象,再调方法 - 若启用了
strict_on或使用了严格模式数据库,字段别名带大写字母时,result_array()中的键名仍为小写——这是 PDO/MySQL 驱动层决定的,无法通过 CI 配置改
为什么 print_r($query) 看不到数据?
因为 $query 是对象,不是数组,其数据存储在私有属性中,PHP 默认不显示。常见错误是误以为“执行完 query 就能直接 foreach”。
- 错误写法:
foreach ($query as $row) { ... }→ 报 Warning: Invalid argument supplied for foreach() - 正确写法:
foreach ($query->result_array() as $row) { ... } - 调试时想快速看数据,用
print_r($query->result_array()),而不是print_r($query) - 如果查询无结果,
result_array()返回空数组[],不会报错;但row_array()返回NULL,需判空
性能和内存要注意什么
所有 result_* 方法都会把全部结果一次性载入内存。大数据集下容易 OOM,尤其用 result_array() 时,比 result() 多一次数组拷贝。
- 查 10 万行?别用
result_array(),改用unbuffered_row_array()(CI 3.1.11+)或手动while ($row = $query->unbuffered_row('array')) -
unbuffered_row('array')每次只取一行,内存恒定,但只能正向遍历一次,不能 rewind - CI 4 已废弃
unbuffered_row,改用getResultArray()+ 游标分页更稳妥 - 如果只是要统计行数,用
$query->num_rows(),别result_array()再count()











