Count avec PDO

Résolu
MichaelOfCourse Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   -  
MichaelOfCourse Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

ça fait 2 heures que je cherchais comment compter le nombre d'entrée dans la colonne "email" qui avait pour valeur une certaine valeur $email, vous l'aurez compris, pour vérifier que l'email n'est pas déjà enregistré :)
Sauf que ce que je savais faire avant ne marche pas en PDO, et a force de voir des solutions sur google, qui aucune n'ont marché, je me tourne vers vous !

$emailalready=$connexion->prepare('SELECT COUNT (*) AS Email FROM Users WHERE Email=\'' . $email . '\''); 
$emailalready->execute(); 


Que dois-je rajouter après ça pour connaitre le nombre de lignes ?

Merci

14 réponses

Utilisateur anonyme
 
Bonjour

D'abord, jamais d'espace entre le nom d'une fonction et la parenthèse ouvrante avec mysql :
COUNT(*) et non pas COUNT (*)

Ensuite, pour récupérer ton nombre de lignes :
$res=$emailalready->fetch();
if ($res['Email']>0) {
... cet adresse existe déjà
} else {
elle n'existe pas déjà
}
1
Utilisateur anonyme
 
L'echo me renvoit en effet toujours 0, alors que la BDD contient bien mon inscription Quel echo ? il n' en a pas dans le code que tu montres. Au vu du reste, je parie que tu ne l'avais pas fait au bon endroit.

Tu n'as pas pris le test dans le bon sens.
Au lieu d'interdire l'insertion si l'Email existe déjà, tu ne l'autorises que s'il existe déjà !
1
MichaelOfCourse Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   6
 
D'abord merci :) Puis les mauvaises nouvelles : ça ne marche pas, en effet lorsque je m'inscris, mon compte est bien dans la BDD, mais si je veux me réinscrire une 2eme fois avec la même adresse, eh bien je peux me réinscrire autant de fois que je veux avec la meme adresse en fait :/ à croire que $res['Email'] vaut toujours + de 0...
0
Utilisateur anonyme
 
Je ne sais pas comment est fait ton script.
Tout ce que je peux dire, ce que le code que je t'ai proposé teste bien si un mail est ou n'est pas déjà dans la table

à croire que $res['Email'] vaut toujours + de 0... Pourquoi le croire ? Tu n'as qu'à faire un echo $res['Email']; et au lieu de croire, tu sauras.

Montre ton code pour voir où est l'erreur.
0

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

Posez votre question
MichaelOfCourse Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   6
 
L'echo me renvoit en effet toujours 0, alors que la BDD contient bien mon inscription...

if($email == $email2) { 
$emailalready=$connexion->prepare('SELECT COUNT(*) AS Email FROM Users WHERE Email=\'' . $email . '\''); 
$emailalready->execute(); 
$res=$emailalready->fetch(); 
if ($res['Email']>0) { 

         
     
$reqprep=$connexion->prepare("INSERT INTO Users SET 
        Prenom='$prenom', 
        Nom='$nom',  
        Email='$email',  
        Pass='$pass'"); 
$reqprep->execute(); 
         
         
        } 
else  { 
} 
        } 
       else {  
       $ERRMSG = 8; 
       } 


Et je précise que ma table contient bien une colonne Email (oui de toute façon vu que j'arrive à écrire dedans)
0
MichaelOfCourse Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   6
 
Sisi j'ai fait le test avec l'echo, seulement je n'en ai pas vraiment besoin dans le code en lui même, mais fais moi confiance, il était au bon endroit et m'indiquait toujours 0 ;)

je vais voir ce que tu m'a dit et modifier, merci :)
0
MichaelOfCourse Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   6
 
Ok j'ai finis par enlever le"WHERE" et là ça marche niquel, merci beaucoup :)
0
MichaelOfCourse Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   6
 
Bon en fait je me suis réjoui trop vite, le code ne vérifie pas en effet si il y a deja cette adresse d'inscrite mais tout simplement si il y a dejà une adresse d'inscrite dans la BDD, donc je ne peux avoir qu'un seul inscrit quoi :O

mon code actue :
$emailalready=$connexion->prepare('SELECT COUNT(*) AS Email FROM Users');
	$emailalready->execute();
	$res=$emailalready->fetch();
	if ($res['Email']>0) {
		$ERRMSG = 10;
	}
	else { //inscription dans BDD}


Si quelqu'un pouvait m'aider :)
0
Utilisateur anonyme
 
J'attendais que tu reviennes. C'était évident que ça ne pouvait pas marcher sans le WHERE, je ne comprends même pas que tu aies essayé.

Où est le problème maintenant ? Si tu remets le code d'inscription (qui marchait puisqu'avant tu avais des inscriptions multiples) dans le else, ça devrait marcher.
Eventuellement, pour diagnostiquer, remets un echo $res['Email'] juste après le $res=$emailalready->fetch();
0
MichaelOfCourse Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   6
 
En fait si j'ai éssayé c'est pour 2 bonnes raisons : 1 je ne m'y connais pas encore beaucoup en php (mais normalement assez pour savoir que j'aurais du le laisser !) et 2, il était tard ;)

Maintenant je suis un peu perdu, j'ai donc rajouté
WHERE Email=\'' . $email . '\'');   
mais je peux toujours m'inscrire doublement :/
0
Utilisateur anonyme
 
Aucune de tes raisons n'est bonne, car ce WHERE est une question de SQL, pas de PHP, et l'heure n'a rien à voir là-dedans.
Bon, c'était juste histoire de te taquiner.

$emailalready=$connexion->prepare('SELECT COUNT(*) AS Email FROM Users WHERE Email=\'' . $email . '\'');
	$emailalready->execute();
	$res=$emailalready->fetch();
        echo $email,' ',$res['Email']; // juste pour vérifier
	if ($res['Email']>0) {
		$ERRMSG = 10;
	}
	else { //inscription dans BDD
$reqprep=$connexion->prepare("INSERT INTO Users SET 
        Prenom='$prenom', 
        Nom='$nom',  
        Email='$email',  
        Pass='$pass'"); 
$reqprep->execute(); }
0
MichaelOfCourse Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   6
 
Tu es étonné si je te dis que ce code me permet toujours de m'inscrire en double ? :)
0
Utilisateur anonyme
 
Je viens d'essayer chez moi et ça marche.
Mais je ne sais pas ce que fait ton code, ni avant, ni après ce bout que tu montres.
Peux-tu me dire ce qu'affiche le
echo $email,' ',$res['Email']; // juste pour vérifier
que je t'ai fait mettre dans le dernier script que je t'ai proposé ?

En fait, j'arrive à reproduire ton problème si me mets une apostrophe dans l'email et en supprimant l'affichage des erreurs Cette apostrophe provoque une erreur parce que tu utilises mal PDO (qui est fait précisément pour éviter ce genre d'erreur). Mais je doute qu'il y ait une apostrophe dans ton adresse email.

Je note une autre anomalie : tu utilise pour la COUNT un alias (Email) qui est le même que le nom de la colonne qui apparaît dans le WHERE ! C'est super ambigu comme façon de faire ! Ton WHERE porte sur le COUNT ou le champ ? Mais bon, le WHERE porte bien sur le champ et le résultat est (devrait être) correct.

En résumé :
1 - Que dit le echo ?
2 - Utilises-tu une apostrophe ou tout autre caractère bizarre dans l'email ?
3 - peux tu montrer le code complet de la page (en particulier la connexion pdo, en cachant les identifiants bien sûr)
0
MichaelOfCourse Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   6
 
en fait le echo me dit mon adresse email suivi d'un 0...

Par contre si ça ne te dérange pas, on pourrait peut être continuer en PV, vu qu'il semblerait que tu sois le seul à être intéressé pour m'aider ;)

Je posterais bien sur la réponse sur le forum pour les futurs lecteurs.
0