Bonjour,

Voila je rencontre un petit problème avec le tutoriel que j'ai suivi ici : https://www.youtube.com/watch?v=xA6pNSS9Q18

Lorque je rentre des fausses données pour me connecter il m'affiche tout en haut une notice qui dit :
Notice: Trying to get property 'password' of non-object in /opt/lampp/htdocs/class/Auth.php on line 92

Voici mon code dans Auth :

public function login($db, $username, $password, $remember = false){

        $user = $db->query('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL', ['username' => $username])->fetch();

        if(password_verify($password, $user->password)){

            $this->connect($user);

            if($remember){
                $this->remember($db, $user->id);
            } else {
            return $user;
            }
        } else {
            return false;
        }

    } 

J'aimerais que cette notice ne s'affiche plus et aussi que le message d'erreur s'affiche même lorsqu'on rentre aucune donnée dans les champs mais qu'on clique sur 'Me connecter', ce qui n'est pas le cas pour le moment.

Voici mon code dans login.php :

<?php

require 'inc/bootstrap.php';

$auth = App::getAuth();

$db = App::getDatabase();

$auth->connectFromCookie($db);

if($auth->user()){
    App::redirect('account.php');
}

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

    $user = $auth->login($db, $_POST['username'], $_POST['password'], isset($_POST['remember']));

    $session = Session::getInstance();

    if($user){
        $session->setFlash('success', "Vous êtes maintenant connecté");
        App::redirect('account.php');
    } else {
        $session->setFlash('danger', "Identifiant ou mot de passe incorrect");
    }

}
?>

Merci de votre aide et de votre temps. :)

2 réponses


KK777
Auteur
Réponse acceptée

Re bonsoir, tout d'abord merci grâce à vous j'ai pu mieux comprendre au problème
j'ai rajouté un if user après le fetch et ça ne me retourne plus la notice à présent.

Voici le code si j'amais d'autres auraient le même problème :

public function login($db, $username, $password, $remember = false){

        $user = $db->query('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL', ['username' => $username])->fetch();

        if($user){

        if (password_verify($password, $user->password)) {

            $this->connect($user);

            if ($remember) {
                $this->remember($db, $user->id);
            } else {
                return $user;
            }
        } else {
            return false;
        }

        } else {
            return false;
        }

    }

Malgré tout je n'arrive pas à faire en sorte que quand il clique sur le boutton sans rien entrer ça le redirige l'erreur mais ce n'est pas si grave que ça.

Bonjour,

J'imagine que la ligne 92 correspond à "if(password_verify($password, $user->password)){..."

En fait ta notice signifie que "$user" n'est pas un objet, probablement parce que ta requête ne retourne aucune résultat... elle ne retorune aucun résultat parce que tu envoi des fausses données.

Il faut donc ajouter une condition supplémentaire avant le "password_verify", condition qui devra vérifier si le résultat de la requête permet de continuer ou pas dans la méthode.

En tout cas cette une bonne pratique de prendre en compte et gérer les notices.