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

时间:2016-04-15 15:30:58

标签: php mysql pdo

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

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

但这是不安全的(SQL注入),也许不是高性能。有任何建议可以解决这个问题吗?

4 个答案:

答案 0 :(得分:4)

$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

答案 1 :(得分:1)

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

所以在没有单引号的情况下使用它,因为ID列是数字,1,2,3,4,5这将分隔每个值。

答案 2 :(得分:1)

我认为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

答案 3 :(得分:0)

使用

"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))))" ;