OVH Cloud OVH Cloud

Session serialisation (php) et tableau associatif

7 réponses
Avatar
yvon.thoravallist
J'ai suivi le tutorial "Introduction to PHP Sessions" trouvé sur :
<http://www.phpfreaks.com/>
ainsi que la "FAQ PHP de PHPIndex V2.1.1".

J'ai réalisé trois types d'essais :

1 - vérifier que je sais passer une variable par "session" entre
plusieurs pages, c'est OK ;
2 - vérifier que je sais sérialiser dé-sérialiser un tableau, c'est OK ;
3 - essayer d'utiliser les deux méthodes précédentes afin de passer un
tableau associatif entre page (l'essai porte sur un cas simple : le
tableau représente la date du jour : jour, mois, annee, heure minute) .

C'est l'essai - 3 - qui pose problème
- le tableau est sérialisé correctement, il apparaît bien dans la liste
des variables de session (quand je fais un "print_r ($_SESSION );") MAIS
il est vide !!!

C'est là qu'est mon pb où vous pourriez m'apporter qq lumières.
Mon set-up : MacOS X.2.6 PHP Version 3.3.2 (compilée et packagée par
Marc Liyanage).

Comme je suis curieux, je suis allé jeter run oeil sans /private/tmp là,
j'ai bien un fichier :

sess_3d4f0a699b6308459bdeb91f98e9ed26

correspondant à l'ID de ma session MAIS, son contenu est SEULEMENT :

dateDuJourTabSer|N; ????

donc il y a bien le nom du tableau sérialisé mais pas son contenu...

dans mon /usr/local/php/php.ini j'ai bien :

session.save_handler files (confirmé par manip ci-dessus)
session.serialize_handler php (ce que je souhaite)


bizarrement, j'ai l'impression que, depuis que j'ai mis ce php.ini (il
n'y en a pas par défaut), le temps de réponse de php est nettement plus
lent...

je suis sûr que c'est ce fichier d'init (ie. /usr/local/php/php.ini) qui
est lu pour deux raisons :

1 - ce'st ce que me dit mon phpinfo()
2 - j'ai changé le mbstring.internal_encoding de EUC-JP (valeur donnée
dans le php.ini-recommanded ???) pour UTF-8 et depuis les accents
passent sans pb...

Les deux scripts :

--Celui qui enregistre le tableau sérialisé--------------------------
<html><body>
<?php
session_start();
header("Cache-control: private");// IE 6 Fix.
session_register('dateDuJourTabSer');
$dateDuJourTab = array( 'jour' => date("d"), 'mois' => date("m"),
'annee' => date("y"), 'heure' => date("H"), 'minute' => date("i"));
$dateDuJourTabSer = serialize($dateDuJourTab);
?>
Date du jour :<br/><? foreach ($dateDuJourTab as $c => $v) {echo "$c =>
$v<br/>";} ?><br/>
<a href="essai2.php">V&eacute;rifier si &ccedil;a marche !</a><br/>
<a href="session-vars.php">Variables de session</a><br/>
</body></html>
---------------------------------------------------------------------
--Celui qui lit le tableau sérialisé---------------------------------
<html><body>
<?php
session_start();
header("Cache-control: private");// IE 6 Fix.
session_register('dateDuJourTabSer');
$dateDuJourTabNew = unserialize($dateDuJourTabSer);
?>
Date du jour :<br/><? foreach ($dateDuJourTabNew as $c => $v) {echo "$c
=> $v<br/>";} ?><br/>
<a href="essai1.php">&lt;&lt;&nbsp;&nbsp;Retour</a><br/>
<a href="session-vars.php">Variables de session</a><br/>
</body></html>
---------------------------------------------------------------------

--
Yvon

7 réponses

Avatar
Guillaume Bouchard

2 - vérifier que je sais sérialiser dé-sérialiser un tableau, c'est OK ;
3 - essayer d'utiliser les deux méthodes précédentes afin de passer un
tableau associatif entre page (l'essai porte sur un cas simple : le
tableau représente la date du jour : jour, mois, annee, heure minute) .


Tu va me faire douter, mais PHP gere tout seule la serialisation des
tableaux pour les sessions, pas besoin de t'en occupé.

session_register('dateDuJourTabSer');


Depuis php 4.1.x tu peut utilisé $_SESSION pour te simplifier la vie.

$_SESSION['dateDuJourTavSer'] = ...;

Elle sera automatiquement sauvegardé et tu la recuperera sur la page
d'apres aussi simplmement que

echo $_SESSION['dateDuJourTavSer'];

par exemple.

--
Guillaume.

Avatar
yvon.thoravallist
Guillaume Bouchard wrote:

Tu va me faire douter, mais PHP gere tout seule la serialisation des
tableaux pour les sessions, pas besoin de t'en occupé.

session_register('dateDuJourTabSer');


Depuis php 4.1.x tu peut utilisé $_SESSION pour te simplifier la vie.

$_SESSION['dateDuJourTavSer'] = ...;

Elle sera automatiquement sauvegardé et tu la recuperera sur la page
d'apres aussi simplmement que

echo $_SESSION['dateDuJourTavSer'];


non, non, tu as raison, pas besoin de sérialiser un tableau , qq'1 me
l'a dit sur fr.comp.sys.mac.programmation et j'ai vérifié c'est OK.

Ceci dit "c'est dans la FAQ" :
FAQ PHP de PHPIndex V2.1.1

7.11 Est-il possible de passer un tableau en argument d'une script à
un autre
Ce n'est pas possible directement. Par contre, il est possible de
passer une chaine.



suivent deux possibilités : implode/explode et serialize/unserialize...
mais peut-être ais-je mal compris la FAQ ???

Question, j'ai eu ce pb de Session suite à une étourderie (oubli de
$_SESSION['dateDuJourTavSer'] = ...;) peut-on automatiser cela je veux
dire, par exemple à l'enregistrement, avoir une fonction :
myRegister($maVar); qui fait :
session_register('maVar');
$_SESSION['maVar']=$maVar;
en passant seulement $maVar en argument ???
cela suppose qu'en php (comme en perl) il est possible de récupérer le
nom d'une variable ?


--
Yvon Thoraval
http://OrganisationPolitique.com hébergé par :
http://ouvaton.coop/


Avatar
Guillaume Bouchard
7.11 Est-il possible de passer un tableau en argument d'une script à
un autre
Ce n'est pas possible directement. Par contre, il est possible de
passer une chaine.



suivent deux possibilités : implode/explode et serialize/unserialize...
mais peut-être ais-je mal compris la FAQ ???


Mais non, tu met juste ton tabelau en session, et il se serialize tout
seul, comme un grand.

Question, j'ai eu ce pb de Session suite à une étourderie (oubli de
$_SESSION['dateDuJourTavSer'] = ...;) peut-on automatiser cela je veux
dire, par exemple à l'enregistrement, avoir une fonction :
myRegister($maVar); qui fait :
session_register('maVar');
$_SESSION['maVar']=$maVar;


Mais $_SESSION['maVar'] le fait tres bien seul... Avec les tableau
$_SESSION, tu oublie les session_unset, et les session_register.

--
Guillaume.



Avatar
yvon.thoravallist
Guillaume Bouchard wrote:
Ce n'est pas possible directement. Par contre, il est possible de
passer une chaine.



Mais non, tu met juste ton tabelau en session, et il se serialize tout
seul, comme un grand.


je ne faisais que citer la FAQ... une erreur ???
(quick)


Mais $_SESSION['maVar'] le fait tres bien seul... Avec les tableau
$_SESSION, tu oublie les session_unset, et les session_register.


ah on n'est plus obligé de faire :
session_register(maVar);
puis :
$_SESSION {maVar} = $ maVar;
seul :
$_SESSION {maVar} = $ maVar; suffit ???
--
Yvon Thoraval
http://OrganisationPolitique.com hébergé par :
http://ouvaton.coop/



Avatar
Guillaume Bouchard

je ne faisais que citer la FAQ... une erreur ???


Peut etre, je n'ai pas trouvé ca dans la faq en question... Mais je n'ai
pas approfondi ma recherche.

ah on n'est plus obligé de faire :
session_register(maVar);


Et ben non :) Vive php 4.1 :)

puis :
$_SESSION {maVar} = $ maVar;
seul :
$_SESSION {maVar} = $ maVar; suffit ???


Apres plusieurs tests, j'ai remarqué que session_register ne fonctione
pas avec register_globals a Off, donc il faut utilisé SEULEMENT
$_SESSION et le probleme est reglé.

--
Guillaume.

Avatar
yvon.thoravallist
Guillaume Bouchard wrote:


Apres plusieurs tests, j'ai remarqué que session_register ne fonctione
pas avec register_globals a Off, donc il faut utilisé SEULEMENT
$_SESSION et le probleme est reglé.


bizarre ça, chez moi ca marche avec php 4.3.2 et reg glob off...

tiens au fait, depuis que je suis passé en 4.3.2 je n'arrive plus à
avoir un seul message d'erreur de php même quand je fais :

error_reporting (E_ALL);

ds le scrip^t lui-même...
--
Yvon Thoraval
http://OrganisationPolitique.com hébergé par :
http://ouvaton.coop/

Avatar
Guillaume Bouchard

tiens au fait, depuis que je suis passé en 4.3.2 je n'arrive plus à
avoir un seul message d'erreur de php même quand je fais :

error_reporting (E_ALL);


display_errors est sur off par default dans le php.ini.

--
Guillaume.