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

PHP & Base de données Discussion :

Passage de connexion PDO à une classe en référence: Exception thrown without a stack frame. [PDO]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Artisan menuisier alu pvc
    Inscrit en
    Février 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Artisan menuisier alu pvc

    Informations forums :
    Inscription : Février 2007
    Messages : 23
    Points : 27
    Points
    27
    Par défaut Passage de connexion PDO à une classe en référence: Exception thrown without a stack frame.
    Bonjour, j'ai une page 'index.php' où la connexion à ma base de donnée est créé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    try {
    	$dbConnexion = new PDO($db_SGBD .":dbname=". $db_nom .";host=". $db_hote, $db_utilisateur, $db_motDePasse);
    } catch (PDOException $e) {
    	echo 'Connexion échouée : ' . $e->getMessage();
    	exit;
    }
    qui inclus une page 'connexion.php', qui inclus le fichier 'Compte.class.php' dont le constructeur est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    public function __construct(PDO &$dbConnexion, $id, $pseudo) {
    	$this->id = intval($id);
    	$this->pseudo = $pseudo;
    	$this->dbConnexion = $dbConnexion;
    	$this->getCiteInfos();
    }
    à la connexion du joueur, une session "compte" stock un nouvel objet Compte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?php
    $_SESSION["compte"] = new Compte($dbConnexion, $compteExistant["id"], ucfirst(strtolower($pseudo)));
    l'erreur suivante m'est renvoyé:
    Fatal error: Exception thrown without a stack frame in Unknown on line 0

    Après moult recherche de topic "résolu", le problème étant "une boucle infini d'Exception", je n'ai toujours pas trouvé la solution à mon problème sachant que:
    Je n'utilises aucune class de gestion de BDD donc pas de gestion d'Exception autre que celle de PDO.
    Je n'ai aucun throw exception dans mes scripts!
    La seule fois où une Exception est reçu c'est dans mon try {} catch() {}, mais même en supprimant cette structure, l'erreur persiste.

    Le pire étant que j'utilise une autre classe, basé sur le même principe de passage de PDO en référence, et que le second marche impeccablement.

    Merci d'avance pour vos éclaircicement sur le sujet

  2. #2
    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. Vous ne pouvez pas, sans redéfinir les méthodes magiques __sleep (pour l'exclure) et __wakeup (pour la recréer lors de la sérialisation) ajouter un objet Compte en session à cause de l'objet PDO en attribut.

    Ce qui, au final, [mettre l'objet PDO en attribut] ne sert à rien (il faut trouver autre chose, comme passer par une solution à base de singleton).

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Artisan menuisier alu pvc
    Inscrit en
    Février 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Artisan menuisier alu pvc

    Informations forums :
    Inscription : Février 2007
    Messages : 23
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par julp Voir le message
    Un objet PDO n'est pas sérialisable. Vous ne pouvez pas, sans redéfinir les méthodes magiques __sleep (pour l'exclure) et __wakeup (pour la recréer lors de la sérialisation) ajouter un objet Compte en session à cause de l'objet PDO en attribut.

    Ce qui, au final, [mettre l'objet PDO en attribut] ne sert à rien (il faut trouver autre chose, comme passer par une solution à base de singleton).
    Je ne comprends pas très bien: je ne sérialise rien, je passes la référence de la variable $dbConnexion d'origine.

    J'utilise la même technique ailleurs, par exemple ici dans un script de combat ou chaque personne est un objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    include "../config.php";
    include "../class/Fourmi.class.php";
    try {
    		$dbConnexion = new PDO($db_SGBD .":dbname=". $db_nom .";host=". $db_hote, $db_utilisateur, $db_motDePasse);
    } catch (PDOException $e) {
    	echo 'Connexion échouée : ' . $e->getMessage();
    	exit;
    }
    $fourmisAdversesSelect = "SELECT * FROM fourmis WHERE id_joueur != " . $chasse["id_joueur"] . " AND position ~= '(" . $caseCourrante[1] . "," . $caseCourrante[2] . ")'::point";
    $fourmisAdversesQuery = $dbConnexion->query($fourmisAdversesSelect)or die(print_r($dbConnexion->errorInfo())."Ligne: ".  __LINE__);
    $fourmisAdverses = $fourmisAdversesQuery->fetchAll(PDO::FETCH_CLASS, 'Fourmi', array($dbConnexion, 'adverse'));
    Fourmi.class.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
    class Fourmi {
    		private $dbConnexion;
    		private $id = FALSE;
    		private $id_joueur = FALSE;
    		private $caste = FALSE;
    		private $position = FALSE;
    		private $naissance = FALSE;
    		private $nom = FALSE;
    		private $vie = FALSE;
    		private $id_chasse = FALSE;
    		private $groupe = NULL;
    		private static $vieGroupe = array();
     
    		public function __construct(PDO &$dbConnexion, $keyGroupe = NULL) {
    			$this->dbConnexion = $dbConnexion;
    			if(!is_null($keyGroupe)) {
    				$this->groupe = $keyGroupe;
    				$this->vieGroupe[$keyGroupe] = (isset($this->vieGroupe[$keyGroupe])) ? $this->vieGroupe[$keyGroupe] + $this->vie : $this->vie;
    			}
    		}
    Et là tout fonctionnes parfaitement. C'est ça qui me perturbes le plus, pourquoi ça marches un coup sur deux?

  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
    Votre exemple n'a rien à voir : il n'y a pas linéarisation.

    À votre avis, il se passe quoi quand vous faites : $_SESSION['foo'] = $bar; ? C'est une (dé)linéarisation opérée par PHP en interne (regardez vos fichiers de session).

    Au passage extrait du code source (C) de la classe PDO :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /* {{{ proto int PDO::__wakeup()
       Prevents use of a PDO instance that has been unserialized */
    static PHP_METHOD(PDO, __wakeup)
    {
    	zend_throw_exception_ex(php_pdo_get_exception(), 0 TSRMLS_CC, "You cannot serialize or unserialize PDO instances");
    }
    /* }}} */
     
    /* {{{ proto int PDO::__sleep()
       Prevents serialization of a PDO instance */
    static PHP_METHOD(PDO, __sleep)
    {
    	zend_throw_exception_ex(php_pdo_get_exception(), 0 TSRMLS_CC, "You cannot serialize or unserialize PDO instances");
    }
    /* }}} */

    Enfin, les références sur les objets sont inutiles en PHP 5. Ils sont eux-même, en quelque sorte, une référence (explication).

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Artisan menuisier alu pvc
    Inscrit en
    Février 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Artisan menuisier alu pvc

    Informations forums :
    Inscription : Février 2007
    Messages : 23
    Points : 27
    Points
    27
    Par défaut
    Merci pour toutes ces explications, je vais donc me pencher vers une classe de gestion BDD pour gérer les __sleep() __wakeup().

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/02/2008, 13h01
  2. passage des variables d'une classe à une autre
    Par zibou7 dans le forum Langage
    Réponses: 4
    Dernier message: 19/02/2007, 16h46
  3. PB de passage d'argument dasn une classe
    Par Naelhem dans le forum C++
    Réponses: 13
    Dernier message: 26/10/2006, 20h03
  4. [VB.NET] passage d'arguments d'une classe(form1) à une autre
    Par zouhib dans le forum Windows Forms
    Réponses: 5
    Dernier message: 05/05/2006, 16h54
  5. Passage de paramètre d'une classe à une autre
    Par semenzato dans le forum C++
    Réponses: 3
    Dernier message: 21/09/2005, 13h59

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