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 :

Instance de BDD dans une classe qui cause une exception [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Points : 59
    Points
    59
    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 :
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
     
    <?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 :)

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    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.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Points : 59
    Points
    59
    Par défaut
    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

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    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.
    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

  5. #5
    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
    Un objet PDO n'est pas sérialisable et déclenche la levée d'une exception (d'où l'erreur).
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $_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.

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Points : 59
    Points
    59
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Imposer une classe qui implemente une interface
    Par hwoarang dans le forum C#
    Réponses: 11
    Dernier message: 12/10/2010, 18h48
  2. Réponses: 6
    Dernier message: 30/03/2009, 18h13
  3. éxecuter une classe qui contient une classe annonyme
    Par star-watcher dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 09/03/2009, 01h26
  4. Réponses: 1
    Dernier message: 26/02/2009, 15h38
  5. Réponses: 27
    Dernier message: 03/01/2008, 11h07

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