Connexion POO

Bonjour,
J'ai créé un site vraiment traditionnel (procédural), mais je souhaite passer à la Programmation Orienté Objet.
Ma première class que je dois créé c'est la connexion à ma BDD.
Sur le net il y en a énormément je suis un peu perdu.
Voilà ce que j'ai trouvé, pouvez-vous me dire si ça pourrais convenir ou si vous avez peut-être une class qui serai mieux adaptée.
Merci énormément
<?php
class Config {
    /* DATABASE CONFIGURATION */
    const HOTE      = 'localhost';
    const DBNAME    = 'monsite';
    const USERNAME  = 'root';
    const PASSWORD  = '';
}
?>

<?php
class Database extends PDO {

    public function __construct() {
        try {
            parent::__construct('mysql:host=' . Config::HOTE . ';dbname=' . Config::DBNAME, Config::USERNAME, Config::PASSWORD);

            $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
        } catch(Exception $e) {
            echo 'Impossible de se connecter à la base de donnée</br>';
            echo 'Erreur : ' .  $e->getMessage() . '<br />';
            echo 'N° : ' .      $e->getCode();
        }
    }
}
?>

5 réponses

  1. Bonjour

    Alors voilà j'ai trouvé pour une connexion à ma BDD cette class.
    Pour moi elle est très compréhensible dites-moi si je peux l'utiliser telle quelle s'ils vous plait.
    En vous remerciant
    class connexion {
    
        private static $instance;
        private $type = "mysql";
        private $host = "localhost";
        private $dbname = "monsite";
        private $username = "root";
        private $password = '';
    
        private $dbh;
    
        /*** Lance la connexion à la base de donnée en le mettant * dans un objet PDO qui est stocké dans la variable $dbh * @access private */
        private function __construct() {
            try {
                $this->dbh = new PDO (
                    $this->type.':host='.$this->host.'; dbname='.$this->dbname, 
                    $this->username, 
                    $this->password,
                    array(PDO::ATTR_PERSISTENT => true)
                );
    
                    $req = "SET NAMES UTF8";
                    $result = $this->dbh->prepare($req);
                    $result->execute();
            }
            catch(PDOException $e) {
                echo "<div class='error'>Erreur !: ".$e->getMessage()."</div>";
                die();
            }
        }
    
        /*** Regarde si un objet connexion a déjà été instancier, * si c'est le cas alors il retourne l'objet déjà existant * sinon il en créer un autre. * @return $instance */
        public static function getInstance() {
            if (!self::$instance instanceof self) {
                self::$instance = new self;
            }
            return self::$instance;
        }
    
        /*** Permet de récuprer l'objet PDO permettant de manipuler la base de donnée * @return $dbh */
        public function getDbh() {
            return $this->dbh;
        }
    }
    ?>
    
    1. Bonjour
      Je voudrais vous demander si cette connexion pour ma BDD serait-elle bien adaptée.
      Merci de votre avis.
      <?php
      class SPDO {
          private $PDOInstance = null;
          private static $instance = null;
      
              const DEFAULT_SQL_USER  = 'root';
              const DEFAULT_SQL_HOST  = 'localhost';
              const DEFAULT_SQL_PASS  = '';
              const DEFAULT_SQL_DTB   = 'monsite';
      
          private function __construct() {
              $this->PDOInstance = new PDO('mysql:dbname='.self::DEFAULT_SQL_DTB.';host='.self::DEFAULT_SQL_HOST,self::DEFAULT_SQL_USER ,self::DEFAULT_SQL_PASS);
          }
      
          public static function getInstance() {
              if(is_null(self::$instance)) {
                  self::$instance = new SPDO();
              }
              return self::$instance;
          }
      
          public function query($query) {
              return $this->PDOInstance->query($query);
          }
      }
      
      1. Salut,

        Si tu souhaites utiliser une classe qui étend PDO, il faut que celle-ci te retourne l'instance PDO pour pouvoir utiliser les méthodes query, prepare, etc sur cette instance.

        Souvent on utilise également le pattern singleton pour ne récupérer qu'une seule instance de PDO à chaque appel de la classe (pour ne faire la connexion qu'une seule fois).

        Tu peux trouver un exemple ici : https://apprendre-php.com/tutoriels/tutoriel-47-classe-singleton-d-accs-aux-sgbd-intgrant-pdo.html

        Bonne journée
        1. Bonjour
          Je me suis mal expliqué chacune des 2 class sont dans deux pages différentes en fait.
          1. Ok, dans tout les cas, ce que je t'ai mit est le mieux adapté, même si t'es codes sont censé fonctionner ça ne respecte pas les normes.
        2. Salut,

          C'est pas comme ça qu'on fait, et on déclare pas deux page php dans la même page !

          D'ailleurs la POO n'est pas propre à PHP, tu confonds avec PDO, la POO s'applique à un ensemble de language qui est orientée objet.

          Voila une déclaration de connexion en PDO avec déclaration d'erreur au besoin :

          <?php
          try {
              $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
              foreach($dbh->query('SELECT * from FOO') as $row) {
                  print_r($row);
              }
              $dbh = null;
          } catch (PDOException $e) {
              print "Erreur !: " . $e->getMessage() . "<br/>";
              die();
          }
          ?>


          Et pour fermer la connexion tu ajoute en fin de page de t'es requete un simple "null", comme ceci :

          $dbh = null;


          Je te conseil vivement d'aller voir le maneul PHP et de connaitre l'utilité et la méthodologie de l'orientée objet, et après tu ira voir l'utilité d'un framework, car ici c'est que du "brut" ^^