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

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par saluts92, 14 Février 2013.

  1. saluts92
    saluts92 WRInaute impliqué
    Inscrit:
    12 Avril 2006
    Messages:
    828
    J'aime reçus:
    32
    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
     
  2. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    9 077
    J'aime reçus:
    295
  3. saluts92
    saluts92 WRInaute impliqué
    Inscrit:
    12 Avril 2006
    Messages:
    828
    J'aime reçus:
    32
    comme j'ai réécrit la fonction les données ne sont pas sérialisés apparemment pareceque la fonction unserialize me retourne FAUX
     
  4. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    9 077
    J'aime reçus:
    295
    Si tu nous montrais à quoi ça ressemble ces datas ?
     
  5. saluts92
    saluts92 WRInaute impliqué
    Inscrit:
    12 Avril 2006
    Messages:
    828
    J'aime reçus:
    32
    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
     
  6. saluts92
    saluts92 WRInaute impliqué
    Inscrit:
    12 Avril 2006
    Messages:
    828
    J'aime reçus:
    32
    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:"";}}}
     
  7. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    9 077
    J'aime reçus:
    295
    Ça ressemble fortement à des datas serialize() mais pas complètement.
    Tu as regardé à la valeur de session.serialize_handler ?
     
  8. saluts92
    saluts92 WRInaute impliqué
    Inscrit:
    12 Avril 2006
    Messages:
    828
    J'aime reçus:
    32
    la valeur de session.serialize_handler est php
     
  9. saluts92
    saluts92 WRInaute impliqué
    Inscrit:
    12 Avril 2006
    Messages:
    828
    J'aime reçus:
    32
    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
     
  10. Leonick
    Leonick WRInaute accro
    Inscrit:
    8 Août 2004
    Messages:
    19 413
    J'aime reçus:
    0
    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 ?
     
  11. saluts92
    saluts92 WRInaute impliqué
    Inscrit:
    12 Avril 2006
    Messages:
    828
    J'aime reçus:
    32
    ce n'était pas ma question
     
  12. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    9 077
    J'aime reçus:
    295
    Tu peux nous montrer ta réécriture de session_set_save_handler() ?
     
  13. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 190
    J'aime reçus:
    1
    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 :
    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 :
    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 :
    Qui ne sont pas encore des variables nommées mais comme tu connais ta structure ça ne pose pas de souci :wink:
     
  14. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    9 077
    J'aime reçus:
    295
    Voilà, sans plus d'infos, zeb a du faire du reverse engineering pour deviner ce que t'as sous la main :mrgreen:
     
  15. Leonick
    Leonick WRInaute accro
    Inscrit:
    8 Août 2004
    Messages:
    19 413
    J'aime reçus:
    0
    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 ?
     
  16. zeb
    zeb WRInaute accro
    Inscrit:
    5 Décembre 2004
    Messages:
    12 190
    J'aime reçus:
    1
    +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.
     
Chargement...
Similar Threads - Lecture données SESSION Forum Date
Balise Audio et lectures successives sur iOS Développement d'un site Web ou d'une appli mobile 14 Avril 2020
Lecture Header avec CURL et outil WRI Développement d'un site Web ou d'une appli mobile 25 Janvier 2020
Outils de lecture de positionnement Référencement Google 20 Janvier 2020
Automatiser l’écriture et la lecture sur les Réseaux Sociaux Développement d'un site Web ou d'une appli mobile 19 Janvier 2020
Serveur adapté pour lecture vidéo sur pic de visiteurs Demandes d'avis et de conseils sur vos sites 2 Décembre 2019
Lecture entete HTTP avec CURL et 403 Développement d'un site Web ou d'une appli mobile 31 Octobre 2019
Blog - avis de lecture Demandes d'avis et de conseils sur vos sites 5 Septembre 2018
lecture mkv sous chrome Développement d'un site Web ou d'une appli mobile 4 Septembre 2016
Lecture aléatoire des vidéos de mon site avec IE Développement d'un site Web ou d'une appli mobile 23 Janvier 2015
Interdire la lecture d'un fichier "texte image"aux Robot txt Débuter en référencement 1 Mars 2013