我在搜索页面上有一个ajax过滤器,可根据用户可以操作的一组条件过滤教师结果。我正在尝试决定是否
1)首先获取所有教师数据,然后在PHP中创建一个新阵列,只是那些不受负面过滤器影响的教师
或
2)使用许多WHERE子句构建一个sql查询,即'WHERE pay = $ pay&& city = $ city&&距离< $ distance“。
我的一部分认为数字2可能是更好的选择,但是当用户没有指定某个过滤器时,我已经不确定如何填充查询的变量值。因此,例如,如果未定义$ pay,则查询将失败。在这种情况下,我想做的是询问老师,无论他们的薪水如何。
答案 0 :(得分:0)
对于SQL方法,您应该根据输入是否为空来构建查询
像
这样的东西$sql = 'SELECT * FROM Teachers';
$filter = array();
if (!empty($pay)) $filter[] = 'pay = "'.$pay.'"';
if (!empty($city)) $filter[] = 'city = "'.$city.'"';
if (!empty($city)) $filter[] = 'distance < "'.$distance.'"';
if (!empty($filter)) {
$and = ' WHERE';
foreach ($filter as $f) {
$sql .= $and.' '.$f;
$and = ' AND';
}
}
请注意,您应该关注SQL注入,因为这只是一个简单的演示。
答案 1 :(得分:0)
如果数据库中没有很多教师,你可以按照你的建议获取所有教师并在PHP中处理它。
如果您不想获取大量数据,可以使用第二个选项。在这种情况下,您可能希望构建动态查询。
例如:
$payCond = "";
...
if (isset($pay) && $pay != ""){
if ($payCond != ""){
$payCond .= "And ";
}
$payCond = "pay=" . intval($pay);
}
答案 2 :(得分:0)
尽可能靠近数据库查询。也就是说,您可以使用空表达式来简化代码:
$payExpr = (isset($_REQUEST['pay']) ? 'pay='.$_REQUEST['pay'] : '1=1');
$query = "select * from Foo where $payExpr";
这里的秘诀是在没有付款时使用'1 = 1'。但是,还有更多你需要这样做我正在跳过这个快速的例子,比如避免带有绑定参数的sql注入。警告:我没有编译这段代码,因为我在平板电脑上啄食!