Bonsoire

J'ai un problème quand j'execute çe code il y a aucune erreur, mais quand je mais dans mon formulaire les bonnes données (username & password) absolument rien ne se produit

<?php

if(!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){
    require_once 'inc/db.php';
    require_once 'inc/functions.php';
    $req = $pdo->prepare('SELECT * FROM users WHERE username = :username');
    $req->execute(['username' => $_POST['username']]);
    $user = $req->fetch();
    if(isset($user->username) && password_verify($_POST['password'], $user->password)){
        session_start();
        $_SESSION['auth'] = $user;
        $_SESSION['flash']['success'] = 'Vous êtes maintenant connecté';
        header('Location: account.php');
        exit();
    }else{
        $_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrecte ou compte inexistant';
    }

}

?>

<?php require "inc/header.php"; ?>

<div class="container">

    <div class="starter-template">
        <h1>Se connecter</h1>

        <form action="" method="post">

            Nom d'utilisateur ou email: <input type="text" name="username" class="form-control"> <br>
            Mot de passe : <input type="password" name="password" class="form-control"> <br>

            <input type="submit" value="Se connecter" name="submit" class="btn btn-primary">

        </form>

    </div>

</div>

Merci d'avance.

3 réponses


Uneo7
Réponse acceptée

Je ne suis pas d'accord avec la réponse de PallMallShow.
Déjà ta condition tu a juste à vérifier si on passe en post

if ($_POST) {} // Ca suffit pour vérifier un form en POST

Et pour ton appel PDO les : ne sont absolument pas nessesaires laisse tel quel :

$req = $pdo->prepare('SELECT * FROM users WHERE username = :username');
$req->execute(['username' => $_POST['username']]);

Et pour ton problème utilise la super fonction qui est var_dump(). Si tu ne la connait pas elle debug le contenu d'une variable. Prend l’habitude de l'utiliser ça aide énormément au debug.

Bref dans ton cas fait donc (j'ai un peut modifié ton code au passage)


<?php

session_start();
if($_POST) {

    require 'inc/db.php';
    require 'inc/functions.php';

    $req = $pdo->prepare('SELECT * FROM users WHERE username = :username');
    $req->execute(['username' => $_POST['username']]);
    $user = $req->fetch();

    // ici on debug le contenu de $user
    var_dump($user); 
    // Note si tu n'as pas Xdebug d'installé remplace le var dump par ce qui suis pour plus de lisibilité
    // echo '<pre>';
    // print_r($user);
    // echo '</pre>'

    die();

    if ($user->username) { // La encore pour plus de lisibilité préfère mettre 2 if plutôt qu'un tu n'est pas a 1/4 de millième de seconde près x)
        if(password_verify($_POST['password'], $user->password)){
            $_SESSION['auth'] = $user;
            $_SESSION['flash']['success'] = 'Vous êtes maintenant connecté';
            header('Location: account.php');
            die();
        }else{
            $_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrecte ou compte inexistant';
        }
    }
}

Tu code va donc s'erreter en affichant ce qui a été renvoyé par MySQL et la tu comprendra le problème.

Hello,

A mon avis c'est ta condition qui foire :

if(!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password']))

Je pense que le empty($_POST) (sachant que post est un tableau) renvoi false. Donc si tu veux regarder si tu as des données en POST, préfère peut être

if(isset($_POST) && count($_POST) && !empty($_POST['username']) && !empty($_POST['password']))

Je me trompe peut être j'ai pas essayé !

Ensuite, quand tu bloques, essai de placer a certain endroit stratégique par exemple :

die('je rentre dans la condition');
//Ou alors
else{
    die('je ne rentre pas, je suis dans le else');
}

Une dernière chose :

$req = $pdo->prepare('SELECT * FROM users WHERE username = :username');
$req->execute(['username' => $_POST['username']]);

Ne devrait pas être plutôt :

$req = $pdo->prepare('SELECT * FROM users WHERE username = :username');
$req->execute([':username' => $_POST['username']]);

Merci de la reponse, mais le problème reste le même. Une autre solution ?