我正在尝试使用where子句的循环来构建MySQL查询。我有一个解决方案,但我觉得应该有一个更好的解决方案。我的代码如下
$query = 'SELECT * FROM `t1` WHERE';
$names = ['John','Steve','Robert'];
foreach($names as $name){
$query .= " `name` = '$name` OR";
}
echo $query;
在这种情况下,查询以“ OR”结尾,使其无效。我要解决的办法是使用
echo rtrim($query," OR");
我觉得应该有一种更清洁的方法。有什么建议吗?
答案 0 :(得分:3)
您可以使用where in
和join
修复查询。您的情况应该是:
$query = 'SELECT * FROM `t1` WHERE name IN (\'' . join($names,'\',\'') . '\')';
注意:join是爆破的别名。它有助于代码的可读性。注意SQL注入。您可能要验证输入或使用PDO。
答案 1 :(得分:1)
您可以将测试推送到一个数组,然后用OR
将其内爆:
$query = 'SELECT * FROM `t1` WHERE';
$names = ['John','Steve','Robert'];
$tests = array();
foreach($names as $name){
$tests[] = "`name` = '$name'";
}
$query .= implode(' OR ', $tests);
答案 2 :(得分:1)
我会按照您在应用程序中的工作去做,只是要小心将来更复杂的WHERE
子句。
例如,如果您的数组为空,则应省略“ WHERE”
$query = 'SELECT * FROM `t1`';
if ($names) $query .= " WHERE";
如果where子句具有AND
,则应注意AND
的优先级高于OR
,并使用适当的括号()
在您提供的代码示例中,您也可以这样做以避免rtrim
$names = ['John','Steve','Robert'];
foreach ($names as &$name) $name = "'$name'";
unset($name);
$query = 'SELECT * FROM `t1` WHERE `name` IN (' . implode(', ', $names) . ') ';