2011-07-13 35 views
0

我有一個PHP驅動頁面,允許我輸入搜索參數。其中一個數字是由幾位數組成的ID。當我搜索具有這些特定數字的數字時,它會返回所有結果。MySQL查詢不通過php腳本返回特定的搜索參數

我已經在phpmyadmin和SQL終端中做了完全相同的聲明,它只返回我搜索的項目。所以我想問題在於我使用PHP提交基於html表單的搜索查詢。

帶狀態選項的下拉菜單正常工作 - 任何需要輸入的字段都沒有。

而且我相信字段被提交到數據庫,因爲我可以在phpadmin與他們進行查看和完整的SQL語句

編輯當進入NumericIdentider並選擇所有的默認狀態回聲結果:'選擇*從表關閉!=''

<?php 
    if($_REQUEST['Search']) { 
    $sql = "SELECT"; 

    if(strlen($_REQUEST['NumericIdentifier']) > 0) { 
     $sql .= " * FROM Table Where NumericIdentifier = ".$_REQUEST['NumericIdentifier']; 
    } 

    if(strlen($_REQUEST['BeginDate']) > 0) { 
     $sql .= " * From Table Where TDate >= {$_REQUEST['BeginDate']}"; 
    } 

    if(strlen($_REQUEST['EndDate']) > 0) { 
     $sql .= " * From Table Where TDate <= {$_REQUEST['EndDate']}"; 
    } 

    if($_REQUEST['Status'] == 'Shipped') { 
     $sql .= "* From Table Where Closed = 'true' "; 
    } 

    if($_REQUEST['AreaCode'] > 0) { 
     $sql .= " * From Table Where AreaCode = {$_REQUEST['AreaCode']}"; 
    } 

    if($_REQUEST['Status'] == 'Recieved') { 
     $sql .= " * From Table Where Closed != 'true'"; 
    } 

    if($_REQUEST['Status'] == 'All') { 
     $sql = "Select * From Table Where Closed != '\0'"; 
    } 
    } else { 
    $sql = "SELECT * FROM Tickets"; 
    } 

    $res = mysql_query($sql, $conn1); 
    while($a = mysql_fetch_array($res)) { 
    echo "<tr><td>&nbsp;<a href='ticket.php?id=".$a['id']."'>".trim($a['id'])."</a>&nbsp;</td> \n <td> ".$a['Name']."</td> \n <td>".date("m/d/Y", strtotime($a['TicketDate']))."</td> \n <td>".$a['Issue']."</td> \n <td>".Showstatus($a['Closed'])." </td></tr>"; 
    } ?> 
</table> 
</body> 
</html> 
+3

1.如何在發佈之前打印$ sql並查看結果(也稱爲「調試」)? 2.這些請求中的多個請求可能同時爲真,因此您可能會得到一個非常奇怪的查詢3.您是否真的需要所有列? – Jacob

+0

嘗試在所有if語句之後回顯$ sql。我相信所生成的SQL不是你想要的。然後嘗試在phpmyadmin中執行。 –

+0

我知道組​​合狀態以及它將如何出錯。事實是,即使它本身沒有正確提交。 – lomayne

回答

0

Yeesh,你的SQL將永遠不會工作。比方說,用戶進入既BEGINDATE和日期和結束日期,您的查詢就會

SELECT 
* From Table Where TDate >= {$_REQUEST['BeginDate']} 
* From Table Where TDate <= {$_REQUEST['EndDate']} 

即使是在MySQL的形式(YYYY-MM-DD),輸入正確的日期,它仍然會出來爲

SELECT 
* FROM Table Where TDate >= 01/01/2011 
* FROM Table Where TDate <= 31/12/2011 

請注意,日期沒有引號。 MySQL會將這些「日期」看作是數字,被分割,所以你說的是TDate >= 0.0004972...TDate <= 0.001284...

最重要的是,說兩次* from table也是非法的語法。

你的代碼顯然不檢查錯誤狀態。在絕對最低限度,你應該有:

$result = mysql_query($sql) or die(mysql_error()); 

這將告訴你到底是什麼問題,你已經構建的查詢。

最糟糕的是,正如其他人所說的那樣,您完全開放並且容易受到SQL注入攻擊,但我不打算進入這個......您的查詢已經無法破解,攻擊是你最擔心的。