Fatal error: Call to a member function fetch() on a non-object

Par Ekim Kael, il y a 9 ans


je suis entrain de suivre le tuto de Gestion d'espace membre en PHP mais j'ai cette erreur là :
Fatal error: Call to a member function fetch() on a non-object
voici mon code

<?php require 'inc/header.php'; require 'inc/func.php'; require_once 'inc/db.php'; authentified(); reconnect_from_cookie(); if(!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){ $q = $db->prepare("SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL"); $q->execute(['username' => $_POST['username']]); $user = $q->fetch(); if($user){ if(password_verify($_POST['password'], $user->password)){ $_SESSION['auth'] = $user; $_SESSION['flash']['success'] = "Vous êtes maintenant connecté"; if(isset($_POST['remember'])){ $remember_token = random(250); $q = $db->prepare("UPDATE users SET remember_token = ? WHERE id = ?"); $q->execute([$remember_token, $user->id]); setcookie('remember', $user->id. '//' . $remember_token . sha1($user->id . 'digitalalchemist'), time() + 60 * 60 * 24 * 7); } // header('Location: account.php'); exit(); }else{ $_SESSION['flash']['danger'] = "Identifiant ou mot de passe incorrect"; } }else{ $_SESSION['flash']['danger'] = "Identifiant ou mot de passe incorrect"; } } ?> <h1>Se connecter</h1> <div class="col-xs-12 col-sm-6 col-md-6 col-lg-6 pull-right"> <form action="" method="POST"> <div class="form-group"> <input type="text" name="username" class="form-control" placeholder="Nom d'utilisateur ou Adresse email"> </div> <div class="form-group"> <input type="password" name="password" class="form-control" placeholder="Mot de passe"> <a href="forget.php">(mot de passe oublier?)</a> </div> <div class="form-group"> <input type="checkbox" name="remember">Se souvenir de moi </div> <button type="submit" class="btn btn-primary">Se connecter</button> </form> </div> <?php require 'inc/footer.php'; ?>

et voici la fonction reconnect que j'appelle

function reconnect_from_cookie(){ require_once 'db.php'; if(!isset($db)){ global $db; } if(isset($_COOKIE['remember']) && !isset($_SESSION['auth'])){ $remember_token = $_COOKIE['remember']; $parts = explode('//',$remember_token); $user_id = $parts[0]; $q = $db->prepare("SELECT * FROM users WHERE id = ?")->execute([$user_id]); $user = $q->fetch(); if($user){ $expected = $user_id. '//' . $user->remember_token . sha1($user_id . 'digitalalchemist'); if($expected == $remember_token){ $_SESSION['auth'] = $user; setcookie('remember', $remember_token, time() + 60 * 60 * 24); }else{ setcookie('remember', NULL,-1); } }else{ setcookie('remember', NULL,-1); } } }

Merci d'avance

2 réponses

Lartak, il y a 9 ans

Bonsoir.
Tu devrais remplacer :

$q = $db->prepare("SELECT * FROM users WHERE id = ?")->execute([$user_id]);

Par :

$q = $db->prepare("SELECT * FROM users WHERE id = ?"); $q->execute([$user_id]);
Carouge10, il y a 9 ans

Bonsoir,
Dans la fonction reconnect.... vous executer la requête à la suite du prepare mais utilisez-vous un querybuilder ?