Page 1 sur 1

Filtre de données

Posté : 26 avr. 2007, 18:23
par Mikayé
Bonjour,
Voici ma situation : j'ai un petit site (pour l'instant) en php (j'ai débuté il y a une semaine). Les données sont dans une base Mysql (version 5 je crois ...) et je voudrais faire un formlaire pour filtrer l'affichage des données avec 16 champs sachant que tout les champs ne sont pas forcément remplis. Ma question : est-ce réalisable en php et si oui comment ?

Sachant que pour pouvoir programmer je me sert d'exemple par-ci par-là (donc me donner des exemples plutot que la marche à suivre SVP)
Merci d'avance !

Posté : 26 avr. 2007, 20:12
par Ryle
Oui c'est possible, il te suffit de récupérer les valeurs des champs qui ont été renseignés et de construire ta requête en filtrant en fonction de ces valeurs...

Et pour l'exemple, on va faire simple car comprendre te sera toujours plus pofitable que recopier ;)
$sql = "SELECT .. FROM .. WHERE ..";
if($_POST['champX'] != '')
  $sql.= " AND champX = '".$_POST['champX']."'";
if($_POST['champY'] != '')
  $sql.= " AND champY LIKE '".$_POST['champY']."'%";
...
Voilà, tu as la marche à suivre et l'exemple.. y a plus qu'à :)

Posté : 26 avr. 2007, 21:23
par Mikayé
OK merci ! Je test et je vois si ca marche ... parce-que je ne savait pas que dans la requete sql les AND fonctionnait sans autres champs de recherche avant ...

Posté : 26 avr. 2007, 21:27
par orgerix
Non, il ne marche pas.

La solution de Ryle ne marche que s'il y avait déjà un filtrage. Sinon, il faut faire ca :
$sql = "SELECT .. FROM .. ";
if($_POST['champX'] != '') 
  $sql.= " WHERE champX = '".$_POST['champX']."'"; 
if($_POST['champY'] != '') 
  $sql.= " AND champY LIKE '".$_POST['champY']."'%";
[...]

Posté : 26 avr. 2007, 23:49
par Ryle
C'est pour ça qu'il y a un " WHERE ... " au préalable. Si ce n'est pas le cas, il faut adapter bien évidement à son code et tester s'il y a eu une condition pour savoir si l'on doit mettre un AND ou un WHERE :)
Ton exemple ne fonctionnera pas plus si 'champX' n'est pas renseigné, tu vas zapper le WHERE et attaquer directement avec le AND du 'champY'.

A chacun sa façon de faire après, on peut tester à chaque fois :
$sql = "SELECT .. FROM .. "; 
$sqlCritere = "";
if($_POST['champX'] != '') {
  $sqlCritere .= ($sqlCritere=='') ? 'WHERE' : 'AND';
  $sqlCritere " champX = '".$_POST['champX']."'";  
}
if($_POST['champY'] != '')  {
  $sqlCritere .= ($sqlCritere=='') ? 'WHERE' : 'AND';
  $sqlCritere .= " champY LIKE '".$_POST['champY']."'%"; 
}
...
$sql .= $sqlCritere;
Ou bien tout rassembler à la fin :
$sql = "SELECT .. FROM .. "; 

$critere = array();
if($_POST['champX'] != '')  
  $critere[] = " champX = '".$_POST['champX']."'";  
if($_POST['champY'] != '')  
  $critere[] = " champY LIKE '".$_POST['champY']."'%"; 
...
$sql .= " WHERE " . implode(' AND ', $critere);
Quelque soit la façon de faire, ce qui compte de toute façon c'est de générer une chaine de caractère qui correspondra à la requête SQL que l'on souhaite jouer :)