1

last.fm/eventsのようなイベント ページを作成しています。

ユーザーは、クエリ文字列で渡されたパラメーターを使用して、日付、カテゴリなどでイベントをフィルター処理できます。

私の質問は、コード (クエリ、ループ) を構造化して、これらのさまざまなクエリの種類を許可し、潜在的にそれらを組み合わせる (たとえば、日付カテゴリでフィルター処理する) 最善の方法は何かということです。

このタイプのページ (クエリ文字列を使用してフィルター処理できる結果セット) を作成する方法の実用的な例/リファレンスを探しています。

4

2 に答える 2

5

カスタム データベース クエリを作成するための一般的なパターン:

$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、結果から除外する必要がある行に遭遇するたびにします。

于 2009-06-08T12:00:14.007 に答える
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);

手順を繰り返す(または同時に実行する)ことで、クエリに必要なデータフィールドも挿入します。

于 2009-06-08T12:06:26.223 に答える