【问题标题】:CodeIgniter "like()" function with % wildcard inside search termsCodeIgniter "like()" 函数在搜索词中带有 % 通配符
【发布时间】: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%'

当使用关键字 ma​​tch something 搜索 ma​​tch another something 并且 wildcard 在第一个和/或之后似乎不起作用时,这很有用。

【问题讨论】:

    标签: php mysql codeigniter query-builder


    【解决方案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)

      【讨论】:

        猜你喜欢
        • 2013-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-24
        • 2014-05-20
        相关资源
        最近更新 更多