我有一个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> <a href='ticket.php?id=".$a['id']."'>".trim($a['id'])."</a> </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>
答案 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注入攻击,但我不打算进入那个......你的查询是如此无可救药地打破注入攻击是你最不担心的事情。