Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2411 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1388810
Peanuty
Posté le 16-06-2006 à 11:27:07  profilanswer
 

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
mood
Publicité
Posté le 16-06-2006 à 11:27:07  profilanswer
 

n°1388819
Youlie2
Posté le 16-06-2006 à 11:31:16  profilanswer
 

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;

n°1388840
Peanuty
Posté le 16-06-2006 à 11:39:43  profilanswer
 

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

n°1388862
Glock21
Yark !
Posté le 16-06-2006 à 11:48:23  profilanswer
 

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...
n°1388874
Peanuty
Posté le 16-06-2006 à 11:52:31  profilanswer
 


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;

n°1388913
Youlie2
Posté le 16-06-2006 à 12:46:36  profilanswer
 

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

n°1388922
Peanuty
Posté le 16-06-2006 à 13:02:54  profilanswer
 

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

n°1389052
Hermes le ​Messager
Breton Quiétiste
Posté le 16-06-2006 à 14:51:22  profilanswer
 

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

n°1389089
Peanuty
Posté le 16-06-2006 à 15:03:05  profilanswer
 

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)

n°1389092
Hermes le ​Messager
Breton Quiétiste
Posté le 16-06-2006 à 15:04:09  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
enlevement caractère requête sql accessAide pour une requête!
Besoin d'aide pour une AP en programation événementiel [résolut]transferts de requête
requete avec liaison[sql/Excel] requête sql vers Excel : problème de saut de ligne ...
[VB6][resolu] prob requeteLoadMovie - Besoin d'aide
stocker les résultats d'une requete[noob] simplifier une requete SQL
Plus de sujets relatifs à : Besoin d'une idée pour automatiser une construction de requête


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR