2011-01-27 70 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. 
     } 
    }); 
});