Bonsoir j'ai un problème pour executer ma requête
<?php
// Gestions des errors
$errors = array(
'success-register' => 'Vous êtes bien inscrit sur l\'espace membres.',
'error-register' => 'Une anomalie s\'est produit lors de l\'inscription, veuilliez reéssayer.',
'error-mail' => 'Votre adresse email n\'est pas valide.',
'error-mail-count' => 'Cette adresse email existe déjà.',
'error-password' => 'Les deux mots de passe ne sont pas identiques.',
'error-password-longeur' => 'Votre mot de passe est trop court, il doit contenir au minimum 8 caractères.',
'error-identifiant-longeur' => 'Votre identifiant est trop long, il doit contenir au maximum 40 caractères.',
'error-prenom-longeur' => 'Votre prenom est trop long, il doit contenir moin de 40 caractères',
'error-nom-longeur' => 'Votre nom est trop long, il doit contenir moin de 20 caractères.',
'error-champs' => 'Un ou plusieurs champs sont vide.</div>',
'error-identifiant-count' => 'Cet identifiant est existe déjà.'
);
if(!empty($_POST'identifiant']) && !empty($_POST'password']) && !empty($_POST'password-repeat']) && !empty($_POST'email']) && !empty($_POST'prenom']) && !empty($_POST'nom']))
{
$identifiant = trim($_POST'identifiant']);
$password = sha1($_POST'password']);
$passwordRepeat = sha1($_POST'password-repeat']);
$email = trim($_POST'email']);
$prenom = trim($_POST'prenom']);
$nom = trim($_POST'nom']);
if($password === $passwordRepeat)
{
if(strlen(trim($password && $passwordRepeat)) < 8)
{
if(strlen(trim($identifiant)) < 40)
{
if(strlen(trim($prenom)) < 40)
{
if(strlen(trim($nom)) < 20)
{
if(preg_match('#^(\w\.-]+)@(\w\.-]+)(\.[a-z]{2,4})$#',trim($email)))
{
$dns = 'mysql:host=localhost;dbname=espace_membres';
$utilisateur = 'root';
$motDePasse = '';
$bdd = new PDO( $dns, $utilisateur, $motDePasse );
$queryMail = $bdd->query("SELECT email FROM profil WHERE email = '$email'");
$countMail = $queryMail->rowCount();
if($countMail == 0)
{
$queryIdentifiant = $bdd->query("SELECT id FROM profil WHERE identifiant = '$identifiant'");
$countIdentifiant = $queryIdentifiant->rowCount();
if($countIdentifiant == 0)
{
$sql = "INSERT INTO profil (`identifiant`, `password`, `email`, `prenom`, `nom`) VALUES(':identifiant', ':password`, ':email', ':prenom', ':nom')";
$req = $bdd->prepare($sql);
$req->bindValue(':identifiant', $identifiant);
$req->bindValue(':password', $password);
$req->bindValue(':email', $email);
$req->bindValue(':prenom', $prenom);
$req->bindValue(':nom', $nom);
$req->execute();
}else{
echo $errors'error-identifiant-count'];
}
}else{
echo $errors'error-mail-count'];
}
}else{
echo $errors'error-mail'];
}
}else{
echo $errors'error-nom-longeur'];
}
}else{
echo $errors'error-prenom-longeur'];
}
}else{
echo $errors'error-identifiant-longeur'];
}
}else{
echo $errors'error-password-longeur'];
}
}else{
echo $errors'error-password'];
}
}else{
echo $errors'error-champs'];
}
?>
Le problème vient de $req->execute();
Le message d'erreur indique : Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
Merci de m'aider !
ta un au lieu d'un ' sur ':password
$sql = "INSERT INTO profil
(`identifiant`, `password`, `email`, `prenom`, `nom`)
VALUES(':identifiant', ':password', ':email', ':prenom', ':nom')";
$req = $bdd->prepare($sql);
$req->bindValue(':identifiant', $identifiant);
$req->bindValue(':password', $password);
$req->bindValue(':email', $email);
$req->bindValue(':prenom', $prenom);
$req->bindValue(':nom', $nom);
$req->execute();
@F0rZ3r0 : Je rebondis sur ta réponse pour te demande: pourquoi l'un plutôt que l'autre ? Car les deux font fonctionner le script à chaque fois. bindParam se n'est pas pour les arguments d'une fonction ?
« Contrairement à PDOStatement::bindValue(), la variable est liée en tant que référence et ne sera évaluée qu'au moment de l'appel à la fonction PDOStatement::execute(). »
Cf : http://www.php.net/manual/fr/pdostatement.bindparam.php
@Francois: sujet résolu ? merci de le signaler ^^