Vérification de l'unicité dans la table MySQL

Petit nouveau ! | 8 Messages

11 nov. 2010, 18:04

Bonjours,
J'ai aucune idée de si je suis débutant ou avancé, mais dans le doute .. :D

Actuellement j'essaye de créer un formulaire d'inscription. Banal me direz vous.
Sauf que même en lisant toute la documentation à ma disposition, je n'arrive pas à trouver mon bonheur.
En effet, mon problème est que je veux pouvoir vérifier avant redirection, si le pseudo est déjà utilisé ou pas.

Voici la première partie du code, j'ai zappé les bases HTML pour alléger.

Code : Tout sélectionner

<?php //Vérification des champs if (isset($_POST['Pseudo']) && isset($_POST['Password']) && isset($_POST['Confirmation']) && ($_POST['Email']) && (isset($_POST['Accepter']))) { //Conversion des $_POST en variables (pour simplifier) $Pseudo=$_POST['Pseudo']; $Password=$_POST['Password']; $Confirmation=$_POST['Confirmation']; $Email=$_POST['Email']; //Vérification de la longueur des champs et du mot de passe if ((strlen($Pseudo) >= 3) && (strlen($Password) >= 6) && ($Password == $Confirmation) && (filter_var($Email, FILTER_VALIDATE_EMAIL))) {
Ça c'était la première parti qui fonctionne. Si vous voyez des simplifications que je pourrais ajouter ..
Ensuite arrive la partie qui "bloque" ..

Ma base se nome 'Maya'
Mon tableau ''Utilisateurs'

Code : Tout sélectionner

try { $bdd = new PDO('mysql:host=localhost;dbname=Maya', 'root', ''); } catch (Exception $e) { die('Erreur : ' . $e->getMessage()); } // On récupère les noms du tableau utilisateurs s'ils sont les mêmes que le pseudo $query = mysql_query("SELECT ID FROM Utilisateurs WHERE name = '$Pseudo'"); if(mysql_num_rows($query) == 1) { //Pseudo déjà utilisé $Deja=1; } else { //Pseudo libre header('Location: inscription2.php?Pseudo='.$Pseudo.'&Email='.$Email.''); } } } ?>
A noter que le nom de cette page est inscription.php et que la redirection se fait vers inscription2.php ..
Je n'ai pas non plus fais l'insertion des champs de l'utilisateurs dans le tableau vu que je n'arrive pas à vérifier l'unicité.

Enfin voici la dernière partie du code, contenant formulaire et affichages d'erreurs.
Je n'ai pas encore pris le temps de faire afficher toutes les erreurs, mais là n'est pas l'important.

Code : Tout sélectionner

<div> <form method="POST" action="inscription.php"> <span> Pseudo:<span/><br/> <input type="text" name="Pseudo"/>*<br/> <?php //Pseudo assez long ? if ((strlen($Pseudo) < 3)) { ?> <span>Doit contenir au moins 3 characteres.</span> <?php } //Pseudo déjà utilisé ? if ($Deja==1) { ?> <span>Pseudo deja utilise.</span> <?php } ?> <br/> <span> Mot de passe:<span/><br/> <input type="password" name="Password"/>*<br/> <br/> <span> Confirmation du mot de passe:<span/><br/> <input type="password" name="Confirmation"/>*<br/> <br/> <span> Adresse email<span/><br/> <input type="text" name="Email" />*<br/> <br/> <input type="checkbox" name="Accepter"/> En cochant cette case vous reconnaissez avoir lu et accepter les <acronym title="Conditions Générales d'Utilisation">CGU</acronym>.<br/><br/> <input type="reset" name="Reset" /> <input type="submit" name="Inscription" value="Inscription" /><br/><br/> *Champs obligatoires </form> </div> </body> </html>

Merci beaucoup pour l'intention que vous apporterez à ma demande d'aide.

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

12 nov. 2010, 02:56

salut,

qu'entend tu par ne fonctionne pas ?

il y a comme un soucis dans ton code, tu initie une connexion avec PDO pou ensuite utiliser mysql_query() ce n'est pas le bon choix ;)
<?php try
               {
                  $bdd = new PDO('mysql:host=localhost;dbname=Maya', 'root', '');
               }
               catch (Exception $e)
               {
                  die('Erreur : ' . $e->getMessage());
               }

               // On récupère les noms du tableau utilisateurs s'ils sont les mêmes que le pseudo
               $query = mysql_query("SELECT ID FROM Utilisateurs WHERE name = '$Pseudo'");
?>
on change la dernière ligne pour $query = $bdd->query('SELECT count(ID) as nb FROM Utilisateurs WHERE name = '.$bdd->quote($Pseudo,PDO::PARAM_STR).')';

tuto sur PDO
http://www.siteduzero.com/tutoriel-3-34 ... x-bdd.html

@+
Il en faut peu pour être heureux ......

Administrateur PHPfrance
Administrateur PHPfrance | 149 Messages

29 janv. 2011, 11:23

       //Conversion des $_POST en variables (pour simplifier)
            $Pseudo=$_POST['Pseudo'];
            $Password=$_POST['Password'];
            $Confirmation=$_POST['Confirmation'];
            $Email=$_POST['Email'];
juste pour l'info

1° pour faire ca il y a extract
2° j'espère qu'en prod, il n'y a pas ce code mais bien un code qui "valide" chaque _Post avant de l'affecter à une variable

http://pear.php.net/manual/fr/package.v ... lidate.php
http://framework.zend.com/manual/fr/zend.validate.html
http://framework.zend.com/manual/fr/zend.filter.html
--
Moosh - ancêtre de la communauté
http://www.phpfrance.com

devlop78
Invité n'ayant pas de compte PHPfrance

06 févr. 2011, 18:31

L'unicité est déjà prise en compte par mysql par l' "index" UNIQUE qui est ... une contrainte d'unicité.

Rediriger la page si le pseudo n'existe pas pose deux problèmes :

- un code malveillant fait ce qu'il veut, donc peut se rendre directement à cette page
- si l'utilisateur fait F5 sur cette page, ça pose le même problème
- Entre ta vérification et ton ajout, un autre utilisateur peut ajouter le même pseudo.

Donc à priori, deux possibilités :

- Une transaction (A ce moment, moi je me donne toutes les chances en choisissant le mode SERIALIZE pour mettre tous les verrous qu'il faut en lecture et écriture) :

Dans l'esprit :

BEGIN
SELECT
IF NO_EXISTS
INSERT
ELSE
NOTHING
COMMIT

Et sinon, en utilisant l'unicité de MySQL:
try {
$pdo->exec ('insert ....');
} catch(Exception $e) {
if ($pdo->errorCode == ...) { } ...
}

A savoir qu'il existe plusieurs types d'exceptions à PDO, donc peut-être regarder de ce code (sinon se fier au code retourné, et listés sur le site de MySQL)

try {
$pdo->exec ('insert ....');
} catch (PDOExceptionUnique $e) {
echo "existe déjà";
...
}
catch(PDOExceptionMachin $e) {
...
}