You need to enable JavaScript to run this app. CodeIgniter执行原生SQL查询无法获取结果,phpMyAdmin运行正常如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 03:48:05