【问题标题】:Use PDO to bind array [duplicate]使用 PDO 绑定数组
【发布时间】:2018-04-29 10:41:26
【问题描述】:

所以我正在建立一个用户选择几个位置的工作网站,它应该返回相应的工作。这意味着我将从用户那里获得一系列位置。我将如何使用 PDO 来绑定这个数组。目前我只是直接将值添加到 SQL 中,但我知道这是一个安全问题。我该如何重写它,使其使用如下语法:

$stmt->bindValue(":locations", $locations);

据我所知:

            $location = $_POST['location'];
            $locs = "'" . implode("', '", $location) . "'";

            //create query
            $sql = 
            "SELECT *
            FROM job
            JOIN location ON job.location_id = location.id
            WHERE location.region IN ($locs)
            ";

            //get results
            try
            {
                $stmt = $DB->prepare($sql);
                $stmt->execute();
                $results = $stmt->fetchAll(); 
            }
            catch (Exception $ex)
            {
                echo $ex->getMessage();
            }

            //print results
            foreach($results as $res)
            {
                echo "<p>Title:" . $res['title'];
                echo "<p>Views:" . $res['views'];
                echo "<p>Created At:" . $res['created_at'];
                echo "<p>Image:" . $res['img_url'];
                echo "<p>Salary:" . $res['salary'];
                echo "<p>Region:" . $res['region'];
                echo "<p>State:" . $res['state'];
                echo "<br/><br/>";

            }

【问题讨论】:

  • 我认为您不能使用 PDO 绑定 IN 子句。您可能需要在 PHP 中验证格式以防止注入,然后将其直接放入查询中,就像您已经在做的那样。

标签: php mysql database pdo


【解决方案1】:

无法将数组绑定到IN 子句中使用的列表。但是,您可以像这样绑定多个标量值:

where location.region in (:region1, :region2, :region3, [...])

$params = array(
    ':region1' => $regions[0],
    ':region2' => $regions[1],
    ':region3' => $regions[2]
    [...]
);

$stmt->execute($params);

您需要以编程方式构建查询的 IN ($placeholders) 部分以处理动态数量的参数。

【讨论】:

  • 我正在阅读 PHP 文档,您可以将数组绑定到执行方法。请参阅此页面,示例 #5 php.net/manual/en/pdostatement.execute.php
  • 这并不意味着您可以将数组绑定到 IN 子句中的单个占位符。来自文档:“多个值不能绑定到单个参数...... [I]不允许将两个值绑定到 IN() 子句中的单个命名参数。”
猜你喜欢
  • 2012-04-27
  • 1970-01-01
  • 2016-08-18
  • 2015-01-06
  • 2017-01-29
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多