Page 1 sur 1

Problème enregistrer données en BDD PDO

Posté : 08 avr. 2011, 09:33
par mistermef
salut à tous

j'suis en train d'adapter un de mes scripts de création de compte que j'avais développé lors d'une formation, pour en faire un script d'inscription à une newsletter.

Mon problème est que le formulaire n'enregistre rien en base de données. Les champs sont pourtant ok, la vérification est ok. J'ai donc rentré manuellement une donnée dans ma table, pour vérifier si mon script se connectait bien à la BDD et lorsque je veux m'inscrire avec mon entrée existante il me dit bien que le mail est déjà utilisé !! Donc pas de prob de connexion à la bdd..

J'ai revu plusieurs fois mon code mais je dois passer à coté d'un détail !

Voici le code de mon inscription :

Code : Tout sélectionner

<?php ini_set('display_errors', 1); if(!empty($_POST)) { extract($_POST); $valid = true; if(empty($nom)) { $valid = false; $erreurnom = 'indiquez votre nom'; } if(!empty($nom) && strlen($nom)<3) { $valid = false; $erreurnom = '3 caractères minimum'; } if(empty($email)) { $valid = false; $erreuremail = 'Indiquez votre e-mail'; } if (!empty($email) && filter_var($email,FILTER_VALIDATE_EMAIL)===FALSE) { $valid = false; $erreuremail = 'Adresse e-mail invalide'; } // Connexion BDD try{ $bdd = new PDO('mysql:host=XXXXX;dbname=XXXXX' , 'XXXXX', 'XXXXX') or die(print_r($bdd->errorInfo())); $bdd->exec('SET NAMES utf8'); } catch(Exeption $e){ die('Erreur:'.$e->getMessage()); } // Verification si les champs sont utilisés $req = $bdd->prepare('SELECT id from newsletters WHERE email=:email'); $req->execute(array(':email'=>$email)); if($req->rowCount()>0) { $valid = false; $erreurid = 'E-mail déjà utilisé'; } $req->closeCursor(); // Si tout est OK if($valid) { $hash = md5(rand(0,1000)); $pass = rand(1000,5000); // on envoi en BDD $req = $bdd->prepare('INSERT INTO newsletters (nom,pass,email,hash) VALUES (:nom,:pass,:email,:hash)'); $req->execute(array( 'nom'=>$nom, 'pass'=>sha1($pass), 'email'=>$email, 'hash'=>$hash, )); $req->closeCursor(); $ok = 'Vous recevrez désormais notre lettre d\'informations !'; unset($nom); unset($email); } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Administration</title> <link href="css/admin.css" type="text/css" rel="stylesheet" media="screen"> </head> <body> <div id="header"><h2>Administration</h2></div> <div id="site"> <div id="col-left"> <div id="title" class="left"><h2>Menu Admin</h2></div> <div id="content" class="left"></div> </div> <div id="content"> <div id="title" class="content"><h2>Newsletters</h2></div> <div id="content" class="content"> <h3>Formulaire d'inscription</h3> <form action="index.php" method="post"> <label for="nom">Nom :</label><br /> <input type="text" name="nom" value="" /><br /> <? if(isset($erreurnom)) echo $erreurnom; ?><br /><br /> <label for="email">Votre E-mail :</label><br /> <input type="text" name="email" value="" /><br /> <? if(isset($erreuremail)) echo $erreuremail; ?><br /><br /> <input type="submit" class="submit" value="Je m'inscris !" /> </form> <? if(isset($erreurid)) echo '<div class="erreurid"><p>' .$erreurid. '</p></div>' ;?> <? if(isset($ok)) echo '<div class="ok"><p>' .$ok. '</p></div>' ;?> </div> </div> </div> </body> </html>
Merci à tous pour vos futurs réponses !

Re: Problème enregistrer données en BDD PDO

Posté : 08 avr. 2011, 12:20
par misterflo
Salut,
plusieurs petites erreurs.
Lorsque tu fais un try - catch il n'y pas besoin de faire un or die apres le new PDO, c'est le but du catch si la connexion ne réussi pas (d'ailleur c'est Exception avec un C).
try {
		$bdd = new PDO('mysql:host=XXXXX;dbname=XXXXX' , 'XXXXX', 'XXXXX')
		$bdd->exec('SET NAMES utf8');
}
catch(Exception $e){
	die('Erreur:'.$e->getMessage());
}
Ensuite lors de l'execution d'une requête (ligne 48-49), il ne faut pas mettre les deux points : du mot clé choisi dans la requête (ici :email)
$req = $bdd->prepare('SELECT id FROM newsletters WHERE email=:email');
$req->execute(array('email'=>$email));
//Dans le execute array() il ne faut pas mettre les deux points :
Et enfin ligne 68, tu refais une execution avec array, le dernier mot clé ne prend de virgule à la fin.
$req = $bdd->prepare('INSERT INTO newsletters (nom,pass,email,hash) VALUES (:nom,:pass,:email,:hash)');
$req->execute(array(
         'nom'=>$nom,
         'pass'=>sha1($pass),
         'email'=>$email,
         'hash'=>$hash //Ici pas de virgule
      ));

Re: Problème enregistrer données en BDD PDO

Posté : 08 avr. 2011, 21:30
par mistermef
Merci beaucoup misterflo pour ces beugs !!

mais malheureusement toujours aucuns enregistrements :/ je pensais pourtant que ca aurait solutionné mais il doit rester un petit beug, je vais revoir ca en détail et vous reposte le code corrigé si jamais..

merci en tout cas :)

Re: Problème enregistrer données en BDD PDO

Posté : 08 avr. 2011, 22:47
par mistermef
Hmmm quel âne, j'avais oublié de créer un champ "hash"

Ca fonctionne, merci :p