2009-12-11 5 views
2

J'ai actuellement une grande table en MySQL avec plusieurs champs. J'essaye actuellement de permettre à l'utilisateur de filtrer par chaque champ, via des boîtes de sélection.Correctement filtrer avec PHP/MySQL et Select Box

J'ai 4 champs: École, Division et État.

Je n'ai aucun problème, en utilisant PHP, sur la façon de filtrer en fonction de l'option que l'utilisateur sélectionne dans la boîte de sélection.

Par exemple, si ces 3 sont soumis:

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

je serais en mesure d'interroger en fonction de chaque option, comme:

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

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

Cependant, si je veux avoir un « All "option (dans la boîte de sélection), comment j'implémenterais ceci dans la requête ou la clause WHERE, de sorte qu'il ne filtre pas ce champ particulier?

+2

J'espère que vous utilisez des instructions préparées pour éviter les injections SQL. –

+0

Je suis, je l'ai juste gardé concis pour garder la «question» aussi simple que possible. – Dodinas

Répondre

4

Vous devriez simplement faire une option que vous recherchez spécifiquement. En fait, dans ce cas, il semble que le meilleur choix serait de faire en sorte que vos boîtes de sélection aient une option «Tous», ou simplement de les laisser vides. Le choix vide peut être votre choix par défaut. Je l'aurais mis en place comme:

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

Maintenant, lorsque vous configurez vos variables de requête, vous faites ceci:

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

Maintenant, si toutes les options de sélection se sélectionnés avec les valeurs vides (utilisation. tous), ils ne feront pas partie de la clause WHERE.

Vous êtes ouvert aux attaques par injection SQL si vous n'échappez pas vos données $ _POST entrantes. Il vous faut donc exécuter mysql_real_escape_string() sur vos valeurs $ _POST, que j'ai ajoutées à l'exemple. On dirait que vous êtes déjà au courant de cela.

1

Ne pas tenir compte de l'injection sql, etc, voici la logique de base d'une façon de le faire. Pseudo-code, ou bien sûr.

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

De cette façon, avec le 1 = 1, vous n'avez pas à vous soucier de savoir si pour ajouter/précédez « et » selon que certains ou la totalité d'entre eux sont présents. Vous sélectionnez tout (valeur de sélection vide) par défaut, et filtre en fonction de la présence de chaque sélection.

Bien sûr, vous devrez le nettoyer un peu, le sécuriser, mettre des valeurs dans des variables, etc., mais c'est la logique de base.