Besoin d'une idée pour automatiser une construction de requête - PHP - Programmation
Marsh Posté le 16-06-2006 à 11:31:16
a mon avis il faut que tu fasse des concaténations à mon avis du style de l'exemple suivant :
if ($equipe != 'Tous') {
$conditionrq .='AND A.CodeEquipe=\''.$equipe.'\'';
}else{
$conditionrq .='AND E.CodeEquipe=A.CodeEquipe AND E.CodeDivision=\''.$division.'\'';
}
$requete='SELECT distinct(L.codelivrable),L.nomlivrable, TL.nomtypelivrable, A.CodeEquipe
FROM llivrable L, ltypelivrable TL, lsousprojet S,tapplication A, tequipe E
WHERE L.codetypelivrable=TL.codetypelivrable AND L.codessprojet=S.codessprojet AND S.codeappli=A.CodeAppli '.$conditionrq;
Marsh Posté le 16-06-2006 à 11:39:43
ReplyMarsh Posté le 16-06-2006 à 11:48:23
Peanuty a écrit : Merci, mais je vois pas où tu veux en venir. |
+1
Marsh Posté le 16-06-2006 à 11:52:31
Voilà ce que le code (sans fonction) donne rien que pour le test sur a/b/c !
Code :
|
Marsh Posté le 16-06-2006 à 12:46:36
ReplyMarsh Posté le 16-06-2006 à 13:02:54
Youlie2 a écrit : et bien oui mais c'est comme cela a mon avis qu'il faut fonctionner |
Mais là j'ai pas fini, c'est juste un exemple avec seulement 1 groupe de 3 ! Illisible et parfait pour se planter surtout si on essaye de rajouter une condition à l'avenir.
C'est pour ça que j'aimerais faire une fonction générique. Et puis j'aime bien les fonctions génériques.
Marsh Posté le 16-06-2006 à 14:51:22
Peanuty a écrit : Mais là j'ai pas fini, c'est juste un exemple avec seulement 1 groupe de 3 ! Illisible et parfait pour se planter surtout si on essaye de rajouter une condition à l'avenir. |
Et bien au travail : Tu construis ta fonction en lui transmettant un tableau de valeurs et cette fonction renvoie une chaine de caractère correspondant à ta clause WHERE.
Note : tu procèdes par boucle dans ta fonction avec un tableau à deux dimensions.
1° dimension : les groupes.
2° dimension : les lettres au sein des groupes.
Ensuite, tu as une double boucle.
Dans la deuxième, tu concatènes avec la nouvelle lettre ."OR ".$nouvelle_lettre (SAUF s'il s'agit de la première lettre du groupe auquel cas, tu concatènes avec seulement .$nouvelle_lettre.
Pas dur. Réfléchis un peu et bosse.
Marsh Posté le 16-06-2006 à 15:03:05
Ca me paraît bien.
Mis à part que je viens d'en rajouter une couche avec des group by, des select et des from "conditionnels" comme pour le where.
Bon, je vais voir ça.
(mais ça m'étonne qu'il n'existe pas déjà une bibliothèque pour faire ce genre de trucs qui doit revenir tout le temps dans les formulaires un peu longs)
Marsh Posté le 16-06-2006 à 15:04:09
Peanuty a écrit : Ca me paraît bien. |
Moi à mon avis, c'est ton idée et ta structure de départ qui est pourri.
Marsh Posté le 16-06-2006 à 11:27:07
Hello,
voilà, je récupère des données dans un formulaire à partir desquelles je dois faire un bête SELECT.
En gros j'ai des groupes de cases à cocher :
a b c
p q
w x y z
(chaque groupe correspond à une colonne de la TABLE)
et la requête correspondante :
SELECT * FROM table WHERE (a OR b OR c) AND (p OR q) AND (w OR x OR y OR z);
Le seul truc c'est que je ne sais pas à l'avance combien (de 0 à n) de cases seront cochées dans chaque groupe, ni lesquelles. Donc à chaque fois que je concatène une condition supplémentaire à la clause, je ne sais pas si je dois caser un OR, un AND, ...
Du coup la requête peut très bien être :
SELECT * FROM table WHERE (a OR b) AND (p OR q) AND w;
ou SELECT * FROM table WHERE (a OR b OR c) AND (w OR x OR y OR z);
ou SELECT * FROM table WHERE c;
ou ...
Je cherche donc à écrire une fonction générique qui permettrait de construire la clause WHERE de la requête, et j'ai pas trop d'idée.
(pour l'instant j'ai fait ça sans fonction, avec des séries de if, mais c'est bordélique et ça ne me plaît pas )
Je ne suis certainement pas le 1er à réfléchir à ça, alors si qql avait une piste...
Message édité par Peanuty le 16-06-2006 à 11:41:09