给定一个ids数组$galleries = array(1,2,5),我想有一个SQL查询,在它的WHERE子句中使用数组的值,如:

SELECT *
FROM galleries
WHERE id = /* values of array $galleries... eg. (1 || 2 || 5) */

我如何生成这个查询字符串与MySQL使用?


当前回答

正如Flavius Stef的回答,你可以使用intval()来确保所有id都是int值:

$ids = join(',', array_map('intval', $galleries));  
$sql = "SELECT * FROM galleries WHERE id IN ($ids)";

其他回答

Use:

select id from galleries where id in (1, 2, 5);

一个简单的for每个循环将工作。

Flavius/AvatarKava的方法更好,但要确保数组值中没有逗号。

小心!此答案包含一个严重的SQL注入漏洞。不要使用这里给出的代码示例,除非确保任何外部输入都被清除。

$ids = join("','",$galleries);   
$sql = "SELECT * FROM galleries WHERE id IN ('$ids')";

再举一个例子:

$galleryIds = [1, '2', 'Vitruvian Man'];
$ids = array_filter($galleryIds, function($n){return (is_numeric($n));});
$ids = implode(', ', $ids);

$sql = "SELECT * FROM galleries WHERE id IN ({$ids})";
// output: 'SELECT * FROM galleries WHERE id IN (1, 2)'

$statement = $pdo->prepare($sql);
$statement->execute();

Col. Shrapnel的SafeMySQL PHP库在其参数化查询中提供了类型提示占位符,并包括了两个用于处理数组的方便占位符。?a占位符将数组展开为逗号分隔的转义字符串列表*。

例如:

$someArray = [1, 2, 5];
$galleries = $db->getAll("SELECT * FROM galleries WHERE id IN (?a)", $someArray);

*请注意,由于MySQL执行自动类型强制,SafeMySQL将上面的id转换为字符串并不重要-您仍然会得到正确的结果。

假设你事先正确地清理了你的输入……

$matches = implode(',', $galleries);

然后调整你的查询:

SELECT *
FROM galleries
WHERE id IN ( $matches ) 

根据数据集适当地引用值。