Page 1 sur 4
pb de requete
Posté : 23 mai 2005, 20:11
par ricardo
Bonsoir,
Voila mon probleme , je possede trois tables :
- login avec 4 champs : id - nomutilisateur - motpasse - email
- annonce avec 8 champs : IDlogin - email - choix - annonce - lieu - telephone - date saisie - id utilisateur
- choix avec 2 champs : id - theme
Je n'arrive pas à exécuter la requete me permettant d'afficher une liste d'annonces par choix (theme)
$reponse="SELECT id_utilisateur FROM annonce WHERE choix = '$theme'";
$result=mysql_query($reponse);
list($id_utilisateur) = mysql_fetch_row($result);
$query_annonce="SELECT * FROM annonce,login WHERE choix='$theme' || id_utilisateur = '$id_utilisateur'";
$result_annonce=mysql_query($query_annonce);
while($val_annonce=mysql_fetch_array($result_annonce))
Merci
Posté : 23 mai 2005, 20:16
par ouckileou
ça fait quoi ? une erreur SQL ?
précise le problème
Posté : 23 mai 2005, 20:20
par Cyrano
Si je me fie à la liste des champs que tu montres avant le script, tu as une erreur en cherchant dans un champ inexistant
$query_annonce="SELECT * FROM annonce,login WHERE choix='$theme' OR id_utilisateur = '$id_utilisateur'";
devrait être:
$query_annonce="SELECT * FROM annonce,login WHERE choix='$theme' OR login.id = '$id_utilisateur'";
Note, j'ai aussi remplacé le "||" par "OR", mais c'est une question de préférence personnelle, je trouve ça plus "parlant"
Posté : 23 mai 2005, 20:22
par ouckileou
il y a un champ id_utilisateur dans sa table annonce
Posté : 23 mai 2005, 20:31
par ricardo
non aucune erreur,
J'affiche les annonces par theme mais chaque utilisateur a poster la meme annonce.
Une annonce se repete pour chaque utilisateur.
Voila le fct actuel.
Merci
Posté : 23 mai 2005, 20:44
par ouckileou
si tu veux faire ça :
Je n'arrive pas à exécuter la requete me permettant d'afficher une liste d'annonces par choix (theme)
pourquoi teste-tu alors l'utilisateur dans ta requête ?
ceci devrait suffire
SELECT * FROM annonce,login WHERE choix='$theme'
Posté : 23 mai 2005, 20:52
par Cyrano
Ok pour id_utilisateur.
Ceci dit, tu fais une requête vers deux tables... sans faire de jointure entre les deux: ça doit perturber pas mal mysql: tu n'as l'air d'avoir aucune clé étrangère nulle part, ça n'aide pas non plus...
Posté : 23 mai 2005, 21:02
par ricardo
Je teste le nom utilisateur car je l'affiche.
Pour ma clé etrangere je sais pas trop comment m'y prendre
Posté : 23 mai 2005, 21:09
par ouckileou
si tu l'affiches, tu dois le sélectionner (ce que tu fais avec le *), tu n'es pas obligé de le tester
si tu veux juste avoir toutes les annonces correspondant à un thème donné, c'est le thème que tu as besoin de tester
j'avoue que je ne comprend pas quel est ton problème précisèment
Posté : 23 mai 2005, 21:19
par Cyrano
Pour ma clé etrangere je sais pas trop comment m'y prendre
Ok, alors avant d'aller plus loin, dis moi qu'est-ce que tu comprends des clés étrangères : selon ta réponse, je ferai varier le degré de détail dans les explications
Posté : 23 mai 2005, 21:22
par ouckileou
pourquoi tu lui parles de clé étrangère ? apparament ses tables sont liées entre elles alors je ne vois pas ce qui te gêne...
ce serait mieux de savoir plus exactement quel est le problème avant de se lancer dans un cours d'analyse
Posté : 23 mai 2005, 21:34
par ricardo
En faite le nom d'utilisateur est dans ma table login et la je fais une requete sur la table annonce ou se trouve les themes at les différent champs de mes annonces.
Quand j'affiche mes annonces par theme je veux également afficher le nom d'utilisateur qui a saisie l'annonce, pour faire le lien j'ai le champs id_utilisateur, mais je vois pas comment l'exploiter ?
Merci
Posté : 23 mai 2005, 21:43
par Cyrano
pourquoi tu lui parles de clé étrangère ? apparament ses tables sont liées entre elles alors je ne vois pas ce qui te gêne...
ce serait mieux de savoir plus exactement quel est le problème avant de se lancer dans un cours d'analyse
Précisément pour lui faciliter la vie: si ce concept n'est qu'un vague halo dans la brume, il va s'enquiquiner à cent sous de l'heure pour faire marcher son truc alors que la solution est simple, mais quand on ne la connait pas, ce n'est pas évident de la découvrir tout seul.
Le principe
ricardo, c'est qu'une table A a une clé primaire et une table B, outre sa clé primaire, a une clé étrangère qui n'est autre que la clé primaire de la table A. Dans la pratique, ça veut dire qu'une ligne de la table A peut correspondre à 0 ou plusieurs lign(s) de la table B, mais qu'une ligne de la table B ne peut correspondre qu'à une et une seule ligne de la table A. Ça va jusque là ?
à partir de là, quand tu veux un résultat à partir des deux tables, tu dois faire une requête avec une jointure.: ça va ressembler à quelque chose comme ça :
Code : Tout sélectionner
SELECT champ1, champ2,... champn
FROM table_a, table_b
WHERE table_a.id = table_b.id_A
En français, ça donne: Je cherche les valeurs des champs 1, 2,...n des tables A et B à condition que la clé primaire de la table A corresponde à la clé étrangère dans la table B. Les champs recherchés proviennent des deux tables et si deux champs ont le même nom, on les préxixe avec le nom de la table et un point (table.champ)
Dis moi si tu captes pas tout

Posté : 23 mai 2005, 21:44
par ouckileou
ok c'est plus clair
là en fait tu faisais un test sur id_utilisateur de façon à ne sélectionner que les annonces d'un certain utilisateur
ce que tu veux toi c'est récupèrer le nom (dans login), qui correspond à l'identifiant de l'utilisateur qui a posté telle ou telle annonce
il faut donc lier ces tables dans ta conditions
Code : Tout sélectionner
SELECT IDlogin, email, choix, annonce, lieu, telephone, date saisie, id utilisateur, nomutilisateur FROM annonce, login
WHERE choix='$theme'
AND annonce.id_utilisateur = login.id_utilisateur
c'est là qu'on vient au clés étrangères dont te parlait Cyrano
dans la table "login" : id_utilisateur est la clé primaire, ce qui identifie un utilisateur
dans la table "annonce" : id_utilisateur est une clé étrangère, elle fait référence à la clé primaire de "login"
Posté : 23 mai 2005, 21:46
par ouckileou
bon et bien je te laisse, ça ne sert à rien que je poste dans le vent