[RESOLU] Formulaire d'inscription >> Pas d'enregistrement dans ma BDD

Eléphant du PHP | 386 Messages

23 mars 2013, 06:11

Bonjour,

Mon formulaire d'inscription en PHP / PDO à un problème : Je n'arrive pas à inscrire des données sur ma base via mon formulaire :

- Le formulaire arrive à envoyer le mail, mais n'enregistre pas les données de mon formulaire via les variables $_POST
- J'ai déjà corrigé plusieurs erreurs, mais je n'arrive pas à trouver celle là :?

PS : Vous verrez que l'attribut action est vide parce que mon formulaire est envoyé en ajax
<?php
if (isset($_SESSION['pseudo'])) :
	header('Location: ../index.php');
	exit();
endif;

$prenom = htmlentities($_POST['prenom']);
$nom = htmlentities($_POST['nom']);
$mail = htmlentities($_POST['mail']);
$sexe = htmlentities($_POST['sexe']);
$jour = htmlentities($_POST['jour']);
$mois = htmlentities($_POST['mois']);
$annee = htmlentities($_POST['annee']);
$pseudo = htmlentities($_POST['pseudo']);
$mdp = htmlentities($_POST['mdp']);
$verif_mdp = htmlentities($_POST['verif_mdp']);

$msg = 'Vous êtes bien inscrit !';

if (!empty($prenom) && !empty($nom) && !empty($mail) && !empty($sexe) && !empty($jour) && !empty($mois) && !empty($annee) && !empty($pseudo) && !empty($mdp) && !empty($verif_mdp)) :
	if (preg_match("!^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$!", $mail)) :
		$req = $connect->prepare('SELECT pseudo, mail FROM wa_communaute WHERE pseudo = :pseudo OR mail = :mail');
		$req->execute(array('pseudo' => $_POST['pseudo'], 'mail' => $_POST['mail']));
		$result1 = $req->rowCount();
		$req->closeCursor();
		if($result1 == 1) :
			echo '<div class="error-register">Pseudo ou email déjà utilisé</div>';
			elseif ( $mdp != $verif_mdp) :
				echo '<div class="error-register">Les mots de passe ne sont pas identiques !</div>';
			else:
				$req1 = $connect->prepare('INSERT INTO wa_communaute (pseudo,pass,mail,nom,prenom,jour,mois,annee,sexe,partime) VALUES (:pseudo,:pass,:mail,:nom,:prenom,:jour,:mois,:annee,:sexe,now())');
				$req1->execute(array('pseudo' => $pseudo,'pass' => $pass,'mail' => $mail,'nom' => $nom,'prenom' => $prenom,'jour' => $jour,'mois' => $mois,'annee' => $annee,'sexe' => $sexe));
				$entete = "MIME-Version: 1.0\r\n";
				$entete .= "Content-type: text/html; charset=iso-8859-1\r\n";
				$entete .= "From: <$email_admin>\r\n";
				$entete .= "Reply-To: $email_admin\r\n";
				mail($mail,'Bienvenue sur ' .$nom_site. ' ' . $login .'.' , $msg, $entete);
				$req1->closeCursor();
				$req2 = $connect->prepare('SELECT id FROM wa_communaute WHERE pseudo = :pseudo');
				$req2->execute(array('pseudo' => $pseudo));
				$result = $req2->fetch();
				$pseudo_sql = $result['pseudo'];
				$_SESSION['pseudo'] = $pseudo_sql;
				$_SESSION['id'] = $id;
				$req2->closeCursor();
				$req3 = $connect->prepare('INSERT INTO wa_mur (id_membre,poster,date_heure) VALUES (:id_membre,Est désormais inscrit sur Web Astronomie,now())');
				$req3->execute(array('id_membre' => $_SESSION['id']));
				setcookie("pseudo", $_POST["pseudo"], time() + 90 * 24 * 60 * 60, "/");
				echo 'OK';
				$req3->closeCursor();
		endif;
	else:
		echo '<div class="error-register">Adresse email incorrecte !</div>';
	endif;
else:
	echo '<div class="error-register">Veuillez remplir tous les champs !</div>';
endif;
?>
Voici mon formulaire :
<form action="" method="post" onsubmit="return false" class="register mrg-bot15">
	<table class="inline-bk" style="width: 330px;">
		<tr><td></td></tr>
		<tr><td><label class="label-register">Prénom</label></td></tr>
		<tr><td><input type="text" name="prenom" id="prenom" class="input-register capitalize" maxlength="23" value="<?php echo $_POST['prenom'] ?>" /></td></tr>
		<tr><td><label class="label-register">Nom de famille</label></td></tr>
		<tr><td><input type="text" name="nom" class="input-register capitalize" maxlength="30" value="<?php echo $_POST['nom'] ?>" /></td></tr>
		<tr><td><label class="label-register">Adresse email</label></td></tr>
		<tr><td><input type="text" name="mail" class="input-register" maxlength="30" value="<?php echo $_POST['mail'] ?>" /></td></tr>
		<tr><td><label class="label-register" style="float: left; margin-top: 15px">Vous êtes</label>
			<div style="float: left; margin-left: 20px;">
				<div style="line-height: 20px;">
				<input type="radio" id="femme" name="sexe" value="2" style="vertical-align: middle; margin-right: 5px;">
				<label for="femme" class="sexe" style="vertical-align: middle;cursor: pointer;">Une femme</label></div>
				<div style="line-height: 20px;">
				<input type="radio" id="homme" name="sexe" value="1" style="vertical-align: middle; margin-right: 5px;">
				<label for="homme" class="sexe" style="vertical-align: middle;cursor: pointer;">Un homme</label></div>
			</div>
		</td></tr>
		<tr><td><label class="label-register" style="margin-top: 5px; display: block; margin-bottom: 3px;">Date de naissance</label></td></tr>
		<tr><td>
		<?php
		echo '<select name="jour" class="day-select">',"\n";
		echo "\t","\t","\t","\t","\t","\t","\t","\t","\t",'<option value=""></option>',"\n";
		for($i=1; $i<=31; $i++){
		echo "\t","\t","\t","\t","\t","\t","\t","\t","\t",'<option value="', $i ,'">', $i ,'</option>',"\n";
		}
		echo "\t","\t","\t","\t","\t","\t","\t","\t",'</select>';
		?> 
		<?php
		$Month = Array('1'=>'Janvier','2'=>'Février','3'=>'Mars','4'=>'Avril','5'=>'Mai','6'=>'Juin','7'=>'Juillet','8'=>'Août','9'=>'Septembre','10'=>'Octobre','11'=>'Novembre','12'=>'Décembre');
		echo '<select name="mois" class="month-select">',"\n";
		echo "\t","\t","\t","\t","\t","\t","\t","\t","\t",'<option value=""></option>',"\n";
		for($i=1; $i<13; $i++){
		echo "\t","\t","\t","\t","\t","\t","\t","\t","\t",'<option value="', $Month[$i] ,'">', $Month[$i] ,'</option>',"\n";
		}
		echo "\t","\t","\t","\t","\t","\t","\t","\t",'</select>';
		?> 
		<?php
		echo '<select name="annee" class="years-select">',"\n";
		echo "\t","\t","\t","\t","\t","\t","\t","\t","\t",'<option value=""></option>',"\n";
		for($i=1905; $i<=date('Y'); $i++){
		echo "\t","\t","\t","\t","\t","\t","\t","\t","\t",'<option value="', $i ,'">', $i ,'</option>',"\n";
		}
		echo "\t","\t","\t","\t","\t","\t","\t","\t",'</select>';
		?> 
	</table>
	<table class="inline-bk" style="width: 300px;">
		<tr><td><div id="ajax_loading1" style="display:none;"><img src="../img/loading0.gif" alt="" height="20" width="20"></div></td></tr>
		<tr><td><label class="label-register">Nom d'utilisateur</label></td></tr>
		<tr><td><input type="text" name="pseudo" id="pseudo" onBlur="verifPseudo(this.value)" autocomplete="off" class="input-register" maxlength="23" value="<?php echo $_POST['pseudo'] ?>" />
		<div id="pseudobox"></div></td></tr>
		<tr><td><label class="label-register">Mot de passe</label></td></tr>
		<tr><td><input type="password" name="mdp" autocomplete="off" class="input-register" maxlength="30" /></td></tr>
		<tr><td><label class="label-register">Confirmez le mot de passe</label></td></tr>
		<tr><td><input type="password" name="verif_mdp" class="input-register" maxlength="30" /></td></tr>
		<tr><td><p style="font-size: 11px;line-height: 15px;margin-top: -5px;"><br />En cliquant sur Inscription, vous acceptez et reconnaissez avoir lu nos 
		<a href="">Conditions d'utilisation</a> y compris <a href="">l'Utilisation des cookies</a>.<br /><br /></p></td></tr>
		<tr><td>
			<label class="uiButton uiButtonsignup uiButtonsignupConfirm" id="register" for="submit-register">
				<input type="submit" class="submit-register" id="submit-register" name="register" value="Inscription" />
			</label>
		</td></tr>
		<tr><td><div id="result1" style="display:none;"></div></td></tr>
	</table>
</form>
Merci d'avance ;)

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

23 mars 2013, 12:08

salut,

1/ requête ajax sur le fichier php ? t'as rien oublié en 1ère ligne ?
2/ la tonne de lignes au départ est a supprimer car
- tu présume de la présence des valeurs dans le tableau $_POST
- on utilise htmlentities qu'a l'affichage
3/ La série d'empty c'est sur les index de $_POST qu'il faut le faire
4/ Il est impératif de tester les scripts avant d'utiliser l'ajax, ou alors tu utilise un debugguer, l'extension developper de chrome ou quelque chose qui te permettra de savoir ce qu'il se passe dans ce script.
S'il n'y a pas d'insertion c'est que la requête déconne, donc pas moyen de le savoir en ajax.
5/ La gestion des erreurs avec PDO (et en poo en général) c'est avec un try / catch, pour capturer l'erreur correctement et ainsi pourvoir renvoyer la chose pour que Js puisse l'exploiter.
6/ utilise du json pour fournir les infos le script serveur ne fait d'affichage c'est ton js, ça permet aussi de l'utiliser autre part ;)
7/ Je ne vois pas l’intérêt des requêtes préparées ..
8/ bon débogage :)

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

Eléphant du PHP | 386 Messages

23 mars 2013, 16:31

Pourquoi la série de ligne au début ne sert à rien ?

Petit nouveau ! | 5 Messages

23 mars 2013, 17:01

Pourquoi la série de ligne au début ne sert à rien ?
Au tout début, tu utilises le tableau $_SESSION. S'il s'agit d'un script appelé en AJAX, il manque un session_start(). Autrement la session n'existera pas pour le script, étant donné qu'il est indépendant du reste de ton application.

Pour les htmlentities, effectivement cela ne sert qu'à convertir les caractères spéciaux en entités HTML. Pour protéger tes variables, tu dois utiliser, selon les cas (les types de données attendues), mysql_real_escape_string, intval(), floatval(), etc, dans le cadre de requêtes SQL. filter_var() / filter_input() sont très utiles également. Ce que veux dire moogli, c'est que la façon dont tu traites tes variables d'entrées ne te protège en rien. Tu dois également vérifier l'existence d'une variable d'entrée.

Par exemple :

Code : Tout sélectionner

$test = ( !empty($_POST['test']) ) ? filter_var( $_POST['test'], FILTER_SANITIZE_STRING ) : '';
Ce qui est équivalent à

Code : Tout sélectionner

if( !empty($_POST['test']) ) { $test = filter_var( $_POST['test'], FILTER_SANITIZE_STRING ); } else { $test = ''; }
C'est un exemple, ce n'est pas forcément la meilleure solution, mais ça évite également des erreurs E_NOTICE (appels sur des éléments inexistants).

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

23 mars 2013, 23:01

Attention il n'est pas question de mysql mais de pdo il faut donc utiliser la méthode quote de l'objet pdo.


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