Bonjour,

J'ai téléchargé le script d'espace membre (refactorisation) de Grafikart, seulement voila, je me suis rendu compte que la page "account.php" permettant au membre de modifier son mot de passe n'a pas été réfactorisée (un oubli de Grafikart?), elle est toujours en procédural !
J'ai donc fais de mon mieux pour écrire la page moi-même et je pense avoir presque réussi mais comme "presque" ne suffit pas je demande de l'aide, le probleme : Je ne sais pas comment (sauf en procédural) récupérer l'id du membre a l'aide des classes du script.

Voila mon code

<?php

require 'inc/bootstrap.php';
App::getAuth()->restrict();

$auth = App::getAuth();

if (!empty($_POST)) {
    $validator = new Validator($_POST);
    $validator->isConfirmed('password');
    if ($validator->isValid()) {
        $password = $auth->hashPassword($_POST['password']);
        $user_id = $_SESSION['auth']->id; // voila la ligne qui pose probleme, ceci fonctionne mais c'est du procédural.
        $db = App::getDatabase();
        $db->query('UPDATE users SET password = ? WHERE id = ?', [$password, $user_id]);
        Session::getInstance()->setFlash('success', 'Votre mot de passe a bien été modifié');
    } else {
        Session::getInstance()->setFlash('danger', 'Vous devez rentrer un mot de passe valide');
    }
}

require 'inc/header.php';

?>

Ce que je veux

l'id du membre, que je récupère de la session :
var_dump(Session::getInstance()->read('auth'));

Mais avec cette ligne je récupère l'ensemble de la session, et pas uniquement l'id.

Ce que j'obtiens AVEC le var_dump

C:\wamp64\www\test\account.php:25:
object(stdClass)[3]
public 'id' => string '2' (length=1)
public 'username' => string 'demo' (length=4)
public 'email' => string 'demo@demo.com' (length=13)
public 'password' => string '$2y$10$nQHaOTIcD3jJ6OL7EuzjM.fcbqYVrpyst90ql9EzvdUr.CvHp2fPa' (length=60)
public 'remember_token' => null
public 'confirmation_token' => null
public 'confirmed_at' => string '2017-01-08 00:50:46' (length=19)
public 'reset_token' => null
public 'reset_at' => null

Comment récuperer l'id seulement ??

Merci pour votre aide, et désolé pour la coloration de mon code, je ne maitrise pas du tout le markdown :/

4 réponses


yanis-git
Réponse acceptée

Essaye ceux-ci :

var_dump( (int) Session::getInstance()->read('auth')->id);

Un peu d'explication :
le (int) va servir à forcer ton id à être un entier et non une string comme le montre ton var_dump.
Le var_dump te montre que c'est un objet de type stdClass c'est une classe générique que propose PHP. Tout les attributs sont public est accessible simplement.

Si tu veux jouer avec cette classe tu peux essayer ceux-ci :

$foo = new \stdClass();
$foo->bar = "Grafikart";
echo $foo->bar;

Une petite recherche sur stdClass te donnera tout un tas d'information à ce sujet.

dd24
Auteur

Merci pour ta réponse rapide et efficace.
Pourquoi mon ide (phpstorm) me surligne le id ?
ta solution fonctionne mais je me pose la question si c'est bien la methode a appeler (read) pour obtenir l'id ? :/
https://www.grafikart.fr/tutoriels/php/gestion-membre-poo-632

Voici la class Session

<?php
class Session{

    static $instance;

    static function getInstance(){
        if(!self::$instance){
            self::$instance = new Session();
        }
        return self::$instance;
    }

    public function __construct(){
        session_start();
    }

    public function setFlash($key, $message){
        $_SESSION['flash'][$key] = $message;
    }

    public function hasFlashes(){
        return isset($_SESSION['flash']);
    }

    public function getFlashes(){
        $flash = $_SESSION['flash'];
        unset($_SESSION['flash']);
        return $flash;
    }

    public function write($key, $value){
        $_SESSION[$key] = $value;
    }

    public function read($key){
        return isset($_SESSION[$key]) ? $_SESSION[$key] : null;
    }

    public function delete($key){
        unset($_SESSION[$key]);
    }

}
dd24
Auteur

finalement, ton code ne fonctionne pas aprés reconnexion dans mon espace membre. Je ne comprends rien ! impossible d'obtenir l'id du membre a partir de la session en cours !!!

Je comprend pas ton souci à dire vrais. Il faut contextualiser et bien détailler.

Qu'est ce qui fonctionne pas ?
Pourquoi impossible d'obtenir l'id ?