我在codeigniter应用中发现了一个问题。我使用4种不同的喜欢和or_like编写了一个简单的搜索查询。
$q = $this->db->select('*')
->from('table')
->like('col', $search_string1, both)
->or_like('col', $search_string2, both)
->or_like('col', $search_string3, both)
->or_like('col', $search_string4, both)
->get()->results
它按照我的意愿工作,但我决定在我的表中添加一个名为" active"并且我只想显示活动的行= 1.所以我尝试添加查询的位置,但它没有像我预期的那样工作。
$q = $this->db->select('*')
->from('table')
->where('active', 1)
->like('col', $search_string1, both)
->or_like('col', $search_string2, both)
->or_like('col', $search_string3, both)
->or_like('col', $search_string4, both)
->get()->results
此查询还显示活动设置为0的行。如何修复它以仅在codeigniter中显示active = 1的行?
答案 0 :(得分:6)
您好,请使用以下代码
$q = $this->db->select('*')
->from('table')
->where('active', 1)
->where("(col LIKE '%".$search_string1."%' OR col LIKE '%".$search_string2."%' OR col LIKE '%".$search_string3."%' OR col LIKE '%".$search_string4."%')", NULL, FALSE)
->get()->results;
由于
答案 1 :(得分:5)
有关@ Roshan代码的解释,因为对于在CI中学习SQL的人来说,答案可能并不明显。 (我还修复了代码中的错误。)
$q = $this->db
// ->select('*') // you don't need select('*') if you want everything
// ->from('table') // Don't need this either
->where('active', 1)
->where("(col LIKE '%".$search_string1."%' OR col LIKE '%".$search_string2."%' OR col LIKE '%".$search_string3."%' OR col LIKE '%".$search_string4."%')", NULL, FALSE)
->get('table') // add your table name here
->result(); // it's not "->results"
所以你的最终查询看起来像这样:
$q = $this->db->where('active', 1)
->where("(col LIKE '%".$search_string1."%' OR col LIKE '%".$search_string2."%' OR col LIKE '%".$search_string3."%' OR col LIKE '%".$search_string4."%')", NULL, FALSE)
->get('table')
->result();
以上是上述问题:
"get all results from 'table'
where active = 1 AND `col` = search_string1
OR where active = 1 AND `col` = search_string2
OR where active = 1 AND `col` = search_string3
OR where active = 1 AND `col` = search_string4
Then assign the result object to $q
查看它的一种更简单的方法,但编写代码的方式更复杂(但可能更容易理解):
$q = $this->db
// where active=1 AND col LIKE %$search_string1%
->where('active', 1)
->like('col', $search_string1, 'both')
// OR where active=1 AND col LIKE %$search_string2%
->or_where('active', 1)
->like('col', $search_string2, 'both')
// OR where active=1 AND col LIKE %$search_string3%
->or_where('active', 1)
->like('col', $search_string3, 'both')
// OR where active=1 AND col LIKE %$search_string4%
->or_where('active', 1)
->like('col', $search_string4, 'both')
->get('table')
->result();
有时您需要这样做。例如,如果active
可能是几个州。 on
,off
,pending
,您需要检查特定州的字段。在您的情况下不一定active
始终为1,但如果active
可以多于您想要的一件事,那么您必须将其拼写出来查询构建器。
答案 2 :(得分:2)
您也可以使用query grouping。
代码如下:
$this->db->where('active', 1);
$this->db->group_start();
$this->db->or_like('col', $search_string1, both)
$this->db->or_like('col', $search_string2, both)
$this->db->or_like('col', $search_string3, both)
$this->db->or_like('col', $search_string4, both)
$this->db->group_end();
$q = $this->db->get('table')->result();
使用group_start和group_end可以确保在此之间的or_like语句的这一部分将放在括号中。
答案 3 :(得分:0)
如果您将要使用数据表服务器端处理,则可能还会遇到此问题,但这是解决方法。
if(!empty($search_val)) {
$x=0;
$this->db->group_start();
foreach($columns as $s_col) {
if($x==0) {
$this->db->like($s_col,$search_val);
}else {
$this->db->or_like($s_col,$search_val);
}
$x++;
}
$this->db->group_end();
}
答案 4 :(得分:-1)
在查询后添加以下行:
echo $ this-> db-> last_query(); die;
它将显示触发的查询,您将知道它出错的地方。如果你还没有得到任何东西,只需复制整个查询并粘贴在MySQL控制台中,如果它不正确,它将产生错误。