Bonjour,

Voila je rencontre un petit problème avec mon code. une message d'erreur s'affiche lorsque je test la connexion au login..

Ce que je fais

Je fais une erreure volontaire dans le login pour voir le message flash : Identifiant ou mot de passe incorrecte.

// mon code du fichier login.php
```<?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 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']['success'] = 'Vous êtes maintenant connecté';  
    header('location: account.php');
    exit();  

  }else{ 
   $_SESSION['flash']['danger '] = 'Identifiant ou mot de passe incorrecte';  

  }    

}
?>  

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

    <h1>Se connecter</h1>
<form action="" method="POST">

    <div class="form-group">
        <label for="">Pseudo ou Email</label>
        <input type="text" name="username"  class="form-control"/>
    </div>

     <div class="form-group">
        <label for="">Mot de passe</label>
        <input type="password" name="password" class="form-control"/>
    </div>

    <button type="submit" class="btn btn-primary" >Se connecter</button>

</form>

<?php require 'inc/footer.php'; ?>
//

voici le message d'erreur que je recois:
PHP Notice:  Trying to get property of non-object in /home/concep19/mcaq.ca/tutoriel/login.php on line 9

que doit je faire ?

Merci 

13 réponses


Bonjour.
Ton problème se situe au niveau de la vérification du mot de passe.
Comment pourrais-tu faire une vérification sur le mot de passe dans le cas où tu ne récupèrerais pas de données depuis la requête SQL ?
Il te faut donc avant de faire la vérification sur le mot de passe, vérifier si tu récupères bien un enregistrement.

Je te propose une correction simple à ton problème :

Ta proposition ne résoudra pas son problème, si tu as bien lu la totalité du contenu de son sujet, il dit :

Je fais une erreure volontaire dans le login pour voir le message flash : Identifiant ou mot de passe incorrecte.

Donc le type de retour de ses données en SQL ne changera en rien le problème qu'il rencontre.

Je le sais, je n'ai pas besoin que tu me l'apprenne, sauf que ce qu'il reçoit actuellement c'est false et que je sache false n'est ni un tableau, ni un objet, mais un boolean.
Je ne vois donc pas en quoi ta proposition changera quoi que ce soit à son problème.
Son problème actuel n'est pas dù à son type de retour de données, mais à ses vérifications.

Je vais faire les test avec vos réponse ...

Un détails tout ce que je veux ces le message d'erreur flash lorsque un utilisateurs tente de se connecté s'affiche....

au moins le reste de mon site fonctionne !

Merci je vous tiens informé si mon problème persiste

bonsoir,

$user = $req->fetch(PDO::FETCH_OBJ); ne donne rien.....

}else{
$_SESSION['flash']['success'] = 'Identifiant ou mot de passe incorrecte';
ne s'affiche toujours pas

PHP Notice: Trying to get property of non-object in /home/concep19/mcaq.ca/tutoriel/login.php on line 9
apparait toujours....

pff je suis dans une impasse.. j'ai pourtant suivi a la lettre exactement le tutoriel....

D'autre suggestion ?

D'autre suggestion ?

Je t'ai déja dit ce que tu devais faire :

Il te faut donc avant de faire la vérification sur le mot de passe, vérifier si tu récupères bien un enregistrement.

Je t'ai donné suffisamment d'explication pour que tu puisse faire le nécessaire, ne t'attends pas à ce que nous te donnions le code, car si tu n'es pas capable de réfléchir à ce tout petit bout de code que tu dois ajouter, c'est que tout ce que tu attends c'est que l'on code tout pour toi.

Juste pour information, la proposition de acanoenfr ne risquait pas te t'aider, il était donc inutile que tu l'utilises, je l'ai pourtant assez expliqué, mais il semblerait que tu ne comprennes pas les explications qui te sont faites.

oh escuse je suis distrait lol

j'ai pourtant suivi a la lettre exactement le tutoriel....

Si tu parles bien de Tutoriel Vidéo PHP » Gestion d'un espace membre, justement c'est une erreur, mais dans la description (rédigée) du tutoriel, il fait un correctif, sauf que le correctif qu'il y fait est un peu illogique.
En effet, il fait 3 conditions dont 2 qui renvoient le même message d'erreur, alors qu'avec 2 seules conditions, mais en modifiant légèrement la première, il arriverait au même résultat, sans pour autant définir 2 fois le même message d'erreur.

je crois avoir une piste...

ceci vérifie si les espace sont rempli:
if(!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){```

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

celle ci exécute la requête :
$req->execute(['username' => $_POST['username']]);

ICI JE SUIS PAS SUR.... le fetch me semble correct...
$user = $req->fetch();

CETTE FONCTION password_verify je suis pas sur quelle est bien fait.....
if(password_verify($_POST['password'], $user->password)){



je continue ma réflexions...

Je vois que tu as un peu cherché, je vais te montrer la solution et tu vas voir que c'est tout bète :

if($user && password_verify($_POST['password'], $user->password)){

Tout simplement.
Pour les explications, en ajoutant la variable qui contient le retour de la BDD, dans le cas ou aucun enregistrement n'est récupéré la variable vaut false, du coup la vérification du mot de passe ne sera pas faite car PHP passera directement au else et affichera donc le message d'erreur.
Par conséquent, avec la première condition codée comme ceci, PHP pourra y entrer dedans seulement si un enregistrement est retourné et que la vérification de la correspondance du mot de passe est correcte.

J'ai beaucoup chercher... je suis content de voir que la solution été plus simples que je croyais...

Je dois me trouvé un tutoriel complet sur les conditions en PHP... c'est une faiblesse que je dois travailler...

Merci beaucoup Lartak de ta patience avec moi et ta gentillesse....

A bientôt !

De rien, avec plaisir.

J'ai cru avoir réussi lol... un message d'erreur différents est apparu :

PHP Notice: Object of class stdClass could not be converted to int in /home/concep19/mcaq.ca/tutoriel/login.php on line 7around

voici mon code:

<?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($user == 1){
        if($user && password_verify($_POST['password'], $user->password)){
        session_start();    
        $_SESSION['auth'] = $user;
        header('Location: account.php');
        exit();
        }       
    }else{             
        $_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrecte';
    }
}
?>  

Quelqu'un connaît ce message d'erreur que j'ai mentionné plus haut ?
Que faire pour y remédier SvP?