Bonjour à tout le monde,

Je suis la tuto de la gestion membre et voilà que j'arrive avec un problème, qui d'après moi vient d'un paramètre qui manque.

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in C:\wamp\www\login\login.php on line 11
( ! ) PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\wamp\www\login\login.php on line 11

Voilà mon code dans login.php;

if(!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){
    require_once 'inc/db.php';
    $req = $pdo->prepare('SELECT * FROM users WHERE (username = :username OR :email = username) AND confirmed_at IS NOT NULL');
    $req->execute(['username' => $_POST['username']]);
    $user = $req->fetch();
    if(password_verify($_POST['password'], $user->password)){
        session_start();
        $_SESSION['auth'] = $user;
        $_SESSION['flash']['sucess'] = 'Vous êtes maintenant connecté.';
        if($_POST['remember']){
            $remember_token = str_random(250);
            $pdo->prepare('UPDATE users SET remember_token = ? WHERE id = ?')->execute([$_remember_token, $user->id]);
            setcookie('remember', $user->id . '==' . $remember_token . sha1($user->id . 'raton-laveurs'), time() + 60 * 60 * 24 * 7);
            header('Location: account.php');
            exit();
        }
    }else{
        $_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrect';
    }
}

Alors ici, je me demande comment je dois modifier mon code pour que le la page fonctionne. Merci d'avance.

3 réponses


shinix
Réponse acceptée

Salut,

Vérifie ton code tu as mis les ":" sur email et non username, du coup, comme c'est indiqué dans le message d'erreur (souvent c'est bien de les lire), il y a une différence de nombre entre les variables définies et celle à définir.

Donc :

$req = $pdo->prepare('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL');

Bonjour

Dans

 $req = $pdo->prepare('SELECT * FROM users WHERE (username = :username OR :email = username) AND confirmed_at IS NOT NULL');
 $req->execute(['username' => $_POST['username']]);

Tu n'exécute qu'avec le username, tu as oublié la variable email.

Bonne journée,
Gaspard.

Exact shinix, bien vu :D