我编写了一个简单的查询,用于在数据库中搜索关键字。
$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%'
查询中尾随的
\
来自哪里?这是进行错误的搜索并且没有返回数据库中实际存在的数据。我已经检查了所有内容,我编写的代码似乎没有任何问题。请帮忙!
你只需这样尝试:
$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用户指南
如果您深入研究 CodeIgniter 的内部结构,您会注意到
$this->db->like()
函数会转义它包含的特殊字符 - 当然包括 %
。
我认为
like()
不会对您的特殊需求有太大帮助。我想,你最好的选择是绕过这个问题并使用包含你的 where
子句的 LIKE
函数:
$this->db->select('*')->from('table')->where("column LIKE '%$keyword%'")->get()->result_array();
使用
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