[resolu] pb execution requete

pb execution requete [resolu] - PHP - Programmation

Marsh Posté le 26-07-2006 à 09:41:21    

Bonjour à tous,  
 
je rencontre un problème avec ce message qui s'affiche lorsque j'exécute ma page.

Code :
  1. Warning: pg_query() [function.pg-query]: Query failed: ERROR: missing FROM-clause entry for table "fonctions" in C:contact_grp_result.php on line 46
  2. Warning: pg_fetch_object() expects parameter 1 to be resource, boolean given in C:contact_grp_result.php on line 47
  3. SELECT utilisateurs.uti_cle, uti_nom, uti_prenom, uti_mail, uti_tel, uti_portable, min(fonctions.fonc_cle) FROM lienfonc INNER JOIN utilisateurs ON utilisateurs.uti_cle=lienfonc.uti_cle INNER JOIN concessions ON uti_concession=conc_cle INNER JOIN filiales ON conc_filiale=fil_cle INNER JOIN marques ON fil_marque=marq_cle INNER JOIN fonctions ON fonctions.fonc_cle=lienfonc.fonc_cle WHERE 1=1 AND fonctions.fonc_cle=3 GROUP BY utilisateurs.uti_cle, uti_nom, uti_prenom, uti_mail, uti_tel, uti_portable, fil_lib, marq_lib, conc_lib ORDER BY uti_nom, uti_prenom OFFSET 0 LIMIT 5


 
Comme vous le voyez j'ai fait un echo de ma requete. Lorsque je l'exécute dans PG ADMIN III elle fonctionne... Ques veut dire l'erreur??


Message édité par jenny50 le 26-07-2006 à 13:32:44
Reply

Marsh Posté le 26-07-2006 à 09:41:21   

Reply

Marsh Posté le 26-07-2006 à 10:24:37    

ERROR: missing FROM-clause entry for table "fonctions" in C:contact_grp_result.php on line 46
 
c est assez explicite non ?  
 
FROM lienfonc  
 
devient  
 
FROM lienfonc, fonctions
 
:/
 
quand je pense que je comprends rien a ta requete [:barthaliastoxik]

Reply

Marsh Posté le 26-07-2006 à 10:37:47    

jenny50 > quelques petites questions en passant : a quoi sert le 1=1 dans le where?
Qu'est ce que tu cherches à faire dans ta requette?
 
Tu cherches à conaitre la fonction minimale de chaque personne pour chaque concessions,filiales,marques ou bien tu cherches à savoir si chaque personne à la fonction 3 pour chacun des couples concessions,filiales,marques?
Dans tous les cas, ca ne serait pas mieux de mettre la table "utilisateurs" en table principale plustôt que la table "lienfonc"?
Est ce que tu cherches à ignorer les personnes qui n'ont aucune fonction ou bien c'est une erreur de raisonement dans la création de la requette?

Reply

Marsh Posté le 26-07-2006 à 10:45:39    

ayant lu tous les précédents topics de jenny je vais répondre à quelques questions

omega2 a écrit :

a quoi sert le 1=1 dans le where?


sa requete est générée par du code php, comme jenny n'est pas sur d'avoir des clauses where a chaque fois, dans la requete de base il y a 1=1 auquel elle concate les clauses where supplémentaires ( et si y'en a pas ça marche quand même)

omega2 a écrit :

Qu'est ce que tu cherches à faire dans ta requette?


ça elle pourra pas te répondre ... :o
Mais en gros elle cherche a obtenir la liste de tous les utilisateurs ainsi que leur fonction, sachant qu'il y a une relation 1-N entre utilisateurs et fonctions mais qu'elle ne veut voir apparaitre qu'une seule fois chaque utilisateurs. A ce sujet je te conseille la lecture de l'avant dernier topic de jenny( au moins pour la rigolade)

omega2 a écrit :

Tu cherches à conaitre la fonction minimale de chaque personne pour chaque concessions,filiales,marques ou bien tu cherches à savoir si chaque personne à la fonction 3 pour chacun des couples concessions,filiales,marques?


réponse probable: les deux ...

omega2 a écrit :

Dans tous les cas, ca ne serait pas mieux de mettre la table "utilisateurs" en table principale plustôt que la table "lienfonc"?


réponse probable: ça change quoi ???

omega2 a écrit :

Est ce que tu cherches à ignorer les personnes qui n'ont aucune fonction ou bien c'est une erreur de raisonement dans la création de la requette?


réponse probable: oui

Message cité 1 fois
Message édité par anapajari le 26-07-2006 à 10:46:20
Reply

Marsh Posté le 26-07-2006 à 10:54:10    

en fait, ma requete est composé en 3 parties :  

Code :
  1. $query = "SELECT utilisateurs.uti_cle, uti_nom, uti_prenom, uti_mail, uti_tel, uti_portable, min(fonctions.fonc_cle)
  2.     FROM lienfonc, fonctions
  3.    INNER JOIN utilisateurs ON utilisateurs.uti_cle=lienfonc.uti_cle
  4.    INNER JOIN concessions ON uti_concession=conc_cle
  5.    INNER JOIN filiales ON conc_filiale=fil_cle
  6.    INNER JOIN marques ON fil_marque=marq_cle
  7.    INNER JOIN fonctions ON fonctions.fonc_cle=lienfonc.fonc_cle
  8.    WHERE 1=1 ";
  9. if ($HTTP_GET_VARS['marque']!=0)
  10. {
  11. $condi=$condi . ' AND marq_cle=' .$HTTP_GET_VARS['marque'];
  12. }
  13. if ($HTTP_GET_VARS['filiale']!=0)
  14. {
  15. $condi=$condi . ' AND fil_cle=' .$HTTP_GET_VARS['filiale'];
  16. }
  17. if ($HTTP_GET_VARS['fonction']!=0)
  18. {
  19. $condi=$condi . ' AND fonctions.fonc_cle=' .$HTTP_GET_VARS['fonction'];
  20. }
  21. if ($HTTP_GET_VARS['nom']!='')
  22. {
  23. $trav=strtoupper($HTTP_GET_VARS['nom']);
  24. $condi=$condi . " AND upper(uti_nom) LIKE '%" .$trav. "%'";
  25. }
  26. $query= $query.$condi. ' GROUP BY utilisateurs.uti_cle, uti_nom, uti_prenom, uti_mail, uti_tel, uti_portable, fil_lib, marq_lib, conc_lib ORDER BY uti_nom, uti_prenom OFFSET ' . $offset . ' LIMIT 5 ';


 
Ce que je souhaite est d'afficher ma liste de user avec nom, prenom, tel, portable et mail. Sur le nom je peux cliquer pour avoir plus de détail (j'utilise la clé du user). Le problème que j'ai rencontré c'est les doublons. D'où mon min(fonctions.fonc_cle).  
 
Cette requete fonctionne pour ma recherche par marque, filiale et nom. Pour la recherche par fonction, ça me mets cette erreur :  

Code :
  1. Warning: pg_query() [function.pg-query]: Query failed: ERROR: missing FROM-clause entry for table "fonctions" in C:contact_grp_result.php on line 46
  2. Warning: pg_fetch_object() expects parameter 1 to be resource, boolean given in C:contact_grp_result.php on line 47


 
mIRROR : j'ai changé mais cette fois il m'ajoute une autre erreur en plus des autres, Warning: pg_query() [function.pg-query]: Query failed: ERROR: missing FROM-clause entry for table "lienfonc" in C:contact_grp_result.php on line 54
Et meme dans PG ADMIN la requete ne s'execute plus

Reply

Marsh Posté le 26-07-2006 à 11:29:00    

anapajari a écrit :

réponse probable: les deux ...

Si elle veut les deux à la fois, il lui faut faire un "left outer join" sur "fonctions", faire le min sur "lienfonc.fonc_cle" et récupérer en plus "fonctions.fonc_cle" si disponible. De cette maniére, elle saura si la personne à cette fonction et qu'elle est sa fonction minimale.
Mais bon, peut être que

anapajari a écrit :

réponse probable: ça change quoi ???

Heu, aprés relecture rien vu que c'est des "inner join" donc la même chôse qu'un "table1,table2". J'ai trop l'habitude des "outer join" et en fait, j'avais quasiment jamais vu de "inner join" dans une véritable requette.
 

jenny50 a écrit :

j'ai changé mais cette fois il m'ajoute une autre erreur en plus des autres

Au vu de la nouvelle requette, c'est normal.
En rajoutant le ",fonctions" juste derriére le "WHERE lienfonc", t'as cassé l'enchainement des jointures vu que la table "lienfonc" n'est plus relié par jointure aux autres tables. En faisant ça, tu ne peux plus utiliser, dans les jointures, des colones de la table "lienfonc".
mIRROR t'avais dit de mettre ça mais il n'avait surement pas vu que la table est relié aux autres par une jointure.
 
PS : Maintenant que j'ai réalisé que t'utilises des "inner join", je ne vois plus de raison au message d'erreur que t'as. A la limite, tu peux essayer en mettant une relation classique entre les tables (table1,table2,table3) à la place des jointures (table1 inner join table2 on ...) en déplacant dans la clause where les conditions reliant les tables (par exemple le utilisateurs.uti_cle=lienfonc.uti_cle ) mais rien ne dit que ca réglera le probléme.
PS2 qui n'a rien à voir avec ton probléme : Dans ton "group by" t'as des colones qu'on ne retrouve pas dans la partie "select",tu risques donc de te retrouver avec des doublons.

Reply

Marsh Posté le 26-07-2006 à 11:46:10    

Citation :

A la limite, tu peux essayer en mettant une relation classique entre les tables


 
J'ai fait voici le résultat, je retrouve tjs mon erreur... ça commence à m'énerver, en plus c'est seulement pour la recherche par fonction. ça me prend le choux!!!!
 

Code :
  1. Warning: pg_query() [function.pg-query]: Query failed: ERROR: missing FROM-clause entry for table "fonctions" in C:contact_grp_result.php on line 57
  2. Warning: pg_fetch_object() expects parameter 1 to be resource, boolean given in C:contact_grp_result.php on line 58
  3. SELECT utilisateurs.uti_cle, uti_prenom, uti_nom, uti_tel, uti_mail, uti_portable FROM utilisateurs, fonctions, lienfonc, concessions, filiales, marques WHERE utilisateurs.uti_cle=lienfonc.uti_cle AND lienfonc.fonc_cle=fonctions.fonc_cle AND conc_cle=uti_concession AND fil_cle=conc_filiale AND marq_cle=fil_marque AND 1=1 AND fonctions.fonc_cle=4 GROUP BY utilisateurs.uti_cle, uti_nom, uti_prenom, uti_mail, uti_tel, uti_portable, fil_lib, marq_lib, conc_lib ORDER BY uti_nom, uti_prenom OFFSET 0 LIMIT 5

Reply

Marsh Posté le 26-07-2006 à 11:51:59    

Là, ton erreur est incompréhensible pour moi aussi. :(

Reply

Marsh Posté le 26-07-2006 à 13:32:25    

LA SOLUTION EST TROUVEE :  
 
Le problème venant d'un seul est unique champs dans ma requete : "utilisateurs.uti_cle" il fallait mettre "lienfonc.uti_cle".
 
Voilà merci à tous

Reply

Sujets relatifs:

Leave a Replay

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