Besoin d'une idée pour automatiser une construction de requête

Besoin d'une idée pour automatiser une construction de requête - PHP - Programmation

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  :non: )
 
Je ne suis certainement pas le 1er à réfléchir à ça, alors si qql avait une piste...  :wahoo:


Message édité par Peanuty le 16-06-2006 à 11:41:09
Reply

Marsh Posté le 16-06-2006 à 11:27:07   

Reply

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;

Reply

Marsh Posté le 16-06-2006 à 11:39:43    

Merci, mais je vois pas où tu veux en venir.  :sweat:

Reply

Marsh Posté le 16-06-2006 à 11:48:23    

Peanuty a écrit :

Merci, mais je vois pas où tu veux en venir.  :sweat:


 
+1 ;)


---------------
Je donne souvent l'air d'être ailleurs, mais en faite, je ne suis nulle part...
Reply

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 :
  1. $req = "select * from table";
  2. unset($clause);
  3. unset($clause_ban);
  4. if ($a == 1)
  5. {
  6.  if (isset($clause_ban))
  7.   $clause_ban .= " or";
  8.  $clause_ban .= " CODE_BAN='6'";
  9. }
  10. if ($b == 1)
  11. {
  12.  if (isset($clause_ban))
  13.   $clause_ban .= " or";
  14.  $clause_ban .= " CODE_BAN='9'";
  15. }
  16. if ($c == 1)
  17. {
  18.  if (isset($clause_ban))
  19.   $clause_ban .= " or";
  20.  $clause_banque .= " CODE_BAN='8'";
  21. }
  22. if (isset($clause_ban))
  23. {
  24.  if (isset($clause))
  25.   $clause .= " and (" . $clause_ban . " )";
  26.  else
  27.   $clause .= " (" . $clause_ban . " )";
  28. }
  29. if (isset($clause))
  30.  $req .= " where" . $clause;

Reply

Marsh Posté le 16-06-2006 à 12:46:36    

et bien oui mais c'est comme cela a mon avis qu'il faut fonctionner

Reply

Marsh 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. :sweat:  
 
C'est pour ça que j'aimerais faire une fonction générique. Et puis j'aime bien les fonctions génériques.  :D

Reply

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. :sweat:  
 
C'est pour ça que j'aimerais faire une fonction générique. Et puis j'aime bien les fonctions génériques.  :D


 
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. [:spamafote]
 
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.  :o

Reply

Marsh Posté le 16-06-2006 à 15:03:05    

Ca me paraît bien.  :jap:  
 
Mis à part que je viens d'en rajouter une couche avec des group by, des select et des from "conditionnels" comme pour le where.  :pt1cable:  
 
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)

Reply

Marsh Posté le 16-06-2006 à 15:04:09    

Peanuty a écrit :

Ca me paraît bien.  :jap:  
 
Mis à part que je viens d'en rajouter une couche avec des group by, des select et des from "conditionnels" comme pour le where.  :pt1cable:  
 
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)


 
Moi à mon avis, c'est ton idée et ta structure de départ qui est pourri. :o

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed