【问题标题】:CodeIgniter/jQuery database filter systemCodeIgniter/jQuery 数据库过滤系统
【发布时间】:2011-06-16 06:05:23
【问题描述】:

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

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

单击过滤器复选框时,我会序列化表单,但我不确定如何将其传递给 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';

【问题讨论】:

  • 因为我在该网址中没有看到 index.php,我假设您正在运行 .htaccess 并将其从网址中删除?

标签: php jquery serialization codeigniter filtering


【解决方案1】:

如果您的 url 正确,您正在尝试将“querystrings”与 codeigniter 结合使用,codeigniter 是基于 uri 段的 url。

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

$config['enable_query_strings'] = FALSE;

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

另外,为了确保您的 url 正确,请尝试在浏览器中直接点击它并传递一些任意数据,并确保您没有收到 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.";
    }       
}

【讨论】:

  • 是的,我已经为查询字符串设置了 codeIgniter,所以在 CI 中我应该循环遍历 $_GET,在返回列表之前添加相关项目?我之前实际上是用一个 switch 语句来做这个的,但我觉得它有点啰嗦。我只是使用 .load() 进行测试,一旦我开始工作,我将切换到 ajax。
  • 更新的答案,附带说明,您没有理由从.load() 切换到$.ajax.load() 的代码少得多,非常适合您的使用,.load()只是一个快捷的ajax函数。
  • 感谢乔恩的帮助。我对直接使用 $_GET 变量持谨慎态度,不知道为什么,但我认为这是错误的。我想我会坚持使用.load,我没有意识到它有一个完整的回调,我可以用它来设置加载动画。再次感谢您的帮助。
  • 没问题的人,是的,使用 $_GET 进行测试语句通常没有问题,我不会直接通过$_GET$_POST 获取信息并尝试留在 CI 输入类中.
【解决方案2】:

更好的方法是使用 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.
       }
   });
});

【讨论】:

  • .load() 不仅是一个 ajax 快捷方式,而且还破坏了常规 $.ajax() 函数的使用。
  • 我使用负载进行快速测试
  • 还是错了,为什么要在data参数中加上'value='?为什么你把它设置为期待'json'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
  • 2013-01-03
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多