Codeigniter喜欢,or_like并不适合在哪里工作

时间:2016-12-13 04:35:03

标签: php mysql codeigniter where-clause sql-like

我在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的行?

5 个答案:

答案 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可能是几个州。 onoffpending,您需要检查特定州的字段。在您的情况下不一定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控制台中,如果它不正确,它将产生错误。