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 :

POO et PDO : problème de connexion


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 35
    Par défaut POO et PDO : problème de connexion
    Bonsoir à tous,

    J'ai actuellement un problème avec la POO et PDO. En effet, lorsque j'essaie de faire une requête, j'ai cette erreur qui est renvoyée :

    "Fatal error: Call to a member function query() on a non-object in[...]"

    Cependant je ne vois pas pourquoi j'ai cette erreur. Il y a pourtant bien une instance de la connexion à la base de données. Voici le schéma de mes classes :

    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
    <?php
     
    class PDOProvider {
     
    	// pattern design
    	protected static $instance; 
     
    	private function __construct() {}
    	private function __clone() {}
     
    	public static function getInstance ($db,$user,$password) {
    		if ( ! isset ( self::$instance ) ) 
    			try {
    				self::$instance = new PDO ( 'mysql:host=localhost;dbname='.$db,$user,$password); 
    			} catch (Exception $e) {
    				echo $e->getMessage();
    			}
    		return self::$instance; 
    	}
    }
     
    class ClassManager {
     
    	protected static $instance; 
    	protected $db; 
     
    	public function __construct () {
    		// get PDO instance
    		$this->db = PDOProvider::getInstance('table','root',''); 
    	}
     
    	public static function getInstance () {
    		// return instance if doesn't exists
    		if ( ! isset ( $instance ) ) 
    			self::$instance = new self; 
     
    		return self::$instance; 
    	}
     
    	public function test ($value) {
    		if ( is_int ( $value ) )
    			$sql = 'SELECT COUNT(*) FROM test WHERE id='.(int)$value; 
    		else 
    			$sql = 'SELECT COUNT(*) FROM test WHERE name="'.$value.'"'; 
     
    		$req = $this->db->query($sql); 
    	}
    }
     
    class Class extends ClassManager {
     
    	protected $manager; // instance of ClassManager
     
    	// construct function
    	public function __construct() {
    		// instance of SimManager
    		$this->manager = SimManager::getInstance(); 
    	} 
     
    	public function __get($attr) {}
    }
     
    $test = new Class(); 
    $test->test('value');

    Je ne comprends donc pas pourquoi le message d'erreur est présent. Je m'en remets à vous, ayant ce problème depuis hier soir...

    Si quelqu'un a une idée...

    Merci d'avance et bonne soirée,

    Guigui13

  2. #2
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Le constructeur d'une base classe n'est pas automatiquement appelé si la classe dérivée définit un constructeur. Un bout de code vaut mieux qu'un long discourt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Base {
      function __construct() { }
    }
     
    class Derived extends Base {
      function __construct() {
        parent::__construct(); // appel le constructeur de la classe mère
      }
    }

  3. #3
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 44
    Par défaut
    salut

    il n'y a pas d'instance, le message d'erreur est clair non-object.
    Ne serait-il pas plus simple de voir une méthode de open pour la connexion a la db dans ton singleton.

    l'appel sera exactement le meme.
    Class::getInstance()->Open();
    La connexion reste unique avec le singleton.

    Citation Envoyé par metagoto Voir le message
    Le constructeur d'une base classe n'est pas automatiquement appelé si la classe dérivée définit un constructeur. Un bout de code vaut mieux qu'un long discourt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Base {
      function __construct() { }
    }
     
    class Derived extends Base {
      function __construct() {
        parent::__construct(); // appel le constructeur de la classe mère
      }
    }
    Avant php 5.3 tu ne peux pas dérivé une class singleton.
    le problème peut être résolu en dupliquant la méthode getInstance dans la classe héritée.

  4. #4
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Citation Envoyé par backdown Voir le message
    Avant php 5.3 tu ne peux pas dérivé une class singleton.
    le problème peut être résolu en dupliquant la méthode getInstance dans la classe héritée.
    Mais là ça n'a rien à voir. Tel que présenté, ClassManager n'est pas un singleton. Son constructeur est publique et c'est lui qui instancie le membre $db. Comme ce constructeur n'est jamais appelé (voir mon post précédent), ça génère l'erreur de "call on a non-object".

Discussions similaires

  1. [PDO] Problème de connexion PDO avec OVH
    Par Dadoo1369 dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 21/01/2013, 12h09
  2. [PDO] [PHP 5.3] Problème de connexion persistante avec PDO
    Par Benjamin Delespierre dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 15/03/2012, 14h24
  3. [MySQL] Problème de connexion PDO
    Par Nanais19 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 01/05/2011, 19h10
  4. Réponses: 11
    Dernier message: 13/10/2003, 14h48
  5. problème de connexion 2 PC
    Par guitalca dans le forum Développement
    Réponses: 3
    Dernier message: 22/09/2003, 14h04

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