2011-09-20 33 views
0

我需要創建一小段代碼,以便根據用戶選擇的類別類型篩選我的事件數據庫。使用PHP和MySQL按多種類型排序事件。

我現在有工作了誰只有一個類別中選擇用戶...

$user_qstring = "SELECT types FROM tbl_users WHERE user_id='".$_SESSION['id']."'"; 
    $user_result = mysql_query($user_qstring); 
    $user_row = mysql_fetch_array($user_result); 

    $type_filter = $user_row['types']; 
    if(isset($type_filter) && $type_filter !="") { 
    $day_events = "SELECT COUNT(*) FROM tbl_events WHERE day='".$day_id."' AND  
    type='".$type_filter."'"; 
    }else{ 
    $day_events = "SELECT COUNT(*) FROM tbl_events WHERE day='".$day_id."'"; 
    } 

我需要修改這個代碼,這樣,如果$ type_filter設置,幷包含多個類別的格式如下。

Festivals,Sports,Education 

而且具有查詢自動添加...

OR type='".$type_filter[2]."' OR type='".$type_filter[3]."' OR ect... 

我已經能夠使用多個解決問題...

elseif(){ 
} 

語句,但需要一個解決方案可擴展到無限種類。

我知道自己需要改變$ type_filter使用爆炸列表開始...

$type_filter = explode(",", $user_row['types']); 

但我仍然有問題把他們放在一起作短暫優雅的解決方案。

+0

看起來您正在從查詢結果中獲取過濾器,因此在此處檢查注入可能不合適。但是,如果用戶可以在其他階段設置過濾器數據,則需要在輸入過濾器數據時進行清理。如果你讓他們從他們不能編輯的預定義列表中選擇,那麼它可能是安全的。提供你在製作過濾器列表時要小心。 – horatio

回答

1

您將需要確認$ type_filter首先不包含單引號,否則您是sql注入攻擊的一個簡單目標。使用mysql_real_escape_string 總是逃生GET/POST數據,或者你很容易受到注入攻擊 -

$day_events = "SELECT COUNT(*) FROM tbl_events WHERE day='".$day_id."' AND type IN ('" . implode("','", explode(',', $type_filter)) . "')"; 
+2

或者只是通過'mysql_real_escape_string()運行每個數組成員。' –

+0

感謝偉大的工程,我將不得不搜索SQL注入攻擊。聽起來不太好。 –

+0

如果我正確讀取他的Q,則數據來自查詢結果,而不是來自POST/GET – horatio

0

嘗試類似的follwing SQL

select * from ... where type in ('one', 'two', ...) ... 

和作爲的話。

+0

如果我正確讀取他的Q,則數據來自查詢結果,而不是來自POST/GET – horatio

+0

可能是,但比對不起更安全:) – roman