编写搜索过滤器 - 在SQL级别或PHP级别过滤?

时间:2013-12-25 01:02:25

标签: php mysql sql

我在搜索页面上有一个ajax过滤器,可根据用户可以操作的一组条件过滤教师结果。我正在尝试决定是否

1)首先获取所有教师数据,然后在PHP中创建一个新阵列,只是那些不受负面过滤器影响的教师

2)使用许多WHERE子句构建一个sql查询,即'WHERE pay = $ pay&& city = $ city&&距离< $ distance“。

我的一部分认为数字2可能是更好的选择,但是当用户没有指定某个过滤器时,我已经不确定如何填充查询的变量值。因此,例如,如果未定义$ pay,则查询将失败。在这种情况下,我想做的是询问老师,无论他们的薪水如何。

3 个答案:

答案 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注入。警告:我没有编译这段代码,因为我在平板电脑上啄食!