Page 1 sur 1

Double Véfification

Posté : 22 févr. 2011, 18:49
par TRUNCKS
Bonjour,

J'ai un formulaire qui vérifie que le pseudo n'existe pas déjà et que l'adresse mail n'est pas utilisée avant d'envoyer.
Mon problème, c'est qu'il faut que les deux conditions soit fausses, si l'un des deux est bonnes, il envoie.
Je n'arrive pas à le reformuler pour une double vérification:

Code : Tout sélectionner

// ON VERIFIE SI CE PSEUDO EXISTE DEJA $sq='select pseudo from membre where pseudo=\''.$pseudo_membre.'\''; $requete=mysql_query($sq ) or die('erreur sq1: '.mysql_error()); $num=mysql_num_rows($requete); if($num!=0) { echo htmlspecialchars("Ce pseudo existe déjà, veuillez en choisir un autre")."<br><br><a href=\"javascript:window.history.back()\">Retour</a>"; } /**/ // ON VERIFIE SI CE MAIL EXISTE DEJA $sq='select mail from membre where mail=\''.$mail_membre.'\''; $requete=mysql_query($sq ) or die('erreur sq1: '.mysql_error()); $num=mysql_num_rows($requete); if($num!=0) { echo htmlspecialchars("Cette adresse mail est déjà utilisée")."<br><br><a href=\"javascript:window.history.back()\">Retour</a>"; } /**/

Re: Double Véfification

Posté : 22 févr. 2011, 18:55
par xTG
Un renommage pour $num_pseudo et $num_email ?
Ainsi tu peux faire quelque chose du genre :
if( ($num_pseudo + $num_email) != 0 )
  echo "erreur";

Re: Double Véfification

Posté : 22 févr. 2011, 19:05
par TRUNCKS
Perfect, merci bien !

Re: Double Véfification

Posté : 22 févr. 2011, 19:17
par devlop78
Et pourquoi ne pas vérifier en une seule requete ???

select pseudo from membre where pseudo=\''.$pseudo_membre.'\' OR mail=\"$mail\"

Re: Double Véfification

Posté : 22 févr. 2011, 19:18
par xTG
Parce qu'il serait bien embêté avec le message d'erreur.
J'ai pour ma part horreur des sites qui te disent que tes informations sont incorrectes lors de l'inscription sans te citer quel est le champ qui pose problème...

Re: Double Véfification

Posté : 22 févr. 2011, 19:38
par devlop78
Oui, je te comprends, mais je reste contre ce nombre important de requête. Je ne sais pas ici ce que fait le script, mais en général il est suivi d'un insert.

Bref, ici on peut très bien récupérer pseudo et mail avec la requête que j'ai donnée. Je ne suis pas spécialiste en la matière et je trouve que l'exécution de requêtes SQL est rapide, toutefois, je pense que c'est assez gourmand. Il ne s'agit pas d'en être radin et de rendre le code immangeable, mais là, je pense qu'il est beaucoup moins couteux de faire cette requête, de récupérer le pseudo et le mail retourné, et de voir s'il correspond à ce que l'utilisateur a donné. En gros, c'est mieux pour SQL, c'est plus simple en PHP, c'est mieux pour tous.

Sinon, avec un insert, une méthode est de mettre les champs "nom", et "mail" en contrainte unique (ou index unique). On peut sans vérifier avec un select, insérer directement. Si le nom ou mail existe déjà, une erreur sortira, on peut la récupérer et l'analyser et afficher le message. On passe donc de 3 requêtes à 1. Le plus dur est l'analyse, j'ai moi-même fait cette requête en vérifiant un code SQL State, et c'est une erreur car ce code englobe trop d'erreurs. Mais avec un peu de recherche, je suis sûr que l'analyse de l'erreur de façon rapide et précise est possible. Mon message me retourne "violation de contrainte" (en gros), mais je suis certain qu'il est facile d'avoir un code plus précis (type de contrainte), et les champs concernés (ici, en l'occurence, si le pseudo et le mail sont en double, il risque de s'arrêter sur le premier, mais est-ce vraiment important).

Edit: aussi rajouter LIMIT 1 à la fin de la ou les requêtes pour que Mysql s'arrête de chercher dès qu'il en a trouvé un