Connexion PDO. construct, ou singleton ?

Connexion PDO. construct, ou singleton ? - PHP - Programmation

Marsh Posté le 28-05-2015 à 15:14:16    

Bonjour,
je suis débutant en POO.
j'aurai une question SVP.
Pour une classe connexion avec la BDD, est-ce mieux de le faire avec un constructeur, ou avec un singleton?
Voici mes 2 codes, je ne sais pas le quel choisir. Svp, je souhaiterai savoir, lequel des 2 fait le + pro, et le + performant.
 
Singleton:

Code :
  1. <?php
  2. class DB
  3. {
  4.     private static $_bdd;
  5.     private static $_Host = 'localhost';
  6.     private static $_DbName = 'cms';
  7.     private static $_Pseudo = 'root';
  8.     private static $_Mdp = '';
  9.     public static function getDB() {
  10.         if(is_null(self::$_bdd)) {
  11.             try {   
  12.                 self::$_bdd = new PDO('mysql:host='.self::$_Host.';charset=utf8;dbname='.self::$_DbName, self::$_Pseudo, self::$_Mdp);
  13.             }
  14.             catch(PDOException $e) {
  15.                 die('<h3>Une erreur est survenue lors du chargement de la page. Veuillez essayer d\'actualiser la page, ou revenir plus tard. Merci.</h3>');
  16.             }
  17.         }   // END if_null
  18.         return self::$_bdd;
  19.     }
  20. }   // END class
  21. ?>


 
Ou Constructeur:
 

Code :
  1. <?php
  2. class Db
  3. {
  4. private $host = 'localhost';
  5. private $name = 'ecommerce';
  6. private $user = 'root';
  7. private $pass = '';
  8. private $connexion;
  9. public function __construct($host=NULL, $name=NULL, $user=NULL, $pass=NULL) {
  10.  if($host != NULL) {
  11.   $this->host = $host;
  12.   $this->name = $name;
  13.   $this->user = $user;
  14.   $this->pass = $pass;
  15.  }
  16.  try {
  17.   $this->connexion = new PDO('mysql:host='.$this->host.';dbname='.$this->name,
  18.    $this->user,$this->pass, array(
  19.     PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8',
  20.     PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING
  21.     ));
  22.  }
  23.  catch(PDOException $e) {
  24.   die('Erreur de connection');
  25.  }
  26. // END __construct
  27. } // END class
  28. ?>


 
Merci beaucoup.


Message édité par 13stephweb13 le 28-05-2015 à 15:15:45
Reply

Marsh Posté le 28-05-2015 à 15:14:16   

Reply

Marsh Posté le 29-05-2015 à 22:53:12    

Bonjour
Je te conseillerai plus le second, le fait de pouvoir passer les identifiants de connexion a la base de données te permettra de te connecter a plusieurs bases en même temps au besoin, ton premier code ne le permet pas
En plus, cela permet d'avoir d'un coté ta librairie et de l'autre coté tes identifiants, ton code sera plus réutilisable comme ca

Reply

Marsh Posté le 04-06-2015 à 15:12:25    

Par contre, le  
 

Code :
  1. catch(PDOException $e) {
  2.  die('Erreur de connection');
  3. }


 
c'est pas "pro" du tout... La fonction die/exit arrête l'exécution du script PHP à l'endroit où elle est appelée et finalise la réponse au navigateur en l'état. Donc l'utilisateur final obtiendra le message non formaté 'Erreur de connection' (avec la faute d’orthographe connection/connexion avec un style plus ou moins abouti en fonction de ce qui a été construit.
 
Dans le cas d'une classe technique, elle devrait émettre ses propres exceptions, c'est-à-dire faire un throw avec une exception personnalisée et tu devrais implémenter un gestionnaire d'exception global à l'application ( set_exception_handler et set_error_handler) qui inscrit des détails de l'exception dans un fichier puis affiche un message général à l'utilisateur (eg "Une erreur technique est survenue, veuillez contacter..." ) ou redirige vers une page d'erreur.

Reply

Marsh Posté le 04-06-2015 à 22:04:19    

La 1ère.
T'as une instance unique accessible de partout, alors qu'une instance "standard", tu ne l'as accessible que dans le contexte aval à ton instanciation.
Si tu as plusieurs BDD a attaquer, fais plusieurs instance de PDO dans le même singleton.
Avec plus de recul, si tu te pose cette question, c'est qu'il te manque de la pratique en POO.


---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 04-06-2015 à 22:13:50    

Ok, merci pour les conseils. j'ai débuté le PHP fin février 2015, donc effectivement il me manque de la pratique.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed