Requête Multi-tables. Erreur d'ambiguité.

xeroxiss Messages postés 85 Date d'inscription samedi 30 juillet 2005 Statut Membre Dernière intervention 7 mai 2009 - 29 nov. 2008 à 21:27
yopai_v Messages postés 47 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 21 avril 2010 - 30 nov. 2008 à 23:53
Bonjour à tous,

J'ai un petit soucis avec une requête. Je tourne en rond

Je voudrais faire un SELECT sur 3 tables différentes avec un WHERE email= $_POST=[' email' juste pour une vérification.

Donc j'ai d'abord essayer sur 2 tables différentes avec :

SELECT amembres.email, bmembres.email 
FROM amembresLEFT
JOIN bmembresON amembres.email =bmembres.emailWHERE email=$_POST=['email']

Et puis j'ai essayé des d'autres requêtes mais rien ne fonctionne, j'ai des messages du type de

Column 'email' in where clause is ambiguous ou d'autres erreurs.

Voilà si vous avez des informations pouvant me mettre sur la voie...

Merci

11 réponses

cs_TropNul Messages postés 340 Date d'inscription dimanche 18 septembre 2005 Statut Membre Dernière intervention 22 octobre 2009
30 nov. 2008 à 09:29
Bonjour xeroxiss,

Le message d'erreur est pourtant simple.

Tu as mal écrit ceci email= $_POST=[' email ']

Ce serait mieux ainsi :

email =\'$_POST['email']\'

Par contre, pour la requête, regarde dans la doc de mysql pour être sure de la syntaxe.

Cdt
0
yopai_v Messages postés 47 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 21 avril 2010
30 nov. 2008 à 09:36
Il te dit lui-même l'erreur :
2 Column 'email'
1 in where clause
3 is ambiguous

1. Dans la clause Where (donc on va regarder WHERE email= $_POST=[' email '])
2. la colonne "email" (on repère le WHERE email =)
3. est ambiguë
En effet, il ne sait pas si le champ qu'il doit vérifier est amembres.email ou bmembres.email

Il faut donc lui préciser (WHERE amembres.email= ... ou WHERE bmembres.email=...)

Au passage, je suppose que l'écriture WHERE  email =$_POST= [' email '] est symbolique (en plus il y a un = en trop), car de toute manière MySql ne connaîtra jamais $_POST.
La construction de ta requête devrait se présenter de la manière suivante :
$sql = '
SELECT
amembres.email,
bmembres.email
FROM amembres
LEFT JOIN bmembres ON amembres.email=bmembres.email
WHERE {amembres ou bmembres}.email='.chr(39).addslashes($_POST['email']).chr(39);

Attention à l'incompatibilité entre addslashes (méthode conseillée) et magic_quotes_gpc (mauvaise méthode de sécurité), qui doit déjà se trouver dans 12375 articles de forum, mais si tu veux des explications envoie moi un MP, je te les fournirais avec joie.

Attention à la différence entre INNER JOIN et LEFT JOIN - j'aurais tendance à dire que c'est plutôt un INNER JOIN que tu veux, mais c'est juste une impression que me donne ton code. J'attire ton attention sur le sujet pour que tu te poses la bonne question.
0
xeroxiss Messages postés 85 Date d'inscription samedi 30 juillet 2005 Statut Membre Dernière intervention 7 mai 2009
30 nov. 2008 à 09:44
Bonjour,
Merci de vos réponses !

Je vais essayer tout cela.

Enfaite j'ai besoin d'effectuer cette requête. Car j'ai 3 sortes de membres bien différents les uns des autres. (Donc 3 tables) Et j'ai besoin de vérifier que l'email ne soit pas déjà utilisé à l'inscription par un autre membre dans les 3 autres table.

Et il en est de même pour la connexion à l'espace membre, je dois effectuer une vérification sur sont email et son mot de passe dans les 3 tables en même temps. Car pour l'instant j'ai 3 formulaires de connexion différents. (Pas très pratique !)

J'essaye vos solutions et je vous remercie de vous pencher sur mon sujet.

Bon dimanche !
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
30 nov. 2008 à 11:42
Hello,

tu vas aussi avoir un problème à la récupération de tes infos. Tu dois "aliaser" les champs que tu récupères :

$sql = '
SELECT
amembres.email AS aMembresEmail,
bmembres.email AS bMembresEmail
FROM amembres
LEFT JOIN bmembres ON amembres.email=bmembres.email
WHERE \''.$_POST['email'].'\' IN(amembres.email, bmembres.email)';

Mais un OR est mieux, plus performant :WHERE amembre.email ... OR bmembres.email ...

 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
xeroxiss Messages postés 85 Date d'inscription samedi 30 juillet 2005 Statut Membre Dernière intervention 7 mai 2009
30 nov. 2008 à 14:40
Salut,

Donc là j'ai essayé et ça fonctionne pas terrible. J'ai pas dit que vos explication n'étaient pas bonnes !

Merci de vos réponses.

Seulement voici ma requête (qui fonctionne) pour la connexion. C'est là que ça ne marche pas terrible lol 

if (isset($_POST['email'])){
    $email = htmlentities(addslashes($_POST[' email ']));
    $pass = htmlentities(addslashes(md5($_POST['pass'])));

mysql_select_db($database, $connexion);$verif_querysprintf(" SELECT * <gras>FROM  amembres WHEREemail</gras>'$email' ANDpass= '$ pass '");
$verif = mysql_query($verif_query, $connexion) or die(mysql_error());
$row_verif = mysql_fetch_assoc($verif);
$utilisateur = mysql_num_rows($verif);

Donc si j'essaye de l'adapter avec un concentré de vos gentilles réponses cela donne :

if (isset($_POST['email'])){

    $email = htmlentities(addslashes($_POST['email']));

    $pass = htmlentities(addslashes(md5($_POST[' pass '])));

mysql_select_db($database, $connexion);


$verif_query =sprintf("SELECTamembres.emailAS aMembresEmail, bmembres.email AS bMembresEmail amembres.pass AS aMembresPass, bmembres.pass AS bMembresPassFROM amembresLEFT JOIN bmembres ON amembres.email= bmembres.email , amembres. pass =bmembres.pass WHERE  '$email' ANDpass= '$ pass 'IN(amembres.email, bmembres.email,amembres.pass, bmembres.pass)");


$verif = mysql_query($verif_query, $connexion) or die(mysql_error());

$row_verif = mysql_fetch_assoc($verif);

$utilisateur = mysql_num_rows($verif);

Voilà que pensez-vous de ma requête ? Car elle ne fonctionne pas ^^ Merci
Ps : J'espère que les couleurs vous aide je fait de mon mieux
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
30 nov. 2008 à 14:47
Hello,

oula...ton adaptation est un massacre :-) !!
Un petit tour sur une doc SQL serait le bienvenu...
SELECT
amembres.emailAS aMembresEmail,
bmembres.email AS bMembresEmail,
amembres.pass AS aMembresPass,
bmembres.pass AS bMembresPassFROM amembresLEFT JOIN bmembres ON amembres.emailbmembres.email  AND amembres. pass bmembres.pass WHERE amembres.email '$ email ' <gras>ANDamembres.pass</gras>'$ pass'

en tenant compte du fait que tu connais la différence entre LEFT JOIN et INNER JOIN...?
0
xeroxiss Messages postés 85 Date d'inscription samedi 30 juillet 2005 Statut Membre Dernière intervention 7 mai 2009
30 nov. 2008 à 15:33
Merci d'avoir répondu malalam !

Heu la différence.... INNER affiche les concordance et LEFT affiche tout ?

Ton code ne me retourne pas d'erreur néanmoins je ne sais me connecter uniquement avec une adresse et un pass de la table amembres. Si j'essaye de créer une adresse dans la tablebmembres avec un pass. Il me retourne une erreur de mon script "Identifiant ou pass incorrecte".

Merci
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
30 nov. 2008 à 15:48
LEFT JOIN implique tu aies quelque chose dans la table de gauche (amembres ici), INNER JOIN, dans les deux, RIGHT JOIN, dans celle de droite.
Donc...là, on attend que amembres soit remplie, et éventuellement que les conditions sur bmembres le soient aussi.
Si tu ne remplis QUE bmembres, et pas amembres, cette requête ne renverra rien. Donc ton problème est normal.
Explique le but et les contextes possible ?
0
xeroxiss Messages postés 85 Date d'inscription samedi 30 juillet 2005 Statut Membre Dernière intervention 7 mai 2009
30 nov. 2008 à 16:09
Ah d'accord je me disais aussi que j'avais compris tout dans le bon ordre

Merci pour ces explications. (Je comprend mieux !)

Enfaite au départ j'ai posté car à l'inscription je vérifiais si l'email était déjà utilisée ou non.
J'ai remarqué que cela allais créer un conflit car je ne vérifiais qu'une table donc une même adresse pouvait s'inscrire sur les 3 formulaires différents. (3 tables). Ensuite je me rend compte que pour la connexion cela pose le même problème. (Il faut effectuer une vérification sur au moins 2 table.)

Donc pour résumer  :

La requête si dessus doit vérifier la présence de l'email et du mot de passe dans les 2 table différentes.

Exemple :

Table amembres
#0 email  pass
#1 toto@mail.com1234
#2 fifi@mail.com12584

Table bmembres
#0 email  pass
#1 albert@mail.com5555
#2 srrsrrr@mail.com1111

Sur le formulaire de connexion l'utilisateur saisi son adresse email et le script recherche si elle est présente dans LES tables amembres et bmembres. Ensuite si elle corresponde aux mail et au pass alors redirection.

Est-ce plus claire ou je m'exprime trop mal lol
0
xeroxiss Messages postés 85 Date d'inscription samedi 30 juillet 2005 Statut Membre Dernière intervention 7 mai 2009
30 nov. 2008 à 16:13
"Ah d'accord je me disais aussi que j'avais PAS tout compris dans le bon ordre"

Enfaite un utilisateur ne peux s'inscrire partout à la fois.
Si il est déjà enregistré avec son email dans amembres il ne pourra pas s'inscrire dansbmembres
Et lors de la connexion il remplira par exemple :

albert@mail.com  5555

Le script lui donnera l'accès car l'email existe bien dans une table et le mot de passe saisi est correct.

Je pense que c'est plus claire avec cette petite précision .

Merci beaucoup
0
yopai_v Messages postés 47 Date d'inscription jeudi 7 septembre 2006 Statut Membre Dernière intervention 21 avril 2010
30 nov. 2008 à 23:53
Tel que tu le décris, un UNION me paraît plus approprié qu'une jointure.
0
Rejoignez-nous