Page 1 sur 1

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

Posté : 11 nov. 2010, 18:04
par voblivion
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.

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

Posté : 12 nov. 2010, 02:56
par moogli
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

@+

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

Posté : 29 janv. 2011, 11:23
par Moosh
       //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

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

Posté : 06 févr. 2011, 18:31
par devlop78
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) {
...
}