Retourner une connexion BDD

xDDx
Invité n'ayant pas de compte PHPfrance

26 févr. 2013, 12:39

Bonjour,

Dans un fichier je me connecte à l'aide de PDO, le problème c'est que je ne sais pas si la connexion se fait car aucun de mes echo ne s'affichent. Le but, est d'inclure le fichier contenant cette connexion dans les autres fichiers qui en auraient besoin (car j'applique la méthode MVC).

Voici le contenu, censé retourner une connexion PDO :
<?php

class ConnexionPDO extends PDO
{
	private $_db;

	public function __construct()
	{
		try
		{
			$this->_db = new PDO('mysql:host=HOST;dbname=DBNAME' , 'USER' , 'MDP');
			return $this->_db;               
		} 
		catch (Exception $e) 
		{
			echo '<meta charset="utf-8" />';
			echo 'Une erreur à la connexion PDO s`est produite, ligne <strong>'. $e->getLine() .'</strong>.
                                Le message d`erreur est le suivant : <strong>'. $e->getMessage() .'</strong>';
		}
	}
}

?>
Pourriez-vous me dire si mon code comporte une erreur ?

Par la suite, j'inclus cette classe dans mes fichiers "contrôleurs" et je l'instancie ce qui me permettrait d'obtenir une connexion.

Merci d'avance.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

26 févr. 2013, 14:38

salut,

pourquoi étendre PDO vu l'utilisation ?
tu n'utilise pas _db, pas de surcharge des méthodes etc etc

bref pour moi inutile.

Le fait d'applique le pattern MVC n'implique pas de faire ce que tu fait.

Par contre il existe une "bonne pratique" nommée : injection de dépendance, qui correspond à ce que tu veux faire.

donc en gros tu instancie une connexion (ou plusieurs suivant les besoins) dans le contrôleur et tu la fournis aux classes que tu appelle (constructeur ou setter).

par exemple
<?php

class controleur {
	private $instancePDO;
	private $erreur;
	
	public function __construct() {
		try{
			$this->instancePDO = new PDO('mysql:host=HOST;dbname=DBNAME' , 'USER' , 'MDP');              
		} 
		catch (Exception $e) {
		
		$this->erreur = 'Une erreur à la connexion PDO s`est produite, ligne <strong>'. $e->getLine() .'</strong>.
						Le message d`erreur est le suivant : <strong>'. $e->getMessage() .'</strong>';
		}
	}
	
	public function getError() {
		return $this->erreur;
	}
	/**
	 * Une méthode pour une page
	 */

	public function afficheListTruc(){
		$trucDao = new trucDao($this->instancePDO);
		return $trucDao->methodeMachin();
	}
}


// la classe trucDao

class trucDao{
	private $sgbd;
	public function __construct(PDO $pdo) {
		if ($pdo !== null) {
			$this->sgbd = $pdo;
		} 
		else {
			throw new Exception('oups boulette faut un objet PDO :) ');
		}
	}
	
	public function methodeMachin() {
		return '';
	}
}
dans ce cas tu fait de l'injection de dépendance sur trucDao.

l'objet que tu passe sera le même pour toutes les méthodes.

L'avantage c'est que tu ne t'emmerde pas a inclure un fichier ou utiliser une classe de plus qui t'apporte de la complexité et peux être des emmerdes :)

Si tu veux faire un truc chiadé tu peux très bien créer une interface que toute les classes DAO devront implémenter pour être certain d'avoir un constructeur respectant le motif indiqué (enfin dans la théorie, dans la pratique php n'est pas trop regardant mais le principe est la).


@+
Il en faut peu pour être heureux ......

xDDx
Invité n'ayant pas de compte PHPfrance

26 févr. 2013, 15:44

Bonjour,

Je vous remercie, j'ai mis un peu de temps à comprendre mais je pense avoir saisi.
Je vous tiens au courant.