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 查询结果数组以从其中一个数组中获取关联值