Page Inscription: Problème requête préparée

Pas_Enregistré
Invité n'ayant pas de compte PHPfrance

21 févr. 2012, 18:43

Bonjour,
Je vous tourne vers vous car, j'ai fais une page d'inscription mais, malheureusement, elle a un petit problème... Les deux erreurs:
Notice: Undefined variable: response in C:\wamp\www\Site\inscription2.php on line 45.
Fatal error: Call to a member function execute() on a non-object in C:\wamp\www\Site\inscription2.php on line 45.
La première erreur, si j'ai bien compris, signifie que la variable n'est pas définie alors que si je fais var_dump($pseudo); elle me retourne ce que j'ai mis dans le champ pseudo.
Le code:

Je vous remercie d'avance de votre aide.
Une personne qui a la flamme de s'inscrire (haha :p)

Pas_Enregistré
Invité n'ayant pas de compte PHPfrance

21 févr. 2012, 18:44

Ah, mince... J'étais sûr que je pourrais pas éditer mon message, je vais donc devoir m'inscrire :lol:

Eléphant du PHP | 179 Messages

21 févr. 2012, 18:45

Moyen d'avoir le code vers la ligne 45 ? :)

Petit nouveau ! | 8 Messages

21 févr. 2012, 18:50

Voilà voilà, c'est moi. :p
<?php
include_once("include/config.php");

/***********************/
/* Inscription au site.
/***********************/

// Si la variable $_POST['bouton'] est vide, on affiche le formulaire.
if(empty($_POST['bouton'])) 
{
?>
<div id="inscription">
	<form method="post" action="">
		<label for="pseudo">Pseudo :</label> <input type="text" name="pseudo" id="pseudo"><br />
		<label for="password">Mot de passe :</label> <input type="password" name="password" id="password"><br />
		<label for="password2">Retapez le mot de passe :</label> <input type="password" name="password2" id="password2"><br />
		<label for="email">Adresse email :</label> <input type="text" name="email" id="email"><br />
		<label for="email2">Retapez votre adresse email :</label> <input type="text" name="email2" id="email2"><br />
		<input type="submit" name="bouton" value="S'inscrire" />
	</form>
</div>
<?php
}
// Sinon la personne a cliqué sur le bouton "S'inscrire" et donc la variable n'est pas vide.
else
{
	// On récupère les variables du formulaire.
	$pseudo = $_POST['pseudo'];
	$mdp = md5($_POST['password']);
	$mdp2 = md5($_POST['password2']);
	$email = $_POST['email'];
	$email2 = $_POST['email2'];
	// Son rôle est de stocker le nombre d'erreurs. 
	// Elle est incrémentée à chaque fois qu'un problème est détecté.
	$nombre_erreur = 0;
	
	// Vérification du pseudo.
	if($pseudo == "")
	{
		$erreur_pseudo_vide = 'Le pseudo n\'est pas remplis.';
		$nombre_erreur++;
	}
	$bdd = new PDO('mysql:host='.$PARAM_hote.';dbname='.$PARAM_nom_bd, $PARAM_user, $PARAM_mdp);
	$reponse = $bdd->prepare("SELECT * FROM site_utilisateurs WHERE pseudo = :pseudo");
	$response->execute(array(':pseudo' => $pseudo));
	$donnees = $reponse->fetchAll();
	$reponse->closeCursor();
	if(count($donnees) > 0)
	{
		$erreur_pseudo_pris = 'Désolé, ce pseudo est déjà utilisé par un membre.';
		$nombre_erreur++;
	}
	// Vérification du mot de passe.
	if($mdp != $mdp2)
	{
		$erreur_mdp_différents = 'Les deux mots de passe ne sont pas identiques.';
		$nombre_erreur++;
	}
	if($mdp == "" || $mdp2 == "")
	{
		$erreur_mdp_vide = 'Le mot de passe n\'est pas remplis.';
		$nombre_erreur++;
	}
	// Vérification de l'adresse email.
    if (!preg_match("#^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}\.[a-z]{2,4}$#", $email || $mail2) && $email == "" || $email2 == "")
    {
        $erreur_email_format = 'Votre adresse mail n\'a pas un format valide.';
		$nombre_erreur++;
    }
	
	// Si il n'y a pas eu d'erreur pendant l'inscription du membre.
	if($nombre_erreur == 0)
	{
		// On enregistre le membre dans la base de données.
		$reponse = $bdd->prepare("INSERT INTO site_utilisateurs (pseudo, password, email) VALUES(:pseudo, :password, :email)");
		$response->execute(array(':pseudo' => $pseudo, ':password' => $mdp, ':email' => $email));
		$reponse->closeCursor();
?>
		<div class="success">
			<h1>Inscription terminée !</h1><br />
			Cliquez <a href="connexion.php">ici</a> pour vous connectez.
		</div>
<?php
	}
	// Sinon, il y a eu une erreur ou plus.
	else
	{
?>
		<div class="error">
			<p><h1>Inscription interrompue !</h1></p>
			<p>Une ou plusieurs erreurs se sont produites pendant l'incription.</p>
			<p><?php echo "$nombre_erreur"; ?> erreur(s)</p>
			<p><?php echo "$erreur_pseudo_pris";?></p>
			<p><?php echo "$erreur_pseudo_vide";?></p>
			<p><?php echo "$erreur_mdp_différents";?></p>
			<p><?php echo "$erreur_mdp_vide";?></p>
			<p><?php echo "$erreur_email_format";?></p>
		</div>
<?php
	}
}
?>

Eléphant du PHP | 209 Messages

21 févr. 2012, 18:52

Ta variable ligne 45 se nomme $reponse et non $response.

Petit nouveau ! | 8 Messages

21 févr. 2012, 18:59

Ohla... Je deviens vraiment aveugle moi. :(
Merci pour votre aide !

Petit nouveau ! | 8 Messages

21 févr. 2012, 20:37

C'est encore moi... Il y a un (gros) problème pendant l'inscription:
- Si les champs mots de passe sont vides l'inscription se déroule avec succès au lieu d'afficher le message d'erreur "Le mot de passe n'est pas remplis."
- Si le champ email est correcte mais, que le deuxième champs (email2) non, l'inscription se déroule avec succès au lieu d'afficher le message d'erreur "Votre adresse mail n'a pas un format valide." et inversement.

Le nouveau code:
<?php
include_once("include/config.php");
include_once("include/haut.php");

/***********************/
/* Inscription au site.
/***********************/

// Si la variable $_POST['bouton'] est vide, on affiche le formulaire.
if(empty($_POST['bouton'])) 
{
	?>
	<div id="inscription">
		<form method="post" action="">
			<label for="pseudo">Pseudo :</label> <input type="text" name="pseudo" id="pseudo"><br />
			<label for="password">Mot de passe :</label> <input type="password" name="password" id="password"><br />
			<label for="password2">Retapez le mot de passe :</label> <input type="password" name="password2" id="password2"><br />
			<label for="email">Adresse email :</label> <input type="text" name="email" id="email"><br />
			<label for="email2">Retapez votre adresse email :</label> <input type="text" name="email2" id="email2"><br />
			<input type="submit" name="bouton" value="S'inscrire" />
		</form>
	</div>
	<?php
}
// Sinon la personne a cliqué sur le bouton "S'inscrire" et donc la variable n'est pas vide.
else
{
	// On mets les variables d'erreurs à NULL sinon, ça bug.
	$erreur_pseudo_vide = NULL;
	$nombre_erreur = NULL;
	$erreur_pseudo_vide = NULL;
	$erreur_pseudo_pris = NULL;
	$erreur_mdp_vide = NULL;
	$erreur_mdp_différents = NULL;
	$erreur_email_format = NULL;
	
	// On récupère les variables du formulaire.
	$pseudo = $_POST['pseudo'];
	$mdp = md5($_POST['password']);
	$mdp2 = md5($_POST['password2']);
	$email = $_POST['email'];
	$email2 = $_POST['email2'];
	// Son rôle est de stocker le nombre d'erreurs. 
	// Elle est incrémentée à chaque fois qu'un problème est détecté.
	$nombre_erreur = 0;
		
	// Vérification du pseudo.
	if($pseudo == "")
	{
		$erreur_pseudo_vide = 'Le pseudo n\'est pas remplis.';
		$nombre_erreur++;
	}
	$bdd = new PDO('mysql:host='.$PARAM_hote.';dbname='.$PARAM_nom_bd, $PARAM_user, $PARAM_mdp);
	$reponse = $bdd->prepare("SELECT * FROM site_utilisateurs WHERE pseudo = :pseudo");
	$reponse->execute(array(':pseudo' => $pseudo));
	$donnees = $reponse->fetchAll();
	$reponse->closeCursor();
	if(count($donnees) > 0)
	{
		$erreur_pseudo_pris = 'Désolé, ce pseudo est déjà utilisé par un membre.';
		$nombre_erreur++;
	}
	// Vérification du mot de passe.
	if($mdp == "" || $mdp2 == "")
	{
		$erreur_mdp_vide = 'Le mot de passe n\'est pas remplis.';
		$nombre_erreur++;
	}
	if($mdp != $mdp2)
	{
		$erreur_mdp_différents = 'Les deux mots de passe ne sont pas identiques.';
		$nombre_erreur++;
	}
	// Vérification de l'adresse email.
	if (!preg_match("#^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}\.[a-z]{2,4}$#", $email, $email2) && $email == "" || $email2 == "")
	{
		$erreur_email_format = 'Votre adresse mail n\'a pas un format valide.';
		$nombre_erreur++;
	}
	// Si il n'y a pas eu d'erreur pendant l'inscription du membre.
	if($nombre_erreur == 0)
	{
		// On enregistre le membre dans la base de données.
		$reponse = $bdd->prepare("INSERT INTO site_utilisateurs (pseudo, password, email) VALUES(:pseudo, :password, :email)");
		$reponse->execute(array(':pseudo' => $pseudo, ':password' => $mdp, ':email' => $email));
		$reponse->closeCursor();
?>
		<div class="success">
			<h1>Inscription terminée !</h1><br />
			Cliquez <a href="connexion.php">ici</a> pour vous connectez.
		</div>
		<?php
	}
	// Sinon, il y a eu une erreur ou plus.
	else
	{
?>
		<div class="error">
			<p><h1>Inscription interrompue !</h1></p>
			<p>Une ou plusieurs erreurs se sont produites pendant l'incription.</p>
			<p><?php echo "$nombre_erreur"; ?> erreur(s)</p>
			<p><?php echo "$erreur_pseudo_vide";?></p>
			<p><?php echo "$erreur_pseudo_pris";?></p>
			<p><?php echo "$erreur_mdp_vide";?></p>
			<p><?php echo "$erreur_mdp_différents";?></p>
			<p><?php echo "$erreur_email_format";?></p>
		</div>
		<?php
	}
}

include_once("include/bas.php");
?>
EDIT: Je voudrais aussi savoir, comment faire pour avoir le formulaire affiché avec les messages d'erreurs ou le message de succès car, le formulaire s'efface.. :/

ViPHP
xTG
ViPHP | 7331 Messages

21 févr. 2012, 20:43

Pour tester le vide utilises empty() plutôt.
Ton utilisation de preg_match() est incorrecte, regarde la doc et tu verras qu'on peut pas lui passer deux chaines arguments à traiter.
Sur la même ligne faut rajouter des parenthèses pour donner un ordre de priorité des opérateurs.

Petit nouveau ! | 8 Messages

21 févr. 2012, 21:31

Pour l'email, je n'ai pu de problème: Si les champs sont vides ou s'ils ont pas un format correct, l'erreur est affiché. Par contre... Le mot de passe c'est toujours pareil. :|
<?php
include_once("include/config.php");
include_once("include/haut.php");

/***********************/
/* Inscription au site.
/***********************/

// Si la variable $_POST['bouton'] est vide, on affiche le formulaire.
if(empty($_POST['bouton'])) 
{
	?>
	<div id="inscription">
		<form method="post" action="">
			<label for="pseudo">Pseudo :</label> <input type="text" name="pseudo" id="pseudo"><br />
			<label for="password">Mot de passe :</label> <input type="password" name="password" id="password"><br />
			<label for="password2">Retapez le mot de passe :</label> <input type="password" name="password2" id="password2"><br />
			<label for="email">Adresse email :</label> <input type="text" name="email" id="email"><br />
			<label for="email2">Retapez votre adresse email :</label> <input type="text" name="email2" id="email2"><br />
			<input type="submit" name="bouton" value="S'inscrire" />
		</form>
	</div>
	<?php
}
// Sinon la personne a cliqué sur le bouton "S'inscrire" et donc la variable n'est pas vide.
else
{
	// On mets les variables d'erreurs à NULL sinon, ça bug.
	$erreur_pseudo_vide = NULL;
	$nombre_erreur = NULL;
	$erreur_pseudo_vide = NULL;
	$erreur_pseudo_pris = NULL;
	$erreur_mdp_vide = NULL;
	$erreur_mdp_différents = NULL;
	$erreur_email_format = NULL;
	
	// On récupère les variables du formulaire.
	$pseudo = $_POST['pseudo'];
	$mdp = md5($_POST['password']);
	$mdp2 = md5($_POST['password2']);
	$email = $_POST['email'];
	$email2 = $_POST['email2'];
	// Son rôle est de stocker le nombre d'erreurs. 
	// Elle est incrémentée à chaque fois qu'un problème est détecté.
	$nombre_erreur = 0;
		
	// Vérification du pseudo.
	if(empty($pseudo))
	{
		$erreur_pseudo_vide = 'Le pseudo n\'est pas remplis.';
		$nombre_erreur++;
	}
	$bdd = new PDO('mysql:host='.$PARAM_hote.';dbname='.$PARAM_nom_bd, $PARAM_user, $PARAM_mdp);
	$reponse = $bdd->prepare("SELECT * FROM site_utilisateurs WHERE pseudo = :pseudo");
	$reponse->execute(array(':pseudo' => $pseudo));
	$donnees = $reponse->fetchAll();
	$reponse->closeCursor();
	if(count($donnees) > 0)
	{
		$erreur_pseudo_pris = 'Désolé, ce pseudo est déjà utilisé par un membre.';
		$nombre_erreur++;
	}
	// Vérification du mot de passe.
	if(empty($mdp) || empty($mdp2))
	{
		$erreur_mdp_vide = 'Le mot de passe n\'est pas remplis.';
		$nombre_erreur++;
	}
	if($mdp != $mdp2)
	{
		$erreur_mdp_différents = 'Les deux mots de passe ne sont pas identiques.';
		$nombre_erreur++;
	}
	// Vérification de l'adresse email.
	if (!preg_match("#^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}\.[a-z]{2,4}$#", $email) || !preg_match("#^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}\.[a-z]{2,4}$#", $email2))
	{
		$erreur_email_format = 'Les adresses mail n\'ont pas un format valide.';
		$nombre_erreur++;
	}
	// Si il n'y a pas eu d'erreur pendant l'inscription du membre.
	if($nombre_erreur == 0)
	{
		// On enregistre le membre dans la base de données.
		$reponse = $bdd->prepare("INSERT INTO site_utilisateurs (pseudo, password, email) VALUES(:pseudo, :password, :email)");
		$reponse->execute(array(':pseudo' => $pseudo, ':password' => $mdp, ':email' => $email));
		$reponse->closeCursor();
?>
		<div class="success">
			<h1>Inscription terminée !</h1><br />
			Cliquez <a href="connexion.php">ici</a> pour vous connectez.
		</div>
		<?php
	}
	// Sinon, il y a eu une erreur ou plus.
	else
	{
?>
		<div class="error">
			<p><h1>Inscription interrompue !</h1></p>
			<p>Une ou plusieurs erreurs se sont produites pendant l'incription.</p>
			<p><?php echo "$nombre_erreur"; ?> erreur(s)</p>
			<p><?php echo "$erreur_pseudo_vide";?></p>
			<p><?php echo "$erreur_pseudo_pris";?></p>
			<p><?php echo "$erreur_mdp_vide";?></p>
			<p><?php echo "$erreur_mdp_différents";?></p>
			<p><?php echo "$erreur_email_format";?></p>
		</div>
		<?php
	}
}

include_once("include/bas.php");
?>

ViPHP
xTG
ViPHP | 7331 Messages

21 févr. 2012, 21:41

Ah bah oui... md5() d'une chaîne vide ça donne pas une chaîne vide mais un hash de 32 caractères. ;)
Faut faire le md5() après les tests.

Petit nouveau ! | 8 Messages

21 févr. 2012, 21:54

Ah... Tu viens de m'apprendre quelque chose là, je ne le savais pas.
Tout marche impeccable désormais, merci. :)