将PHP变量传递到SQL查询

时间:2018-09-12 10:49:06

标签: php sql variables url

我想创建一个过滤器,并将类别和值都传递给WHERE子句中的sql查询。 如果我手动设置类别,它将获取值并过滤结果。但是当我想要传递类别时,它给了我这个错误。

enter image description here

这是我使用的代码:

$('#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);

3 个答案:

答案 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时,您总是会看到该错误。因为这些变量默认情况下为空。