我想创建一个过滤器,并将类别和值都传递给WHERE子句中的sql查询。 如果我手动设置类别,它将获取值并过滤结果。但是当我想要传递类别时,它给了我这个错误。
这是我使用的代码:
$('#filterEvents').click(function () {
document.location.href = 'events.php?filter=' + $('#eventFilterOption').val() + '&filterValue=' + $('#eventFilterInput').val();
});
PHP处理:
$category = $_GET['filter'];
$searchValue = $_GET['filterValue'];
$sql = "SELECT EV_Date, EV_KKZ, EV_CardNr, TE_Name, EV_Name, EV_SurName, EV_EventTyp FROM events1
INNER JOIN terminal1 ON terminal1.TE_IDX = events1.EV_FK_TermIDX
WHERE ".$category." = '" . $searchValue . "'
ORDER BY EV_Date DESC
LIMIT 2000";
print_r($sql);
$query = $DB->prepare($sql);
$query->execute();
$data = $query->fetchAll(PDO::FETCH_ASSOC);
答案 0 :(得分:2)
您在获取变量时遇到了问题-PHP脚本未获取值-因此我认为您的Javascript中存在错误。
更重要的是,这不是运行查询的安全方法。您的PHP正在接受用户传递的变量,并将其直接插入SQL中-无需验证。滥用此功能来提取信息或修改数据库非常容易。
您应使用$category
的值选择一个已知列,然后使用绑定参数设置$searchValue
。
答案 1 :(得分:1)
如果稍微更改功能,将可以使用带有绑定参数的准备好的查询。
所以说您现在拥有用于颜色和大小的过滤器,就像您将调用
这样的网址events.php?filter=Colour&filterValue=Red
events.php?filter=Size&filterValue=Large
您可以更改为通过过滤器[名称] =值
events.php?filterColour=Red
events.php?filterSize=Large
JavaScript看起来像这样
$('#filterEvents').click(function () {
document.location.href = 'events.php?filter' + $('#eventFilterOption').val() + '=' + $('#eventFilterInput').val();
});
查询可以重写如下(假设列的大小和颜色)
$sql = "SELECT EV_Date, ....
WHERE
( '' = :colour OR Colour = :colour ) AND
( '' = :size OR Size = :size )
ORDER BY ....
和绑定绑定的实际参数的调用
$query = $DB->prepare($sql);
$query->bindParam(':colour', $_GET['filterColour'], PDO::PARAM_STR, 12);
$query->bindParam(':size', $_GET['filterSize'], PDO::PARAM_STR, 12);
$query->execute();
这使您可以使用准备好的查询并避免SQL注入的风险 作为奖励(或漏洞),它可以同时支持多个过滤器选项
events.php?filterSize=Large&filterColour=Red
答案 2 :(得分:0)
您在这里有空值:
$category = $_GET['filter'];
$searchValue = $_GET['filterValue'];
您应该调试该方法,以便在js中获得它们。 顺便说一句,打开此页面/events.php时,您总是会看到该错误。因为这些变量默认情况下为空。