Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
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 17/08/2007, 01h12   #1
Membre actif
 
Avatar de __fabrice
 
Fabrice
Inscription : août 2004
Messages : 309
Détails du profil
Informations personnelles :
Nom : Fabrice
Âge : 40

Informations forums :
Inscription : août 2004
Messages : 309
Points : 180
Points : 180
Envoyer un message via ICQ à __fabrice Envoyer un message via MSN à __fabrice
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 :
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 :
Citation:
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
__fabrice est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2007, 05h55   #2
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
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 ...
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2007, 09h58   #3
Membre actif
 
Avatar de __fabrice
 
Fabrice
Inscription : août 2004
Messages : 309
Détails du profil
Informations personnelles :
Nom : Fabrice
Âge : 40

Informations forums :
Inscription : août 2004
Messages : 309
Points : 180
Points : 180
Envoyer un message via ICQ à __fabrice Envoyer un message via MSN à __fabrice
salut,

Merci. On dirai que cela marche lorsque j'enleve le "new" et le "serialize" et "unserialize". Cela donne ceci :
Code :
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 :
Citation:
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
__fabrice est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2007, 11h33   #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
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.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2007, 00h55   #5
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
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.
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 23h41   #6
Membre actif
 
Avatar de __fabrice
 
Fabrice
Inscription : août 2004
Messages : 309
Détails du profil
Informations personnelles :
Nom : Fabrice
Âge : 40

Informations forums :
Inscription : août 2004
Messages : 309
Points : 180
Points : 180
Envoyer un message via ICQ à __fabrice Envoyer un message via MSN à __fabrice
Salut,

Bon, j'ai refais des tests et toujours sans succes... :
Code :
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 :
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 :
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 :
Citation:
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
__fabrice est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 00h00   #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
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 !
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 09h16   #8
Membre actif
 
Avatar de __fabrice
 
Fabrice
Inscription : août 2004
Messages : 309
Détails du profil
Informations personnelles :
Nom : Fabrice
Âge : 40

Informations forums :
Inscription : août 2004
Messages : 309
Points : 180
Points : 180
Envoyer un message via ICQ à __fabrice Envoyer un message via MSN à __fabrice
Bonjour,

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 !
Si si, j'avais testé aussi, mais cela ne change rien...

On me dis :
Citation:
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 :
Citation:
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
__fabrice est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 11h02   #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
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.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2008, 22h30   #10
Membre confirmé
 
Avatar de venomelektro
 
Inscription : avril 2004
Messages : 496
Détails du profil
Informations personnelles :
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : avril 2004
Messages : 496
Points : 250
Points : 250
Citation:
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..
__________________
telecharger jeux pc
venomelektro 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 14h01.


 
 
 
 
Partenaires

Hébergement Web