Php CodeIgniter“;like();搜索项中包含%通配符的函数
假设我有这样的函数:Php CodeIgniter“;like();搜索项中包含%通配符的函数,php,mysql,codeigniter,query-builder,Php,Mysql,Codeigniter,Query Builder,假设我有这样的函数: public function get_list($category = '', $limit = 10, $offset = 0) { if (!empty($category)) $this->db->where('category', $category); $search = $this->input->get('search'); if (!empty($search
public function get_list($category = '', $limit = 10, $offset = 0) {
if (!empty($category))
$this->db->where('category', $category);
$search = $this->input->get('search');
if (!empty($search))
$this->db->or_like(array('foo_column'=>$search));
$query = $this->db->get('table_name', $limit, $offset);
//echo $this->db->last_query();
return $query->result();
}
将查询生成为:
SELECT * FROM table_name WHERE foo_column LIKE '%match something%'
正如您所看到的,%
通配符可以添加在两侧,前面
和后面
如果我想生产这样的产品,我该怎么做:
... WHERE foo_column LIKE '%match%something%'?
仅供参考,我使用str_replace()
函数将空格
更改为%
,但代码点火器始终使用斜杠
进行转义。
它生成如下查询:
... WHERE foo_column LIKE '%match\%something%'
当搜索用关键字匹配另一个东西时,这很有用,而且第一个和/或之后的通配符似乎不起作用。函数$This->db->like()
会转义它包含的特殊字符,当然包括%。
我想,应该绕过这个问题,使用一个where函数,其中包含LIKE
子句:
$this->db->select('*')->from('table')
->where("foo_column LIKE %$search%")->get();
为了实现这种功能,我用一些不同的条件更新了您的代码,如
注意:这里我手动放置了类别和搜索的值
此处$search='match something'
将生成如下查询:
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND
`foo_column` LIKE '%match%' OR `foo_column` LIKE '%something%' LIMIT 10
如果$search='match something other'
,它将生成如下查询:
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND
`foo_column` LIKE '%match%' OR `foo_column` LIKE '%something%' OR
`foo_column` LIKE '%another%' LIMIT 10
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND
`foo_column` LIKE '%match%' LIMIT 10
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' LIMIT 10
如果$search='match'
,它将生成如下查询
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND
`foo_column` LIKE '%match%' OR `foo_column` LIKE '%something%' OR
`foo_column` LIKE '%another%' LIMIT 10
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND
`foo_column` LIKE '%match%' LIMIT 10
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' LIMIT 10
如果$search=''
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND
`foo_column` LIKE '%match%' OR `foo_column` LIKE '%something%' OR
`foo_column` LIKE '%another%' LIMIT 10
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND
`foo_column` LIKE '%match%' LIMIT 10
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' LIMIT 10
从3.0.0开始,使用“查询生成器”(与以前版本的“活动记录”相比),like()
有一个额外的参数,用于防止转义匹配字符串:
$this->db->like('foo_column', '%match%something%', 'none', false)
- 第三个参数=
'none'
防止附加通配符字符的前缀/后缀
- 第四个参数=
false
防止嵌入式通配符的转义
注意:如果你对匹配字符串使用一个变量而不是一个文本,那么当第四个参数为false时,你应该使用$this->db->escape\like\u str($match)
非常感谢,这就是我要寻找的,也许从CodeIgniter 3开始添加$this->db->group\u start()和$this->db->group\u end()是一个好方法。