CodeIgniter / jQuery数据库过滤系统

时间:2011-01-27 00:22:35

标签: php jquery serialization codeigniter filtering

我正在尝试使用带有CodeIgniter&的ajax创建一个动态过滤系统。 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>";
    }       
}

编辑第二部分

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

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';

2 个答案:

答案 0 :(得分:1)

如果您的网址是正确的,那么您正尝试使用codeigniter“querystrings”,这是一个基于uri网段的网址。

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

$config['enable_query_strings'] = FALSE;

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

另外,为确保您的网址正确无误,请尝试直接在浏览器中点击一下,传递一些任意数据,并确保您没有收到404500消息,但数据按预期返回浏览器。

注意

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

修改

这就是我将如何实现您的目标,利用Codeigniter的ActiveRecord类使得逐渐构建查询变得更加简洁,就像您尝试的那样。

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.";
    }       
}

答案 1 :(得分:-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.
       }
   });
});