这似乎是一项如此简单的任务,但我很难找到我喜欢的解决方案。除了笨重之外,我找不到任何我会考虑的东西。这是我正在处理的内容:
有一个搜索表单可以将变量发布到处理脚本。这些变量是被查询数据的过滤器。根据用户的权限,可能会有或多或少的变量进入,这取决于他们有权访问的过滤器。基本上,每个过滤器都指的是结果来自的表中的一个字段。每个过滤器的一个选项也是“ANY”,因此不需要 WHERE 子句。
构建查询字符串的好方法是什么。假设有四个变量返回:$firstname、$lastname、$age、$dob。但只有部分用户有权按 $age 和 $dob 进行过滤。
$query = "SELECT * FROM people";
if(($firstname != 'ANY' && !empty($firstname)) ||
($lastname != 'ANY' && !empty($lastname)) ||
($age != 'ANY' && !empty($age)) ||
($dob != 'ANY' && !empty($dob))) {
$query .= " WHERE";
}
if($firstname != 'ANY' && !empty($firstname)) {
$query .= " firstname='$firstname'";
}
if($lastname != 'ANY' && !empty($lastname)) {
if($firstname != 'ANY' || !empty($firstname)) {
$query .= " AND";
}
$query .= " lastname='$lastname'";
}
...
等等。但对我来说,这看起来很愚蠢、可怕,而且效率低得可笑。我使用的是稍微修改过的 MVC 模式,那么在搜索模型中为每个可能的过滤器构建方法是否有意义?
最佳答案
我会这样做:
$query = "SELECT * FROM people"; $whereClause = " WHERE 1 = 1 "; if($firstname != 'ANY' && !empty($firstname)) { $whereClause .= " AND firstname='$firstname' "; } if($lastname != 'ANY' && !empty($lastname)) { $whereClause .= " AND lastname='$lastname' "; } $query .= $whereClause;
您也可以将所有语句收集到一个数组中,然后:
if (count($arr)>0) { $query = "$query WHERE ". implode(" AND ",$arr); }
关于php - 基于发布的变量构建 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1245023/