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

Langage PHP Discussion :

Sérialisation d'un tableau d'objets


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 16
    Points : 9
    Points
    9
    Par défaut Sérialisation d'un tableau d'objets
    Bonjour à tous,

    J'ai un problème avec la fonction unserialize.
    J'ai parcouru le net pour chercher des solutions mais n'arrive pas à trouver une réponse adéquat.

    Voila le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      class Test {
            private $test;
     
            function __construct($t){
                $this->test=$t;
            }
        }
     
     
        $test = array(new Test("case1"),new Test("case2"));
        $ser=serialize($test);
     
        $res =  unserialize($ser);
        echo $res[0];
    Et le message d'erreur :

    Catchable fatal error: Object of class Test could not be converted to string

    En gros j'aimerais pouvoir passer d'une page à l'autre une session contenant un tableau d'objet compliqué (plus que l'exemple).

    Si quelqu'un aurait déjà fait fasse à ce problème ...
    Merci

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Yoan_ Voir le message
    Catchable fatal error: Object of class Test could not be converted to string
    Parceque tu fais echo $res[0] au lieu de echo $res[0]->test.
    Pour afficher un objet comme tu le faisait il aurait fallu implémenter la méthode __toString( )

    En gros j'aimerais pouvoir passer d'une page à l'autre une session contenant un tableau d'objet compliqué (plus que l'exemple).

    Si quelqu'un aurait déjà fait fasse à ce problème ...
    Pas de souci particulier avec serialize/unserialize, il faudra juste t'assurer que la class est bien définie dans le script cible.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Futur Membre du Club
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Oui effectivement Seb Merci,
    Cet exemple simple fonctionne donc bien.

    Je n'avais pas fait attention à ça.

    Pour un exemple plus compliqué j'obtient l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unserialize() expects parameter 1 to be string, array given
    Je pensais passer par un exemple simple pour comprendre mon erreur, mais celui-ci fonctionne bien, je ne vois pas pourquoi j'obtiens cette erreur lorsque j'ai un tableau d'objet plus compliqué.

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    Vu le message d'erreur tu dois filer à unserialize( ) un tableau d'objets sérialisés (passés en session ?), non ?
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Futur Membre du Club
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Oui c'est ca.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    page1.php
     
    $_sess->sess_liste = serialize(article::chargementListe());	
    header('Location:index.php');
     
    J'utilise une classe perso pour les sessions, je met dans sess_liste mon tableau contenant la liste d'objet article. Et je passe sur la page index.php
     
    page index.php
     
    require_once("../system.php");
    $liste = unserialize($_sess->sess_liste);
     
    Le fichier system.php appelle la liste des classes utilisées et ensuites les sessions.
    Et j'obtient cette erreur

    EDIT j'ai oublié le serialize en recopiant la ligne n°1

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    Donc, pour faire simple, tu fais d'après ce que j'ai compris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $objets = array( ) ;
    $objets[ ] = serialize(new Objet('foo')) ;
    $objets[ ] = serialize(new Objet('bar')) ;
    $_SESSION['objets'] = $objets ;
    Note qu'ici $_SESSION['objets'] est un tableau non linéarisé d'objets linéarisés.

    Et ensuite sur une autre page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $objets = unserialize($_SESSION['objets']) ;
    Ici tu veux délinéariser le tableau d'objets. Or ce dernier ne l'est pas, ce sont les objets qui le composent qui sont linéarisés.

    Une solution serait de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $objets = array( ) ;
    $objets[ ] = new Objet('foo') ;
    $objets[ ] = new Objet('bar') ;
    $_SESSION['objets'] = serialize($objets) ; // Linéarisation du tableau d'objets
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  7. #7
    Futur Membre du Club
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    En fait l'appel à " article::chargementListe() "
    Me renvoie déja un tableau d'objet.

    Ce tableau je le serialize.
    PS dans mon précédant post j'avais oublié le mot serialize!

  8. #8
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Yoan_ Voir le message
    En fait l'appel à " article::chargementListe() "
    Me renvoie déja un tableau d'objet.

    Ce tableau je le serialize.
    PS dans mon précédant post j'avais oublié le mot serialize!
    D'ac, dans ce cas doit y avoir un bug en chemin. Sur la 2e page fait un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo '<pre>' ;
    print_r($_sess->sess_liste) ;
    echo '</pre>' ;
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  9. #9
    Futur Membre du Club
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 16
    Points : 9
    Points
    9

  10. #10
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Yoan_ Voir le message
    Manque quelque chose.

    Tu as juste cela ou tu as foiré ton copier/coller sur le forum ?
    Si tu n'as que cela alors fais un print_r( ) de $_sess
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  11. #11
    Futur Membre du Club
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Non non je n'ai vraiment que ca !

    Et je ne peux pas faire une print_rde $_sess vu que c'est un objet.

  12. #12
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Yoan_ Voir le message
    Non non je n'ai vraiment que ca !
    Aide-nous à t'aider

    Et je ne peux pas faire une print_rde $_sess vu que c'est un objet.
    Ben si !
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  13. #13
    Futur Membre du Club
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Oui je suis désolé j'avoue que je suis pas très explicite !

    Je viens de me rendre compte d'une erreur déjà. J'avais oublié de serializer le tableau dans la page1.php ....

    Donc maintenant j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		$liste = article::chargementListe();
    		print_r($liste); // FOnctionne très bien
    		$_sess->sess_liste = serialize($liste);
    Et la page d'erreur... avant même d'aller sur l'autre page.
    Est-ce qu'il peut y avoir un problème avec le contenu du tableau, c'est à dire qu'il contient des objets de type article avec comme attributs privés un titre, une date, une position ou encore un contenu TEXT avec des ' , des " etc..

    ?

  14. #14
    Futur Membre du Club
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    J'ai résolu le problème mais de facon étrange. Si je n'utilise pas serialize, tout fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    page1.php
     
    $liste = article::chargementListe();
    $_sess->sess_liste = $liste;	
     
    page index.php
     
    $liste = ($_sess->sess_liste);
    echo $liste[0]->getTitre();

  15. #15
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		$liste = article::chargementListe();
    		print_r($liste); // FOnctionne très bien
    		$_sess->sess_liste = serialize($liste);
    Et la page d'erreur...
    Quelle message d'erreur ?

    Est-ce qu'il peut y avoir un problème avec le contenu du tableau
    Pourquoi pas, nous ne sommes jamais à l'abri d'un bug.

    c'est à dire qu'il contient des objets de type article avec comme attributs privés un titre, une date, une position ou encore un contenu TEXT avec des ' , des " etc..
    Je ne pense pas que les ' ou " puissent gêner, ni les membres privés.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  16. #16
    Futur Membre du Club
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Donc effectivement tout fonctionne bien quand je n'utilise pas "serialize", va savoir pourquoi...

    Du coup j'ai résolu mon problème sans avoir la réponse à ce problème de serialize...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. retour tableau d'objets par service web axis jboss
    Par TrollMaster dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 27/11/2005, 21h45
  2. Tableau d'objets
    Par moulefrite dans le forum MFC
    Réponses: 7
    Dernier message: 15/06/2004, 14h14
  3. Sauvegarde / Chargement d'un tableau d'objets
    Par Naruto dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2004, 14h34
  4. [VB6]Tableau d'objet withevents
    Par soazig dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 13/02/2004, 19h44
  5. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33

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