Codeigniter:$ this-> db-> like()的奇怪行为

时间:2014-03-20 20:21:31

标签: codeigniter

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

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

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

3 个答案:

答案 0 :(得分:18)

你只需这样试试:

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

OR

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

更多信息,您可以阅读CodeIgniter User Guide

答案 1 :(得分:13)

如果你在CodeIgniter的内部挖掘一下,你会发现$this->db->like()函数会转义它包含的特殊字符 - 当然包括%

我认为like()不会对您的特殊需求有所帮助。我猜你最好的办法就是绕过问题并使用包含where子句的LIKE函数:

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

答案 2 :(得分:0)

使用escape_like_str()方法。

escape_like_str()条件中使用字符串时,应使用LIKE方法,以便字符串中的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