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 !

5 réponses


Glaived
Réponse acceptée

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();

oui merci j'ai modifié mon code et sa marche

bindValue par bindParam :)

@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 ^^