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); } }
关键说明
- 语法修正:将条件从
手机号 = referred_by_id改成referred_by_id = '手机号',并给手机号加上单引号,确保数据库将其识别为字符串进行匹配。 - 安全优化:查询绑定(
?占位符)是CodeIgniter推荐的防SQL注入方式,能确保变量被正确解析,避免恶意注入。 - 空值判断:增加
!empty($current_mobile)的判断,防止Session中无手机号时生成无效的WHERE条件。
修改后,执行的SQL会变成:
SELECT * FROM ci_users WHERE referred_by_id = '13800138000'
这样就能正确返回所有referred_by_id等于当前用户手机号的记录了。
内容的提问来源于stack exchange,提问作者ED123
相关产品推荐
相关产品推荐

