建立多个"或"在mySQL中基于用户输入

时间:2015-05-21 13:56:13

标签: php mysql sql

我试图找出构建它的最佳方法。这就是我到目前为止所拥有的:

总结单个邮政编码中出售的所有小部件:

select `Widgets`, SUM(`number sold`) as total_sold from mytable where
`Widgets`="Super Widget" and `zip_code`="35801"

到目前为止,这么好。如果我想要两个邮政编码的销售,我可以做类似的事情:

select `Widgets`, SUM(`number sold`) as total_sold from mytable where 
`Widgets`="Super Widget" and (`zip_code`="35801" or 
`zip_code`="12345")

效果很好。

我需要做的是能够设置它,以便用户可以选择多个邮政编码而无需事先知道他们想要多少邮政编码。可能是2或20.有没有办法将此查询构造为数组或类似的?伪代码:

select `Widgets`, SUM(`number sold`) as total_sold from mytable where
`Widgets`="Super Widget" and
(`zip_code`=in_array[35801,12345,00124,43562,12441])

这将显示这5个邮政编码中的所有销售。这将是一个简单的查询,通过将前端的用户输入作为逗号分隔的输入来构建。

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:3)

使用in

select `Widgets`, SUM(`number sold`) as total_sold from mytable where `Widgets`="Super Widget" and `zip_code` in (35801,12345,00124,43562,12441)

答案 1 :(得分:3)

您可以使用IN功能(以下是链接中的示例):

SELECT 'wefwf' IN ('wee','wefwf','weg');

适用于您的情况,可能如下所示:

...
and (`zip_code` IN ('35801', '12345', '00124', '43562', '12441'))

答案 2 :(得分:2)

如上所述,您可以使用SQL的IN函数,如果您在PHP代码中构建此查询(您添加了一个php标记),那么您可以使用implode函数来创建“in array”。

$arr = ['a', 'b', 'c'];
$line = implode(',', $arr);
echo $line; // Will output: a,b,c

请注意,将值直接写入查询字符串非常危险,因为它会将您的应用程序暴露给SQL注入攻击。

<强>更新

您可以在PDO中使用IN,只需一点解决方法 - 您可以在查询中为每个值创建问号占位符。 我们将使用str_repeat函数创建所需的问号占位符,并使用rtrim函数删除最后一个逗号。 假设您的值列表存储在$ arr中,并且您的PDO引用位于$ pdo:

$arr = ['value 1', 'value 2', 'value 3' ...];
$placeHolders = rtrim(str_repeat('?,', cound($arr)), ',');
$query = "SELECT * FROM table WHERE id IN ($placeHolders)";
$stmt = $pdo->prepare($query);
$stmt->execute($arr);

变量$ placeHolders将保存带有'?'的字符串参数的占位符,以数组中元素的数量为单位,然后您可以将数组传递给prepeared语句的execute函数。