CodeIgniter如何正确查询筛选字段值为null?多种写法无效
CodeIgniter 筛选字段值为 NULL 的实现方案
错误写法失效原因
你之前尝试的三种写法都无法生效,核心原因和CodeIgniter查询构造器的默认转义规则、SQL本身的NULL判断语法有关:
- 直接传整段条件字符串:
$this->db->where('uu.usuario_grupo_id is null');
查询构造器默认会对where入参做自动转义,这段带逻辑判断的字符串会被识别为字段名,自动包裹反引号,最终生成的SQL语法完全错误。 - 传入null作为判断值:
$this->db->where('uu.usuario_grupo_id =', null);
首先SQL语法不支持用=匹配NULL值,必须使用IS NULL;其次查询构造器默认会将传入的null参数转义为空字符串,最终生成uu.usuario_grupo_id = ''的条件,只能匹配空字符串,无法匹配真实的NULL字段。 - 传入字符串形式的null:
$this->db->where('uu.usuario_grupo_id =', 'null');
该写法会把字符串null当作普通值转义,最终生成uu.usuario_grupo_id = 'null'的条件,只能匹配字段值为"null"字符串的记录,和SQL的NULL值完全无关。
正确实现方式
- 优先使用内置NULL判断方法(CI 3.0+ / 全版本CI 4支持)
查询构造器已经提供了专门的NULL判断方法,无需手动处理转义逻辑:// 筛选字段为NULL的记录 $this->db->where_null('uu.usuario_grupo_id'); // 如需筛选非NULL记录,调用where_not_null即可 $this->db->where_not_null('uu.usuario_grupo_id'); - 低版本CI兼容写法
如果使用的CI版本没有内置where_null方法,可以通过关闭条件自动转义的方式实现,将where方法的第三个参数设为FALSE即可跳过自动转义:$this->db->where('uu.usuario_grupo_id IS NULL', NULL, FALSE);
安全提示:关闭自动转义的写法仅适用于条件完全可控的场景,不要将用户输入的内容直接拼接进原生条件,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者Raiuri Santos
相关产品推荐
相关产品推荐

