codeigniter 3 的 like() 方法用于安全模糊查询,自动转义并支持 'before'/'after'/'both' 位置参数;ci4 移至 $builder 实例,需先指定表名,且须用 groupstart()/groupend() 控制逻辑分组。

CodeIgniter 3 的 like() 方法怎么用
CodeIgniter 3 的查询构造器里,like() 是专为 SQL LIKE 模糊匹配设计的,它会自动转义通配符并包裹单引号,避免 SQL 注入。别手写 WHERE name LIKE '%{$keyword}%' —— 那样既不安全也不跨数据库兼容。
基本写法是:$this->db->like('title', 'news') 等价于 WHERE `title` LIKE '%news%';第三个参数可选位置('before'、'after'、'both'),默认是 'both'。
-
$this->db->like('name', 'john', 'after')→LIKE 'john%' -
$this->db->like('email', 'gmail', 'both')→LIKE '%gmail%'(显式写出更清晰) - 多个
like()会用AND连接,如同时查姓名和城市:$this->db->like('name', $kw)->like('city', $kw)
CodeIgniter 4 的 like() 写法和差异
CI4 把查询构造器移到了 $builder 实例上,语法更统一,但行为一致。注意:必须先调用 $this->db->table('users') 或直接用 $builder = $this->db->table('users') 获取构造器对象。
常见错误是漏掉表名或误用链式调用顺序 —— like() 必须在 get() 前调用,且不能脱离 builder 实例单独使用。
- 正确:
$builder->like('title', $q)->get() - 错误:
$this->db->like('title', $q)->get('posts')(CI4 不支持这种旧式写法) - 若需
OR关系,得用orLike():$builder->like('name', $q)->orLike('email', $q)
模糊查询时容易被忽略的转义和性能问题
用户输入含下划线 _ 或百分号 % 时,like() 默认会把它们当通配符处理,导致查不到真实含这些字符的数据。CI3 和 CI4 都支持第四个参数指定转义符,比如 $this->db->like('desc', '100%', '', '\'),生成 LIKE '%100\%' ESCAPE '\'。
另外,LIKE '%keyword'(前导通配符)无法走索引,大数据量时很慢。如果业务允许,优先用 like('name', $kw, 'after')(即 name LIKE 'xxx%'),这样能命中 B-Tree 索引。
- 避免对大字段(如
TEXT)全模糊查,考虑加全文索引或引入 Elasticsearch - CI3 中
escape_like_str()可手动转义,但不如直接传第四个参数干净 - CI4 的
like()第四个参数是string $escape,用法相同
组合模糊 + 精确条件时的注意事项
经常有人把 like() 和 where() 混用后发现结果不对,其实不是 bug,而是 SQL 执行顺序和分组逻辑问题。CI 的查询构造器按调用顺序拼接 WHERE 条件,但不会自动加括号 —— 所以 where('status', 1)->like('name', $q)->orLike('email', $q) 实际生成的是 WHERE status = 1 AND name LIKE '%x%' OR email LIKE '%x%',逻辑优先级可能不符合预期。
这时候必须用 groupStart() / groupEnd() 显式分组:
$builder->where('status', 1)
->groupStart()
->like('name', $q)
->orLike('email', $q)
->groupEnd();
生成的 SQL 就是 WHERE status = 1 AND (name LIKE '%x%' OR email LIKE '%x%')。
CI3 没有原生分组方法,得靠 where() 传数组或手写字符串,复杂查询建议升级到 CI4 或改用 Query Builder 封装层。











