Création, validation zone membres.

Loden
Invité n'ayant pas de compte PHPfrance

10 août 2012, 16:01

Salut,

voilà je me suis lancé dans la création d'un site internet et j'en suis à la création de la zone membres, j'ai déjà fais le formulaire et l'envoie de données à la Bdd :
<html>
    <head>
    <title>Inscription</title>
    </head>
    <body>
	<p>Inscription au site</p>

	<form name="inscription" method="post" action="inscription.php">
   	<p>
    <label for="pseudo">Votre pseudo :</label>
    <input type="text" name="pseudo" id="pseudo" required />
       
    <br />
    <label for="pass">Votre mot de passe :</label>
    <input type="password" name="pass" id="pass" required />
           
    <br />
    <label for="confirmpass">Confirmer le mot de pass :</label>
    <input type="password" name="confirmpass" id="confirmpass" required />
       
	<br />
	<label for="email">Votre adresse email :</label>
	<input type="email" name="email" id"email" required />

	<br />
	    <input type="submit" name="envoyer" value="Envoyer" />
       
   	</p>
	</form>
<?php
$bdd = new PDO('mysql:host=localhost;dbname=RankOne', 'root', '');

        if (isset($_POST['envoyer'])){
($pseudo=($_POST['pseudo']));
($pass=($_POST['pass']));
($confirmpass=($_POST['confirmpass']));
($email=($_POST['email']));
            
$bdd->beginTransaction();                          
$insert = $bdd->query("INSERT INTO Membres VALUES('','$pseudo','$pass','$email',NOW())");
$bdd->commit();

$bdd = null;
		}
        ?>
	</body>
    </html> 
Mais maintenant je bloque pour faire les validations, "le pseudo est déjà utilisé" etc... Je viens juste de modifier mon code en pdo (avant il était en mysql).
Et je sais pas trop comment m'y prendre pour faire les vérifs en pdo.

Merci,
Loden.

ViPHP
ViPHP | 2577 Messages

10 août 2012, 16:05

tu peux faire un select sur le pseudo pour voir s'il existe déjà

ou

tu peux ajouter un index unique sur la colonne pseudo et tester l'erreur ou l'exception qui correspond à DUPLICATE KEY

ViPHP
xTG
ViPHP | 7331 Messages

10 août 2012, 16:15

Attention à la protection contre l'injection...
mysql_real_escape_string() avec mysql.
PDO::quote() ou requête préparée avec PDO.

Loden
Invité n'ayant pas de compte PHPfrance

10 août 2012, 16:25

Oui j'ai un index unique sur pseudo et email, mais je n'arrive pas à trouver de tutos ou de solutions la "validation", tester l'erreur

sinon, j'ai modifier mon code pour avec la requête préparé :
<html>
    <head>
    <title>Inscription</title>
    </head>
    <body>
	<p>Inscription au site</p>

	<form name="inscription" method="post" action="inscription.php">
   	<p>
    <label for="pseudo">Votre pseudo :</label>
    <input type="text" name="pseudo" id="pseudo" required />
       
    <br />
    <label for="pass">Votre mot de passe :</label>
    <input type="password" name="pass" id="pass" required />
           
    <br />
    <label for="confirmpass">Confirmer le mot de pass :</label>
    <input type="password" name="confirmpass" id="confirmpass" required />
       
	<br />
	<label for="email">Votre adresse email :</label>
	<input type="email" name="email" id"email" required />

	<br />
	    <input type="submit" name="envoyer" value="Envoyer" />
       
   	</p>
	</form>
<?php
$bdd = new PDO('mysql:host=localhost;dbname=RankOne', 'root', '');

        if (isset($_POST['envoyer'])){
($pseudo=($_POST['pseudo']));
($pass=($_POST['pass']));
($confirmpass=($_POST['confirmpass']));
($email=($_POST['email']));
            
$bdd->beginTransaction();                          
$req = $bdd->prepare("INSERT INTO Membres(pseudo, pass, email, date_inscription) VALUES('$pseudo', '$pass', '$email', NOW())");
$req->execute(array(
			'pseudo' => $pseudo,
			'pass' => $pass,
			'email' => $email,
			));
$bdd->commit();

$bdd = null;
		}
        ?>
	</body>
    </html>

ViPHP
ViPHP | 2577 Messages

10 août 2012, 16:39

Qu'est ce qui se passe si tu saisies 2 fois le même user ?

Une exception => var_dump($e) pour voir ou trouver le numéro de l'erreur - $e est l'exception interceptée dans un try / catch

Un code => var_dump($bdd->errorInfo())


Edit :
Error: 1022 SQLSTATE: 23000 (ER_DUP_KEY)
Message: Can't write; duplicate key in table '%s'
Modifié en dernier par Mazarini le 10 août 2012, 16:44, modifié 1 fois.

ViPHP
xTG
ViPHP | 7331 Messages

10 août 2012, 16:43

Edit: pouah trop rapide :P

Configures PDO pour les exceptions (voir la doc pour ça).
A la suite de cela l'erreur SQL duplicate entry (du fait de ton index unique) sera renvoyée sous forme d'exception lors de la tentative d'insertion.
Or il me semble que chaque PDOException a un numéro différent suivant l'erreur SQL.
Il te suffira donc de l'exécuter une fois pour afficher ce numéro et par la suite l'inclure dans ton code pour afficher un message d'erreur personnalisé.
Et si au pire je me plantais quand à ce numéro, tu auras ce numéro dans le texte de l'exception.
Un preg_match() ou compagnie pour l'extraire et le tour est joué. :)

Pour les exceptions voici un peu de doc : http://fr.php.net/manual/fr/language.exceptions.php

ViPHP
ViPHP | 2577 Messages

10 août 2012, 16:47

Plus lent, mais plus clair...

Lodens
Invité n'ayant pas de compte PHPfrance

10 août 2012, 23:19

Re,

j'ai essayé avec ce code :
<html>
    <head>
    <title>Inscription</title>
    </head>
    <body>
	<p>Inscription au site</p>

	<form name="inscription" method="post" action="inscription.php">
   	<p>
    <label for="pseudo">Votre pseudo :</label>
    <input type="text" name="pseudo" id="pseudo" required />
       
    <br />
    <label for="pass">Votre mot de passe :</label>
    <input type="password" name="pass" id="pass" required />
           
    <br />
    <label for="confirmpass">Confirmer le mot de pass :</label>
    <input type="password" name="confirmpass" id="confirmpass" required />
       
	<br />
	<label for="email">Votre adresse email :</label>
	<input type="email" name="email" id"email" required />

	<br />
	    <input type="submit" name="envoyer" value="Envoyer" />
       
   	</p>
	</form>
<?php

$bdd = new PDO('mysql:host=localhost;dbname=RankOne', 'root', '');

        if (isset($_POST['envoyer'])){
($pseudo=($_POST['pseudo']));
($pass=($_POST['pass']));
($confirmpass=($_POST['confirmpass']));
($email=($_POST['email']));
       
	   try
	   {     
$bdd->beginTransaction();                          
$insert = $bdd->query("INSERT INTO Membres VALUES('','$pseudo','$pass','$email',NOW())");
$bdd->commit();
	   }
		
catch (PDOException $e)
    {
        echo 'Pseudo ou email déjà utilisé', $e->getMessage(); 
    }

$bdd = null;
		}
        ?>
	</body>
    </html> 
En rajoutant un
catch (PDOException $e)
    {
        echo 'Pseudo ou email déjà utilisé', $e->getMessage(); 
    }
Mais sa ne marche pas je sais pas si il capte l'erreur.

Merci,
Loden.

ViPHP
xTG
ViPHP | 7331 Messages

11 août 2012, 10:57

Configures PDO pour les exceptions (voir la doc pour ça).
;)

Petit nouveau ! | 2 Messages

11 août 2012, 12:41

D'accord mais sa ce situe dans les extension php de wampserver ou il faut le télécharger ?

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

11 août 2012, 16:27

C'est tout simplement dans la doc de php http://fr2.php.net/manual/fr/pdo.error-handling.php

Tu peux aussi regarder le tuto du site du zéro http://www.siteduzero.com/tutoriel-3-34 ... x-bdd.html

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

Petit nouveau ! | 2 Messages

12 août 2012, 00:12

D'accord merci sa marche :p Et donc maintenant je peux enlever le
var_dump($e->getMessage())
Non pour seulement montrer le message que je veux.

Voilà mon code maintenant :
<?php
session_start();
include("identifiants.php");
?>
<html>
    <head>
    <title>Inscription</title>
    </head>
    <body>
	<p>Inscription au site</p>

	<form name="inscription" method="post" action="inscription.php">
   	<p>
    <label for="pseudo">Votre pseudo :</label>
    <input type="text" name="pseudo" id="pseudo" required />
       
    <br />
    <label for="pass">Votre mot de passe :</label>
    <input type="password" name="pass" id="pass" required />
           
    <br />
    <label for="confirmpass">Confirmer le mot de pass :</label>
    <input type="password" name="confirmpass" id="confirmpass" required />
       
	<br />
	<label for="email">Votre adresse email :</label>
	<input type="email" name="email" id"email" required />

	<br />
	    <input type="submit" name="envoyer" value="Envoyer" />
       
   	</p>
	</form>
<?php
        if (isset($_POST['envoyer'])){
($pseudo=($_POST['pseudo']));
($pass=($_POST['pass']));
($confirmpass=($_POST['confirmpass']));
($email=($_POST['email']));
       
	   try
	   {     
$bdd->beginTransaction();                          
$insert = $bdd->query("INSERT INTO Membres VALUES('','$pseudo','$pass','$email',NOW())");
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$bdd->commit();
	   }
		
catch (PDOException $e)
    {
        echo 'Pseudo ou email deja utilise', var_dump($e->getMessage()); 
    }

$bdd = null;
		}
        ?>
	</body>
    </html>