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 29/10/2011, 09h49   #1
Candidat au titre de Membre du Club
 
Inscription : octobre 2008
Messages : 34
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 34
Points : 12
Points : 12
Envoyer un message via MSN à lamouche42
Par défaut Instance de BDD dans une classe qui cause une exception

bonjour à tous,

je n' arrive pas à résoudre mon problème je viens donc vers vous afin de trouver la solution ...
j'instancie ma bdd dans une classe, mais cela provoque une exception de ce type :
Citation:
Fatal error: Exception thrown without a stack frame in Unknown on line 0
j'ai commenté plusieurs parties de ma classe pour trouver d'ou vient le probleme, et cette exception disparait quant je commente la ligne qui instancie la bdd ...

voici le code de al classe :
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
 
<?php
	class SessionManager
	{
	//	------------------------ ATTRIBUTS -----------------------------------
		private $db;
		private static $compteur = array();
 
	//	------------------------ METHODES -----------------------------------							
		//	GETTERS
		public static function getCompteur()
		{
			return self::$compteur;
		}		
		//	SETTERS
		private static function setCheckSession($valeur)
		{
			self::$compteur[$valeur] = 1;
		}
		private function setCompteur($value)
		{
			self::$compteur[$value] = 0;
		}
		public function setDb(PDO $bdd)
		{
			$this->db = $bdd;
		}
		//	Public
		public function __construct(PDO $bdd)
		{
			$this->setDb($bdd);
			try	// Requetes
			{
				$attr = $this->db->query('SELECT * FROM secteurs');
				$q = $this->db->query('SELECT * FROM formulaires
								INNER JOIN secteurs ON secteurs.id_secteur = formulaires.id_sect
								WHERE etat = \'En cours\'');
			}
			catch(Exception $e)
			{
				die('Erreur: '.$e->getMessage());
			}
			while($attribut = $attr->fetch(PDO::FETCH_OBJ))		// creation et affectation de l' attribut compteur
			{
				$this->setCompteur($attribut->nom_secteur);
			}
			while($ses=$q->fetch(PDO::FETCH_OBJ))				// Recherche des sessions en cours pour creation d'objet !!
			{
				$_SESSION[$ses->nom_secteur] = new Session($ses);
				self::setCheckSession($ses->nom_secteur);
			}
		}
		public function listeSession()				// Listage du statut de toutes les sessions
		{
			foreach(self::getCompteur() as $key=>$value)
			{
				if($value)
				{
					echo 'Vous avez une session  '.$_SESSION[$key]->getNomSecteur().'  en cours, son ID est <a href="session.php?secteur='.$_SESSION[$key]->getNomSecteur().'">'.$_SESSION[$key]->getIdFormulaire().'</a><br />';
				}
				else
				{
					echo ' il n\'y a pas de session '.$key.' en cours.<br />';
				}
			}			
		}
		public function create($nom)
		{
			if(isset($_SESSION[$nom]))
			{
				//echo 'Une session '.$nom.' existe déjà';
				return $_SESSION[$nom];
			}
			else
			{
				$idSect = $this->db->query('SELECT id_secteur FROM secteurs WHERE nom_secteur = '.$nom)->fetchColumn();
				$infoSes = $this->db->prepare('INSERT INTO formulaires SET id_sect = :id_sect, date_session = :date_session, etat = :etat');
				$infoses->bindValue(':id_sect', $idSect, PDO::PARAM_INT);
				$infoses->bindValue(':date_session', time());
				$infoses->bindValue(':etat', 'En cours');
				$infoses->execute();
				$idSes = lastInsertId($this->db);
				$q = $this->db->query('SELECT * FROM formulaires
								INNER JOIN secteurs ON secteurs.IDsect = formulaires.ID_sect
								WHERE IDform = '.$idSes)->fetch(PDO::FETCH_OBJ);
				return new Session($q);
			}
		}
		public function delete($nom)
		{
 
		}
		public function modify($nom)
		{
		}
	}
?>
voici le début de la page qui lance la création de classe :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<?php
	session_cache_limiter('private_no_cache');
	session_start();
	include('commun/php_fonctions.php');
	$bdd = db_connect('localhost','base test','David','********',array());		// Connection à la BDD sauve trade
	function chargerClasse($classe)										// Auto load de la classe à creer
	{
		require 'class/'.$classe.'.class.php';
	}
	spl_autoload_register('chargerClasse');								// Ajout de la classe dans la pile d'autoload
	$_SESSION['SM'] = new SessionManager($bdd);
?>
et voici le fichier 'php_fonctions.php'
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
<?php
	function db_connect($host,$db,$name,$pass,$options)
	{
		try
		{
			$bdd = new PDO('mysql:host='.$host.';dbname='.$db, $name, $pass, $options);
			$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
			$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 
		}
		catch(exception $e)
		{
			die('erreur :'.$e->getMessage());
		}
		return $bdd;
	}
?>
pouvez vous m'eclaircir sur la raison du probleme et comment le corriger svp?
 
mercid 'avance :)
lamouche42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2011, 10h40   #2
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Bonjour,
Je me suis pas plus penché sur ton code que ça mais ce message d'erreur est expliqué ici section III-B-2. Boucle infinie. Quand ton gestionnaire d'erreurs rappelle la portion de code qui génère ton erreur.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2011, 11h35   #3
Candidat au titre de Membre du Club
 
Inscription : octobre 2008
Messages : 34
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 34
Points : 12
Points : 12
Envoyer un message via MSN à lamouche42
j'ai deja lu ce paragraphe :p

en me repenchant sur mon probleme, j' ai essayé de changer la variable $_SESSION['SM'] par une variable normale $sm

et ca fonctionne!!

je pense donc que maintenant une instance de bdd dans un objet situé dans une variable globale cause une boucle infinie ... invisible pour nous.

je dois me pencher sur la gestion des sessions php :p
lamouche42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/10/2011, 12h03   #4
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
A vrai dire, pourquoi tu stockes une ressource (PDO) dans une session ?
Une fois ta session clôturée, ton PDO ne sera jamais récupérable à la réouverture.
Citation:
Il n'est actuellement pas possible d'enregistrer des ressources dans les sessions. Par exemple, vous ne pouvez pas créer de connexion à une base de données, et stocker la connexion dans une variable de session. Elle ne sera pas valide lors de la prochaine page.
Voir ici
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/10/2011, 12h04   #5
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
Un objet PDO n'est pas sérialisable et déclenche la levée d'une exception (d'où l'erreur).
Code C :
1
2
3
4
5
6
7
8
9
static PHP_METHOD(PDO, __sleep)
{
    zend_throw_exception_ex(php_pdo_get_exception(), 0 TSRMLS_CC, "You cannot serialize or unserialize PDO instances");
}
 
static PHP_METHOD(PDO, __wakeup)
{
     zend_throw_exception_ex(php_pdo_get_exception(), 0 TSRMLS_CC, "You cannot serialize or unserialize PDO instances");
}

Cette linéarisation a lieu lors de :
Code :
$_SESSION['SM'] = new SessionManager($bdd);
Puisque l'objet SessionManager contient un objet PDO comme membre.

En l'état, pour que ça marche, il faudrait jouer des méthodes magiques __sleep pour écarter l'objet PDO de la linéarisation et __wakeup pour réinstancier la connexion à la délinéarisation. Ce qui, au final, ne sert strictement à rien et demanderait alors à trouver une solution pour conserver l'objet PDO externe à la classe.
julp est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/10/2011, 12h13   #6
Candidat au titre de Membre du Club
 
Inscription : octobre 2008
Messages : 34
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 34
Points : 12
Points : 12
Envoyer un message via MSN à lamouche42
merci à vous deux

apres avoir parlé avec un ami j'en ai conclu ce que vous me confirmez avec une explication

je vais devoir revoir ma logique de code.

en fait je voulais creer un objet SessionManager pour touta la durée de la session php mais en fait le mieu sera je pense de creer une table temporaire et de construire une instance 'objet avec cette table qd besoin

ce qui est logique dans un sens

je vais me pencher sur un tuto "sessions php" pour mieux gerer le proble à l' aenir

merci encore :p
lamouche42 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 09h24.


 
 
 
 
Partenaires

Hébergement Web