CodeIgniter执行原生SQL查询无法获取结果,phpMyAdmin运行正常如何解决
你拿到的返回结果不是SQL执行抛出的错误,是CodeIgniter查询类的原始对象结构,没有正确获取查询结果导致的。以下是具体排查和修正方案:
- 未调用结果获取方法
CodeIgniter中$this->db->query()执行后返回的是查询对象,不会直接返回数据集,需要调用对应的结果提取方法才能拿到数据:- 获取数组格式的结果集:调用
result_array() - 获取对象格式的结果集:调用
result() - 获取单条结果:调用
row()
你现在直接返回查询对象,输出的就是原始的初始化结构,看起来所有字段都是空值。
- 获取数组格式的结果集:调用
- 表前缀不匹配
如果你在CodeIgniter的数据库配置中设置了dbprefix表前缀,原生SQL不会自动给手动写的表名加前缀,会导致找不到matches、teams表,而phpMyAdmin中执行时不需要加前缀所以能正常运行。可以用$this->db->dbprefix('表名')来拼接带前缀的表名适配配置。 - SQL严格模式不兼容
你使用了RIGHT JOIN+GROUP BY的写法,如果数据库开启了ONLY_FULL_GROUP_BY严格模式,这条SQL的分组规则可能不符合要求被拦截。而phpMyAdmin的连接默认可能关闭了严格模式所以可以正常执行。可以在执行查询前先执行$this->db->query("SET sql_mode = ''");临时关闭严格模式验证。
修正后的参考代码:
public function calculateScore() { // 临时关闭严格模式,确认是模式问题后可再优化SQL写法兼容严格模式 // $this->db->query("SET sql_mode = ''"); $team_points = $this->db->query('SELECT teams.team_name, COUNT(matches.winner) AS Win FROM matches RIGHT JOIN teams ON teams.team_name = matches.winner GROUP BY teams.team_name, matches.winner ORDER BY win DESC'); // 提取数组格式的结果返回 return $team_points->result_array(); }
如果需要排查实际的SQL执行错误,可以在执行query后打印$this->db->error(),就能拿到数据库返回的具体错误信息。
内容的提问来源于stack exchange,提问作者user15360495
相关产品推荐
相关产品推荐

