PHP / MySQL sorgu dizesini kullanarak bir sonuç kümesi filtre nasıl?

2 Cevap php

I last.fm/events benzer bir etkinlik sayfası inşa ediyorum

Kullanıcı sorgu dizesinde geçirilen parametreleri ile, tarih, kategori vb olaylarını filtreleme yapabilirsiniz

Benim sorum bu farklı sorgu türleri için izin kodunuzu (sorgular, döngüler) yapısı ve potansiyel onları birleştirmek için en iyi yolu, ne olduğunu (tarihe göre örneğin filtre and kategorisi)

Ben sayfanın bu tip (sorgu dizesi kullanarak filtre edilebilir bir sonuç kümesi) nasıl pratik örnekler / referanslar arıyorum.

2 Cevap

Özel bina veritabanı sorguları için bir ortak desen:

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

Yoksa, PDO kullanarak:

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

Eğer veritabanı sonucu ek filtreleme yapmak gerekiyorsa sonuç alınmamalıdır bir satır karşılaştıkları zaman, sadece bir hedef diziye verileri kopyalamak için bir döngü kullanabilirsiniz ve continue.

Sorguları çalıştırmak için sorgu dizesi verileri kullanarak konum Öncelikle eğer güvenliği için hazırlanmış tablolar / saklanan prosedürleri kullanmak isteyeceksiniz. Ayrıca MySQL 5.1.17 beri sorgu önbelleğe alma hazırlanmış tablolar ile çalışır.

Hazırlanan tabloları bu özel sorgu için ihtiyaç sorgu çeşitli bölümlerini birbirine birleştirerek, sadece PHP normal bir sorgu gibi inşa edilebilir.

Kullanmak şeylerin bir dizi her bildirimde atamak ve sonra onları içeriye patlamak olabilir, araya 'yerleştirmek zorunda VE ait olan sıkıntılar önlemek için:

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

İşlemin tekrarlanması (veya aynı anda yapıyor) siz de sorgu için gereken veri alanları eklemek için.