Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
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 28/02/2011, 19h04   #1
 
yoro Faye
Inscription : mai 2010
Messages : 25
Détails du profil
Informations personnelles :
Nom : yoro Faye

Informations forums :
Inscription : mai 2010
Messages : 25
Points : -2
Points : -2
Par défaut Passer un objet PDO via une variable de session

Bonjour à tous

J’ai créer une classe qui donne une instance de connexion à une base de donnée, et je veux pouvoir utiliser cet objet quand je veux dans mes pages php donc je la fait par une variable de session. Mais ca me met une erreur que je narrive pas à debugger.

Voici la classe ou je dfini ma classe de connection : connection.class.php
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
52
53
54
 
 class Connection{
 
		 public static $con;
		 public $serveur;
		 public $port;
		 public $user;
		 public $password;
		 public $database;
 
		 public function __construct($serveur, $port, $user, $password, $database){
 
			 $this->serveur=$serveur;
			 $this->database=$database;
			 $this->port=$port;
			 $this->user=$user;
			 $this->password=$password;
 
 
		 }
 
		 public function connectBdd(){
			 if(!isset(self::$con))
			 {
 
				 try{
					self::$con= new PDO('mysql:host='.$this->serveur.';port='.$this->port.';dbname='.$this->database, $this->user, $this->password);
					print "Connexion à la base de données ruessie";
				 }catch(PDOException $e){
					 print "Error.... Num : ".$e->getCode()." Message : ".$e->getMessage();
					 die();
				 }
			 }
			 else print "une instance de cnx existe déja<br>";
			return self::$con;
		 }
 
 
		 /**
		  *Methode défimit pour sauver les attributs avant la sérialisation
		  */
		 public function _sleep(){
			 	$this->con= null;
				//return array('serveur', 'port', 'user', 'password', 'database');
 
			}
 
			/**
			 *Methode qui est appelée après la désérialisation, pour nous permettre de relncer la connexion
			 */
		 public function _wakeup(){
			 $this->connectBdd();
		 }
	 }
Et la mon fichier ou je stocke linstance de cnx dans une variable de session : test.php
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
<?php
	include "connection.class.php";
    session_start();
 
    if (!isset ($_SESSION['connexion']))
    {
       	$connexion = new Connection ('localhost', '8888','root', 'root', 'desimmob');
        $_SESSION["connexion"] = $connexion->connectBdd();
 
        print 'Actualisez la page !';
    }
 
    else
    {
        echo '<pre>';
        var_dump ($_SESSION['connexion']); // On affiche les infos concernant notre objet
        echo '</pre>';
    }
 
?>
Et c avec le bout de code suivant que je teste pour voir si ca passe : rep.php
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
session_start();
		include "connection.class.php";
 
		$connexion = $_SESSION["connexion"];
 
 
 
		$query1=("Select * from test");
		$resultat = $connexion->query($query1);
		while($ligne = $resultat->fetch(PDO::FETCH_OBJ)){
				echo $ligne->nom."-______-".$ligne->prenom."<br/>";
			}
Quand je lance test.php sur le navigateur j’obtient cette erreur
Code :
1
2
 
Fatal error: Exception thrown without a stack frame in Unknown on line 0
Et qund je lance rep.php sur le navigateur g cette erreur :

Code :
1
2
3
4
 
Notice: Undefined index: connexion in /Applications/MAMP/htdocs/desimmob/classe_metier/rep.php on line 5
 
Fatal error: Call to a member function query() on a non-object in /Applications/MAMP/htdocs/desimmob/classe_metier/rep.php on line 10
Si kelkun à une idée ou une solution sur mon probleme, je suis preneur.

Merci à tous
gohanfaye est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 19h29   #2
Membre Expert
 
Inscription : septembre 2010
Messages : 1 239
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 239
Points : 1 561
Points : 1 561
Citation:
Envoyé par gohanfaye Voir le message
Bonjour à tous
J’ai créer une classe qui donne une instance de connexion à une base de donnée, et je veux pouvoir utiliser cet objet quand je veux dans mes pages php donc je la fait par une variable de session.
Et pourquoi tu ne fais pas une inclusion du fichier qui contient la classe de connexion dans tous les scripts qui en ont besoin ?
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 19h49   #3
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
Citation:
J’ai créer une classe qui donne une instance de connexion à une base de donnée, et je veux pouvoir utiliser cet objet quand je veux dans mes pages php donc je la fait par une variable de session. Mais ca me met une erreur que je narrive pas à debugger.
Eeeeh perdu. Les objets PDO* ne peuvent pas être sérialisés donc on ne peut pas les mettre dans une variable de session car ces données sont supposées être linéarisées (ou sérialisées) ce qui signifie qu'elles seront transformées sous forme de chaine de caractères dans le but d'être mises dans le fichier de session d'apache.
Vu que les objets PDO encapsulent des ressources, ce n'est pas possible à moins d'utiliser __sleep et __wakeup.

La solution à ton problème est de créer un Singleton pour PDO et d'ouvrir ta connection en tant que persistante pour que d'une page à l'autre tu utilise toujours le même socket.
- http://tonylandis.com/php/php5-pdo-singleton-class/
- http://www.php.net/manual/en/ref.pdo-mysql.php

A toi de jouer
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 19h50   #4
 
yoro Faye
Inscription : mai 2010
Messages : 25
Détails du profil
Informations personnelles :
Nom : yoro Faye

Informations forums :
Inscription : mai 2010
Messages : 25
Points : -2
Points : -2
En ce moment c ce que je fait. Mais je voulais juste tester une autre manière de faire. Mais malheuresemet ça ne marche pas et je suis impatient de savoir pourquoi. Ca me fera dormir moin bte ce soir lol.
gohanfaye est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 28/02/2011, 19h51   #5
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
La réponse à ton problème dans le post au dessus

Dors bien.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 19h52   #6
 
yoro Faye
Inscription : mai 2010
Messages : 25
Détails du profil
Informations personnelles :
Nom : yoro Faye

Informations forums :
Inscription : mai 2010
Messages : 25
Points : -2
Points : -2
Merci Benji je v jeter un coup d’oeil sur la solution ke tum propose.

Encore merrci
gohanfaye est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 20h09   #7
Membre Expert
 
Inscription : septembre 2010
Messages : 1 239
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 239
Points : 1 561
Points : 1 561
Citation:
Envoyé par gohanfaye Voir le message
Merci Benji je v jeter un coup d’oeil sur la solution ke tum propose.

Encore merrci
Tout en sachant que les connexions persistantes ne sont pas à utiliser systématiquement. A toi de voir si oui ou non tu en as besoin. Et si non ton ancienne méthode (d'appeler le script de connexion dans chaque page en ayant besoin) est la bonne.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 20h34   #8
 
yoro Faye
Inscription : mai 2010
Messages : 25
Détails du profil
Informations personnelles :
Nom : yoro Faye

Informations forums :
Inscription : mai 2010
Messages : 25
Points : -2
Points : -2
Ok ABCIWEB merci du conseil.
gohanfaye est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 20h42   #9
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 33
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 33
Points : 12
Points : 12
Bonsoir,

Je galère depuis plusieurs jours à essayer la méthode indiquée par Benjamin.
(je débute en POO )

As tu réussi ? Je serai curieux de voir comment cela ce construit.

Est-ce normal que dans la class "pdo-singleton-class.php" il n'y ai rien de prévu pour passer les paramètres des requêtes préparées ?
berlo44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 10h00   #10
Membre émérite
 
Homme Frédéric Bruyère
Chef de projet NTIC
Inscription : novembre 2008
Messages : 124
Détails du profil
Informations personnelles :
Nom : Homme Frédéric Bruyère
Âge : 29
Localisation : Belgique

Informations professionnelles :
Activité : Chef de projet NTIC
Secteur : Conseil

Informations forums :
Inscription : novembre 2008
Messages : 124
Points : 806
Points : 806
Hello berlo44,
Citation:
Est-ce normal que dans la class "pdo-singleton-class.php" il n'y ai rien de prévu pour passer les paramètres des requêtes préparées ?
cette classe "remplace" la classe de base PDO, alors que les paramètres des requetes préparées se passent aux PDOStatement's, donc oui, a priori c'est normal

Ceci étant dit, tu devrais créer ton propre sujet, celui-ci étant marqué "résolu", tu risques d'y trouver moins facilement de l'aide
Code62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 10h11   #11
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 33
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 33
Points : 12
Points : 12
merci du conseil, je vais faire un sujet.
berlo44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h27.


 
 
 
 
Partenaires

Hébergement Web