Problème de Session POO

Eléphant du PHP | 417 Messages

08 nov. 2012, 14:39

Bonjour,

voila je début en POO

je voulais savoir si on instance un objet ex $client= new User(); dans un fichier index.php est ce que qu'on on passe a un autre fichier on perd notre instance $client ?

parce que moi quand je suis sur index.php j'ai un formulaire d'identification quand j'identifié, je suis tjr sur le fichier index mais quand je click sur un lien pour changer la page je perd mon $client comment régler ça ?


merci d'avance

ViPHP
xTG
ViPHP | 7331 Messages

08 nov. 2012, 19:45

Ton problème ne vient pas de la POO mais de l'utilisation des sessions. :)
Si tu ne mets rien en session il est normal de ne rien retrouver après un changement de page.
Car variable de type int ou bien variable de type MonObjet c'est le même fonctionnement.

Eléphant du PHP | 417 Messages

08 nov. 2012, 19:55

je pense que ça vien pas de session parce que quand je change la page et je fait un echo $_SESSION['name'] par exemple il est tjr open et même je ferme la page sans déconnexion et je relance la page et la session est encore open

ViPHP
xTG
ViPHP | 7331 Messages

08 nov. 2012, 21:21

Et ta variable $client... Elle est dans une variable de session ? Car là rien à voir avec la variable name.

Eléphant du PHP | 417 Messages

08 nov. 2012, 23:13

ah il faut stocker l'instance de l'objet user dans session ? :shock: je savais pas

donc si j'ai bien compris il faut faire un truc de genre
$client = new User();
$_SESSION['client'] = $client;


et pour Access aux méthodes au attributs dans n'importe quel fichier tant que la session est open il suffit de faire
$client = $_SESSION['client']; // inverse de ce qu'on a fait avant

$client->attribut1;
$client->method1;
//...



c'est bien ça ?
Modifié en dernier par miiidooo19 le 09 nov. 2012, 00:37, modifié 2 fois.

ViPHP
AB
ViPHP | 5818 Messages

09 nov. 2012, 00:32

Oui, mais n'oublie pas de déclarer session_start() avant l'utilisation des variables de session.

Eléphant du PHP | 417 Messages

09 nov. 2012, 00:37

J'ai essayé mais ça marche pas voici ce que j'ai fait

index.php
$_SESSION['Auth']= array(
'User'=>$User, 
'id'=>$utilisateur[0]["id"], 
'mail'=> $User->mail,
'password'=> $_POST['password'] 
);

header('location:profile.php');
profil.php
session_start();
	require "core/core.php";
	require "core/auth.php";

	if(Auth::islog()){
		echo ' yesss<br />';
	}
	else{
		header('location:index.php');
	}
	echo $_SESSION['Auth']['mail'];
	$User = $_SESSION['Auth']['User'];
	$User->test();
résultat

yesss
[email protected]
Fatal error: main() [<a href='function.main'>function.main</a>]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "User" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in C:\Program Files (x86)\EasyPHP-5.3.9\www\PPE-POO\profile.php on line 14

d'après les résultats on vois vien que la session est tjr ouverte vu qu'il m'affiche $_SESSION['Auth']['mail'];

la ligne d'erreur 14 fichier profile.php c'est $User->test();

ViPHP
AB
ViPHP | 5818 Messages

09 nov. 2012, 01:00

Fichier A
<?php
class Student{
    private $full_name = '';
    private $score = 0;
    private $grades = array();
   
    public function __construct($full_name, $score, $grades)
    {
        $this->full_name = $full_name;
        $this->grades = $grades;
        $this->score = $score;
    }
   
    public function show_full_name()
    {
        echo $this->full_name;
    }
   
    public function show_score()
    {
        echo $this->score;
    }
	
    public function show_grades()
    {
        print_r($this->grades);
    }
	
    function __sleep()
    {
        return array('full_name','grades');
    }
   
    function __wakeup()
    {}
}

$student = new Student('bla bla', 'XXX', array('a' => 90, 'b' => 100));
$student->show_full_name();
$student->show_score();
$student->show_grades();

session_start();
$_SESSION['ma_class'] = $student;
?>
Fichier B
<?php
class Student{
    private $full_name = '';
    private $score = 0;
    private $grades = array();
   
    public function __construct($full_name, $score, $grades)
    {
        $this->full_name = $full_name;
        $this->grades = $grades;
        $this->score = $score;
    }
   
    public function show_full_name()
    {
        echo $this->full_name;
    }
   
    public function show_score()
    {
        echo $this->score;
    }
	
    public function show_grades()
    {
        print_r($this->grades);
    }
	
    function __sleep()
    {
        return array('full_name','grades');
    }
   
    function __wakeup()
    {}
}



session_start();
$a = $_SESSION['ma_class'];
$a->show_full_name();
$a->show_score();
$a->show_grades();
?>
Dans cet exemple j'ai utilisé __sleep et __wakeup (qui va avec) pour ne conserver que certaines variables qui sont énoncées dans __sleep.
Sinon tu peux te passer d'utiliser les fonctions __sleep et __wakeup (en les supprimant) et toutes tes variables seront sauvegardées.

Eléphant du PHP | 417 Messages

09 nov. 2012, 02:10

Houps :shock:

comme je suis débutant en POO comment je peux utilisé tes function dans mon exemple ?
j'ai pas compris l'utilité

ViPHP
AB
ViPHP | 5818 Messages

09 nov. 2012, 04:28

C'est pas pour que tu les utilise dans ton exemple c'est pour que tu les teste et comprendre comment ça fonctionne.
Tu crée un premier fichier et tu colle dedans le code du fichier A puis tu crée un second fichier et tu colle dedans le code du fichier B.
Ensuite tu lance ton premier fichier (qui contient de code A) et ensuite ton second fichier (qui contient de code B) et tu observe le résultat. Tu pourras aussi faire des tests en modifiant des fonctions etc.

Et comme je te l'ai déjà dit, les fonctions __sleep() et __wakeup() sont facultatives. Tu peux les supprimer. Elle permettent simplement par l'intermédiaire de la fonction __sleep(), de sélectionner les variables que tu veux transmettre lors de l'enregistrement en session. C'est surtout utile si tu as par exemple des variables encombrantes (qui prennent beaucoup de place en mémoire) et que tu n'as pas besoin de les transmettre car tu sais qu'elles ne seront pas exploitées dans ton fichier B (qui récupère l'objet par l'intermédiaire de la variable de session).

C'était juste pour te montrer les différentes possibilités pour transmettre un objet en session :wink:

A part cela je crois qu'avant la version php 5.3 ? il fallait obligatoirement sérialiser l'objet et donc le dé sérialiser à réception. Si tu veux un code qui marche aussi sur d'anciennes versions de php tu dois faire :
dans le fichier A : $_SESSION['ma_class'] = serialize($student); à la place de $_SESSION['ma_class'] = $student;
et dans le fichier B : $a = unserialize($_SESSION['ma_class']); à la place de $a = $_SESSION['ma_class'];

ViPHP
xTG
ViPHP | 7331 Messages

09 nov. 2012, 09:50

Concernant l'erreur vérifies bien que tu as inclus la définition de ta class avant l'endroit où tu extrais ta variable de la session.
Il se peut même qu'il faille l'inclure avant le session_start() j'avoue ne plus me rappeler quand il réinstancie l'objet...

Eléphant du PHP | 417 Messages

09 nov. 2012, 11:58

Merci AB pour les informations qui pourrai m'être utile aussi
et merci xTG j'ai réussi graçe a ton dernière message :)

la solution c'est qu'il faut inclure la class et instancé l'objet avant le session_start()

mais c'est bizard parce que j'ai entendé dire qu'il faut toujours placer session_star() avant tous le code

ViPHP
ViPHP | 2577 Messages

09 nov. 2012, 15:25

Je pense qu'il faut surtout mettre le session_start() avant d'envoyer quoique ce soit au navigateur. Ce qui est devenu, il faut le mettre en premier.

ViPHP
xTG
ViPHP | 7331 Messages

09 nov. 2012, 18:29

Le session_start() doit remplir la tête de la réponse en fait, donc on dit toujours de le mettre avant tout autre chose car beaucoup de personnes ne comprennent pas qu'en faisant un echo ou en utilisant header() on inscrit des choses dans la réponse.

ViPHP
AB
ViPHP | 5818 Messages

11 nov. 2012, 21:30

Oui en réalité on ne doit pas "toujours mettre session_start() en début de code", mais en le mettant en début de code on peut éviter plus facilement des erreurs donc finalement on conseille de le mettre au début.
Dans mes exemples, j'ai fais exprès de ne pas mettre session_start() en début de code pour te montrer l'endroit minimum où il fallait le mettre, c'est à dire avant l'utilisation - enregistrement ou lecture - des variables de session. Mais évidemment ça marcherait tout aussi bien si je l'avais mis en début de code.