Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/12/2007, 14h41   #1
Membre habitué
 
Inscription : juin 2004
Messages : 296
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : juin 2004
Messages : 296
Points : 147
Points : 147
Par défaut stockage objet session avec attribut private : KO

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 :
1
2
3
4
5
6
7
8
9
 
Class Maison	{
 
	public $type;
 
	public $name;
 
	public $value;
}
Le stockage de cet objet ne pose pas de pb.
Sa sérialisation donne
Code :
1
2
 
O:6:"Maison":3:{s:4:"type";N;s:4:"name";N;s:5:"value";N;}
Maintenant si on met l'attribut type en private :
Code :
1
2
3
4
5
6
7
8
9
 
Class Maison	{
 
	private $type;
 
	public $name;
 
	public $value;
}
Le stockage de cet objet crash avec le message suivant :
Code :
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)]
Sa sérialisation donne
Code :
1
2
 
O:6:"Maison":3:{s:12:"Maisontype";N;s:4:"name";N;s:5:"value";N;}
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.

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!
__________________
- Blog
- stages-aikido.fr
kaboume est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2007, 06h56   #2
Nouveau Membre du Club
 
Développeur Web
Inscription : avril 2006
Messages : 37
Détails du profil
Informations personnelles :
Âge : 24

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2006
Messages : 37
Points : 37
Points : 37
utiliser __sleep() sur ta classe ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Class Maison {
 
  private $type, $name, $value;
 
  public function __construct($type, $name; $value) {
 
    $this->type = $type;
    $this->name = $name;
    $this->value = $value;
 
  }
 
  public function __sleep() {
 
    return array('type', 'name', 'value');
 
  }
 
}
Méthylbro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2007, 08h34   #3
Membre habitué
 
Inscription : juin 2004
Messages : 296
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : juin 2004
Messages : 296
Points : 147
Points : 147
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.
__________________
- Blog
- stages-aikido.fr
kaboume est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2007, 11h20   #4
Nouveau Membre du Club
 
Développeur Web
Inscription : avril 2006
Messages : 37
Détails du profil
Informations personnelles :
Âge : 24

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2006
Messages : 37
Points : 37
Points : 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 ?
Méthylbro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2007, 11h32   #5
Membre habitué
 
Inscription : juin 2004
Messages : 296
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : juin 2004
Messages : 296
Points : 147
Points : 147
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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
define('DELIMITEUR_MEMBRES_PRIVES','privateMembre');
 
 function write($id, $data)
 {
    $data = str_replace(chr(0),DELIMITEUR_MEMBRES_PRIVES,$data);
    .... écriture en base...
 }
 
 function read($id)
 {   
   .... lecture en base ...
   $result = str_replace(self::DELIMITEUR_MEMBRES_PRIVES,chr(0),$result);
   return $result;
 }
__________________
- Blog
- stages-aikido.fr
kaboume est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h21.


 
 
 
 
Partenaires

Hébergement Web