CodeIgniter 的 $this->db->like() 方法会自动转义输入字符串中的百分比符号

问题描述 投票:0回答:3

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

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

查询中尾随的

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

php codeigniter activerecord query-builder
3个回答
23
投票

你只需这样尝试:

$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用户指南


14
投票

如果您深入研究 CodeIgniter 的内部结构,您会注意到

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

我认为

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

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

2
投票

使用

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

© www.soinside.com 2019 - 2024. All rights reserved.