2009-06-08 4 views
1

Ich baue eine Event-Seite ähnlich wie last.fm/eventsWie filtert man eine Ergebnismenge mit der Query-Zeichenkette in PHP/MySQL?

Der Benutzer kann nach Datum Ereignisse filtern, Kategorie usw., wobei die Parameter in der Abfrage-String übergeben

Meine Frage ist, was ist der beste Weg, um Ihre zu strukturieren Code (Abfragen, Schleifen) für diese verschiedenen Abfragetypen zu ermöglichen, und kombinieren sie möglicherweise (zB Filter nach Datum und Kategorie)

ich suche praktische Beispiele/Referenzen, wie diese Art von Seite zu machen (eine Ergebnismenge, die mithilfe der Abfragezeichenfolge gefiltert werden kann.

Antwort

4

Ein gemeinsames Muster für die Erstellung benutzerdefinierter Datenbankabfragen:

$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... 

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

Wenn Sie eine zusätzliche Filterung des Datenbankergebnis tun müssen, nur eine Schleife verwenden, kopieren die Daten zu einem Zielarray und continue immer dann, wenn Sie auf eine Zeile stoßen, die aus dem Ergebnis ausgelassen werden sollte.

0

Wenn Sie Daten aus der Abfragezeichenfolge zum Ausführen von Abfragen verwenden, sollten Sie vorbereitete Anweisungen/gespeicherte Prozeduren für die Sicherheit verwenden. Hinzu kommt, dass MySQL 5.1.17 Query Caching mit vorbereiteten Anweisungen arbeitet.

Vorbereitete Anweisungen können wie eine normale Abfrage in PHP aufgebaut werden, indem die verschiedenen Teile der Abfrage, die Sie für diese bestimmte Abfrage benötigen, miteinander verkettet werden.

Um Belästigungen zu vermeiden, mit ‚platzieren und die zwischen Sie jede Aussage zu einer Reihe von Dingen zuweisen könnte zu verwenden und diese dann implodieren:

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

Wiederholung des Verfahrens (oder es gleichzeitig tun Zeit), die für die Abfrage benötigten Datenfelder einzufügen.

Verwandte Themen