codeigniter like子句覆盖where子句

时间:2013-05-26 17:48:22

标签: sql codeigniter where-clause

至少这似乎正在发生。我正在尝试为网站创建一个搜索栏,它确实有效,除非它没有读取只会撤回已批准内容的where子句。你可以看出为什么会出现这个问题。

无论如何,这就是我在我的模型中所拥有的

$match = $this->input->post('search');      
$this->db->where('approved', 'y');  
$this->db->like('description', $match);
$this->db->or_like('title', $match);
$this->db->or_like('body', $match);
$this->db->or_like('author', $match);

$query = $this->db->get('story_tbl');

return $query->result();

当我打印出查询时,似乎它看到了where子句,但是当我把这些东西拿回来时,就会拉出未经批准或未经审查的内容。

这是我打印的查询

SELECT * FROM (`story_tbl`) WHERE `approved` = 'y' AND `description` LIKE 
'%another%' OR `title` LIKE '%another%' OR `body` LIKE '%another%' OR 
`author` LIKE '%another%'

2 个答案:

答案 0 :(得分:2)

您的查询应该是

SELECT * FROM (`story_tbl`) WHERE `approved` = 'y' AND (`description` LIKE
'%another%' OR `title` LIKE '%another%' OR `body` LIKE '%another%' OR
`author` LIKE '%another%')

检查这些括号。因此,您最好的选择是使用普通$this->db->query()。如果您坚持使用活动记录,则必须对这些括号执行此操作 -

$match = $this->input->post('search');
$this->db->where('approved', 'y');
$this->db->where("(`description` LIKE '%$match%'");
$this->db->or_where("`title` LIKE '%$match%'");
$this->db->or_where("`body` LIKE '%$match%'");
$this->db->or_where("`author` LIKE '%$match%')");
$query = $this->db->get('story_tbl');

编辑:

true AND true OR true OR true    //true
false AND true OR true OR true   //true just like your where clause is ignored
false AND false OR false OR true //Still true
false AND true OR false OR false //false
false AND false OR false OR false //false

因此,此查询将返回所有行,其中approved ='y'或其中title,body,author匹配'another'

在我发布的查询中

true AND (true OR true OR true)    //true
false AND (true OR true OR true)   //false, where clause is checked
true AND (false OR false OR false) //false
true AND (true OR false OR false)  //true

将返回批准的行='y'并且标题或正文或作者或描述与“另一个”匹配。我相信这就是你想要实现的目标。

答案 1 :(得分:0)

您可以为此使用 codeigniters 的 group_start() 和 group_end()。代码可以这样修改

Parser