【问题标题】:Passing PHP variables into sql query将 PHP 变量传递给 sql 查询
【发布时间】:2019-02-16 23:42:14
【问题描述】:

我想创建一个过滤器,并将类别和值都传递到 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,并且应该为该值绑定一个参数。这是一个很大的 sql 注入漏洞。
  • @jeroen,我得到了$category 的值,我可以打印出来。但是当我尝试在子句中使用时,它无法正常工作。问题是,我可以使用其他值。
  • 你正在做一个print_r($sql);。结果是什么?

标签: php sql variables url


【解决方案1】:

这里有空值:

$category = $_GET['filter'];
$searchValue = $_GET['filterValue'];

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

【讨论】:

  • 第一次加载,默认显示来自数据库的值。当我开始过滤它们时,问题就出现了。
  • @MaximRoman 我不确定你的意思。但是这个错误:ibb.co/k9Adpp 因为 $category 和 $searchValue 是空的。我不确定你想得到什么答案。
【解决方案2】:

您在获取变量时遇到问题 - PHP 脚本没有获取值 - 所以我相信您的 Javascript 中存在错误。

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

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

【讨论】:

    【解决方案3】:

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

    所以说你现在有颜色和大小的过滤器看起来你会调用像

    这样的 url
    events.php?filter=Colour&filterValue=Red
    events.php?filter=Size&filterValue=Large
    

    你可以改为通过 filter[name]=value

    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
    

    【讨论】:

      猜你喜欢
      • 2016-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多