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 :

Impossible de créer un objet de connexion à ma BD (erreur 500)


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut Impossible de créer un objet de connexion à ma BD (erreur 500)
    Bonjour tout le monde,

    J'ai des soucis pour créer un objet de connexion à ma BD :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php
    //inclut l'auto-loader.
    require("auto_loader/auto_loader.php");
     
    $db = new DatabaseConnection();
    $db->getInstance();
     
    ?>
    J'obtiens ce message d'erreur :

    "NetworkError: 500 Internal Server Error - http://localhost:8888/imaginatiff/reservations/PHP/enregistrement_utilisateurs.php"
    Mon auto-loader fonctionne car j'ai testé la valeur de $class, cela m'affiche bien le nom de la classe. Voici le code au cas où... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
     
       //fonction anonyme en php qui sert d'auto-loader.
       spl_autoload_register(function ($class) 
        {
           include 'class/' . $class . '.class.php';
         }
         );
    ?>
    Voici le code de ma classe (j'ai ajouté le port 8889 car je suis sous mac) :

    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
     
    <?php  
    class DatabaseConnection
    {
        private static $_instance = null;
     
        private $_host;
     
        private $_port;
     
        private $_user;
     
        private $_password;
     
        private $_dbname;
     
        private $_handle;
     
     
     
        private function __construct($dbname = 'imaginatiff')
        {
            $this->_host     = 'localhost';
     
            $this->_port = 8889;
     
            $this->_user     = 'root';
     
            $this->_password = 'root';
     
            $this->_dbname   = $dbname;
     
            $this->_handle   = null;
     
            try
            {
     
                $this->_handle = new PDO("mysql:host=$this->_host;port=$this->_port;dbname=$this->_dbname", $this->_user, $this->_password);
     
                $this->_handle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     
                echo 'Connection established and database "' . $this->_dbname . '" selected.';
     
            }
            catch (PDOException $e)
            {
     
                die('Connection failed or database cannot be selected : ' . $e->getMessage());
            }
        }
     
        //empêche l'objet d'être cloné
        private function __clone ()
        {
        }
     
        //singleton
        public static function getInstance()
        {
            if (is_null(self::$_instance))
            {
                self::$_instance = new self();
            }
     
            return self::$_instance;
        }
     
        public function handle()
     
        {
            return $this->_handle;
        }
    }
    Je devrais obtenir le message d'erreur grâce au die ?

    La seule chose que j'obtiens dans l'alerte de l'erreur ci-dessous est null :

    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
    $(document).ready(function()
    {
          $('#btn_enregistrement').click(function(){
                var valeurs = $("#form_enregistrement").serialize();
                $.ajax({
                            type: 'POST',
                            url: 'PHP/enregistrement_utilisateurs.php',
                            dataTpye: 'text',
                            data: valeurs,
                            success:function(retour)
                            {
                                  alert(retour);
                            },
                            error:function(retour)
                            {
                                  var obj = jQuery.parseJSON(retour);
                                  alert(obj);
                            }
                       }
                      )
     
     
          });
    });
    Merci d'avance pour votre aide.

    bee

  2. #2
    Membre très actif
    Avatar de Gecko
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Décembre 2008
    Messages
    499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Décembre 2008
    Messages : 499
    Par défaut
    Comme dit sur le chat ton singleton est invalide, pas sur que mon script puisse prendre en charge plusieurs bases, à toi de voir comment arranger ça

    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
    class DB extends PDO {
        private static $_instance = null;
        private $_host 'localhost';
        private $_port = 8889;
        private $_user = 'root';
        private $_password = 'root';
        protected $_dbname;
     
        public function __construct();
     
        public static function getInstance($dbname = 'imaginatiff') {
            if (is_null(self::$_instance)) {
                try {
                    self::$_instance = new PDO('mysql:host='.$this->_host.';port='.$this->_port.';dbname='.$this->_dbname, $this->_user, $this->_password);
                    self::$_instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                    echo 'Connection established and database "' . $this->_dbname . '" selected.';
                } catch (PDOException $e) {
                    throw new Exception('Connection failed or database cannot be selected : ' . $e->getMessage());
                }
                self::$_instance = new self();
            }
            return self::$_instance;
        }
        public function __construct() {
     
        }
     
        private function __clone () { }
     
        public function __destruct() {
            self::$_instance = null;
        }
    }

    Pour l'utilisation, $db deviens un objet qui accède aux méthodes de PDO, ce qui donne ceci :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $db = DB::getInstance();
    $db->query('select toto from tata where tonton = 1');

  3. #3
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Merci pour ton aide sur le chat Gecko.

    Voici ton code corrigé (cela pourrait servir pour quelqu'un d'autre) :

    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
     
     
    <?php
    class DB extends PDO
    {
        private static $_instance = null;
        private static $_port = '8889';
        private static $_host = 'localhost';
        private static $_user = 'root';
        private static $_password = 'root';
        protected static $_dbname;
     
        public static function getInstance($dbname = 'imaginatiff')
        {
            if (is_null(self::$_instance))
            {
                try
                {
                    self::$_instance = new PDO('mysql:host='.self::$_host.';port='.self::$_port.';dbname='.self::$_dbname, self::$_user, self::$_password);
                    self::$_instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                    echo 'Connection established and database "' . self::$_dbname . '" selected.';
                }
                catch (PDOException $e)
                {
                    throw new Exception('Connection failed or database cannot be selected : ' . $e->getMessage());
                }
                self::$_instance = new self();
            }
            return self::$_instance;
        }
        public function __construct()
        {
     
        }
     
        private function __clone () { }
     
        public function __destruct()
        {
            self::$_instance = null;
        }
    }
    ?>
    maintenant, j'ai corrigé ma version et j'ai trouvé le problème.

    Le constructeur était private, il ne pouvait donc pas être atteint !

    Ma version corrigée :

    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
     
    <?php  
    class DB
    {
        private static $_instance = null;
     
        private $_host;
     
        private $_port;
     
        private $_user;
     
        private $_password;
     
        private $_dbname;
     
        private $_handle;
     
     
     
        public function __construct($dbname = 'imaginatiff')
        {
            $this->_host     = 'localhost';
     
            $this->_port = 8889;
     
            $this->_user     = 'root';
     
            $this->_password = 'root';
     
            $this->_dbname   = $dbname;
     
            $this->_handle   = null;
     
            try
            {
     
                $this->_handle = new PDO("mysql:host=$this->_host;port=$this->_port;dbname=$this->_dbname", $this->_user, $this->_password);
     
                $this->_handle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     
                echo 'Connection established and database "' . $this->_dbname . '" selected.';
     
            }
            catch (PDOException $e)
            {
     
                die('Connection failed or database cannot be selected : ' . $e->getMessage());
            }
        }
     
        //empêche l'objet d'être cloné
        private function __clone ()
        {
        }
     
        //singleton
        public static function getInstance()
        {
            if (is_null(self::$_instance))
            {
                self::$_instance = new self();
            }
     
            return self::$_instance;
        }
     
        public function handle()
     
        {
            return $this->_handle;
        }
    }
    Question pour tout le monde :

    Est-ce que les deux versions de ce code se valent où bien l'une ou l'autre est meilleure et pourquoi ?

    Merci d'avance.

    bee

  4. #4
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    En principe, pour un singleton, le constructeur doit être private. C'est la static méthode getInstance qui doit être public pour récupérer l'instance en cours s'il existe sinon il va appeler le constructeur.

    A+.

Discussions similaires

  1. [Admin] [BO XI] Impossible de créer ou modifier une connexion partagée
    Par Jodie dans le forum Administration-Migration
    Réponses: 3
    Dernier message: 02/11/2010, 14h21
  2. ActivexDirectory impossible de créer un objet
    Par xdiexid dans le forum Microsoft Dynamics CRM
    Réponses: 2
    Dernier message: 15/06/2010, 12h09
  3. [GD] Impossible de créer un objet DateTime
    Par gege2061 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 28/08/2007, 14h16
  4. Réponses: 8
    Dernier message: 14/01/2005, 09h06
  5. [ADO] [DLL] Impossible de créer la connexion...
    Par Le Lézard dans le forum Bases de données
    Réponses: 7
    Dernier message: 13/09/2004, 14h16

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