Page 1 sur 2
comment appliquer des filtres successifs sur une base de don
Posté : 28 avr. 2009, 14:45
par gandahar
Bonjour a tous !!
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

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

Posté : 28 avr. 2009, 14:49
par D4Y
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'
Posté : 28 avr. 2009, 14:56
par gandahar

oui effectivement, ca simplifie enormement les choses,

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

Posté : 28 avr. 2009, 15:05
par Ryle
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

Posté : 28 avr. 2009, 15:10
par gandahar
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
Posté : 28 avr. 2009, 15:18
par D4Y
$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."");
Posté : 28 avr. 2009, 15:23
par gandahar
merci beaucoup pour cet exemple,
je vais tester Ça de suite
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

Posté : 28 avr. 2009, 18:27
par AB
$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;
Posté : 28 avr. 2009, 18:30
par albat
$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 !

Posté : 28 avr. 2009, 18:59
par sylvaing26
$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 !

Rolala mais oui !!! Perso j'aurai jamais pensé à ca !! Ya des rusés parmis nous !

Posté : 28 avr. 2009, 19:01
par albat
Vous pouvez envoyer vos dons à mon fan club...

Posté : 28 avr. 2009, 19:16
par albat
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
en haut à gauche de ce sujet.
Posté : 28 avr. 2009, 20:49
par sylvaing26
Vous pouvez envoyer vos dons à mon fan club...

1 fan (de plus ?) !
Posté : 28 avr. 2009, 21:58
par Ryle
Ben alors,
Ryle ? Ne me dis pas que tu ne la connaissais pas !

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

Posté : 28 avr. 2009, 22:05
par albat
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 ?