将PHP变量传递到sql查询

将PHP变量传递到sql查询,php,sql,variables,url,Php,Sql,Variables,Url,我想创建一个过滤器,并在WHERE子句中将类别和值传递到sql查询中。 如果我手动设置类别,它将获取值并过滤结果。但是当我想通过分类时,它会给我这个错误 以下是我使用的代码: $('#filterEvents').click(function () { document.location.href = 'events.php?filter=' + $('#eventFilterOption').val() + '&filterValue=' + $('#eventFilterI

我想创建一个过滤器,并在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);

此处的值为空:

$category = $_GET['filter'];
$searchValue = $_GET['filterValue'];
您应该调试如何在js中获取它们的方法。
顺便说一句,打开此页面/events.php时,您将始终看到该错误。因为这些变量默认为空。

您在获取变量时遇到问题-PHP脚本无法获取值-因此我相信您的Javascript中存在错误

更重要的是,这不是运行查询的安全方法。您的PHP正在获取用户传递的变量,并将它们直接插入到SQL中,而无需验证。很容易滥用此功能来提取信息或修改数据库


您应该使用
$category
的值来选择一个已知列,然后使用绑定参数来设置
$searchValue

如果稍微更改功能,您将能够使用带有绑定参数的准备好的查询

所以,假设你现在有颜色和大小的过滤器,看起来你会像这样调用URL

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();
});
查询可以重写如下(假设列的大小和颜色)

并添加了一个绑定实际参数的调用

$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注入的风险 作为奖励(或bug),它可以同时支持多个过滤器选项

events.php?filterSize=Large&filterColour=Red

转储查询-消息表明您有语法错误。调试代码您应该对照允许的列名白名单检查
$category
,并为值绑定一个参数。这是一个很大的sql输入漏洞。@jeroen,我得到了
$category
的值,我可以打印出来。但是,当我试图在该条款中使用时,它没有正常工作。问题是,我可以使用其他值。这样做的结果是什么?第一个加载是数据库中的值的默认显示。当我开始过滤它们时,有一个问题,我不知道你的意思。但是这个错误:因为$category和$searchValue是空的。我不知道你想得到什么答案。
events.php?filterSize=Large&filterColour=Red