2009-06-08 8 views
1

私は私の質問は、あなたを構築するための最良の方法だ何、あるユーザーは、クエリ文字列で渡されたパラメータPHP/MySQLでクエリ文字列を使用して結果セットをフィルタリングする方法は?

で、日付、カテゴリなどでイベントをフィルタすることができますlast.fm/events

と同様のイベントページを構築していますこれらの異なるクエリの種類を可能にし、潜在的にそれらを結合するためのコード(クエリ、ループ)(日付カテゴリ別に例えばフィルタ)

私はこの種類のページを作成する方法の具体例/参照(探していますクエリー文字列を使用してフィルタリングできる結果セット)。

答えて

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); 

手順を繰り返す(または同じでそれをやって時間)を使用して、クエリに必要なデータフィールドも挿入します。

関連する問題