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

  1. #1
    Membre habitué
    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
    Points : 194
    Points
    194
    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
    Inscrit

    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
    Points : 909
    Points
    909
    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 ...
    YourLabs Business Service: Conseil en Strategie Numerique / Club de 1337 Haxors depuis 2012 / Marque de Logiciels Libres / Blog / GitHub /
    Citation Envoyé par C.A.R. Hoare, The 1980 ACM Turing Award Lecture
    There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies.”
    More great quotes - RIP Uriel

  3. #3
    Membre habitué
    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
    Points : 194
    Points
    194
    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
    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
    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
    Inscrit

    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
    Points : 909
    Points
    909
    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.
    YourLabs Business Service: Conseil en Strategie Numerique / Club de 1337 Haxors depuis 2012 / Marque de Logiciels Libres / Blog / GitHub /
    Citation Envoyé par C.A.R. Hoare, The 1980 ACM Turing Award Lecture
    There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies.”
    More great quotes - RIP Uriel

  6. #6
    Membre habitué
    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
    Points : 194
    Points
    194
    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
    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
    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 habitué
    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
    Points : 194
    Points
    194
    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

  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
    Votre classe test_serialize ne fait pas partie de PHP, elle n'est pas écrite en C sous la forme d'une extension donc sa définition doit être chargée avant session_start lorsque l'objet se trouve déjà en session. Pour les classes internes à PHP c'est déjà fait sinon vous ne pourriez pas les utiliser.

    Citation Envoyé par __fabrice
    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.
    __autoload est une fonction elle n'est pas liée à un objet particulier à l'inverse des méthodes magiques __sleep et __wakeup qui sont respectivement appelées lorsque l'objet est sérialisé et désérialisé.

    La fonction __autoload peut, si elle est bien placée, charger pour vous les définitions des classes des objets qui sont en session plus éventuellement ceux que vous utiliseriez dans votre code.

  10. #10
    Membre averti Avatar de venomelektro
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2004
    Messages : 521
    Points : 316
    Points
    316
    Par défaut
    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
    salut, j ai un probleme similaire, je n arrive pas a seralizer un objet qui contient une instance PDO.

    pourtant on m a dit que c etais faisable et que ce tracait bien de stocker les requetes preparé dans une session .. mais comment ?

    j ai lu ce thread et il n apporte pas de solution..

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