【问题标题】:Codeigniter: Weird behaviour of $this->db->like()Codeigniter:$this->db->like() 的奇怪行为
【发布时间】:2014-04-27 23:03:22
【问题描述】:

我编写了一个简单的查询来在数据库中搜索关键字。

$keyword = "keyword sample"; 
$keyword = str_replace(" ", "%", $keyword);   

$this->db->select('*')->from('table')
           ->like('column', "%".$keyword."%")->get();

现在Codeigniter生成的查询是这样的:

SELECT * FROM (`table`) WHERE `column` LIKE '%keyword\%sample%'

查询中尾随的\ 来自哪里?这是进行错误搜索并且没有返回实际在数据库中的数据。我已经检查了所有内容,我编写的代码似乎没有任何问题。请帮忙!

【问题讨论】:

    标签: codeigniter


    【解决方案1】:

    如果您深入了解 CodeIgniter 的内部结构,您会注意到 $this->db->like() 函数会转义它包含的特殊字符 - 当然包括 %

    我认为like() 不会对您的特定需求有太大帮助。我猜你最好的选择是绕过这个问题并使用包含LIKE 子句的where 函数:

    $this->db->select('*')->from('table')->where("column LIKE '%$keyword%'")->get()->result_array();
    

    【讨论】:

    • ...("column LIKE %$keyword%")... ,别忘了插入单引号,所以应该是 ...("column LIKE '%$keyword% '")...
    • 你说得对,我修正了查询。我的错。
    【解决方案2】:

    使用escape_like_str() 方法。

    当要在LIKE 条件下使用字符串时,应使用escape_like_str() 方法,以便字符串中的LIKE 通配符%_ 也被正确转义。它无法自动为您添加 ESCAPE ! 条件,因此您必须手动添加。

    希望对你有帮助。

    $keyword = "keyword sample"; 
    $sql = "SELECT id FROM table WHERE column LIKE '%" .
    $this->db->escape_like_str($keyword)."%' ESCAPE '!'";
    

    来源:-https://www.codeigniter.com/userguide3/database/queries.html

    【讨论】:

      【解决方案3】:

      你可以这样尝试:

      $this->db->select('*')
      $this->db->from('table');
      $this->db->like('column', $keyword);
      return $this->db->get()->result_array();
      

      如果要控制通配符 (%) 的放置位置,可以使用可选的第三个参数。您的选项是“之前”、“之后”和“两者”(这是默认设置)。

      示例:

      $this->db->select('*')
      $this->db->from('table');
      $this->db->like('column', $keyword, 'before');
      return $this->db->get()->result_array();
      

      如果您不想使用通配符 (%),您可以将选项“none”传递给可选的第三个参数。

      示例:

      $this->db->select('*')
      $this->db->from('table');
      $this->db->like('column', $keyword, 'none');
      return $this->db->get()->result_array();
      

      但是,对于您的示例,您必须像 "%keyword sample%""%keyword%" OR "%simple%" 一样搜索;

      例如:

      $this->db->like('column', 'keyword simple');
      // Produces: WHERE column LIKE '%keyword simple%' 
      

      $this->db->like('column', 'keyword');
      $this->db->or_like('column', 'simple');
      // Produces: WHERE column LIKE '%keyword%' OR column LIKE '%simple%'  
      

      更多,可以阅读CodeIgniter User Guide

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-02
        • 1970-01-01
        相关资源
        最近更新 更多