You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter中使用datatable_json查询推荐用户数据异常求助

问题排查与解决方案

你的代码核心问题出在SQL条件的语法错误,导致数据库无法正确解析匹配逻辑,同时还存在潜在的SQL注入风险。

问题根源

你在构造WHERE条件时,直接把Session中的手机号拼进了SQL字符串:

$wh[] = "$this->session->userdata('mobile_no') = referred_by_id";

这段代码会生成类似13800138000 = referred_by_id的条件,数据库会把13800138000当成数值/列名,而不是字符串去匹配referred_by_id字段,这就导致条件逻辑完全错误,自然只能返回随机的1条结果(甚至可能是巧合匹配)。

另外,直接将变量拼接进SQL的写法存在SQL注入风险,即使是Session中的数据也不推荐。

修正后的代码

Model层(推荐使用查询绑定,安全防注入)

public function get_all_users(){
    $wh = array();
    $SQL = 'SELECT * FROM ci_users';
    // 先取出Session中的手机号,单独存储更清晰
    $current_mobile = $this->session->userdata('mobile_no');

    // 仅当手机号存在时添加条件
    if (!empty($current_mobile)) {
        // 使用查询占位符?,避免SQL注入,同时让数据库正确识别字符串类型
        $wh[] = "referred_by_id = ?";
        // 准备绑定参数
        $bind_params = array($current_mobile);
    }
    
    if(count($wh) > 0)
    {
        $WHERE = implode(' and ', $wh);
        // 将绑定参数传递给LoadJson方法(需要确认你的datatable类支持参数绑定)
        return $this->datatable->LoadJson($SQL, $WHERE, $bind_params ?? array());
    }
    else
    {
        return $this->datatable->LoadJson($SQL);
    }
}

备选方案(如果datatable类不支持参数绑定)

如果你的LoadJson方法不支持接收绑定参数,可以暂时用带单引号的字符串拼接(确保手机号是经过验证的,无注入风险):

public function get_all_users(){
    $wh = array();
    $SQL = 'SELECT * FROM ci_users';
    $current_mobile = $this->session->userdata('mobile_no');

    if (!empty($current_mobile)) {
        // 给字符串值加上单引号,让数据库正确解析
        $wh[] = "referred_by_id = '$current_mobile'";
    }
    
    if(count($wh) > 0)
    {
        $WHERE = implode(' and ', $wh);
        return $this->datatable->LoadJson($SQL, $WHERE);
    }
    else
    {
        return $this->datatable->LoadJson($SQL);
    }
}

关键说明

  1. 语法修正:将条件从手机号 = referred_by_id改成referred_by_id = '手机号',并给手机号加上单引号,确保数据库将其识别为字符串进行匹配。
  2. 安全优化:查询绑定(?占位符)是CodeIgniter推荐的防SQL注入方式,能确保变量被正确解析,避免恶意注入。
  3. 空值判断:增加!empty($current_mobile)的判断,防止Session中无手机号时生成无效的WHERE条件。

修改后,执行的SQL会变成:

SELECT * FROM ci_users WHERE referred_by_id = '13800138000'

这样就能正确返回所有referred_by_id等于当前用户手机号的记录了。

内容的提问来源于stack exchange,提问作者ED123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:28:15