2012-02-21 133 views
2

我一直在堅持這一點,我一直把自己通過PHP的速成課程整個一週製作一個假的亞馬遜網站!我想用一個下拉菜單來訂購我的桌子,但無法解決問題!我知道SQL多數民衆贊成在容易一點,但我試圖做的事情是這樣如下:PHP - 使用下拉菜單對列表進行排序

設置變量,例如

$query = "SELECT bookname, bookauthor, bookpub, bookisbn 
       FROM booktable 
       ORDER BY bookname ASC"; 

$query2 = "SELECT bookname, bookauthor, bookpub, bookisbn 
      FROM booktable 
      ORDER BY bookauthor ASC"; 

然後,我有我的形式=

<form name="sort" action="products.php" method="post"> 
<select name="order"> 
    <option value="choose">Make A Selection</option> 
    <option value="title">Title</option> 
    <option value="author">Author</option> 
    <option value="publisher">Publisher</option> 
    <option value="isbn">Book ISBN-10</option> 
</select> 
<input type="submit" value=" - Sort - " /> 
</form> 

現在對位我不能這樣做,

我設置的變量:

$sort = $_POST['order']; 

這樣無論在下拉菜單中的值,將成爲賦給變量$排序.....(是嗎?)

那麼我想說的IF值$排序爲同樣可以說'作者'比$ query = $ query2 ,但我不知道如何說出它沒有巨大的錯誤禮貌XAMPP!

我希望這一切是有道理的,我的方法,試圖實現它是接近正確

謝謝

+0

'if(isset($ _ POST ['order'])&& $ _POST ['order'] =='author'){// run query 2} else {// run query one}' – PeeHaa 2012-02-21 23:51:35

+0

*「is那對嗎?「」是的!「 – hakre 2012-02-21 23:53:10

回答

5

排序我會做到以下幾點:

更改選項值從表中匹配列名 設置包括默認排序選項,如果他們沒有選擇任何東西:

$sort=$_POST["order"]!="choose"?$_POST["order"]:"bookname"; 

則只需設置查詢中使用:

ORDER BY ".mysql_real_escape_string($sort)." ASC 

這樣,你只需要一個查詢,而不是針對每種情況的查詢。

+0

非常感謝你....這似乎相對簡單,但我距離它幾英里!謝謝! – Phil 2012-02-22 00:06:17

+0

高興地幫助:) – Avanche 2012-02-22 00:07:44

+0

+1爲SQL注入預防 – apfelbox 2012-02-22 14:07:36

2

該類型排序你不需要2次或3的查詢你可以用這個

<?php 
$sort = @$_POST['order']; 
if (!empty($sort)) { // If you Sort it with value of your select options 
echo $query = "SELECT bookname, bookauthor, bookpub, bookisbn 
       FROM booktable 
       ORDER BY '".$sort."' ASC"; 

} else { // else if you do not pass any value from select option will return this 
echo $query = "SELECT bookname, bookauthor, bookpub, bookisbn 
       FROM booktable 
       ORDER BY bookname ASC"; 
} 
?> 


<form name="sort" action="" method="post"> 
<select name="order"> 
    <option value="choose">Make A Selection</option> 
    <option value="title">Title</option> 
    <option value="author">Author</option> 
    <option value="publisher">Publisher</option> 
    <option value="isbn">Book ISBN-10</option> 
</select> 
<input type="submit" value=" - Sort - " /> 
</form> 
+0

只是測試它.... – 2012-02-21 23:58:21

+0

雖然之前的答案出來(不知道誰給出的答案,但他先回答),但你的答案幫了很多非常感謝你 – Phil 2012-02-22 00:07:04

1

做到這一點有許多方法可以做到這一點,但我們堅持自己的基本方法 - 使用您的SQL的ORDER BY子句爲您進行排序。您需要做的是修改您的查詢(或使用不同的查詢),具體取決於用戶使用下拉列表進行的選擇。這裏是我會做什麼:

$query = 'SELECT bookname, bookauthor, bookpub, bookisbn FROM booktable'; 
switch($_POST['order']){ 
    case 'title': 
     $query .= ' ORDER BY bookname ASC'; 
     break; 
    case 'publisher': 
     $query .= ' ORDER BY bookpub ASC'; 
     break; 
    case 'author': 
     $query .= ' ORDER BY bookauthor ASC'; 
     break; 
    case 'isbn': 
     $query .= ' ORDER BY bookisbn ASC'; 
     break; 
} 
$results = mysql_query($query); // or however you are processing the query 

現在,這是正確的,但我個人覺得這種類型的開關語句是矯枉過正。如果您只是使用開關塊來根據另一個值更改一個特定值,則使用PHP陣列將一個值映射到另一個值可以更簡單地閱讀,所以這裏有另一個版本,我發現它更簡化:

$fieldNameMapping = array('title'  => 'bookname', 
          'publisher' => 'bookpub', 
          'author' => 'bookauthor', 
          'isbn'  => 'bookisbn', ); 

$query = 'SELECT bookname, bookauthor, bookpub, bookisbn 
      FROM booktable ORDER BY ' . $fieldNameMapping[ $_POST['order'] ] . ' ASC'; 

$results = mysql_query($query); // or however you are processing the query 

使用這兩種方法之一,請務必在使用前對$_POST['order']進行一些基本的理性檢查。我已經在我的示例中留下了任何輸入驗證或消毒,但是當您獲取用戶數據並使用它來構建SQL查詢時,您總是要格外小心。