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

Cob*_*ear 9 codeigniter

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

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

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

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

SELECT * FROM (`table`) WHERE `column` LIKE '%keyword\%sample%'
Run Code Online (Sandbox Code Playgroud)

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

Erm*_*egu 19

你只需这样尝试:

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

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

例:

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

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

例:

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

但是,对于你的例子,你必须要搜索"%keyword sample%",或喜欢"%keyword%" OR "%simple%";

例如:

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

要么

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

更多信息,您可以阅读CodeIgniter用户指南


Sol*_*ear 13

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

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

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

  • ...("列LIKE%$ keyword%")...,不要忘记插入单引号,所以它应该是...("列LIKE'%$ keyword%'")... (3认同)