我有两个MySQL表(规范化),包含以下数据:
Customer Type:
+------------------+---------------------+
| customer_type_id | description |
| 1 | customer |
| 2 | former customer |
| 3 | prospect |
| 4 | center of influence |
+------------------+---------------------+
Queue:
+----------+------------------+---------+------------+
| queue_id | customer_type_id | user_id | send_date |
| 1 | 1 | 1 | 2018-02-12 |
| 2 | 1 | 2 | 2018-01-01 |
| 3 | 4 | 1 | 2018-01-01 |
+----------+------------------+---------+------------+
我想查询Queue表,但我允许用户过滤多个customer_type_id值。我知道我可以在WHERE子句中使用多个条件,如下所示:
WHERE
`user_id` = 1 AND
(`customer_type_id` = 1 OR
`customer_type_id` = 4)
但是因为我在后端使用PHP,通过AJAX请求发送数据,HTML标记如下所示:<select name="customers[]">
,我想知道是否有办法只需将PHP数组作为参数传递给SQL命令,类似于以下伪代码:
WHERE
`user_id` = 1 AND
`customer_type_id` CONTAINS [1, 4]
这样做的原因是我宁愿实现内置的MySQL方法,而不是在运行时构建动态SQL命令。
答案 0 :(得分:0)
答案 1 :(得分:0)
您可以使用SQL IN()
从数组生成String参见示例:
$string = join(", ", $array);
$sql = "SELECT * FROM ... WHERE customer_type_id IN (".$string.")
如果您想添加字符串,则必须通过for循环替换连接,如
$string = "";
$i = 0;
foreach($array as $value) {
if($i > 0)
$string += ", ";
$string += "'".$value."'";
}
$sql = "SELECT * FROM ... WHERE column IN (".$string.")";
答案 2 :(得分:0)
最好的选择是将MySQL IN
clause 与PHP数组结合使用:
$valus = array(1, 4);
$query = "SELECT * FROM `Queue` WHERE `user_id` = 1
AND `customer_type_id` IN (" + $values + ")";
哪个被评估为可以独立于PHP使用的原始MySQL:
SELECT * FROM `Queue` WHERE `user_id` = 1 AND `customer_type_id` IN (1, 4)
或者,如果您要选择范围内的任何值,可以使用 BETWEEN
clause :
SELECT * FROM `Queue` WHERE `user_id` = 1 AND `customer_type_id` BETWEEN 1 AND 4
希望这有帮助!
答案 3 :(得分:0)
正如其他人所建议的那样,使用IN ()
谓词。这在逻辑上等同于您展示的多个术语使用OR
。
请参阅https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_in
但是你应该小心防止SQL注入。如果您只是使用PHP implode()
来组合一个不安全的请求参数,那么您就有风险。
您可以将(@)投射到int
:
$cust_type_list = implode(',', array_map('intval', $_GET['customers']));
$sql = "...WHERE customer_type_id IN ($cust_type_list);
或者您可以使用与查询数量相同的SQL查询参数:
$cust_types = (array) $_GET['customers'];
$placeholders = implode(',', array_fill(1, count($cust_types), '?'));
$sql = "...WHERE customer_type_id IN ($placeholders);
$stmt = $pdo->prepare($sql);
$stmt->execute($cust_types);