Filtre de données

Petit nouveau ! | 2 Messages

26 avr. 2007, 18:23

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 !
Modifié en dernier par Mikayé le 24 sept. 2011, 15:32, modifié 1 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 avr. 2007, 20:12

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'à :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 2 Messages

26 avr. 2007, 21:23

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

Mammouth du PHP | 693 Messages

26 avr. 2007, 21:27

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']."'%";
[...]

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 avr. 2007, 23:49

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...