Php CodeIgniter/jQuery数据库过滤系统

Php CodeIgniter/jQuery数据库过滤系统,php,jquery,serialization,codeigniter,filtering,Php,Jquery,Serialization,Codeigniter,Filtering,我正在尝试使用ajax和CodeIgniter&jQuery创建一个动态过滤系统 我有一个从数据库中提取的项目列表,以及一个用于筛选这些项目的复选框列表。 我想能够选择多个复选框,允许各种过滤器 当点击过滤器复选框时,我序列化了表单,但我不确定如何将其传递给codeigniter以及如何处理它。 到目前为止,我已经尝试过这样做,在查询字符串中传递序列化数据 $('#filter input').bind('change', function(){ var f = $('#filter')

我正在尝试使用ajax和CodeIgniter&jQuery创建一个动态过滤系统

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

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

$('#filter input').bind('change', function(){
    var f = $('#filter').serialize();
    $('#list').load('http://localhost/testing/filter?'+f);
});
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>";
    }       
}
我的序列化表单返回与筛选器复选框对应的以下内容

cat_0=1&cat_1=1
在CodeIgniter中,我可以轻松创建这个sql查询,查询数据库并返回与过滤器匹配的项

SELECT * FROM `items` WHERE `category` ='0' OR `category` ='1'
我想我的主要问题是从序列化表单中获取类别信息到CodeIgniter中。还是有其他更有效的过滤方法。 任何帮助都将不胜感激。谢谢

编辑

我的问题不是接收查询字符串,而是如何在CI中处理它。最后我做了这个。这是相当混乱,所以如果有人可以看到改进,请让我知道。谢谢

我刚刚使用收到的查询字符串中的类别构建了一个sql查询

$('#filter input').bind('change', function(){
    var f = $('#filter').serialize();
    $('#list').load('http://localhost/testing/filter?'+f);
});
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>";
    }       
}
这是我需要在数据库中创建和使用的SQL语句

$config['enable_query_strings'] = FALSE;

如果您的url是正确的,那么您正在尝试将QueryString与codeigniter一起使用,这是一个基于uri段的url

在第151行的system/application/config/config.php中,应该有这一行

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.";
    }       
}
将此值更改为TRUE,然后查看是否允许您使用$this->input->get'cat_0';和$this->input->get'cat_1';从url获取数据

此外,为了确保您的url是正确的,请尝试在浏览器中直接点击它,传递一些任意数据,并确保您没有收到404或500消息,而是按照预期将数据返回到浏览器

虽然此方法应该可以工作,但通过.load发送数据的正确方法是将其作为第二个参数传递,因此对于您的示例$'list'.load'path/to/file',f

编辑

这就是我将如何完成您所尝试的,利用Codeigniter的ActiveRecord类可以让您逐步地构建查询变得不那么麻烦

$('#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.
       }
   });
});

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


由于我在该url中没有看到index.php,我假设您正在运行.htaccess并将其从url中删除?不仅是.load是一个ajax快捷方式,还破坏了常规$.ajax函数的使用。我使用load是为了快速测试。这仍然是错误的,为什么要在数据参数中添加'value='呢?为什么要将它设置为需要“json”?是的,我为查询字符串设置了codeIgniter,所以在CI中,我应该循环使用$\u GET,在返回列表之前添加相关项?实际上,我以前是用switch语句来做这件事的,但我觉得这有点冗长。我只是使用.load进行测试,一旦它运行起来,我将切换到ajax。更新的答案,附带说明,您没有理由从.load切换到$.ajax。load的代码少得多,非常适合您的使用。load只是一个快捷的ajax功能。谢谢您的帮助jon。我担心直接使用$\u GET变量,不知道为什么,但我认为这是错误的。我想我会坚持使用.load,我没有意识到它有一个完整的回调,我可以用来设置加载动画。再次感谢您的帮助。没问题,伙计,是的,使用$\u-GET作为测试语句通常没有问题,我不会直接通过$\u-GET或$\u-POST获取信息,并尝试保持在CI输入类中。