2009-06-08 62 views
1

我建立類似的活動頁面last.fm/events如何使用PHP/MySQL中的查詢字符串過濾結果集?

用戶可以過濾按日期,類別等事件,這些參數在查詢字符串

我的問題是過去了,什麼是構建最好的方式你代碼(查詢,環路),以允許這些不同的查詢類型,並有可能(按日期類如過濾)

我在尋找如何使這種類型的網頁的實際例子/引用它們組合(一個可以使用查詢字符串過濾的結果集)。

回答

4

用於構建自定義數據庫查詢的常見模式:

$sql = 'SELECT * FROM foo '; 
$sql .= 'WHERE 1 '; 

if (array_key_exists('category', $_GET)) { 
    $sql .= sprintf('AND category_id = %d ', intval($_GET["category"])); 
} 

if (array_key_exists('date', $_GET)) { 
    $sql .= sprintf('AND date = "%s" ', mysql_real_escape_string($_GET["date"])); 
} 

// and so on... 

或者,使用PDO:

$params = array(); 

$sql = 'SELECT * FROM foo '; 
$sql .= 'WHERE 1 '; 

if (array_key_exists('category', $_GET)) { 
    $sql .= 'AND category_id = ? '; 
    $params[] = $_GET["category"]; 
} 

if (array_key_exists('date', $_GET)) { 
    $sql .= 'AND date = ? '; 
    $params[] = $_GET["date"]; 
} 

// and so on... 

$stmt = $db->prepare($sql); 
$stmt->execute($params); 

如果需要對數據庫做的結果進一步進行過濾,只使用一個循環來複制將數據發送到目標數組,並且每當遇到應該從結果中省略的行時,都將返回continue

0

首先,如果您使用查詢字符串中的數據來運行查詢,您將希望使用預準備語句/存儲過程來實現安全性。另外,因爲MySQL 5.1.17查詢緩存與預處理語句一起工作。

準備好的語句可以像PHP中的普通查詢一樣建立起來,將查詢所需的各個部分連接在一起。

爲了避免不得不把「AND的插圖中,你可以每個語句分配到的事物的陣列使用,然後爆他們的煩惱:

if(use_date) $sql_where[] = "date = ?"; 
if(use_category) $sql_where[] = "category = ?"; 
$sql = $sql . implode(" AND ", $sql_where); 

重複的程序(或相同做時間)來插入查詢所需的數據字段。