[英]SQL multiple where clause using PHP to filter
我正在創建一個簡單的表,該表使用簡單的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'";
}
任何幫助將不勝感激,對於缺乏正確術語的歉意
您應該使用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
子句event_type.prefix
表中的列。 如果沒有匹配的行,則LEFT JOIN
為這些列返回NULL
,並且測試將失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.