我正在创建一个简单的表格,使用简单的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'";
}
对于缺乏正确的术语,任何帮助都会非常感激和道歉
答案 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
,测试将失败。