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%'

如您所见,% 通配符可以添加到两侧,beforeafter

如果我想像这样制作:

... WHERE foo_column LIKE '%match%something%'?

仅供参考,我使用 str_replace() 函数到 change space%codeigniter 始终将 escapeslash 一起使用。 它产生如下查询:

... WHERE foo_column LIKE '%match\%something%'

当使用关键字 ma​​tch something 搜索 ma​​tch 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 语句

CodeIgniter数据库搜索

搜索一个单词,就像我在codeigniter中的文本框中给出的不完全一样

Codeigniter自动完成模型

使用 codeigniter 将变量传递给 SELECT 子句