begin process at 2012 05 27 18:15:53
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > RÉCUPÉRATION DES OBJETS STOCKÉS DANS UNE SESSION

RÉCUPÉRATION DES OBJETS STOCKÉS DANS UNE SESSION


 Information sur la source

Note :
Aucune note
Catégorie :Class et Objet ( POO ) Classé sous :POO, session, onglet, unserialize, objet Niveau :Initié Date de création :21/01/2008 Date de mise à jour :21/01/2008 16:47:18 Vu :7 837

Auteur : jsgorre

Ecrire un message privé
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

 Description

Voici une fonction que j'ai écrit récemment et qui me permet de récupérer rapidement tous mes objets stockés dans ma session.
Au chargement de mon application web, je crée mes objets et les stocke dans ma session.
J'utilise ensuite cette fonction pour récupérer tous mes objets dans toutes mes autres pages ou sections générées par l'Ajax. Je déserialise mes objets et j'utilise eventuellement la méthode __wakeup dans certaines classes pour réactiver par exemple une connexion à une base de données ou réinitialiser certaines variables.
Elle fonctionne bien, et elle est plutôt pratique, mais j'aimerai avoir votre avis et vos commentaires, car récemment je me suis retrouvé dans un cas où j'avais 2 applications web différentes, dans un même navigateur (même fenêtre mais 2 onglets..), et ces 2 applications web utilisant la fameuse fonction, les objets ont été récupérés dans ces 2 applications, d'où des erreurs de classes inexistantes...
J'ai été surpris de constater que les applications se partageait la même session.. Est-ce un comportement normal, et dans ce cas ma fonction apporterai un souci de sécurité.
Merci pour vos commentaires!


Source

  • <?php
  • /*
  • * Démarrage de la session et récupération de tous les objets créés et stockés dans la session
  • * - Récupère les noms des objets créés
  • * - Réintègre les fichiers de classes correspondants
  • * - Désérialise les objets de la session
  • */
  • function getObjects(){
  • $classes = $objects = array();
  • $sessionvars = array_keys($_SESSION);
  • foreach ($sessionvars as $name){
  • if (substr($_SESSION[$name],0,2)=="O:"){ // Si c'est un objet
  • $objectname = $name;
  • for ($i=0;$i<strlen($_SESSION[$name]);$i++){
  • if (ereg('O:[0-9]+:"[a-zA-Z._-]+"',substr($_SESSION[$name],$i),$temp)){ //recherche dans l'objet serialisé du pattern O:(entier):"nom classe"
  • $temp = explode(":",$temp[0]); //on transforme la chaîne en tableau
  • $classname = str_replace(chr(34),"",$temp[2]); //suppression des guillements dans le nom de classe
  • }
  • if (!in_array($classname,$classes)) array_push($classes,$classname); //Si le nom de classe n'existe pas déjà on le stocke dans $classes
  • }
  • if (!in_array($objectname,$objects)) array_push($objects,$objectname);
  • }
  • }
  • foreach ($classes as $classname) include ("class.$classname.inc.php");
  • foreach ($objects as $objectname){
  • global ${$objectname};
  • ${$objectname} = unserialize($_SESSION[$objectname]);
  • }
  • }
  • ?>
<?php 
        /*
	 * Démarrage de la session et récupération de tous les objets créés et stockés dans la session
	 * - Récupère les noms des objets créés
	 * - Réintègre les fichiers de classes correspondants
	 * - Désérialise les objets de la session
	 */
	function getObjects(){
		$classes = $objects = array();
		$sessionvars = array_keys($_SESSION);
		foreach ($sessionvars as $name){
			if (substr($_SESSION[$name],0,2)=="O:"){  // Si c'est un objet
				$objectname = $name;
				for ($i=0;$i<strlen($_SESSION[$name]);$i++){
					if (ereg('O:[0-9]+:"[a-zA-Z._-]+"',substr($_SESSION[$name],$i),$temp)){ 	//recherche dans l'objet serialisé du pattern O:(entier):"nom classe"
						$temp = explode(":",$temp[0]);				//on transforme la chaîne en tableau
						$classname = str_replace(chr(34),"",$temp[2]);  //suppression des guillements dans le nom de classe
					}
					if (!in_array($classname,$classes)) array_push($classes,$classname); //Si le nom de classe n'existe pas déjà on le stocke dans $classes
				}
				if (!in_array($objectname,$objects)) array_push($objects,$objectname);
			}
		}
		foreach ($classes as $classname) include ("class.$classname.inc.php");
		foreach ($objects as $objectname){
			global ${$objectname};
			${$objectname} = unserialize($_SESSION[$objectname]);
		}
	}

?>



 Historique

21 janvier 2008 16:47:18 :
Code non pris en compte dans l'enregistrement de mon message

 Sources de la même categorie

Source avec Zip GÉNÉRATION AUTOMATIQUE DE FICHIER .CLASS.PHP EN FONCTION D'U... par ig3
CLASSE D'OBJET DE CRYPTAGE ET DÉCRYPTAGE DE CHAINES DE CARAC... par 8Tnerolf8
Source avec Zip MY.DEVIANTART API par inwebo
CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter

 Sources en rapport avec celle ci

Source avec Zip MY.REMOTE : SERVEUR D'OBJETS PHP5 par inwebo
Source avec Zip PHP5 MY EXPLORER : AFFICHE L'ARBORESCENCE DE DOSSIERS par ranouf
Source avec Zip HASHMAP EN PHP AVEC LA SPL par dorian91
[PHP5]CLASSE DE SESSION par hametsu21
Source avec Zip CLASSE NEWS par mrjulien

Commentaires et avis

Commentaire de codefalse le 21/01/2008 16:59:04 administrateur CS

Pour ton probleme de session, tu peux utiliser la fonction session_set_save_handler, elle va te permettre de spécifier les méthodes pour tes sessions, du coup tu peux te baser sur une bdd, et tu peux spécifier comme moyen d'identification, la "base url", comme ca pour deux sites différents, tu ne mélange plus les sessions.

voir : http://fr3.php.net/session_set_save_handler

Ce qui est décevant pour ton code, c'est que tu propose la méthode getObject, mais pas saveObject (ou setObject ?), du coup on peux récuperer des objets d'une session précédente, mais on peux pas sauvegarder :p

Commentaire de TheSin le 22/01/2008 21:31:43

Jdis ptetre une connerie, mais as-tu utilisé un nom de session différent par application Web ?
session_name ( 'NomSession' ) ;
C'est générallement quand on ne l'utilise pas qu'on se retrouve avec des sessions partagées.

Commentaire de jsgorre le 22/01/2008 22:42:51

Non tu ne dis pas de connerie TheSin... en fait je m'en suis rendu compte moi même en effectuant quelques tests en affichant les infos de la session. J'ai donc défini le nom de session dans mon appli. Par contre j'étais surpris qu'un onglet ne gère pas une instance différente du navigateur et donc une session différente..

Merci Codefalse pour ton commentaire, en fait j'ai regardé de plus prés la fonction PHP session_set_save_handler et elle est effectivement intéressante, il faut que je regarde comment intégrer ma fonction getObjects et comme tu dis, créer l'équivalent pour les sauver.
Merci

Commentaire de codefalse le 22/01/2008 23:24:48 administrateur CS

De rien :)

Commentaire de TheSin le 23/01/2008 10:53:09

L'onglet ne le gère pas tout comme une nouvelle fenêtre car il garde le même cookie. C'est pas plus mal, sinon on pourrait pas gérer des popups pour des demandes d'accès (logon) ou d'autres choses encore que je n'ai pas imaginé (bon, je ne suis pas un fervant utilisateur de popup non plus, je vous assure).
Enfin voilà, juste pour dire que mieux vaut ça que rien, sinon d'ailleur, s'il faut se reconnecter à chaque onglet ouvert sur un site pour voir un contenu privé et protégé, on est dans le c*** ^^.

Par contre, je ne savais pas si t'avais essayé le nom de session avant le post de ton code ou apres, en espérant que ton problème soit résolu et que la méthode de CodeFalse t'aide encore mieux ;).

Commentaire de malalam le 23/01/2008 23:31:25 administrateur CS

Hello,
quelques remarques :
- tu mets une fonction dans ton for(). Fais ainsi, ton strlen() est recalculé à chaque itération ce qui ne sert à rien.
- tu fais une boucle pour chercher tes objets, que tu fous dans un tableau sur lequel tu boucles à nouveau pour les désérialiser. Pourquoi ne pas tout faire dans ta 1ère boucle ?
- plutôt que de faire tous ces parsing sur tes chaînes, il me semble plus efficace de normaliser tes sessions :
$_SESSION['OBJECTS'] => array('CLASSNAME' => 'nom_de_la_classe', 'SERIALIZED_OBJECT' => 'objet_linéarisé').
En ajoutant une dimension histoire de pouvoir avoir plusieurs instances d'une même classe (impossible dans mon exemple hein, il faut ajouter une dimension au tableau).

Commentaire de jsgorre le 28/01/2008 10:57:23

Merci MALALAM pour toutes ces remarques constructives, effectivement j'ai quelques retouches à faire.
J'en tiens compte et je reposterai le code modifié.
Merci encore

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Class POO retourné le nom de l'objet [ par MeTh ] Bonjour,Comment retourné le nom de l'objet déclaré?exemple :$monobjet = new GridR();comment recuperé $monobjet dans ma class?Merci Sécurité par adresse IP et Sécurité par objet Session [ par dadystar ] Bonjour,j'aimerais savoir la diff&#233;rence entre une s&#233;curit&#233; par adresse IP et celle par objet session.MerciCe que je sais c'est que je n Récupération d'une variable objet enregistrée en session [ par ouamtax ] Salut, je voudrais savoir comment récupérer un objet que j'ai enregistré dans une sesssion.Si quelqu'un aurais ch'ti renseignement siouplait!!!!! pb Objet $_SESSION et boucle while [ par lenuldeservice ] salut, comme le sujet l'indique, j'ai un soucis avec l'objet $_SESSION, j'ai une boucle while dans laquelle je rt&#233;cup&#232;re des infos d'une ba session avec objet [ par Rhazou ] Bonjour,Je me tourne vers vous car je suis face a un pb que je n'arrive pas a résoudre.Je reg un objet dans une session, par d'erreur. si j'essay de l Mettre un objet dans une variable de session [ par adakick ] Bonjour, je voudrais enregistrer un objet dans une variable de session :$panier = new Panier();if(!isset($_SESSION['panier']))    $_SESSION['panier'] Probleme POO [ par cedriclomb ] Bonjour,Aujourd'hui au programme casse tete chinois ! :DVoila j'ai une classe B qui est une extends de Aun objet $b=new B;et ensuite $b-&gt;loadModule erreur lors de la transmission d'un objet par variable session [ par fabienenvac ] Bonjour,lorsque je transmet un objet grace au session (apres l'avoir serializer ) certaine propriete semble changer et je perds le connexion a ma bdd "Multi-session", possible ? [ par ptah69 ] Bonjour a tous.Je crois que c'est la premiere fois que je pose une question sur ce forum, bien que je le lise assez frequemment.Je suis actuellement c orienté objet en php [ par am1ra2 ] bonjour,    j'ai des connaissances sur la POO en php mais je ne connais pas comment implimenter la POO dans mes applications.


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,874 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales