comment appliquer des filtres successifs sur une base de donnée

Petit nouveau ! | 8 Messages

28 avr. 2009, 14:45

Bonjour a tous !! :D

voici mon soucis :
j'effectu une requete sur bdd.
le but de la requete etant d'afficher les données par une selection de 4 filtres

je vais donner un exemple concret, ce sera plus rapide :

voici mes 4 filtres : typeA et typeB, localisationA et localisationB

le resultat doit afficher toutes les entrées filtrée par le typeA, puis cette selection filtrée par le typeA doit être filtrée par le typeB, puis par localisationA et enfin par localisationB pour aboutir au resultat voulu

donc mon idée est d'appliquer les filtres chacun son tour, car je ne voi pas comment proceder autrement, mais il existe peut-être une manière plus simple et optimisée en sachant qu'un des filtres n'est pas forcement activé, ce qui complique tout

:shock: help please

si vous avez une idée, merci de la partager, je suis vraiment largué :?

D4Y
Eléphant du PHP | 52 Messages

28 avr. 2009, 14:49

Je pense que le "AND" dans ta requetedoit faire l'affaire
SELECT * FROM matable WHERE typeA = 'type_a' AND typeB = 'type_b' AND localistationA = 'localisation_a' AND localistationB = 'localisation_b'

Petit nouveau ! | 8 Messages

28 avr. 2009, 14:56

:D oui effectivement, ca simplifie enormement les choses, :lol: je me sent comme soulagé
je me voyais deja en train de créer un gros code... argh
merci beaucoup, je vais tester Ça.

mais je viens de realiser que si un des filtre n'est pas activé, comme puis-je dynamiquement modifier la requete pour n'integrer que les filtres selectionnés ??


a bientôt

merci pour cette reponse si rapide :wink:

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

28 avr. 2009, 15:05

La requête SQL n'est qu'une simple chaine de caractères pour php... il te suffit donc de construire la requête que tu souhaites exécuter en fonction des paramètres dont tu disposes...
$sql = "SELECT ... FROM ... ";
if ( .... ) 
  $sql.= " WHERE ... "
if ( .... ) 
  $sql.= " AND ... "
La petite difficulté étant seulement d'identifier quand est-ce qu'il faut mettre un where et quand est-ce qu'il faut mettre un and, si jamais la 3ème condition est renseignée, mais pas la premiere :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 8 Messages

28 avr. 2009, 15:10

je comprend le concept mais pourriez-vous me donner un exemple concret svp ? ainsi je pourrais modifier et adapter car j'ai encore un peu de mal a composer de toute piece un code aussi complexe

merci

D4Y
Eléphant du PHP | 52 Messages

28 avr. 2009, 15:18


$where = "";
if($typea != "" ||  $typeb != "" || $localisationa != "" || $localisationb != "")
{
$where .= "WHERE";
  
if($typea != "")
{
$where .= " typeA = ''".$typea."";
}

if($typea != "" &&  ($typeb != "" || $localisationa != "" || $localisationb != ""))
{
$where .= " AND ";
}

if($typeb != "")
{
$where .= " typeB = ''".$typeb."";
}

// et aini de suite....


}


mysql_query("SELECT * FROM matable ".$where."");


Petit nouveau ! | 8 Messages

28 avr. 2009, 15:23

merci beaucoup pour cet exemple,

je vais tester Ça de suite
:D

EDIT :

jai adapté le code, mais jai un parse error, impossible de savoir ce qui ne va pas, jai testé le point virgule, les guillemets, bref, je bloque

voici le bout de code qui bloque,
if ( $cuisinea == 0 ) {    //c'est cette ligne qui est designée par le parse error !

   $where=$where;

}

else {

    if ($where='') {
      $where=$where.'idtipococina='.$cuisinea;
    }

    else {
      $where=$where.' and idtipococina='.$cuisinea;
    }

}
help please :cry:

ViPHP
AB
ViPHP | 5818 Messages

28 avr. 2009, 18:27

$cuisinea n'est peut-être pas défini...
if (isset($cuisinea) && $cuisinea == 0) {

}
Mais tu ne suis pas les exemples ci-dessus pour concaténer tes chaines
$chaine = '';
$chaine .= 'chiens';
$chaine .= ' et ';
$chaine .= 'chats';

echo $chaine;

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

28 avr. 2009, 18:30

$sql = "SELECT ... FROM ... ";
if ( .... ) 
  $sql.= " WHERE ... "
if ( .... ) 
  $sql.= " AND ... "
La petite difficulté étant seulement d'identifier quand est-ce qu'il faut mettre un where et quand est-ce qu'il faut mettre un and, si jamais la 3ème condition est renseignée, mais pas la premiere :)
Pour contourner cette difficulté, l'astuce suivante est infaillible :
$sql = "SELECT ... FROM ... WHERE 1=1";
if ( .... ) 
  $sql.= " AND ... "
if ( .... ) 
  $sql.= " AND ... "
Ben alors, Ryle ? Ne me dis pas que tu ne la connaissais pas ! :shock:

Mammouth du PHP | 686 Messages

28 avr. 2009, 18:59

$sql = "SELECT ... FROM ... WHERE 1=1";
if ( .... ) 
  $sql.= " AND ... "
if ( .... ) 
  $sql.= " AND ... "
Ben alors, Ryle ? Ne me dis pas que tu ne la connaissais pas ! :shock:
Rolala mais oui !!! Perso j'aurai jamais pensé à ca !! Ya des rusés parmis nous ! :wink:

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

28 avr. 2009, 19:01

Vous pouvez envoyer vos dons à mon fan club... :langue:

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

28 avr. 2009, 19:16

Modération :
gandahar, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.

Mammouth du PHP | 686 Messages

28 avr. 2009, 20:49

Vous pouvez envoyer vos dons à mon fan club... :langue:
1 fan (de plus ?) !

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

28 avr. 2009, 21:58

Ben alors, Ryle ? Ne me dis pas que tu ne la connaissais pas ! :shock:
Si, si, je connaissais, mais ça me donne des boutons de voir passer des 1=1 dans des requêtes sql... (c'est comme si tu me sortais un if (true === true), voire quand je dois faire des checked="checked" mais celui là, on peut malheureusement pas y faire grand chose... longue vie au html ! ;))

Donc moi, mon truc infaillible et qui donne pas de boutons aux dba, c'est de construire ma requête proprement ;)

En plus, s'il n'y a que des AND, on peut le faire très simplement avec un tableau et un implode :
$tabConditions = array();
if (condition1)
  $tabConditions[] = ' champ = $valeur ';
...

if (count($tabConditions) > 0)
  $sql. = ' WHERE ' . implode(' AND ', $tabConditions);
Le résultat sera le même, mais je trouve ça plus propre :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

28 avr. 2009, 22:05

Ah, le implode() est très élégant, j'aime beaucoup aussi. =D>

Finalement, je suis passé par l'approche SQL et toi, par l'approche PHP.

Ça vaudrait le coup de faire un benchmark pour voir si ç'a un impact en termes de performances, non ?