2011-01-27 38 views
1

我想创建一个动态过滤系统,使用与CodeIgniter的AJAX & jQuery。CodeIgniter/jQuery数据库过滤系统

我有一个从我的数据库中拉出的项目列表,以及用于过滤这些项目的复选框列表。 我希望能够选择多个复选框,以允许使用各种过滤器。

当单击过滤器复选框时,我会序列化表单,但我不确定如何将它传递给codeigniter以及如何处理它。 到目前为止,我已经尝试过,将查询字符串中的序列化数据。

$('#filter input').bind('change', function(){ 
    var f = $('#filter').serialize(); 
    $('#list').load('http://localhost/testing/filter?'+f); 
}); 

我的序列化表单返回以下内容,对应于过滤器复选框。

cat_0=1&cat_1=1 

在CodeIgniter中,我可以很容易地创建这个sql查询,查询数据库并返回与过滤器匹配的项目。

SELECT * FROM `items` WHERE `category` ='0' OR `category` ='1' 

我想我的主要问题是从我的序列化表单获取类别信息CodeIgniter。或者还有另一种更有效的过滤方法。 任何帮助将不胜感激。由于

编辑

我的问题是不接受查询字符串,它是如何在CI处理。我最终这样做了。这是非常混乱,所以如果任何人都可以看到改善,请让我知道。谢谢

我刚刚建立一个SQL查询使用收到的查询字符串中的类别。

function filter(){ 

    if($this->input->get('cat_0', true)) { 
     $a[] = " OR `category` = '0'"; 
    } 
    if($this->input->get('cat_1', true)) { 
     $a[] = " OR `category` = '1'"; 
    } 
    if($this->input->get('cat_2', true)) { 
     $a[] = " OR `category` = '2'"; 
    } 
    if($this->input->get('cat_3', true)) { 
     $a[] = " OR `category` = '3'"; 
    } 
    if($this->input->get('cat_4', true)) { 
     $a[] = " OR `category` = '4'"; 
    } 
    if($this->input->get('cat_5', true)) { 
     $a[] = " OR `category` = '5'"; 
    } 
    if($this->input->get('cat_6', true)) { 
     $a[] = " OR `category` = '6'"; 
    } 

    if(!isset($a)){ 
     echo "no items"; 
    } else { 
     $sql = 'SELECT * FROM `items` WHERE '; 
     $a[0] = str_replace(" OR ", "", $a[0]); //remove 'OR' from first 
     foreach($a as $b){ 
      $sql = $sql.$b; 
     }  
     echo "<pre>"; 
      print_r($this->db->query($sql)->result()); 
     echo "</pre>"; 
    }  
} 

编辑部分II

我回来到这个问题,我现在需要用户名检查添加到查询。我已经尝试了以下机智,现在运气。

function filter(){ 

    $this->db->where('username', $this->ion_auth->profile()->username); 

    foreach($_GET as $key=>$value){ 
     if($value == 1){ 
      $key = explode('_', $key); 
      $this->db->or_where('cat', $key[1]);     
     } 
    } 

    print_r($this->db->get('items')->result()); 
     } 

这是我需要创建并在我的数据库中工作的SQL语句。

SELECT * FROM `items` WHERE `username` = 'tmp_username' AND `cat` = '0' OR `cat` = '6'; 
+0

因为我没有在该网址中看到index.php,我假设你正在运行.htaccess并将其从网址中删除? – jondavidjohn 2011-01-27 02:35:25

回答

1

如果你的网址是正确的,你试图使用“querystrings”codeigniter这是一个基于URI的网段。

system/applicaiton/config/config.php上线151应该有这条​​线

$config['enable_query_strings'] = FALSE; 

更改此值以TRUE,看看是否允许您使用$this->input->get('cat_0');$this->input->get('cat_1');从URL抓取数据。

此外,为确保您的网址是正确的,请尝试直接打在浏览器中通过一些任意数据,并确保你没有得到一个404500消息,但数据返回给像您期望的浏览器。

注意

虽然这种方法应该工作,通过​​发送数据正确的做法是把它作为第二个参数,所以你的例子$('#list').load('path/to/file', f);

编辑

这就是我将如何完成你想要的,利用Codeigniter的ActiveRecord Class使得它像你试图做的那样慢慢地构建查询。

function filter(){ 

    foreach($_GET as $key=>$value) { 
     if ($value == 1) { 
      $key = explode('_',$key); 
      $this->db->or_where('category', $key[1]); 
     } 
    } 

    if(count($_GET) > 0){ 
     $query = $this->db->get('items'); 
     echo "<pre>"; 
      print_r($query->result()); 
     echo "</pre>"; 
    } else { 
     echo "no items."; 
    }  
} 
+0

是啊我有我的codeIgniter安装查询字符串,所以在内部CI我应该循环通过$ _GET,在返回列表之前添加相关项目?实际上,我之前是通过switch语句来做这件事的,但是觉得它有点冗长。我只是使用.load()进行测试,一旦我使用它,我就会切换到ajax。 – michael 2011-01-27 11:54:09

+0

更新了答案,在附注中,没有理由从`.load()`切换到`$ .ajax`,`.load()`是更少的代码并且完全适合您的使用。 load()`就是一个简单的ajax函数。 – jondavidjohn 2011-01-27 13:53:36

-1

更好的方法是使用ajax将数据传递到您的控制器。

$('#filter input').bind('change', function(){ 
    var f = $('#filter').serialize(); 
    $.ajax({ 
     type: "POST", 
     url: "http://localhost/testing/filter", 
     data: "value="+f,  
     dataType: "json", 
     success: function(data){ 
      //code after success. 
     } 
    }); 
});