|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||||
|
Membre habitué
![]() Inscription : juin 2004 Messages : 296 ![]() |
Bonjour,
Je mets ce post dans la rubrique SESSION mais je pense aussi que j'aurai pu le mettre dans Accès Database. Je vous explique : J'utilise une base SQL Server pour stocker mes variables de session. J'ai donc redéfini le set_session_handler avec mes propres fonctions d'accès au serveur SQL (2005 pour info). Tout se passe correctement : stockage de chaines, d'entiers, d'objets.... à l'exception des objets avec des attributs private!!!!! Et oui, c'est fou! Si mon objet a le malheur d'avoir un attribut private, le stockage dans la database crash!! J'ai donc regardé de plus près en affichant l'objet sérialisé avec qu'il ne soit inséré en base : Voici mon objet tout bête : Code :
Sa sérialisation donne Code :
Code :
Code :
Code :
Je me suis donc amusé à supprimer les éventuels caractères spéciaux que je ne voyais pas à l'oeil nu et je me suis rendu compte qu'il avait ajouté avant et après Maison le caractère ASCII Nul (0*00 ou \0 en php); Le probème est que je peux pas faire un str_replace de ce caractère car lors de la désirialisation, il va m'negueuler en me disant que ce n'est pas le bon nombre de caractères (12 attendu au lieu de 10). Donc 2 solutions : - je passe tous mes attributs en public ce qui est pas top en termes d'encapsulation objet - ou avez-vous une solution ? Merci d'avance pour ceux qui se pencheront sur ce problème non trivial! |
||||||||||
|
|
00
|
|
|
#2 | ||
|
Nouveau Membre du Club
![]() Développeur Web Inscription : avril 2006 Messages : 37 ![]() |
utiliser __sleep() sur ta classe ?
Code :
|
||
|
|
00
|
|
|
#3 |
|
Membre habitué
![]() Inscription : juin 2004 Messages : 296 ![]() |
Hello Méthylbro,
Sympa de me répondre. J'ai testé ta solution mais ça ne marche pas mieux. D'après ce que j'ai pu comprendre dans la doc, __sleep précise les membres de la classe qui doivent être sérialisés et non la manière dont ils doivent l'être. Je crois que c'est mort car j'ai vu dans la doc PHP que mon problème était connu : http://fr.php.net/serialize#60834 J'ai déjà commencé à mettre tous membres de mes classes en public. Merci encore. |
|
|
00
|
|
|
#4 |
|
Nouveau Membre du Club
![]() Développeur Web Inscription : avril 2006 Messages : 37 ![]() |
hum ...
et tu as pensé à te créer toi même une méthode serialize() retournant une chaine de caractères comme le ferais la fonction classique ? |
|
|
00
|
|
|
#5 | ||
|
Membre habitué
![]() Inscription : juin 2004 Messages : 296 ![]() |
Hello,
Ben, je ne sais pas si on peut redéfinir en PHP la foncrion serialize(). J'ai trouvé une autre solution moins crade que celle de passer les membres en public : Il faut modifier les functions write et read du set_session_handler afin de remplacer les \0 par une chaine quelconque lors de l'écrtiture en base et de faire l'inverse pour la lecture. Ainsi les fonctions read et write du set_session_handler doivent contenir : Code :
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com