这似乎是一项如此简单的任务,但我很难找到一个我喜欢的解决方案.除了笨重,我找不到任何我会考虑的东西.这是我正在使用的:
有一个搜索表单将变量发布到处理脚本.这些变量是要查询的数据的过滤器.根据用户的权限,可能会有更多或更少的变量进入,具体取决于他们可以访问的过滤器.每个过滤器基本上是指结果来自表格中的字段.每个过滤器的一个选项也是"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'";
}
...
Run Code Online (Sandbox Code Playgroud)
等等.但这对我来说只是看起来愚蠢,可怕,而且效率低得离谱.我正在使用稍微修改过的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);
}