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 :

[POO] Sérialiser un objet PDO dans une classe


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Par défaut [POO] Sérialiser un objet PDO dans une classe
    bonjour à tous,

    Bon, j'ai un soucis avec la serialisation d 'objet avec php5. J'ai lu pas mal de docs là-dessus sans réponse...appropriée.
    Voici la classe simplifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    <?php
    session_start();
    class test_serialize {
    	private $nom;
    	public $prenom;
    	private $objConnex;
     
    	function __construct($typeConn="mysql") {
    		//$this->objConnex = new PDO($typeConn.':host=localhost;dbname=bdd','root','');
    	}
     
    	function getNom() {
    		echo $this->nom ;
    	}
     
    	function SetNom($leNom) {
    		$this->nom = $leNom;
    	}
     
    	function getProduct() {
    		return array ("premier", "dernier");
    	}
     
    	function __sleep() {
    		return array_keys(get_object_vars($this));
    	}
    }
     
    $objTest = new test_serialize();
     
    $objTest->prenom = "Fabrice";
    $objTest->SetNom("Dupont ");
    $objTest->getNom();
    echo " " .$objTest->prenom ."<br><br>";
    var_dump($objTest->getProduct());
     
    // ///////////////////////////////////////////////////////////////// //
     
    echo "<br><br>Objet Serialisé : ";
    $_SESSION['obj'] = serialize($objTest);
     
    $objTestSerialized = new test_serialize();
    $objTestSerialized = unserialize($_SESSION['obj']);
     
    $objTestSerialized->getNom();
    echo " " .$objTestSerialized->prenom ;
    echo "<br><br>";
    var_dump($objTestSerialized->getProduct());
     
     
    ?>
    Ce code marche nickel même si je met en commentaire la ligne :$objTestSerialized = new test_serialize(); alors que, normalement, je devrais la mettre dans le code... deja, je comprends pas !

    Ensuite, si j'enlève le commentaire de : //$this->objConnex = new PDO($typeConn.':host=localhost;dbname=bdd','root',''); dans le constructeur, j'ai cette erreur :
    Uncaught exception 'PDOException' with message 'You cannot serialize or unserialize PDO instances' in G:\www\tests_scripts\test_serialize.php:42 Stack trace: #0 G:\www\tests_scripts\test_serialize.php(42): PDO->__sleep() #1 {main} thrown in G:\www\tests_scripts\test_serialize.php on line 42
    La variable en public ne change rien.
    Donc, ma question est : comment puis-je passer un objet PDO en le sérialisant ?

    Merci à tous,
    Fabrice

  2. #2
    Membre émérite

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Par défaut
    L'instance est serialisée : pas besoin de la ligne problématique.
    Si vous la laissez : vous aurez deux instances, la new et celle de la session.
    Néanmois, la sérialisation et la dé-sérialisation sont automatiques avec les variables de session en PHP5. Pas besoin d'utiliser les fonctions serialize et unserialize.
    D'ailleurs, si vous êtes sous PHP5, je suspecte un cafouillage du pass-by-reference ...

  3. #3
    Membre éclairé
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Par défaut
    salut,

    Merci. On dirai que cela marche lorsque j'enleve le "new" et le "serialize" et "unserialize". Cela donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    echo "<br><br>Objet Serialisé : ";
    $_SESSION['obj'] = $objTest;
     
    $objTestSerialized = $_SESSION['obj'];
     
    $objTestSerialized->getNom();
    Par contre, sur un autre script, j'ai cette erreur :
    The script tried to execute a method or access a property of an incomplete object
    Erreur de déclaration de l'objet. Et je fais le même chose. Je regarderai plus tard.

    Fabrice

  4. #4
    Membre expérimenté

    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
    Par défaut
    Comme tend à le dire un des messages d'erreur rencontré je doute qu'un objet PDO soit directement sérialisable puisqu'il doit contenir contenir en son sein une ou plusieurs variables de type ressource.

    Concernant les objets et leur sérialisation, vous devez impérativement avoir la déclaration des objets contenus dans la session avant l'appel à session_start.

  5. #5
    Membre émérite

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Par défaut
    Vous pouvez aussi tenter le var_export(), quitte a faire une classe etendant PDO et a surcharger __set_state() pour resoudre les problemes de ressources ephemeres.

    Concernant les objets et leur sérialisation, vous devez impérativement avoir la déclaration des objets contenus dans la session avant l'appel à session_start.
    Pas pour PDO ni que les autres interfaces objets aux extensions C.
    A nottez qu'__autoload() peut rendre des services a ce niveau.

  6. #6
    Membre éclairé
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Par défaut
    Salut,

    Bon, j'ai refais des tests et toujours sans succes... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    <?php
    set_include_path('.' . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'].'/includes/ZF/library' . PATH_SEPARATOR . get_include_path());
    require_once('Zend/Db.php');
     
    class test_serialize {
    	private $nom;
    	public $prenom;
     
    	function __construct($typeConn="PDO_MYSQL") {
    		try {
    			$params = array ('host'     => "localhost", 'username' => "root", 'password' => "mot_de_passe", 'dbname'   =>"absolument");
    			$this->db = Zend_Db::factory($typeConn, $params);
    			$this->db->getConnection();
    		} catch (Zend_Db_Adapter_Exception $e){
    			echo $e->getMessage();
    		}
    	}
     
    	function getNom() {
    		echo "Le nom : " .$this->nom .'<br>';
    	}
     
    	function SetNom($leNom) {
    		$this->nom = $leNom;
    	}
     
    	function getProduct() {
    		return $this->db->fetchRow("select * from shop_product");
    	}
     
    	function __sleep() {
    		return  array_keys(get_object_vars($this));
    	}
    }
    ?>
    le premier fichier teste la classe, et j'ai ce message d'erreur Fatal error: Exception thrown without a stack frame in Unknown on line 0, meme si le code s'execute bien, cela affiche ce qu'il faut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    session_start();
    include "test_serialize.php";
     
    $toto = new test_serialize();
    $toto->SetNom("fabrice");
    echo $toto->getNom();
    var_dump($toto->getProduct());
     
    $_SESSION['objToto'] = $toto;
    ?>
    <a href="test_serialize3.php">cliquez ici pour continuer...</a>
    Et le second regarde pour la serialisation de l'objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    session_start();
    include "test_serialize.php";
     
    echo "<br><br> APRES LA SERIALIZATION :";
    $tutu = new test_serialize();
     
    $tutu = $_SESSION['objToto'];
     
    echo $tutu->getNom();
    var_dump($tutu->getProduct());
    ?>
    J'ai ce message d'erreur lors de l'exécution du dernier fichier :
    APRES LA SERIALIZATION :
    Fatal error: Call to a member function getNom() on a non-object in G:\www\tests_scripts\test_serialize3.php on line 10
    Bizarre ....
    Fabrice

  7. #7
    Membre expérimenté

    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
    Par défaut
    Citation Envoyé par is_null
    Pas pour PDO ni que les autres interfaces objets aux extensions C.
    C'est évident

    Citation Envoyé par julp
    Concernant les objets et leur sérialisation, vous devez impérativement avoir la déclaration des objets contenus dans la session avant l'appel à session_start.
    Vous ne le faites pas !

  8. #8
    Membre éclairé
    Avatar de __fabrice
    Homme Profil pro
    Développeur Back-End
    Inscrit en
    Août 2004
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Août 2004
    Messages : 404
    Par défaut
    Bonjour,

    Envoyé par julp
    Concernant les objets et leur sérialisation, vous devez impérativement avoir la déclaration des objets contenus dans la session avant l'appel à session_start
    .
    Vous ne le faites pas !
    Si si, j'avais testé aussi, mais cela ne change rien...

    On me dis :
    Concernant les objets et leur sérialisation, vous devez impérativement avoir la déclaration des objets contenus dans la session avant l'appel à session_start.
    Et ensuite son contraire :
    Pas pour PDO ni que les autres interfaces objets aux extensions C.


    Par contre, je n'ai pas testé avec __autoload, et d'ailleurs je ne vois pas tres bien comment mettre çà en place, car j'ai deja __sleep et __wakeup.

    Fabrice

Discussions similaires

  1. Sérialiser un objet directement dans une base de données
    Par Kehel dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 22/08/2008, 09h45
  2. [POO] Problème avec un require_once dans une classe
    Par Sayrus dans le forum Langage
    Réponses: 5
    Dernier message: 23/02/2008, 14h40
  3. [POO] Tableau d'objets B dans une instance de class A
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 24/05/2006, 09h52
  4. Créer une liste d'objets statiques dans une classe
    Par crossbowman dans le forum C++
    Réponses: 3
    Dernier message: 13/03/2006, 09h11

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