CodeIgniter数值区间数据查询问题:自定义查询返回空结果
解决CodeIgniter中范围查询无结果的问题
你写的查询条件有两处关键问题,导致没查到数据,咱们一步步来修正:
1. 错误的WHERE条件写法
你当前的写法:
$this->db->where('Bond#' >= $data['from']);
PHP会先计算'Bond#' >= $data['from']这个表达式,得到一个布尔值(true/false),再把这个布尔值传给where()方法,这完全不是你想要的SQL查询条件。
2. 特殊字段名的处理
你的字段名是Bond#,其中#在SQL里属于注释符号,直接写会导致数据库解析字段名出错,必须用反引号(MySQL环境下)包裹起来。
正确的写法有三种,选你顺手的就行:
方法一:拆分条件,用参数绑定(推荐,防SQL注入)
$this->db->select('*'); $this->db->from('draw'); // 用反引号包裹特殊字段名,把条件和参数分开传递 $this->db->where('`Bond#` >=', $data['from']); $this->db->where('`Bond#` <=', $data['to']); return $this->db->get();
CodeIgniter会自动帮你转义参数,避免SQL注入风险。
方法二:使用where_between简化范围查询
如果你的需求是查询Bond#在from和to之间的所有数据,用where_between会更简洁:
$this->db->select('*'); $this->db->from('draw'); $this->db->where_between('`Bond#`', $data['from'], $data['to']); return $this->db->get();
这个方法会自动生成WHERE Bond# BETWEEN '值1' AND '值2'的SQL语句,和>=、<=的效果完全一致。
方法三:直接写完整SQL条件(记得手动转义)
如果你习惯写完整的条件字符串,一定要用$this->db->escape()转义参数,防止注入:
$this->db->select('*'); $this->db->from('draw'); $this->db->where('`Bond#` >= ' . $this->db->escape($data['from'])); $this->db->where('`Bond#` <= ' . $this->db->escape($data['to'])); return $this->db->get();
额外检查项
- 确认
$data['from']和$data['to']有有效的数值,不是空值或者不符合字段类型的字符串 - 核对数据库里
draw表的Bond#字段,确实存在>= $data['from']且<= $data['to']的数据 - 如果你的数据库不是MySQL(比如SQL Server),把反引号换成方括号
[Bond#]
内容的提问来源于stack exchange,提问作者Rizwan Gohar
相关产品推荐
相关产品推荐

