【问题标题】:MySQL and PHP: how to fetch multiple ID's in an array containing the ID's [duplicate]MySQL和PHP:如何在包含ID的数组中获取多个ID [重复]
【发布时间】:2016-08-07 16:04:19
【问题描述】:

我有多个 ID 存储在一个变量中。该数组可以变长(+400 个 ID)。如何从 MySQL (PDO) 中的这些 ID 中获取数据?
我可以这样做:

"select * from info WHERE `id` IN ('1,2,3,4,5')"

但这是不安全的(SQL 注入),并且可能性能不佳。有什么解决这个问题的建议吗?

【问题讨论】:

  • 你的问题是如何防止mysql注入还是代码有问题?
  • 使用implode()查看answer here

标签: php mysql pdo


【解决方案1】:

从内容'1,2,3,4,5'中取出单引号,这会检查ID下的完整值。

所以不要使用单引号,因为 ID 列是数字,1,2,3,4,5 这将分隔每个值。

【讨论】:

    【解决方案2】:

    使用

    "select * from info WHERE `id` IN (1,2,3,4,5)" 
    

    包含单引号会强制将整个值视为单个字符串。

    如果数组中有值,那么只需将其写为

    $query = "select * from info WHERE `id` IN (implode(',', array_map('intval', json_decode('[' . $ids . ']', true))))" ;
    

    【讨论】:

    • 这看起来很容易受到 SQL 注入问题的影响。
    • 我们通常在发送到模型或执行查询之前清理输入。所以不容易被sql注入。
    • 在我看来,这还不足以提供答案——如果它不使用参数绑定或显式去污,那么它很容易受到攻击。您的读者没有您使用的外部(未说明的)清理代码。
    • @halfer 我已经更新了 :-)
    【解决方案3】:
    $in = join(',', array_fill(0, count($ids), '?'));
    $select = <<<SQL
        SELECT *
        FROM galleries
        WHERE id IN ($in);
    SQL;
    $statement = $pdo->prepare($select);
    $statement->execute($ids);
    

    source

    【讨论】:

      【解决方案4】:

      我假设 id 字段是 INTEGER,所以请删除撇号,新查询将是这样的,

      select * from info WHERE `id` IN (1,2,3,4,5)
      

      例如在 PHP 方面,

      $idList = explode(',', $_GET['id_list']);
      $idList = implode(',', array_unique(array_map('intval', $idList)));
      
      $query = "select * from info WHERE `id` IN ($idList)";
      

      请检查IN中的最大允许选择器

      http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_max_allowed_packet

      【讨论】:

        猜你喜欢
        • 2021-03-16
        • 2019-09-11
        • 1970-01-01
        • 2016-12-30
        • 2013-12-10
        • 1970-01-01
        • 1970-01-01
        • 2012-07-27
        • 2016-04-16
        相关资源
        最近更新 更多