Yayınlanmıştır değişkenlere dayalı bina MySQL sorgusu

3 Cevap php

Bu, basit bir görev gibi görünüyor, ama ben bunun için mi bir çözüm bulmak zor bir zaman yaşıyorum. Ben aksak başka bir şey düşünecektim şey bulamıyorum. İşte ben çalışıyorum ne:

Bir arama formu var işlem script mesaj değişkenler olduğunu. Bu değişkenler sorgulanan veriler için filtreler vardır. Kullanıcı haklarına bağlı olarak, erişimi filtreler bağlı olarak gelen daha fazla ya da daha az değişken, olabilir. Her filtre temelde, sonuçlar geliyor tablodaki bir alanla ilişkilidir. Her filtre için bir seçenek "ANY" de, yani hiçbir yan tümcesi gerekli NEREDE.

Sorgu dizesi oluşturmak için iyi bir yolu nedir. $ Ad, $ soyad, yaş $, $ dob: geri geliyor dört değişken var diyelim. Ama sadece bazı kullanıcılar $ yaş ve $ dob göre filtre erişebilirsiniz.

$query = "SELECT * FROM people";
if(($firstname != 'ANY' && !empty($firstname)) ||
   ($lastname != 'ANY' && !empty($lastname)) ||
   ($age != 'ANY' && !empty($age)) ||
   ($dob != 'ANY' && !empty($dob))) {
    $query .= " WHERE";
}

if($firstname != 'ANY' && !empty($firstname)) {
    $query .= " firstname='$firstname'";
}
if($lastname != 'ANY' && !empty($lastname)) {
    if($firstname != 'ANY' || !empty($firstname)) {
        $query .= " AND";
    }
    $query .= " lastname='$lastname'";
}
...

Ve böylece. Ama bu sadece bana aptal korkunç ve gülünç verimsiz görünüyor. Ben biraz değiştirilmiş MVC deseni kullanıyorum, bu yüzden olası her filtre için arama modelinde yöntemler inşa etmek mantıklı olur?

3 Cevap

Bunun için gitmek istiyorum:

$query = "SELECT * FROM people";

$whereClause = " WHERE 1 = 1 ";
if($firstname != 'ANY' && !empty($firstname)) {
    $whereClause .= " AND firstname='$firstname' ";
}
if($lastname != 'ANY' && !empty($lastname)) {
    $whereClause .= " AND lastname='$lastname' ";
}

$query .= $whereClause;

Sen alternatif bir diziye bütün ifadeleri toplamak ve sadece gidebiliriz:

if (count($arr)>0) { 
   $query = "$query 
              WHERE ". implode(" AND ",$arr); 
}

Burada birlikte tüm yayınlanmıştır değişkenleri ve dize onları çekecek bazı kod.

foreach($_POST as $name=>$value){
    $arrFields[] = $name." = '".$value."'";
}
$sSql = "SELECT * FROM people WHERE 1 AND ".implode(" AND ",$arrFields);

OR senin alan adları tablo adları aynı, ya da farklı bir biçimde SQL alanları tedavi etmek istiyorsanız, size bir anahtar kullanabilirsiniz değilseniz.

foreach($_POST as $name=>$value){
    switch($name){
    	case "firstname":
    		$arrFields[] = "fName = '".$value."'";
    		break;
    	case "lastname":
    		$arrFields[] = "lName = '".$value."'";
    		break;
    	case "age":
    		$arrFields[] = "bioAge >= ".$value;
    		break;
    }
}
$sSql = "SELECT * FROM people WHERE 1 AND ".implode(" AND ",$arrFields);