2010-07-03 176 views
0

我想讓用戶根據名稱,價格等對mysql查詢進行排序。這個下拉菜單讓他們有能力做到這一點,它根據用戶選擇的內容更改「ORDER BY」子句。這是凌晨3點在這裏,我只是不能看出錯誤:我的代碼有什麼問題?

<?php 
     $sortBy = $_POST['sortBy']; 
     if ($sortBy) { 

      $priceLowToHigh = $_POST['price-low-to-high']; 
      $priceHighToLow = $_POST['price-high-to-low']; 
      $dateMostRecent = $_POST['date-most-recent']; 
      $dateOldest = $_POST['date-oldest']; 
      $alphabeticalOrder = $_POST['alphabetical-order']; 

      if ($priceLowToHigh) { 
       $sortOrder = "price ASC"; 
      } elseif ($priceHighToLow) { 
       $sortOrder = "price DESC"; 
      } elseif ($dateMostRecent) { 
       $sortOrder = "date DESC"; 
      } elseif ($dateOldest) { 
       $sortOrder = "date ASC"; 
      } elseif ($alphabeticalOrder) { 
       $sortOrder = "name ASC"; 
      } 

     } else { 
      $sortOrder = "date DESC"; 
     } 
    ?> 
    <form action="" method="post"> 
     <select name="sortBy" onchange="this.form.submit()"> 
      <option>Sort By</option> 
      <option value="price-low-to-high">Price (low to high)</option> 
      <option value="price-high-to-low">Price (high to low)</option> 
      <option value="date-most-recent">Date (most recent)</option> 
      <option value="date-oldest">Date (oldest)</option> 
      <option value="alphabetical-order">Alphabetical Order</option> 
     </select> 
    </form> 

後來在ORDER BY子句中使用這樣的:

$query = mysql_query("SELECT * FROM products WHERE category = $categoryId ORDER BY $sortOrder"); 
+0

不應該表單標籤有一個值的行動?像當前頁面的名稱一樣...發佈到哪裏? – 2010-07-03 06:13:49

+2

不一定,因爲默認值是當前頁面。 – spinon 2010-07-03 06:14:14

回答

4

您正在錯誤地處理菜單。您的$ sortBy變量將已經是用戶選擇的內容,而不是單獨的$ _POST字段。

這是你應該做的,而不是 -

<?php 
    $sortBy = $_POST['sortBy']; 
    if($sortBy == 'price-low-to-high') { 
     $sortOrder = "price ASC"; 
    } else if($sortBy == 'price-high-to-low') { 
     $sortOrder = "price DESC"; 
    } else if($sortBy == 'date-most-recent') { 
     $sortOrder = "date DESC"; 
    } else if($sortBy == 'date-oldest') { 
     $sortOrder = "date ASC"; 
    } else if($sortBy == 'alphabetical-order') { 
     $sortOrder = "name ASC"; 
    } else { 
     $sortOrder = "date DESC"; 
    } 
?> 
+0

事實上,除了檢測他們是否選擇執行自定義排序外,他並未使用排序。之後你可以看到他正在檢查單個帖子字段以查看正在使用哪一個。 – spinon 2010-07-03 06:16:09

+0

如果沒有選擇選項,上面的代碼將默認不使用,就像他發佈的原始代碼一樣。除了我發佈的作品=) – 2010-07-03 06:19:41

+0

對不起,我猜我錯了。我假設有另一個字段正在填充名稱。但我認爲你其實是對的。 – spinon 2010-07-03 06:19:56

0

看來你的代碼是在雙引號時,它應該是在單個有PHP做代替你的代碼。你應該把這個sql打印到屏幕上,你會發現它很可能不會取代這個值。

我指的是您進行mysql_query調用的行。

0

你的基本代碼是一個有點不對勁。它應該是以下內容: -

<?php 
$sortBy = $_POST['sortBy']; 

if($sortBy == 'price-low-to-high') 
    $sortOrder = "price ASC"; 
else if($sortBy == 'price-high-to-low') 
    $sortOrder = "price DESC"; 
else if($sortBy == 'date-most-recent') 
    $sortOrder = "date DESC"; 
else if($sortBy == 'date-oldest') 
    $sortOrder = "date ASC"; 
else if($sortBy == 'alphabetical-order') 
    $sortOrder = "name ASC"; 
else 
    $sortOrder = "date DESC"; 
?> 

<form action="" method="post"> 
     <select name="sortBy" onchange="this.form.submit()"> 
      <option>Sort By</option> 
      <option value="price-low-to-high">Price (low to high)</option> 
      <option value="price-high-to-low">Price (high to low)</option> 
      <option value="date-most-recent">Date (most recent)</option> 
      <option value="date-oldest">Date (oldest)</option> 
      <option value="alphabetical-order">Alphabetical Order</option> 
     </select> 
</form> 

我認爲如果將代碼更改爲上面的代碼,現在就可以工作了。

希望它有幫助。

1

我不能評論你的答案拉斐爾,因爲我不夠高,但我只是想提及可能使用switch語句的可讀性。但你在那裏。 Upvote