我已经编写了一个简单的查询来搜索数据库中的关键字。
$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中实际存在的数据。我已经检查了所有内容,而且我编写的代码似乎没有任何错误。请帮忙!
答案 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