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 :

Utilisation de PDO dans un contexte statique [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut Utilisation de PDO dans un contexte statique
    Bonjour à toutes et à tous,

    Je suis sur un problème depuis un bon moment dont j'ai du mal à trouver la solution ...
    En effet, j'ai crée une classe abstraite Modele (qui ne peut donc pas être instancié) contenant une méthode statique load($nom) permettant de charger un modele en fonction de son nom donné en paramètre.

    J'invoque la méthode statique de cette façon
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $membre = Modele::load("membre")
    ...
    $membre->read(); // message d'erreur
    Call to a member function prepare() on a non-object
    Je comprends bien le message d'erreur mais comment procéder pour utiliser PDO dans un contexte statique.

    modele.php
    Code php : 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
    abstract class Modele {
     
        public $table;
        public $id;    
     
        // traitement pour la lecture des donnees dans la table
        public function read($fields = null) { // $fields represente les champs de la table categories
            if ($fields == null) {
                $fields = "*";
            }        
            $db = DBConnect::getBDD(); // on se connecte à la Base de données        
            $sql = "SELECT $fields FROM " . $this->table . " WHERE mid =" . $this->id; // $this->id fait reference a l'identifiant de l'enregistrement que l'on veut recuperer                
            $stm = $db->prepare($sql); // on prepare la requete a executer sur le serveur
            $stm->execute(); // on execute la requete preparee
            // PDO::FETCH_ASSOC: retourne un tableau indexe par le nom de la colonne comme retournee dans le jeu de resultats
            $data = $stm->fetch(PDO::FETCH_ASSOC); // $data est un tableau indexe
            foreach ($data as $k => $v) { // un tableau associatif
                $this->$k = $v; // on associe la cle recupere avec sa valeur
            }
     
            //return $data;
            $db = null; // on ferme la connexion
        }
     
    public static function load($nom) { // $nom correspond au nom du fichier charge
            require("$nom.php"); // le fichier contenant l'interaction avec la Base de donnees
            return new $nom(); // on retourne une instance de l'objet charge
        } // fin static function load($nom)

    index.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $db = DBConnect::getBDD(); // on se connecte à* la Base de données
     
    $membre = Modele::load("membre");
    $membre->mid = 2;
    $membre->read();
    echo $membre->pseudo;
    Merci d'avance.
    Transact.

  2. #2
    Membre éprouvé Avatar de tdutrion
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2009
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 561
    Points : 1 105
    Points
    1 105
    Par défaut
    Bonjour !

    Aucune chance que l'erreur vienne de la ligne suivante ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $db = DBConnect::getBDD(); // on se connecte à la Base de données
    A mon avis, le résultat (db) n'est pas l'objet que tu attends mais null ou false...

  3. #3
    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
    Salut,

    le contexte (statique ou pas) n'a rien à voir avec PDO...
    Je pense tout simplement que ta chaîne de connexion PDO est erronnée

    Edit: #grilled

  4. #4
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    Voici le code de ma classe DBConnect

    Code php : 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
     
    <?php
     
    // Fonction permettant la connexion à la Base de données. 
    final class DBConnect { 
     
        private static $conn; // propriété en visibilité privée et statique qui va permettre de stocker l’unique instance de la classe.
     
        // Nous mettons le constructeur en visibilité privée ce qui permet de n'avoir qu'une unique instance de la classe grâce à la méthode singleton
        private function __construct() {
            // On initialise les variables de connection avec les paramètres de la chaîne de connexion
            $hostname = "localhost";
            $dbname = "vineyard";
            $username = "vigneron";
            $password = "dew46tr1564re";
            // On n'oublie pas de mettre tout ceci dans un bloc try{} catch() si quelque chose se passe mal
            try {
                // mode d'erreurs
                $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_WARNING;
                // Indispensable pour ne pas avoir execute qui formate en string avec un tableau en paramètre  (ce qui est incompatible avec la clause limit)
                $pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;
     
                // Notre unique instance correspondra donc à la chaîne permettant de se connecte à la Base de données
                self::$conn = new PDO('mysql:host=' . $hostname . ';dbname=' . $dbname . ';charset=utf8', $username, $password, $pdo_options);
                echo "ok"; // pour le test                        
            } catch (Exception $e) {
                // on lance une exception si cela se passe mal.
                echo "Connexion au serveur MySQL impossible : " . $e->getMessage();
                die();
            }
        }
     
        // Nous créeons également une méthode statique permettant de supprimer le jeton de connexion une fois les données exploitées
        public static function destructToken() {        
            if(isset(self::$conn)) { // si l'instance de la connexion est en cours
                return self::$conn = null; // ... alors on la supprime
            }
        }
        // ... cette méthode est appelée de façon statique par la méthode magique __destruct()
        public function __destruct() {        
            self::destructToken();
        }
     
        // Rappel : Singleton garantit qu’une classe n’a qu’une seule instance et fournit un point d’accès global à cette instance.
        // Voir http://design-patterns.fr/singleton
        // getBDD() est un pseudo-constructeur l'avantage est qu'il nous permet de retourner l'unique instance de connexion à la Base de données
        public static function getBDD() {
            if (!isset(self::$conn)) { // on teste si l'instance est unique (donc qu'elle n'existe pas encore)
                new DBConnect; // ... on crée un nouvel objet de la classe
                return self::$conn; // on retourne la valeur de cette propriété
            }
        }
     
    }
    ?>

  5. #5
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    La chaîne de connexion est correcte puisque si je modifie une valeur (par exemple $username), j'ai mon exception qui s'affiche.

    Par contre un var_dump($db) me renvoi ceci :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
     object(PDO)#2 (0) { }
    Le problème vient de là car une valeur doit être retournée.

  6. #6
    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
    Salut,

    ce code est correct mais ne répond pas au besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static function getBDD() {
            if (!isset(self::$conn)) { // on teste si l'instance est unique (donc qu'elle n'existe pas encore)
                new DBConnect; // ... on crée un nouvel objet de la classe
                return self::$conn; // on retourne la valeur de cette propriété
            }
    }
    Tu devrais mieux présenter afin d'en faciliter la lecture et le débogage.
    Dans ce bout de code tu ne retournes une instance PDO que quand elle n'est pas définie et rien quand PDO est défini
    plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static function getBDD() 
    {
        if ( ! isset(self::$conn)) 
        { 
            new DBConnect();
        }
     
        return self::$conn;
    }

  7. #7
    Membre éprouvé
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 630
    Points : 1 029
    Points
    1 029
    Par défaut
    [Résolu]
    Merci pour ta réponse rawsrc; en effet en indentant le code en si retrouve mieux pour le debogage.

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

Discussions similaires

  1. [PDO] Utilisation de PDO dans une classe
    Par arthuro45 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 19/04/2012, 13h54
  2. Réponses: 3
    Dernier message: 23/08/2011, 15h55
  3. Méthode non-statique dans un contexte statique : erreur de compilation
    Par endreillie dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 15/01/2011, 14h36
  4. [Talend] - Utilisation d'une variable de context dans un tPostgresqlInput
    Par lolotte35 dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 07/11/2007, 15h17
  5. [FAQ][Classpath]Charger ressource dans contexte statique ?
    Par Pill_S dans le forum Général Java
    Réponses: 3
    Dernier message: 14/10/2004, 16h52

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