CodeIgniter"喜欢()"在搜索词中使用%wildcard

时间:2015-05-14 04:07:32

标签: 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))
            $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%'

当搜索匹配其他内容与关键字匹配时,以及wildcard首先和/或之后似乎无法正常工作时,此功能非常有用

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

$this->db->like()函数会转义它包含的特殊字符 - 当然包括%.

我想,是绕过问题并使用包含LIKE子句的where函数:

$this->db->select('*')->from('table')
->where("foo_column LIKE %$search%")->get();

答案 2 :(得分:0)

从3.0.0版开始,使用“查询生成器”(相对于以前的版本为“ Active Record”),like()有一个附加参数,可以防止转义匹配字符串:

$this->db->like('foo_column', '%match%something%', 'none', false)
  • 第3个参数= 'none'可防止其他通配符的前缀/后缀
  • 第4个参数= false可以防止转义嵌入的通配符char

请注意,如果您为匹配字符串而不是文字使用变量,则当第四个参数为$this->db->escape_like_str($match)时应使用false