Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/05/2007, 13h14   #1
Membre à l'essai
 
Inscription : novembre 2005
Messages : 26
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 26
Points : 21
Points : 21
Par défaut [php objet] constructeur lancer à chaque changement de page

voilà, je compte utilisé les objets en php.
je me suis retrouver face à un problème qui est que le constructeur se lance à chaque changement de page et j'ai pas trouver le moyen de garder les objets.

en gros, j'ai un objet noyaux qui contient en ensemble d'autre objet pour la construction de la page.
le constructeur de mon noyau initialise différent objet qu'il contient, comme l'objet menu.
dans cet objet menu, le constructeur fait une requète sql pour générer le menu. et ces requètes ne doivent être faites que s'il y a un changements dans les autorisations.
genre un visiteur non logué n'as pas le même menu qu'un visiteur logué et qu'un admin logué.
donc en gros il ne devrait il y avoir de requète sql pour le menu qu'à l'ouverture du site et au log on de l'utilisateurs.

et dans le cas présent, il y a des requètes à chaque fios qu'on navigue sur le site.

si quelqu'un a une solutions à proposé, je suis preneur.

si je demande de l'aide ici, c'est que j'ai pas trouvé par mes propres recherches.
veuillez m'excuser si la réponse est présente ici, je ne l'ai pas trouvé
azraelster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2007, 13h34   #2
Membre expérimenté
 
Étudiant
Inscription : juillet 2004
Messages : 777
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2004
Messages : 777
Points : 527
Points : 527
Pour passer les objet d'une page a l'autre il te faut utiliser serialize et unserialize Et les variables de sessions

Par contre il te faudra definir dans ta classe les methodes __sleep et __wakeup.
Au moins __sleep en tous cas
cerede2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2007, 13h46   #3
Membre à l'essai
 
Inscription : novembre 2005
Messages : 26
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 26
Points : 21
Points : 21
pourquoi des sleep? je coupe les connection sql sql après chaque requète.

le serialize, pour les objets avec des collections d'objet, je ne le fais que sur celui qui les contients? ou je doit aussi le faire pour les objets contenu dans celui ci?


donc si j'ai bien suivit ça donnerais ça:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
<?php
session_start();
include ('fichierdelaclass.php');
 
if ($_SESSION['myobject']=='')
{
     $object=new nomclass();
}
else
{
     $object=unserialize($_SESSION['myobject']);
}
 
//utilisation de l'objet
 
$_SESSION['myobject']=serialize($object);
?>
ça serait quelque chose comme ça alors?
azraelster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2007, 13h58   #4
Membre expérimenté
 
Étudiant
Inscription : juillet 2004
Messages : 777
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2004
Messages : 777
Points : 527
Points : 527
Non pas des sleep! une methode __sleep, elle sert a specifier a serialize ce qu'il doit traiter comme variable
Sinon oui ton code est pas mal teste mais tu risque d'avoir une surprise
cerede2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2007, 14h06   #5
Membre à l'essai
 
Inscription : novembre 2005
Messages : 26
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 26
Points : 21
Points : 21
en fait la question avec __sleep , c'était est ce que c'est obligatoire s'il n'y a pas de connection ouverture. parce que normalement quand j'arrive au serialize à la fin du script, toutes les connections sql sont fermées.

oups, j'ai oublié des virgules dans mon code. pas bien. bon je vais test ça.
azraelster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2007, 14h09   #6
Membre expérimenté
 
Étudiant
Inscription : juillet 2004
Messages : 777
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2004
Messages : 777
Points : 527
Points : 527
Oui test, parce que moi j'avais pas mit de __sleep et je n'avais pas le données comme il fallait
cerede2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2007, 14h27   #7
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
  • Les méthodes magiques __sleep et __wakeup n'ont pas besoin d'être implémentées dans tous les cas (et heureusement).
  • Vous n'avez pas besoin de faire vous-même appel aux opérations de sérialisation et désérialisation pour une variable de session : elles sont déjà réalisées par PHP en coulisses (comment pensez-vous qu'il peut les conserver même pour une variable d'un type de base ?)
  • La déclaration de la classe doit impérativement être faite avant l'appel à session_start
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2007, 14h37   #8
Membre à l'essai
 
Inscription : novembre 2005
Messages : 26
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 26
Points : 21
Points : 21
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
<?php
session_start();
 
 
class nomclass{ 
    var $compteur;
	public function __construct() {
		$this->compteur=0;
    }
	public function increment()
	{
		$this->compteur++;
	}
	public function affiche()
	{
		echo $this->compteur;
	}
  } 
 
if ($_SESSION['myobject']=='')
{
     $object=new nomclass();
}
else
{
     $object=unserialize($_SESSION['myobject']);
}
 
$object->increment();
$object->affiche();
 
$_SESSION['myobject']=serialize($object);
?>

Avec ça, ça passe niquel. Par contre sans les serialize et unserialize, j'ai cette erreur :

Citation:
Fatal error: Call to a member function increment() on a non-object in E:\localhost\test\test.php on line 31
donc je laisse avec et le problème est résolu.

merci bien.
apparemment, ça gène pas d'avoir la déclaration de classe après l'ouverture de session, j'ai pas d'erreur avec ce code là.
azraelster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2007, 15h06   #9
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Message d'erreur que vous obtenez peut être parce que votre session au moment du test contenait déjà un objet sérialisé deux fois et désérialisé une seule fois (une chaîne n'étant pas un objet nomclass ...).

La forme suivante est quand même plus simple à utiliser :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
class nomclass{ 
    var $compteur;
	public function __construct() {
		$this->compteur=0;
    }
	public function increment()
	{
		$this->compteur++;
	}
	public function affiche()
	{
		echo $this->compteur;
	}
  } 
 
session_start();
 
if (!isset($_SESSION['myobject']))
{
     $object=new nomclass();
}
else
{
     $object=$_SESSION['myobject'];
}
 
$object->increment();
$object->affiche();
 
$_SESSION['myobject']=$object;
?>
Note : vous utilisez le mot-clé var pour déclarer votre attribut donc sa visibilité sera publique (assure la compatibilité avec PHP 4).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h55.


 
 
 
 
Partenaires

Hébergement Web