CodeIgniter "like()" 函数在搜索词中带有 % 通配符
Posted
技术标签:
【中文标题】CodeIgniter "like()" 函数在搜索词中带有 % 通配符【英文标题】:CodeIgniter "like()" function with % wildcard inside search terms 【发布时间】:2015-07-25 13:57:40 【问题描述】:假设我有这样的功能:
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%'
如您所见,%
通配符可以添加到两侧,before
和 after
。
如果我想像这样制作:
... WHERE foo_column LIKE '%match%something%'?
仅供参考,我使用 str_replace()
函数到 change space
到 %
但 codeigniter 始终将 escape
与 slash
一起使用。
它产生如下查询:
... WHERE foo_column LIKE '%match\%something%'
当使用关键字 match something 搜索 match another something 并且 wildcard
在第一个和/或之后似乎不起作用时,这很有用。
【问题讨论】:
【参考方案1】:$this->db->like()
函数转义它包含的特殊字符 - 当然包括 %.
我想,应该是绕过这个问题并使用包含您的 LIKE
子句的 where 函数:
$this->db->select('*')->from('table')
->where("foo_column LIKE %$search%")->get();
【讨论】:
【参考方案2】:为了实现这种功能,我用一些不同的条件更新了你的代码。
注意:这里我手动放置了类别的值并进行了搜索
public function get_list($category = '', $limit = 10, $offset = 0)
$category = 'electronics';
if (!empty($category))
$this->db->where('category', $category);
$search = 'match something';
if (preg_match('/\s/', $search) > 0)
$search = array_map('trim', array_filter(explode(' ', $search)));
foreach ($search as $key => $value)
$this->db->or_like('foo_column', $value);
else if ($search != '')
$this->db->like('foo_column', $search);
$query = $this->db->get('table_name', $limit, $offset);
return $query->result();
这里是$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 another'
,那么它将生成查询
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND
`foo_column` LIKE '%match%' OR `foo_column` LIKE '%something%' OR
`foo_column` LIKE '%another%' LIMIT 10
如果$search = 'match'
它将生成查询
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' AND
`foo_column` LIKE '%match%' LIMIT 10
如果$search = ''
它将生成查询
SELECT * FROM (`table_name`) WHERE `category` = 'electronics' LIMIT 10
【讨论】:
非常感谢,这正是我要找的,也许是添加 $this->db->group_start() 和 $this->db->group_end() 的好方法从 CodeIgniter 3 开始。【参考方案3】:从 3.0.0 开始,使用“查询生成器”(相对于以前的版本“活动记录”),like()
有一个附加参数,可以防止转义匹配字符串:
$this->db->like('foo_column', '%match%something%', 'none', false)
第三个参数 = 'none'
防止附加通配符的前缀/后缀
第 4 个参数 = false
防止嵌入通配符转义
请注意,如果您对匹配字符串使用变量而不是文字,则当第 4 个参数为 false
时,您应该使用 $this->db->escape_like_str($match)
【讨论】:
以上是关于CodeIgniter "like()" 函数在搜索词中带有 % 通配符的主要内容,如果未能解决你的问题,请参考以下文章
动态 Active Record 查询中的 Codeigniter 括号
使用 CodeIgniter Active Record 语句