Lecture données d'une SESSION PHP différente de celle en cours

WRInaute passionné
Bonjour,

j'ai ré-écrit session_set_save_handler() (en PHP) pour gérer mes sessions PHP dans une BDD et non dans des fichiers, qui héberge entre autre, les paniers utilisateurs.
Jusque là tout fonctionne très bien.

Lorsque mon client se connecte (user/mot de passe) je souhaite , s'il existe, récupérer le panier qu"il a pu faire sur un autre ordinateur (en ayant été connécté bien entendu) pour le fusionner avec celui en cours.

Pour cela j'ai donc besoin de lire dans ma BDD les enregistrements correspondant au user_id en question (jusque là tout est OK) mais j'ai besoin d'interpréter le contenu (DATA) de la variable de session (qui en mode fichier corrspondant au contenu du fichier), qui ne se présente pas de la même façon qu'un tableau PHP "classique".

Ma question est donc, existe t-il un moyen d'interpéter (de décoder) la data d'une variable de session, afin de récupérer les
couples variables=valeur ?

A moins que vous ne me proposiez une autre techique ?

D'avance merci

F
 
WRInaute passionné
comme j'ai réécrit la fonction les données ne sont pas sérialisés apparemment pareceque la fonction unserialize me retourne FAUX
 
WRInaute passionné
voici un exemple très simple qui je le rappelle est issu d'une commande $_SESSION["pagination"]=40;
et stocker en BDD

pagination|i:40;


meme ca je n'arrive pas à le UNSERIALIZEr
 
WRInaute passionné
je viens de comprendre que je ne peux UNSERIALIZER que la partie i:40; merci de confirmer
donc comment éclater toutes les informations contenu dans la DATA d'une session (voir ci-dessous):
pour info les variables de session sont : pagination, httpreferer, key_prod_consult, prod_consult, prod_infos et enfin caddy_user celui qui m'intéresse le plus (sachant qu'il peut encore y avoir des variables après caddy_user et que caddy_user est un tableau)

pagination|i:40;httpreferer|s:17:"http://127.0.0.1/";key_prod_consult|i:1;prod_consult|a:2:{i:0;s:5:"26314";i:1;s:5:"26315";}prod_infos|a:2:{i:0;s:16:"Pouf Léon";i:1;s:16:"Mobile Funambule";}caddy_user|a:2:{i:26314;a:12:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{s:5:"84.00";i:3;}}}}}i:1;s:9:"Pouf Léon";i:2;s:5:"84.00";i:3;s:5:"26314";i:4;a:1:{i:0;s:4:"0.00";}i:5;s:2:"-1";i:6;s:4:"0.00";i:7;s:8:"Pourcent";i:8;i:0;i:9;s:4:"1051";i:10;s:3:"OUI";i:11;a:1:{i:0;s:0:"";}}i:26315;a:12:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{s:5:"62.50";i:1;}}}}}i:1;s:17:"Mobile Funambule";i:2;s:5:"62.50";i:3;s:5:"26315";i:4;a:1:{i:0;s:4:"0.00";}i:5;s:2:"-1";i:6;s:4:"0.00";i:7;s:8:"Pourcent";i:8;i:0;i:9;s:4:"1051";i:10;s:3:"OUI";i:11;a:1:{i:0;s:0:"";}}}
 
WRInaute accro
Ça ressemble fortement à des datas serialize() mais pas complètement.
Tu as regardé à la valeur de session.serialize_handler ?
 
WRInaute passionné
le format des données de session est :

[nom_var] suivi du caractère | suivi des données sérialisées puis un ; pour séparer de la prochaine variables

mais je ne peux pas EXPLODEr en utilisant le ; comme séparateur parcequ'il y en a dans les spéarateurs de valeurs quand il s'agit d'un tableau

je suis étonné de ne pas trouver une fonction pour lire cette donnée qui fait partie intégrante de PHP
 
WRInaute accro
les variables de session sont des données, par essence, volatiles. Quel intérêt de conserver de telles données dans une bdd et pas d'avoir une structure bdd plus classique et donc mieux adaptée à tes besoins ?
 
WRInaute accro
saluts92 a dit:
pagination|i:40;httpreferer|s:17:"http://127.0.0.1/";key_prod_consult|i:1;prod_consult|a:2:{i:0;s:5:"26314";i:1;s:5:"26315";}prod_infos|a:2:{i:0;s:16:"Pouf Léon";i:1;s:16:"Mobile Funambule";}caddy_user|a:2:{i:26314;a:12:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{s:5:"84.00";i:3;}}}}}i:1;s:9:"Pouf Léon";i:2;s:5:"84.00";i:3;s:5:"26314";i:4;a:1:{i:0;s:4:"0.00";}i:5;s:2:"-1";i:6;s:4:"0.00";i:7;s:8:"Pourcent";i:8;i:0;i:9;s:4:"1051";i:10;s:3:"OUI";i:11;a:1:{i:0;s:0:"";}}i:26315;a:12:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{i:0;a:1:{s:5:"62.50";i:1;}}}}}i:1;s:17:"Mobile Funambule";i:2;s:5:"62.50";i:3;s:5:"26315";i:4;a:1:{i:0;s:4:"0.00";}i:5;s:2:"-1";i:6;s:4:"0.00";i:7;s:8:"Pourcent";i:8;i:0;i:9;s:4:"1051";i:10;s:3:"OUI";i:11;a:1:{i:0;s:0:"";}}}

Il semble que ta structure soit incompatible avec unserialize() car on y trouve le nom des variables.
Il y a peut être moyen de les faire sauter pour que unserialize() puisse opérer tranquillement seulement il faudra que tu sache l'ordre des variables pour les retrouver.

Pour reprendre ton exemple :
Code:
	$pagination = 40;
	$httpreferer = "http://127.0.0.1/";
	$key_prod_consult = 1;
	$prod_consult = array("26314","26315");
	$prod_infos = array("Pouf Léon","Mobile Funambule");

La structure php qui se rapproche le plus de la data que tu as a traiter est la suivante :
Code:
	$variable = serialize($pagination).serialize($httpreferer).serialize($key_prod_consult).serialize($prod_consult).serialize($prod_infos);
	echo ($variable);
l'écho renvoie ceci :
i:40;s:17:"http://127.0.0.1/";i:1;a:2:{i:0;s:5:"26314";i:1;s:5:"26315";}a:2:{i:0;s:16:"Pouf Léon";i:1;s:16:"Mobile Funambule";}
si maintenant on prend la partie correspondante de ta variable (donc les 5 première variables qui sont respectivement un INT, puis un STRING, un INT et deux ARRAY) (j'ai pas tout mis pour pas me prendre la tête)
on peut donc poser :
Code:
	$chaine = 'pagination|i:40;httpreferer|s:17:"http://127.0.0.1/";key_prod_consult|i:1;prod_consult|a:2:{i:0;s:5:"26314";i:1;s:5:"26315";}prod_infos|a:2:{i:0;s:16:"Pouf Léon";i:1;s:16:"Mobile Funambule";}';
Il conviens donc de traiter les différents nom de variable pour rendre la chaine "compatible" avec une dé-sérialisation.
Code:
	preg_match_all('#[a-z_]{1,20}\|#si',$chaine,$matchs, PREG_SET_ORDER);
	$i=0;
	$newChaine = $chaine;
	foreach($matchs as $mVariableSession){
		$newChaine = str_replace($mVariableSession[0],'i:'.$i.';',$newChaine);
		$i++;
	}
	$newChaine = 'a:'.$i.':{'.$newChaine.'}';
Si on fait un echo de $newChaine à la sortie ça donne ça :
a:5:{i:0;i:40;i:1;s:17:"http://127.0.0.1/";i:2;i:1;i:3;a:2:{i:0;s:5:"26314";i:1;s:5:"26315";}i:4;a:2:{i:0;s:16:"Pouf Léon";i:1;s:16:"Mobile Funambule";}}
Si maintenant pour finir je unserialize() cette nouvelle chaine :
Code:
	$newData = unserialize($newChaine);
	foreach($newData as $data){
		print_r($data);
	}
Je retombe sur les variables d'origine soit :
40
http://127.0.0.1/
1
Array
(
[0] => 26314
[1] => 26315
)

Array
(
[0] => Pouf Léon
[1] => Mobile Funambule
)
Qui ne sont pas encore des variables nommées mais comme tu connais ta structure ça ne pose pas de souci :wink:
 
WRInaute accro
Voilà, sans plus d'infos, zeb a du faire du reverse engineering pour deviner ce que t'as sous la main :mrgreen:
 
WRInaute accro
d'où ma question du dessus : pourquoi vouloir absolument passer par des variables de session sauvegardées en bdd. Une structure objet serait plus adaptée, non ?
 
WRInaute accro
+1 surtout qu'en gardant un système de session classique rien n’empêche de mettre toutes les variables de session utiles a conserver dans une array qu'on sérialise ensuite pour l'injecter dans un blob du sgdb. Au login il suffit de lire le blob, de dé-sérialiser et d'initialiser les variables de session pour les retrouver.
 
Discussions similaires
Haut