Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
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 13/10/2007, 16h27   #1
Invité de passage
 
Inscription : juillet 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 7
Points : 0
Points : 0
Par défaut Désérialiser un objet provenant d'une table MySQL

Bonjour à tous,

Je suis vraiment bloqué sur un pb de sérialistation/désérialisation que j'utilise avec des sessions.

1. Lorsque l'utilisateur se loggue, je crée un objet "user" (contenant ses infos pesonnelles).
2. Je sérialise cet objet
3. Je l'enregistre dans un champ de type "blob" de ma table MySQL avec l'id de la session.
4. A l'ouverture d'une seconde page php, je récupére l'id de la session
5. Je cherche l'enregistrement de ma session poru trouver mon objet sérialisé.
6. Je voudrais désérialiser le contenu récupéré:

Pour cela, je fais:
Code :
1
2
3
4
5
6
7
8
9
<?php
$db = new PDO('mysql:host=localhost;dbname=sessions', 'root', '', array(PDO::ATTR_PERSISTENT => true)); 
      $getData = $db->prepare("SELECT dataobject FROM sessions AS Session WHERE Session.id = ?");
      $getData->bindParam(1, session_id());
      $getData->execute();    
      $allData = $getData->fetch(PDO::FETCH_ASSOC);
      $donnees = $allData['dataobject'];
      $client = unserialize($donnees);
?>
Je récupere bien dans $donnees je chaine de caractères, mais quand je la passe dans dla fonction unserialize(), je n'ai plus rien, comme si il n'arrivait pas à la décoder.

Pouvez-vous m'aider?
Si vous avez besoin de plus de détails pour m'aider, n'hésitez pas à me demander.

Merci !
kiki650 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2007, 19h46   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Que donne var_dump avant/après (respectivement de $donnees et $client) ?
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2007, 20h34   #3
Invité de passage
 
Inscription : juillet 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 7
Points : 0
Points : 0
Citation:
Envoyé par julp Voir le message
Que donne var_dump avant/après (respectivement de $donnees et $client) ?
Alors avant, j'ai NULL pour les 2 variables

Apres, pour
$donnees : j'ai l'objet sérialisé de cette forme : string(101) user|s:88:"O:4:"User":3:{s:3:"nom";s:2:"da";s:12:"�User�prenom";s:2:"da";s:9:"�User�tel";s:2:"23";}";"
et
$client : bool(false)

Tout est normal non? Mis à par bien sur qu'il n'y a rien dans $client apres.

Tu aurais une idée?
merci pour ton aide
kiki650 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2007, 21h30   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Si unserialize échoue, ce qui est le cas ici puisque la valeur FALSE est retournée, vous devriez obtenir un message d'erreur (de type notice). Il faudrait donc forcer son affichage si nécessaire avant (avec error_reporting(E_ALL) par exemple).

Il se pourrait que ce soit un problème d'encodage qui en soit à l'origine ...
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2007, 21h55   #5
Invité de passage
 
Inscription : juillet 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 7
Points : 0
Points : 0
En effet, j'ai une notice qui me dit :
Notice: unserialize() [function.unserialize]: Error at offset 0 of 101 bytes in C:\Progr......

Mais comment savoir si j'ai un pb à l'encodage?
C'est vrai que j'ai des caractères bizzare dans qd je récupére mon champ "dataobject". J'ai des �. C'est peut etre pas normal?
L'interclassement de mon champ est : latin1_swedish_ci

Tu aurais une idée? Tu pense que je récupère pas ce qu'il faut?
kiki650 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2007, 22h03   #6
Invité de passage
 
Inscription : juillet 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 7
Points : 0
Points : 0
J'essaye de désérialiser ca :

user|s:88:"O:4:"User":3:{s:3:"nom";s:2:"da";s:12:"�User�prenom";s:2:"da";s:9:"�User�tel";s:2:"23";}";
kiki650 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2007, 23h04   #7
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Comment sérialiser vous cet objet ? A quoi correspond le début (user|) ?

PS : la "déclaration" de la classe User doit être présente avant l'appel à unserialize.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2007, 23h23   #8
Invité de passage
 
Inscription : juillet 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 7
Points : 0
Points : 0
user correspond au nom de mon objet
User correspond au nom de ma classe
nom : le premier attribut de la classe
prenom le deuxième
tel le troisieme
kiki650 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2007, 00h02   #9
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
J'ai bien compris mais vous n'avez pas répondu à ma question qui était comment en arrivez-vous à cette sérialisation ? Le format obtenu ne correspond pas au format standard de la fonction serialize. Ici, il semble s'agir de celui des sessions qui utilise une technique légèrement différente (et après une première sérialisation).

Il semblerait alors qu'il faille s'orienter d'abord vers la fonction session_decode (à moins d'implémenter un équivalent) :
Code :
1
2
3
4
5
6
7
8
9
<?php
require_once('user.class.php');
session_start();
 
# ...
 
session_decode($donnees);
$_SESSION['user'] = unserialize($_SESSION['user']); // On a vu mieux
var_dump($_SESSION['user']);
J'obtiens avec votre exemple :
Citation:
# La chaîne d'origine ($donnees)
string(100) "user|s:88:"O:4:"User":3:{s:3:"nom";s:2:"da";s:12:" User prenom";s:2:"da";s:9:" User tel";s:2:"23";}""
# Le résultat après ces opérations
object(User)#1 (3) { ["nom"]=> string(2) "da" [" User prenom"]=> string(2) "da" [" User tel"]=> string(2) "23" }
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2007, 00h24   #10
Invité de passage
 
Inscription : juillet 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 7
Points : 0
Points : 0
J'ai du rater quelque chose parce que je ne comprend plus rien.

Ce que je fais me parait simple, mais je dois m'y prendre mal.

page1.php
1. je crée un objet user
2. je crée une session
3. j'enregistre l'id de la session et l'objet sérialisé (serialize($user)) dans une table

page2.php
1. je récupere l'id de la session avec session_id()
2. je cherche l'enregistrement dans la table (et donc mon objet sérialisé)
3. je fais un unserialize($donneesSerialisees)

Je n'arrive pas à obtenir la meme chose que vous avec la solution que vous me proposez ...
kiki650 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2007, 16h20   #11
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Citation:
Envoyé par kiki650 Voir le message
J'ai du rater quelque chose parce que je ne comprend plus rien.

Ce que je fais me parait simple, mais je dois m'y prendre mal.

page1.php
1. je crée un objet user
2. je crée une session
3. j'enregistre l'id de la session et l'objet sérialisé (serialize($user)) dans une table

page2.php
1. je récupere l'id de la session avec session_id()
2. je cherche l'enregistrement dans la table (et donc mon objet sérialisé)
3. je fais un unserialize($donneesSerialisees)

Je n'arrive pas à obtenir la meme chose que vous avec la solution que vous me proposez ...
Il me semble qu'il faut mette session_start après
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united 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 15h31.


 
 
 
 
Partenaires

Hébergement Web