簡體   English   中英

MySQL 查詢未通過 php 腳本返回特定搜索參數

[英]MySQL Query not returning specific search parameters via php script

我有一個 php 驅動頁面,允許我輸入搜索參數。 其中一個數字是由多個數字組成的 ID。 當我用這些特定數字搜索一個時,它會返回所有結果。

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

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

此外,我確定這些字段正在提交到數據庫,因為我可以在 phpadmin 中查看它們並使用它們完成 SQL 語句

輸入 NumericIdentider 並選擇所有默認狀態時編輯回顯結果: Select * From Table Where Closed != ' '

<?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>

是的,你的 SQL 永遠不會工作。 假設用戶同時輸入了 BeginDate 和 EndDate,您的查詢將是

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 注入攻擊,但我不會 go 進入那個......你的查詢已經如此絕望,以至於注入攻擊是最少的你的煩惱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM