Partage
  • Partager sur Facebook
  • Partager sur Twitter

Notice: Trying to get property of non-object

Sujet résolu
29 septembre 2016 à 17:24:30

Hello tout le monde, j'ai un petit souci dans mon code à cet endroit :

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['auth'] = $user;
    $_SESSION['flash']['success'] = "You are now connected";
    if ($_POST['remember']) {
      $remember_token = str_random(255);
      $pdo->prepare('UPDATE users SET remember_token = ? WHERE id = ?')->execute([$remember_token, $user->id]);
      setcookie('remember', $user->id . '==' . $remember_token . sha1($user->id . 'austinpouvoir'), time() + 60 * 60 * 24 * 7);
    }
    header('Location: account.php');
    exit();
  }
  else {
    $_SESSION['flash']['danger'] = "Username or password don't match";
  }
 }

Lorsque j'essaye d'envoyer le formulaire, j'ai une erreur php qui me dit :

"Trying to get property of non-object" on line 14 (qui correspond ici à la ligne 7)

Soit au niveau du if (password_verify(...) {

[...]

}

Si quelqu'un peut m'aider :)

-
Edité par Psychologist 29 septembre 2016 à 17:27:45

  • Partager sur Facebook
  • Partager sur Twitter
29 septembre 2016 à 17:31:40

Salut,

Essaye 

$user['password']

Ta variable $user renvoit un array et tu essayes d'y accéder comme un objet, d'où cette erreur

  • Partager sur Facebook
  • Partager sur Twitter
Quand tu ne sais pas, Google reste ton meilleur ami ! ;)
29 septembre 2016 à 17:37:41

Merci pour ta réponse. En appliquant les modifs, j'ai maintenant une nouvelle erreur :

Fatal error: Cannot use object of type stdClass as array on line 14

L'erreur ne s'affiche uniquement après avoir rentré au moins un bon user_id

-
Edité par Psychologist 29 septembre 2016 à 17:39:08

  • Partager sur Facebook
  • Partager sur Twitter
29 septembre 2016 à 17:44:28

Ah, donc je t'ai dit des bétises, c'est bien un objet donc tu l'appelais correctement.

En revanche, tu as du avoir cette erreur parce que ta requête ne retournait pas de résultat donc tu essayais d'accéder à "password" de NULL

Fais un var_dump($user) pour oir

Mais normalement, c'est pour éviter ce genre d'erreur qu'on utilise la boucle while().

En gros elle dit "tant qu'il y a des résultats, tu fais quelque chose" donc si il y a un résultat tu peux accéder à l'objet du coup si pas de résultat pas d'erreur

while($data = $req->fetch()){
    $pass = $data['password'];
    print_r($data);
}



-
Edité par bryan33000 29 septembre 2016 à 17:45:34

  • Partager sur Facebook
  • Partager sur Twitter
Quand tu ne sais pas, Google reste ton meilleur ami ! ;)
29 septembre 2016 à 17:47:51

On l'a déjà corrigé je ne sais combien de fois ce code :

$user = $req->fetch();
  if (password_verify($_POST['password'], $user->password)) {

=>

  if (($user = $req->fetch(PDO::FETCH_OBJ)) && password_verify($_POST['password'], $user->password)) {

ou, si tu préfères :

$user = $req->fetch(PDO::FETCH_OBJ);
  if ($user && password_verify($_POST['password'], $user->password)) {

Note : PDO::FETCH_OBJ n'est pas nécessaire si tu as redéfinis le mode de fetch par défaut pour celui-ci (attribut PDO::ATTR_DEFAULT_FETCH_MODE)

-
Edité par julp 29 septembre 2016 à 17:58:41

  • Partager sur Facebook
  • Partager sur Twitter
29 septembre 2016 à 17:52:47

En fait le cas où ça ne fonctionne pas, c'est quand j'entre un username inexistant dans la bdd.

Si j'entre un bon username et un mauvais password ou un bon username et le bon password, pas d'erreur php...

@julp : En corrigeant le code de cette façon, il ne reconnaît pas l'utilisateur lorsque je rentre les bons identifiants...

Edit : Ça fonctionne avec la deuxième option, merci :)

-
Edité par Psychologist 29 septembre 2016 à 17:57:56

  • Partager sur Facebook
  • Partager sur Twitter