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 :
Le stockage de cet objet ne pose pas de pb.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Class Maison { public $type; public $name; public $value; }
Sa sérialisation donne
Maintenant si on met l'attribut type en private :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 O:6:"Maison":3:{s:4:"type";N;s:4:"name";N;s:5:"value";N;}
Le stockage de cet objet crash avec le message suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Class Maison { private $type; public $name; public $value; }
Sa sérialisation donne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Eric_Handler_Session (Maileva_Handler_Session::write) : SQLSTATE[HY000]: General error: 20018 Incorrect syntax near 'session_maison|O:6:"Maison":3:{s:12:"'. [20018] (severity 5) [(null)]
J'ai trouvé bizarre le nombre de caractères dans la dernière sérialisation, le comptage du nombre de caractères n'est pas correct pour le type. En effet, il en compte 12 (s:12), alors que MaisonType ne fait que 10 caractères.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 O:6:"Maison":3:{s:12:"Maisontype";N;s:4:"name";N;s:5:"value";N;}
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!
Partager