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 :

Class accès BD : Call to undefined method db::query() [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut Class accès BD : Call to undefined method db::query()
    Bonjour,

    j'ai une fonction que je souhaite transformer en classe (c'est la première)
    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
    function libatt($table,$pdo) {
            $sql = "select Att_Lib as lib from attribut where Att_Table = '$table' order by Att_ordre";
            try {
                $result = $pdo->query($sql);
                $nblg=$result->rowCount();   
            }
            catch (PDOException $e)
            {
                $error = 'Erreur Recup liste attribut : '.$table . $e->getMessage();
                include '../include/error.php.html';
                exit();
            }
            if ($nblg == 0) { $lib= ''; }
            else { 
                foreach ($result as $row)
                {
                    $lib[]=$row['lib'];
                }
            }
            return $lib;
    }
    Elle fonctionne parfaitement, le $pdo = new PDO($ConnexionString, $username,$password);.

    J'ai donc créer une classe (merci a ceux qui m'on aider avec les $this)
    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
    class db {
        private $pdo;
        private $instance=null;
        private $options = array(PDO::MYSQL_ATTR_INIT_COMMAND    => "SET NAMES utf8" );
        private $host = 'localhost';
        private $db_name = 't2i_erp';
        private $user = 'root';
        private $pass ='';    
        private $dns = '';
     
        public function __construct() {
            try {
                $this->dns = "mysql:host=$this->host;dbname=$this->db_name";
                $this->instance = new PDO($this->dns,  $this->user,  $this->pass,  $this->options);
                $this->instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            }
            catch (PDOException $e)
            {
                $error='Impossible de se connecter à la base de donnée '.$e->getMessage(). '. '.  $dns.'. '.  $this->user.'. '.  $this->pass;
                include'error.php.html';
                exit();
            }
        }
     
        public function getinstance() {
            return $this->instance;
        }
    }
    J'ai fait un test avec $npdo=newdb();.

    Maintenant pour transformer ma fonction en class
    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
    class attribut {
        protected $db;
        var $lib =null;
     
        function __construct($db=null) {
            if ($db == null) { 
                $this->db = new db();
                $this->db->getinstance();
            } 
            else { 
                $this->db = $db;
            }
        }
        public function libatt($table) {
            $sql = "select Att_Lib as lib from attribut where Att_Table = $table order by Att_ordre";
            try {
                $result = $this->db->query($sql);
                $nblg=$result->rowCount();   
            }
            catch (PDOException $e)
            {
                $error = 'Erreur Recup liste attribut : '.$table . $e->getMessage();
                include '../../include/error.php.html';
                exit();
            }
            if ($nblg == 0) { $this->lib= ''; }
            else { 
                foreach ($result as $row)
                {
                    $this->lib[]=$row['lib'];
                }
            }
            return $this->lib;
        }
    }
    et cela plante sur la ligne $result = $this->db->query($sql);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $attlib=new attribut();
    $ltype = $attlib->libatt('contrat');
    avec le message
    Call to undefined method db::query()
    comme si mon db n'était pas un object de type PDO.

    Merci pour votre aide.

  2. #2
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    A mon avis l'erreur serait que tu n'aurais pas inclus le fichier contenant le code de ta classe db, du coup la propriété db de la classe attribut aurait comme valeur NULL.

    Juste pour tester ça, suffit d'afficher la valeur de db, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $attlib = new attribut();
    var_dump($attlib->db);
    Par ailleurs, tu devrais consulter le forum PDO, et rechercher des exemples de code (tu en trouveras c'est certain) sur le comment créer un singleton avec PDO.
    A mon sens ce sera plus pratique, mais surtout je ne serais pas étonné que cela correspondrait mieux à ce que tu compte faire.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Bonjour,

    Comme je ne sais pas ce que c'est un singleton PDO, j'aurais du mal a savoir de quoi tu parle.

    J'ai fait une recherche sur internet et j'ai trouvé les exemples suivants dont je me suis inspiré :
    http://codereview.stackexchange.com/...fety-and-logic
    http://stackoverflow.com/questions/1...across-classes
    http://stackoverflow.com/questions/2...pdo-in-classes
    http://www.atelierphp.net/commons/sh...db_lecture.php

    Mon besoin est "simple", je veux créer un class db pour la connexion et ensuite faire une class par objet (table mysql). Et donc ne plus avoir le $pdo dans les appels de fonctions (entre autre).

    Je n'ai peut être pas pris les bons exemples, mais j'ai eu beaucoup de mal a trouvé des exemples qui correspond à mon besoin (ou j'ai pas fait la bonne recherche google). Je passe mon temps sur Google depuis 1 mois que j'ai débuté.

    pour finir var_dump($attlib->db)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Cannot access protected property attribut::$db
    merci

    J'ai modifié protected en public et j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    object(db)[5]
      private 'pdo' => null
      private 'instance' => 
        object(PDO)[6]
      private 'options' => 
        array (size=1)
          1002 => string 'SET NAMES utf8' (length=14)
      private 'host' => string 'localhost' (length=9)
      private 'db_name' => string '_erp' (length=7)
      private 'user' => string 'root' (length=4)
      private 'pass' => string '' (length=0)
      private 'dns' => string 'mysql:host=localhost;dbname=_erp' (length=35)

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 219
    Points : 121
    Points
    121
    Par défaut
    Merci beaucoup,

    c'est le mot singleton qu'il me manquait !!!

    en fait j'avais une double erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class db {
    ....
        public $instance=null;
    ...
    au lieu de private initialement, et ensuite dans la class attribut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    try {
                $result = $this->db->instance->query($sql);
    Et donc maintenant cela semble fonctionner

    Info trouvée sur un autre site.

    Merci à toi

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

Discussions similaires

  1. [1.x] Call to undefined method après modification Product.class.php
    Par kira-sama dans le forum Symfony
    Réponses: 1
    Dernier message: 13/08/2013, 16h59
  2. [1.x] Call to undefined method CommandeForm::save()
    Par sacricri dans le forum Symfony
    Réponses: 5
    Dernier message: 09/01/2010, 16h24
  3. [PDO] Call to undefined method PDOStatement::lastinsertid()
    Par megacool dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/10/2008, 15h32
  4. [Artichow] Call to undefined method Graph::getDrawer()
    Par belocom dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 17/04/2008, 22h56
  5. Réponses: 0
    Dernier message: 25/02/2008, 17h28

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