MySQL Query不通过php脚本返回特定的搜索参数

时间:2011-07-13 15:40:39

标签: php mysql

我有一个php驱动的页面,允许我输入搜索参数。其中一个数字是由几个数字组成的ID。当我搜索具有这些特定数字的数字时,它会返回所有结果。

我在phpmyadmin和SQL终端中完成了完全相同的语句,它只返回我搜索的项目。所以我想问题就在于我用来提交基于html表单的搜索查询的PHP。

使用状态选项的下拉列表工作正常 - 任何需要输入的字段都没有。

另外我确定字段正在提交到数据库,因为我可以在phpadmin中查看它们并用它们完成SQL语句

输入NumericIdentider并选择默认状态all EDIT 回显结果:选择*从表中关闭!=''

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

1 个答案:

答案 0 :(得分:0)

Yeesh,你的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注入攻击,但我不打算进入那个......你的查询是如此无可救药地打破注入攻击是你最不担心的事情。