2013-07-17 50 views
0

以下代碼顯示錶中的數據,然後根據兩個組合框的結果對其進行過濾。一旦提交表格,我可以通過ID訂購結果,但不能在初始加載時(所有列出的都是)。我試過$sql = "SELECT * FROM Places ORDER BY ID";,它在列表加載時工作,但在提交表單時返回錯誤。希望這是有道理的。有任何想法嗎?謝謝!使用PHP Order By排序查詢結果

// Default query 
$sql = "SELECT * FROM Places"; 
// check if form was submitted 
if (isset($_POST['area'])) { 
    $connector = 'where'; 
    if ($_POST['area'] != 'All') { 
     $sql .= " where Area = '".$_POST['area']."' ORDER BY ID"; 
     $connector = 'and'; 
    } 
    if ($_POST['theme'] != 'All') { 
     $sql .= " $connector Theme = '".$_POST['theme']."' OR Theme2 = '".$_POST['theme']."' 
     ORDER BY ID"; 
    } 
} 
+1

'ORDER BY'方法是正確的,但您需要告訴我們更多關於「提交表單時出錯」的信息。請向我們展示您的表單以及其提交的代碼。 – RandomSeed

+0

嗨,錯誤是'mysql_fetch_array()期望參數1是資源,布爾給定...' – cbladon

+0

- 任何幫助,由網絡包生成的代碼 – cbladon

回答

0

您的ORDER BY ID子句必須出現在語句的最後。如果兩個$_POST['area']$_POST['theme']充滿,你最終得到這樣的查詢:

SELECT ... WHERE Area = 'some area' ORDER BY ID AND Theme = 'some theme' 

添加ORDER BY位作爲查詢的最後一部分。

+0

此外,您的代碼已廣泛開放給SQL注入。不要連接任何來自用戶輸入的內容(例如'$ _POST')與您的查詢。閱讀「[SQL注入](http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php)」。 – RandomSeed

0

我認爲你缺少一個默認的行爲語句。即你的IF語句沒有else子句。所以你正在檢查isset,如果它改變了select查詢,但沒有什麼可說的! isset SELECT查詢應該是.... ORDER BY ID。

此外,我會嘗試回顯你的SQL查詢每次你設置/更改它的一部分,以準確理解什麼是發送到數據庫。

最後,我總是檢查mysql.general_log表中最後一次運行的查詢,以查看實際發生在DB端的內容。

+0

所以我需要說'如果表單沒有發送然後顯示所有,按ID排序'? – cbladon

+0

那麼,如果它的表單設置時,但它不是那麼時,它認爲它值得一試。 – Simon

0

它看起來像$ _POST ['area']!='All'和$ _POST ['theme']!='All'是可能的。在這種情況下,你將把ORDER BY子句放入兩次。這可能是你的問題。

所以試試這個。

// Default query 
$sql = "SELECT * FROM Places"; 
// check if form was submitted 
if (isset($_POST['area'])) { 
    $connector = 'where'; 
    if ($_POST['area'] != 'All') { 
     $sql .= " where Area = '".$_POST['area']."'"; 
     $connector = 'and'; 
    } 
    if ($_POST['theme'] != 'All') { 
     $sql .= " $connector Theme = '".$_POST['theme']."' OR Theme2 = '".$_POST['theme'] . "'"; 
    } 

    if ($_POST['area'] != 'All' || $_POST['theme'] != 'All') { 
     $sql .= ' ORDER BY ID'; 
    } 
} 
+0

謝謝你,我給了它一個去,但它具有與原代碼 – cbladon

0

感謝您的全力幫助,無論如何我已經解決了服務器端的問題,所以不需要代碼。感謝您關注安全問題,我把它們放在了我的腦海中,但不知道它有多糟糕!如果我將代碼更改爲PDO,會對它有什麼幫助?我已經將用戶的權限降低到最低限度。再次感謝。

+0

相同的效果請編輯你的答案,並給出一個簡短的解決方案的說明 - 它可以幫助一個誰在這個線程上絆倒。然後將自己的答案標記爲已接受,以便結束該主題。如果您有更多問題,請...提出一個新問題! – RandomSeed