MySQL和PHP:如何在包含ID的数组中获取多个ID [重复]

Posted

技术标签:

【中文标题】MySQL和PHP:如何在包含ID的数组中获取多个ID [重复]【英文标题】:MySQL and PHP: how to fetch multiple ID's in an array containing the ID's [duplicate] 【发布时间】: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。 【参考方案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

【讨论】:

以上是关于MySQL和PHP:如何在包含ID的数组中获取多个ID [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Codeigniter/PHP 中合并两行并获取单个数组?

比较 php MySQL 查询结果数组以从其中一个数组中获取关联值

如何在mysql php中保存json数组

如何从mysql中获取多个ID相关值[重复]

如何使用 bootstrap 和 Ajax 根据所选 ID 从 MySQL 数据库中获取数据?

如何在 MySQL 中获取多个插入行的 ID?