CodeIgniter报Cannot use CI_DB_mysql_result as array错误如何解决
问题根因说明
你代码中出现结果操作报错、无法取到查询值的核心原因有两个:
- 直接将
$this->db->get()返回的CI_DB结果对象当作数组使用,用$result[0]的方式取值,本身就不符合对象的访问规则 - 之前尝试调用结果处理方法时,误用了其他框架的驼峰命名方法(比如
getResult()),和CodeIgniter原生提供的方法名不匹配
正确取值操作步骤
- 先完成数据库初始化,确保
$this->db是有效的数据库连接实例:如果没有显式加载数据库类,先执行$this->load->database(),否则后续所有db方法调用都会报错 - 正常执行查询拿到结果对象:
$this->db->select('COUNT(choice) as choices_count'); $this->db->from('js_libraries'); $this->db->where('choice', $i); $query = $this->db->get(); - 调用结果对象自带的原生方法取数,CodeIgniter 2/3版本提供的可用方法都是小写命名,不存在驼峰形式的
getResult():- 取单条查询结果(适合你这种COUNT聚合的单值返回场景),用
row_array()把结果转成关联数组:$row = $query->row_array(); $votes = $row['choices_count']; - 取多条查询结果,用
result_array()把结果转成二维数组,再按下标取对应值:$rows = $query->result_array(); $votes = $rows[0]['choices_count'];
- 取单条查询结果(适合你这种COUNT聚合的单值返回场景),用
代码优化建议
你当前的循环写法每一轮都单独执行一次数据库查询,5轮循环就会产生5次独立的数据库请求,性能浪费明显。可以直接用分组查询一次性拿到所有投票的计数:
// 一次性查询全量分组计数 $this->db->select('choice, COUNT(choice) as choices_count'); $this->db->from('js_libraries'); $this->db->group_by('choice'); $count_query = $this->db->get(); // 把结果整理为 「choice值 => 计数值」 的映射数组 $count_map = array_column($count_query->result_array(), 'choices_count', 'choice'); // 循环拼表格时直接从映射数组取值即可 for ($i = 1; $i < 5; $i++) { $votes = $count_map[$i] ?? 0; $table_rows .= "<tr><td>" . $libraries[$i] . " Got:</td><td><b>" . $votes . "</b> votes</td></tr>"; }
之前遇到的“方法不存在”报错,基本是两种场景:一是方法名拼写错误,把CodeIgniter原生的
row_array()、result_array()写成了其他框架的驼峰命名格式;二是没有正确初始化数据库连接,拿到的返回值根本不是CI_DB_result类的实例。
内容的提问来源于stack exchange,提问作者aneela
相关产品推荐
相关产品推荐

