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
Réponse acceptée

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]);

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