2013-05-02 166 views
0

我有一個產品頁面,顯示我的網站上出售的所有產品,側面有鏈接以允許用戶縮小結果,例如通過顏色。所以如果他們點擊「紅色」鏈接,只顯示紅色的產品。該數據庫表的設置,使每種顏色的不是「是」或「否」,那麼在點擊鏈接時,查詢看上去像這樣的值:排序MySQL搜索結果返回後

if(isset($_GET['color'])) { 
    $color = filter($_GET['color']); 
    $query = mysql_query("SELECT * FROM products WHERE $color='yes'") or die (mysql_error()); 
} 

後來的後來,我有一個while循環以顯示產品:

<?php 
    while ($result = mysql_fetch_array($query)) { 
    ...Display product info here... 
    } 
?> 

我遇到問題的部分是在返回後對結果進行排序。在頁面上還有其他鏈接可按「價格」和「最新」對返回的結果進行排序。我對如何使用這些排序鏈接的邏輯有困難。

例如,當我點擊「紅色」鏈接後,我只能看到紅色的產品。現在我希望能夠點擊「價格」鏈接,該鏈接應該按照價格僅對紅色產品進行分類。我不知道是否可以在返回後對結果進行排序,或者是否使用附加條件(ORDER BY價格)重新查詢數據庫。如果第二種情況是正確的做法,我該如何將條件附加到先前的查詢並重新查詢數據庫?任何人都可以幫我解決這個問題嗎?我一直在這工作了幾個小時,但沒有運氣!

+0

查詢只是字符串,所以修改查詢應該不那麼困難。你會想使用預先準備好的聲明順便說一句。,或以其他方式使用適當的SQL轉義;你現在擁有的是危險的代碼。 – 2013-05-02 09:16:48

+0

如上所示,我有一個自定義的「過濾器」函數來過濾查詢字符串中的有害輸入。 – 2013-05-02 09:21:04

+0

嗯,好吧,我看到請求值用於列名,這樣準備的語句實際上不會在這種情況下工作。 ..說,你應該仍然可以使用它無論如何= D – 2013-05-02 09:22:58

回答

0

的JavaScript

你需要像

http://tablesorter.com

PHP,

傳遞值和遞增/遞減到服務器端,查詢像

「SELECT * FROM產品WHERE $ color ='yes'order by price「

請使用mysqli

+0

謝謝,但這會奏效。客戶有一個非常具體的設計,這不適合。搜索結果上方只有兩個鏈接,用於按價格和最新進行排序。 – 2013-05-02 09:37:03

+1

然後通過顏色+排序+ DESC/ASC到服務器.... – 2013-05-02 09:41:41

0

只需重新添加ORDER BY子句的查詢。當然這是一個簡單的查詢。

但是,可以將結果讀入數組,然後使用php usort函數將它們按期望的順序排序(但隨後需要在頁面刷新之間存儲細節),或者可以對在客戶端機器上的JavaScript(但你需要下載所有的數據到客戶端,而不是任何分頁速度增益崩潰)

而這樣做內php的例子(沒有測試,所以原諒任何錯別字): -

<?php 

switch (true) 
{ 
    case is_array($_SESSION['details']) AND $_POST['sort_order'] == 'id' : 
     $Details = $_SESSION['details']; 
     usort($Details, 'id_sort'); 
     break; 
    case is_array($_SESSION['details']) AND $_POST['sort_order'] == 'name' : 
     $Details = $_SESSION['details']; 
     usort($Details, 'name_sort'); 
     break; 
    case is_array($_SESSION['details']) AND $_POST['sort_order'] == 'dob' : 
     $Details = $_SESSION['details']; 
     usort($Details, 'dob_sort'); 
     break; 
    case is_array($_SESSION['details']) AND $_POST['sort_order'] == 'home_town' : 
     $Details = $_SESSION['details']; 
     usort($Details, 'home_town_sort'); 
     break; 
    default : 
     $sql = "SELECT id, name, dob, home_town FROM Persons"; 

     $Query = $db->query($sql); 

     $Details = array(); 

     while($row=$db->fetchAssoc($Query)) 
     { 
      $Details[] = $row; 
     } 
     $_SESSION['details'] = $Details; 
     break; 
} 

foreach($Details AS $aDetail) 
{ 
    echo $aDetail['id']."\t".$aDetail['name']."\t".$aDetail['dob']."\t".$aDetail['home_town']."\r\n"; 
} 

function id_sort($a,$b) 
{ 
    $RetVar = 0; 
    switch (true) 
    { 
     case $a['id'] > $b['id'] : 
      $RetVar = 1; 
      break; 
     case $a['id'] < $b['id'] : 
      $RetVar = -1; 
      break; 
     default : 
      $RetVar = 0; 
      break; 
    } 
    return $RetVar; 
} 

function name_sort($a,$b) 
{ 
    $RetVar = 0; 
    switch (true) 
    { 
     case $a['name'] > $b['name'] : 
      $RetVar = 1; 
      break; 
     case $a['name'] < $b['name'] : 
      $RetVar = -1; 
      break; 
     default : 
      switch (true) 
      { 
       case $a['id'] > $b['id'] : 
        $RetVar = 1; 
        break; 
       case $a['id'] < $b['id'] : 
        $RetVar = -1; 
        break; 
       default : 
        $RetVar = 0; 
        break; 
      } 
      break; 
    } 
    return $RetVar; 
} 

function dob_sort($a,$b) 
{ 
    $RetVar = 0; 
    switch (true) 
    { 
     case $a['dob'] > $b['dob'] : 
      $RetVar = 1; 
      break; 
     case $a['dob'] < $b['dob'] : 
      $RetVar = -1; 
      break; 
     default : 
      switch (true) 
      { 
       case $a['name'] > $b['name'] : 
        $RetVar = 1; 
        break; 
       case $a['name'] < $b['name'] : 
        $RetVar = -1; 
        break; 
       default : 
        switch (true) 
        { 
         case $a['id'] > $b['id'] : 
          $RetVar = 1; 
          break; 
         case $a['id'] < $b['id'] : 
          $RetVar = -1; 
          break; 
         default : 
          $RetVar = 0; 
          break; 
        } 
        break; 
      } 
      break; 
    } 
    return $RetVar; 
} 

function home_town_sort($a,$b) 
{ 
    $RetVar = 0; 
    switch (true) 
    { 
     case $a['home_town'] > $b['home_town'] : 
      $RetVar = 1; 
      break; 
     case $a['home_town'] < $b['home_town'] : 
      $RetVar = -1; 
      break; 
     default : 
      switch (true) 
      { 
       case $a['name'] > $b['name'] : 
        $RetVar = 1; 
        break; 
       case $a['name'] < $b['name'] : 
        $RetVar = -1; 
        break; 
       default : 
        switch (true) 
        { 
         case $a['id'] > $b['id'] : 
          $RetVar = 1; 
          break; 
         case $a['id'] < $b['id'] : 
          $RetVar = -1; 
          break; 
         default : 
          $RetVar = 0; 
          break; 
        } 
        break; 
      } 
    } 
    return $RetVar; 
} 

?> 

想法與這是細節被存儲(在我已經使用會話變量,但方程式的例子只要它可以以任何你想要的方式存儲),並且如果找到了細節並且通過了排序順序,那麼它使用usort排序該細節數組。一個函數用於每個排序順序,因此你也可以改變子順序(例如,id應該是唯一的,所以你可以基於這個排序,但在這個例子中的家鄉可能不是唯一的,因此,然後在其中的ID)。

您不必指定降到該級別的排序,但我認爲這個示例值得。

+0

沒有jQuery,它是PHP。我知道如何在簡單的查詢中使用ORDER BY,但我試圖在初始查詢後使用它。如何添加ORDER BY子句來查詢已經完成的? – 2013-05-02 09:43:20

+0

你可以像這樣將它添加到查詢中。您可能需要使用不同的order by子句重新執行查詢,或對已檢索的結果集進行排序(服務器端在php中或在客戶端使用javascript)。 – Kickstart 2013-05-02 09:46:47

+0

你能提供一個簡單的例子來說明如何使用PHP對我檢索的結果集進行排序嗎?我只是看着usort的文檔,並從中得到了一個頭疼的問題! – 2013-05-02 09:49:48