Düzgün PHP / MySQL ve Select Box ile Filtresi

2 Cevap php

Şu anda birkaç alanları ile MySQL büyük bir tablo var. Şu anda Seç kutular vasıtasıyla, kullanıcının her alana göre filtre uygulamak için izin çalışılıyor.

Okul, Bölüm ve Devlet: I 4 alanlar var.

Ben kullanıcı seçin kutusunda seçer hangi seçeneği dayalı filtre nasıl, PHP kullanarak, hiçbir sorun yok.

Örneğin, bu 3 sunulur eğer:

<select id="school">
 <option value="13">John Brown School</option>
</select>

<select id="division">
 <option value="I">I</option>
</select>

<select id="state">
 <option value="NY">New York</option>
</select>

Ben gibi, her seçeneğe göre sorgulamak mümkün olacaktır:

$school= $_POST['school'];
$division= $_POST['division'];
$state = $_POST['state'];

Query: SELECT * from table WHERE school=$school AND division=$division and state=$state

Ben (select kutusunda) bir "All" seçeneği var isterseniz o belirli alan filtre etmez böylece Ancak, ne ben, sorgu veya WHERE yan tümce içine bu uygulamak istiyorsunuz?

2 Cevap

Sadece size özel olarak bakmak bir seçenek yapmak gerekir. Iyi seçenek seçeneğini kutuları bir "All" seçeneği var, ya da sadece boş onları terk yapmak olacak gibi aslında, bu durumda bu sesler. Boş seçim varsayılan olabilir. Ben o kadar kurmak olurdu:

<option value="">-- All schools --</option>
 etc.

Sorgu değişkenleri kurarken Şimdi, bunu:

$whereClauses = array();
if (! empty($_POST['school'])) $whereClauses[] = 'school='.mysql_real_escape_string($_POST['school']);
if (! empty($_POST['division'])) $whereClauses[] ='division='.mysql_real_escape_string($_POST['division']);
if (! empty($_POST['state'])) $whereClauses[] = 'state='.mysql_real_escape_string($_POST['state']);

$where = '';
if (count($whereClauses) > 0) {
    $where = 'WHERE '.implode(' AND ',$whereClauses);
}

$query = "SELECT * FROM table ".$where;

Herhangi seçenekleri seçin boş değerler (yani bütün kullanın) ile seçilmiş olsun Şimdi, eğer onlar WHERE yan tümcesinin parçası olmayacaktır.

Siz de gelen $ _POST verileri kaçış yoksa bunu yapmanız gereken tek şey mysql_real_escape_string() Ben örnek için eklenen senin $ _POST değerleri üzerinde çalıştırmak, SQL enjeksiyon saldırılarına açık olan . Zaten o düşünceden farkındayız gibi geliyor.

Sql enjeksiyon, vb için muhasebe değil, burada bunu yapmak için bir yol temel mantığıdır. Psudo-kodu veya kurs.

<select id="select1">
    <option value="">All</option>
    <option value="value1">Value1</option>
    ...
</select>



$sql = "select ... from ... where 1 = 1 ";

if ( !empty($_POST["select_1"]) ) {
    $sql .=" and field1 = select1value";
}

if ( !empty($_POST["select_2"]) ) {
    $sql .=" and field2 = select2value";
}

if ( !empty($_POST["select_one"]) ) {
    $sql .=" and field3 = select3value";
}

// Etc.

Bu şekilde, 1 = 1 ile, / prepend append 've' bazıları ya da hepsi mevcut olup olmadığını dayalı olup olmadığını endişelenmenize gerek yok. Her select varlığına dayalı tüm varsayılan (boş değeri seçin) ve filtre seçin.

Tabii, vb değişkenler içine değerlerini koymak, sabitleyin, biraz onu temizlemek gerekir, ancak bu temel mantığıdır.