使用WHERE子句的循环创建查询

时间:2019-08-22 00:54:30

标签: php mysql

我正在尝试使用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");

我觉得应该有一种更清洁的方法。有什么建议吗?

3 个答案:

答案 0 :(得分:3)

您可以使用where injoin修复查询。您的情况应该是:

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

Demo on 3v4l.org

答案 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) . ') ';