Récupération des objets stockés dans une session

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 999 fois - Téléchargée 18 fois

Contenu du snippet

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 / Exemple :


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

A voir également

Ajouter un commentaire

Commentaires

Messages postés
4
Date d'inscription
lundi 29 janvier 2007
Statut
Membre
Dernière intervention
13 octobre 2008

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
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
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).
Messages postés
331
Date d'inscription
mardi 12 novembre 2002
Statut
Membre
Dernière intervention
10 février 2009

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 ;).
Messages postés
1123
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1
De rien :)
Messages postés
4
Date d'inscription
lundi 29 janvier 2007
Statut
Membre
Dernière intervention
13 octobre 2008

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
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.