SQL multiple where子句使用PHP进行过滤

时间:2017-10-13 20:23:19

标签: php mysql sql

我正在创建一个简单的表格,使用简单的PHP查询向团队成员展示可用的培训课程

$Get_Events_Widget_Query = "
                SELECT event_information.id AS info_id,
                event_type.name,
                event_type.prefix,
                event_information.start_date
                FROM event_information
                LEFT OUTER JOIN event_type
                ON event_information.type=event_type.prefix
                WHERE (event_information.live = '1' AND event_information.start_date > NOW()) AND event_type.prefix IN ('GPS','PET','FST','ICT','FSW','SAL')";

上面显示了查询是如何工作的,但这是我想用PHP添加过滤器的地方。

event_type.prefix是所有培训课程所在的类别,但是每个用户都可以通过将每个课程分配给0或1来取消选择他们希望通过会话查看的课程类型。

$_SESSION['filter_GPS']
$_SESSION['filter_PET']
$_SESSION['filter_FST']
$_SESSION['filter_ICT']
$_SESSION['filter_FSW']
$_SESSION['filter_SAL']

这就是我的问题所在。如果我想过滤掉一些选项,我似乎无法解决PHP代码中的问题。

这是我认为可行的,直到我意识到我不能多次调用相同的where子句(无论如何都是这种格式);

if($_SESSION['filter_information_sessions'] == "1") {
    $Get_Events_Widget_Query .= "AND event_type.prefix = 'GPS' ";
}
if($_SESSION['filter_pet'] == "1") {
    $Get_Events_Widget_Query .= "AND event_type.prefix = 'PET'";
}
if($_SESSION['filter_fs_testing'] == "1") {
    $Get_Events_Widget_Query .= "AND event_type.prefix = 'FST'";
}
if($_SESSION['filter_ict_testing'] == "1") {
    $Get_Events_Widget_Query .= "AND event_type.prefix = 'ICT'";
}
if($_SESSION['filter_workshops'] == "1") {
    $Get_Events_Widget_Query .= "AND event_type.prefix = 'FSW'";
}
if(isset($_SESSION['filter_speaking'] == "1") {
    $Get_Events_Widget_Query .= "AND event_type.prefix = 'SAL'";
}

对于缺乏正确的术语,任何帮助都会非常感激和道歉

1 个答案:

答案 0 :(得分:3)

您应该使用AND,而不是OR

但更好的方法是动态构建IN()列表。

$event_types = array();
if($_SESSION['filter_information_sessions'] == "1") {
    $event_types[] = "'GPS'";
}
if(isset($_SESSION['filter_pet'])) {
    $event_types[] = "'PET'";
}
...
$events_string = implode(', ', $event_types);
$Get_Events_Widget_Query = "
                SELECT event_information.id AS info_id,
                event_type.name,
                event_type.prefix,
                event_information.start_date
                FROM event_information
                LEFT OUTER JOIN event_type
                    ON event_information.type=event_type.prefix
                WHERE (event_information.live = '1' AND event_information.start_date > NOW()) 
                    AND event_information.type IN ($events_string)";

我将最后一个条件更改为测试event_information.type而不是event_type.prefix,因为在执行LEFT JOIN时,您不应该在WHERE子句中测试子表中的列;如果没有匹配的行,LEFT JOIN会为这些列返回NULL,测试将失败。

相关问题