IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Désérialiser un objet provenant d'une table MySQL


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 5
    Points
    5
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Que donne var_dump avant/après (respectivement de $donnees et $client) ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    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

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    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 ...

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    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?

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    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";}";

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    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.

  8. #8
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    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

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    # 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" }

  10. #10
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    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 ...

  11. #11
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 490
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 490
    Points : 6 042
    Points
    6 042
    Par défaut
    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 !...

Discussions similaires

  1. Es-ce possible de créer une table MySQL avec MS Excel
    Par pierrot10 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 16/10/2005, 06h30
  2. Vider une table MySQL suite à javascript:confirm()
    Par anutka dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 16/09/2005, 12h16
  3. Connaître le type d'un champs d'une table Mysql
    Par xoran dans le forum Langage SQL
    Réponses: 1
    Dernier message: 20/07/2005, 09h29
  4. Comment importer un document CSV dans une table MySql ?
    Par magic8392 dans le forum Requêtes
    Réponses: 6
    Dernier message: 04/02/2005, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo