簡體   English   中英

SQL多where子句使用PHP進行過濾

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM