php - 具有超过 1 个 IN 函数的安全 pdo mysql 语句

标签 php mysql pdo

各位程序员大家好,我目前正在尝试创建一个社交网站,但在选择供用户查看和滚动的内容部分有点卡住了。

假设他们有 friend 和关注者,我想以安全的方式从他们的 friend 和关注者的数据库中选择内容。我当前的假设是我可能会使用这样的代码。

        $select = "SELECT * FROM tableName WHERE FollowedPersonsID IN (1,2) OR FriendsID IN (9,8)";

    $arrayForSecurity = array( array(1,2), array(9,8) );
              try
                      {
                          // These statements run the query against your database table.
                        $result = $pdo->query($select);
                        $statement = $pdo->prepare("SELECT * FROM tableName WHERE FollowedPersonsID IN (?) OR FriendsID IN (?)");
                        $statement->execute($arrayForSecurity);
                        $content = $statement->fetchAll(PDO::FETCH_ASSOC);

                      }
                      catch(PDOException $e)
                      {
                          // Note: On a production website, you should not output $ex->getMessage().
                          // It may provide an attacker with helpful information about your code.
                          die("Failed to run query: " . $e->getMessage() . "<br><br>" . "$select");
                      }

foreach ($content as $key => $value) {
   HTMLContentFunction($value);
}

在这里你可以看到我有2个IN()函数,它们都需要是php数组,因为你们可以想象,人们关注的人数会因人而异。

如何使用 2 个函数创建安全的 sql 语句?

最佳答案

您需要为数组的每个成员生成一个占位符,然后将数组合并并展平,并将所有参数放在正确的位置。例如:

// props to https://stackoverflow.com/a/1320156/1064767
function array_flatten(array $array) {
    $return = [];
    array_walk_recursive($array, function($a) use (&$return) { $return[] = $a; });
    return $return;
}

$arr1 = [1,2,3];
$arr2 = [4,5];

$ph1 = implode(',', array_fill(0, count($arr1), '?'));
$ph2 = implode(',', array_fill(0, count($arr2), '?'));

$query = "SELECT * FROM foo WHERE a = ? AND ( b IN ($ph1) OR c IN ($ph2) ) AND d = ?";

$params = array_flatten([0, $arr1, $arr2, 6]);

var_dump($query, $params);

输出:

string(74) "SELECT * FROM foo WHERE a = ? AND ( b IN (?,?,?) OR c IN (?,?) ) AND d = ?"
array(7) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(2)
  [3]=>
  int(3)
  [4]=>
  int(4)
  [5]=>
  int(5)
  [6]=>
  int(6)
}

作为一般警告,请小心让您的 IN() 子句变得太大 [ballpark: 100 或更多],因为这可能会导致性能问题。它们基本上只是一堆 OR 子句的压缩语法。

关于php - 具有超过 1 个 IN 函数的安全 pdo mysql 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54815383/

相关文章:

php - 如何使用php从mysql数据库中选择行

mysql - 跨多个服务器使用 mysql Node 模块的最佳方法

php - 使用 PDO 创建表单搜索

php - 连接数组以插入mysql表中

php - 我如何在自动创建其他表时使用 id 的值

php - 从具有一个二进制字段的表中获取单独的值

php - Laravel 照亮\数据库\查询异常 : could not find driver Error

javascript - WordPress 不排队脚本

java - 在 MySQL 数据库中检索非英文字符插入值

mysql - DATEDIFF 最后记录的当前/日期