Система фильтрации базы данных CodeIgniter / jQuery - PullRequest
1 голос
/ 27 января 2011

Я пытаюсь создать систему динамических фильтров, используя ajax с 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. Или есть еще один более эффективный метод фильтрации. Любая помощь приветствуется. Спасибо

EDIT

Моя проблема не заключалась в получении строки запроса, а в том, как с ней справиться в CI. Я закончил тем, что делал это. Это довольно грязно, так что если кто-то может увидеть улучшения, пожалуйста, дайте мне знать. Спасибо

Я только что создал SQL-запрос, используя категории в полученной строке запроса.

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

РЕДАКТИРОВАТЬ ЧАСТЬ 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';

Ответы [ 2 ]

1 голос
/ 27 января 2011

Если ваш URL-адрес правильный, вы пытаетесь использовать «строки запроса» с codeigniter, который является URL-адресом на основе сегмента uri.

в вашем system/applicaiton/config/config.php в строке 151 должна быть эта строка

$config['enable_query_strings'] = FALSE;

Измените это значение на TRUE и посмотрите, позволяет ли это использовать $this->input->get('cat_0'); и $this->input->get('cat_1'); для получения данных из URL.

Кроме того, чтобы убедиться, что ваш URL-адрес правильный, попробуйте нажать его прямо в браузере, передавая некоторые произвольные данные, и убедитесь, что вы не получаете сообщение 404 или 500, но данные возвращаются в браузер как вы ожидаете.

Примечание

Хотя этот метод должен работать, правильный способ отправки данных через .load() состоит в том, чтобы передать их в качестве второго параметра, поэтому для вашего примера $('#list').load('path/to/file', f);

EDIT

Вот как я бы выполнил то, что вы пытаетесь сделать, используя класс ActiveRecord от Codeigniter, и теперь гораздо проще создавать запросы постепенно, как вы пытаетесь это сделать.

<code>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 "
"; } еще { эхо "нет предметов."; } }
0 голосов
/ 27 января 2011

Лучший способ - использовать 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.
       }
   });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...