Ce code me pemet de récuper les users dans ma bdd, par contre lorsque je ne trouve rien, j'ai cet erreur qui s'affiche
Trying to get property 'mail'

$users = UserTable::getUser($mail);
        if($mail == $users->mail){
            if(password_verify($_POST['pass'], $users->pass))
public static function getUSer($mail){
        return self::query("
        SELECT * FROM usertable
        WHERE mail = ?",[$mail], true
        );
    }

Merci de bien vouloir m'aider

8 réponses


Gusparo
Réponse acceptée

Ce que je ferais c'est simplement une condition qui vérifie si la requête vers ta bdd est correct du genre après ton $users = UserTable::... un if($users) -> qui vérifie si on a bien trouvé quelque chose dans la bdd

Salut, je ne suis pas tout à faire sûr de ma réponse, mais je pense que quand tu fait $users->mail PHP essaye d'obtenir l'attribut de l'instance $users, or ce n'est en aucun cas une instance le problème viens de là je pense, j'image que ta méthode getUser($mail) doit renvoyer un tableau, essaye de voir en mettant $users['mail'].

En faite le code est totalement fonctionelle lorsque j'entre un mail qui se trouve dans la bdd. Le problème survient lorsque j'entre un mail qui n'est pas enregistrer.

Ton self::query renvois quoi? un tableau ? essaye de voir ce que renvois ton $users fait un coup de var_dump($users) pour voir quand tu met un mail non enregistrer puis un mail enregistrer, pour voir ce qu'il ce passe

Lorsque j'utlise var_dump($users) le résultat

boolean false

Oui c'est exactement ceux à quoi j'ai pensé. C'est bon maintenant
Merci

Alors la condition c'est la bonne solution, maintenant si tu es en PHP 8 la condition se fait autrement:

$users = UserTable::getUser($mail);
        if($mail == $users?->mail){
            if(password_verify($_POST['pass'], $users?->pass))

La syntaxe ?-> rends le contenu optionel, si $user n'existe pas, au lieux de ffaire une erreur il retourneras juste false

Hello,

Je passe par là et je vais apporter des précisions car le soucis c'est que le flow n'est pas bon à la base.

Si tu fais un where sur le mail, pourquoi revérifier que le mail est égale au user avec ce mail ?

Je ne connais pas comment est le code en interne mais perso voici comment je verrai la chose :

class Table
{
    public function query(/* arguments */) { /* code ... */ }
}

class UserTable extends Table
{
    public function findByEmail(string $email)
    {
        return parent::query('SELECT * FROM usertable WHERE mail = ?', [$email], true);
    }
}

// Ensuite dans le code on peut faire
$email = $_POST['email'] ?? '';
$password = $_POST['pass'] ?? '';

$userTable = new UserTable();
$user = $userTable->findByEmail($email);

if ($user === false || !password_verify($password, $user->pass)) {
    // Code si pas de user trouvé (email mauvais)
    // Ou mot de passe érroné
} else {
    // OK pour s'authentifier
}

J'ai retiré le côté static car personnellement je n'en vois pas l'intérêt dans ce cas-là mais si tu ne veux pas tous changer tu peux rester comme c'est.

Par contre il ne faut pas oublier que quand tu fais un where sur un champs (par exemple l'email) alors le résultat obtenu est forcément "égale".
Refaire une condition sur le mail n'est donc pas nécessaire. Par contre il faut en effet vérifier que tu as bien un utilsateur.
Un simple if sur est-ce que j'ai un objet ou false suffit.

En prévision d'une question sur ma condition :) , j'ajouterai que la condition du password_verify ne se fera que si la condition $user === false n'est pas rempli.
Donc faire ma condition ou faire le code ci-dessous revient au même quasiement :

if ($user === false) {
    // Ou mot de passe érroné
} else if (!password_verify($password, $user->pass)) {
    // Code si pas de user trouvé (email mauvais)
} else {
    // OK pour s'authentifier
}

Voilà je voulais juste re-préciser un peu aussi pour les autres personnes qui lirai ce post après.