mysql_rows

simonlaurent
Invité n'ayant pas de compte PHPfrance

21 juil. 2011, 18:53

Bonjour tout le monde,

Voici mon problème. J'ai 2 tables (comptes_utilisateurs qui sont les professeurs et une autre table élèves). L'adresse email doit etre unique qu'elle soit dans une table ou une autre c'est à dire que si on a [email protected] dans la table comptes_utilisateurs elle ne peut pas se retrouver dans la table élèves.

J'ai réalisé ce code, il fonctionne pour une table mais quand je rajoute dans ma requete au niveau du FROM le nom de la seconde table pour la vérification, il me renvoie un :

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in

Un tout grand merci à tous,
<?php

mysql_connect("localhost", "root", "*********");
mysql_select_db("ereports1011");

$result = mysql_query("SELECT DISTINCT Adresse_Email FROM comptes_utilisateurs , eleves WHERE Adresse_Email='".$_GET["mail"]."'");
if(mysql_num_rows($result)>=1)
        echo "1";
else
        echo "2";
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

21 juil. 2011, 19:06

C'est parce que ta requête sql est erronée, du coup il n'arrive pas à l'exécuter, et donc ne peut pas traiter le résultat de la requête. Dans ces cas là, tu peux utiliser mysql_error() pour savoir s'il n'y a pas eu un problème lors de l'exécution de la requête par mysql.

Dans ton cas, je suppose que le champ Adresse_Email est présent dans tes deux tables, et du coup mysql ne sait pas auquel des deux tu fait référence...

Dans ces cas là, il suffit de préfixer le nom du champ par le nom de la table concernée, ex : "comptes_utilisateurs.Adresse_Email" MySQL saura ainsi que tu fais référence au champ Adresse_Email de la table comptes_utilisateurs et pas à un autre.

Il faudrait donc dans ton cas une requête qui test : si l'email se trouve dans la table des profs OU si l'email se trouve dans la table des élèves (WHERE ... OR ...)

A noter cependant que cette méthode est loin d'être optimisée, dans la mesure où tu croises les données de deux tables qui ne sont pas liées. MySQL va donc effectuer un produit cartésien en mélangeant les deux tables (au premier prof associer tous les élèves, au second prof associer tous les élèves, ...) et traiter beaucoup plus d'enregistrements qu'il ne le devrait.
En gros pour 10 profs et 40 élèves, au lieu de traiter 10 enregistrements chez les profs et 40 chez les élèves, il va en tester 400.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

simonlaurent
Invité n'ayant pas de compte PHPfrance

21 juil. 2011, 19:34

Merci beaucoup c'est exactement ca :)

Je l'ai fait en + dans une autre vie mais c'était loin :)

Merci bcp encore

Mammouth du PHP | 2278 Messages

21 juil. 2011, 20:54

Je vais faire un hors-sujet, mais :
1) c'est peut-être au moment où l'on crée le compte qu'il faudrait vérifier l'unicité de cet email.
2) je me demande si
a) une table unique des gens avec un champ indiquanr leur statut et un id unique
b) une table des emails à entrées email_utilisateur uniques :
id_utilisateur, email_utilisateur
où id_utilisateur est soit celui d'un prof soit celui d'un eleve
ne résoudrait pas allègrement beaucoup de problèmes actuels et à venir....
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

simonlaurent
Invité n'ayant pas de compte PHPfrance

21 juil. 2011, 23:08

C'est lors de l'inscription ;)

C'est un fichier PHP qui est appelé dans une fonction en AJAX pour me mettre une boule verte ou une boule rouge si elle est disponible ou pas :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 juil. 2011, 18:30

Sans modifier ta structure, le mieux serait dans ce cas de faire deux requêtes, ou pour limiter leur nombre faire juste une union :
$sql = "SELECT DISTINCT Adresse_Email 
    FROM comptes_utilisateurs 
    WHERE Adresse_Email='".$_GET["mail"]."'
UNION
  SELECT DISTINCT Adresse_Email 
    FROM eleves
    WHERE Adresse_Email='".$_GET["mail"]."'";
Ca te permettra ainsi de savoir si l'email est présent dans l'une ou l'autre des tables (sans savoir laquelle, mais c'est pas l'objet) et donc d'informer l'utilisateur de sa disponibilité ou non..
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...