【问题标题】:PDO Prepared Statement with % and Limit带有 % 和限制的 PDO 准备好的语句
【发布时间】:2014-10-20 08:16:39
【问题描述】:

我是 PDO 的新手,但我需要使用它来避免 SQL 注入。

这是我的 SQL 查询,其中包含我通过 POST 请求获得的变量,我想使用该 SQL 查询执行 PDO(此版本有效):

if($refid == "") $refid="%";

$lastOrders = "SELECT * FROM Orders WHERE REFID LIKE'$refid' 
               ORDER BY dateAdded DESC LIMIT 0,$limiter";
$ps_orders = $db->query($lastOrders);
$data = $ps_orders->fetchAll();

我的问题: 给定的 $refid 要么是我可以在数据库中找到的数字,要么是 POST 请求未指定的数字(因此值为 $refid= “”),在这种情况下,我想将 WHERE 部分设置为:WHERE REFID LIKE '%',所以在这种情况下,我可以看到每个“RefID”的所有结果。有没有办法做到这一点,还是我真的需要为这两种情况创建 2 个不同的 SQL 查询?

我的尝试(不起作用无法弄清楚究竟是什么问题):

if($refid == "") $refid="%";

$sql = "SELECT * FROM Orders WHERE REFID LIKE :refid
        ORDER BY dateAdded DESC LIMIT :min,:max";
$ps_orders = $db->prepare($sql);
$ps_orders->bindParam(':refid', $refid, PDO::PARAM_STR);
$ps_orders->bindParam(':min', 0, PDO::PARAM_INT);
$ps_orders->bindParam(':max', (int)$limiter, PDO::PARAM_INT);
$ps_orders->execute();
$data = $ps_orders->fetchAll();

【问题讨论】:

  • 有错误提示吗?
  • 正如我所描述的,$refid 是由 POST 请求设置的:$refid = $_POST['refid'];

标签: php mysql sql pdo


【解决方案1】:

bindParam 需要一个变量引用,所以它不能与 as 一起使用

bindParam(":min", 0, PDO::PARAM_INT)

您可以创建类似$zero = 0 的名称,但这似乎没有必要,因此您可以使用bindValue 代替。 (int)$limiter 也一样,它变成了一个值而不是一个变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-13
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    相关资源
    最近更新 更多