Singleton de connexion PDO

Download Report

Transcript Singleton de connexion PDO

Bases de données
Singleton pour la connexion
Jérôme CUTRONA
[email protected]
07:07:19
Programmation Web 2013-2014
1
PROBLÉMATIQUE
07:07:19
Programmation Web 2013-2014
2
Problème posé
 Développement d'un site nécessitant une BD :



Connexion en début de chaque page PHP
Requête(s)
Déconnexion en fin de chaque page PHP
 Développement objet d'un site avec une BD :



Connexions à divers endroits dans les méthodes
Requête(s) à divers endroits dans les méthodes
Déconnexion en fin de page PHP à prévoir
 Quand doit-on se connecter, se déconnecter ?
07:07:19
Programmation Web 2013-2014
3
SOLUTION CLASSIQUE :
SINGLETON
07:07:19
Programmation Web 2013-2014
4
Solution : Singleton
 Singleton : objet à instance unique

Instance unique => connexion unique
 Réalisation :

1 attribut statique
 Instance du Singleton

1 point d'accès
 méthode statique, gère l’unicité de l’instance

limiter l'accès au constructeur
 privé / protégé

07:07:19
interdire le clonage
Programmation Web 2013-2014
5
Solution : Singleton
 Adaptation à la connexion BD PDO : myPDO

1 attribut statique
 _PDOInstance, instance de PDO

1 point d'accès
 Méthode statique getInstance()
 Instanciation PDO si nécessaire => connexion

constructeur privé
 Interdire la construction

destructeur
 termine la connexion à la BD

mise hors service de la méthode __clone
 throw new Exception("…") ;
07:07:19
Programmation Web 2013-2014
6
Durée de vie de l'objet myPDO
 Nature de l'objet

membre statique d'une classe : variable globale
 Construction

créé au premier appel de myPDO::getInstance()
 Destruction


variable globale : durée de vie = le script
détruit en fin de script
 Bilan



07:07:19
connexion lors de la première requête
déconnexion à la fin du script
propre, transparent pour le développeur
Programmation Web 2013-2014
7
IMPLÉMENTATION
07:07:19
Programmation Web 2013-2014
8
Une implémentation
<?php
final class myPDO {
private static $_PDOInstance
private
private
private
private
= null ;
static $_DSN
= null ;
static $_username
= null ;
static $_password
= null ;
static $_driverOptions = array(
PDO::ATTR_ERRMODE
=> PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE
=> PDO::FETCH_ASSOC
) ;
07:07:19
Programmation Web 2013-2014
9
Une implémentation
public static function getInstance() {
if (is_null(self::$_PDOInstance)) {
if (self::hasConfiguration()) {
self::$_PDOInstance
= new PDO(self::$_DSN, self::$_username,
self::$_password, self::$_driverOptions) ;
}
else {
throw new Exception(
__CLASS__ . ": Configuration not set") ;
}
}
return self::$_PDOInstance ;
}
07:07:19
Programmation Web 2013-2014
10
Une implémentation
private function __construct() {
}
private function __destruct() {
if (!is_null(self::$_PDOInstance)) {
self::$_PDOInstance = null ;
}
}
public function __clone() {
throw new Exception("Clonage interdit") ;
}
07:07:19
Programmation Web 2013-2014
11
GESTION DES PARAMÈTRES DE
CONFIGURATION
07:07:19
Programmation Web 2013-2014
12
Une implémentation
public static function setConfiguration(
$dsn, $username='', $password='',
$driver_options=array()) {
self::$_DSN
= $dsn ;
self::$_username
= $username ;
self::$_password
= $password ;
self::$_driverOptions =
$driver_options
+ self::$_driverOptions ;
}
private static function hasConfiguration() {
return self::$_DSN !== null ;
}
07:07:19
Programmation Web 2013-2014
13
UTILISATION
07:07:19
Programmation Web 2013-2014
14
Utilisation
require_once "mypdo.class.php" ;
myPDO::setConfiguration(
'mysql:host=mysql;dbname=my_db;charset=utf8',
'my_login', 'my_password') ;
$pdo = myPDO::getInstance() ;
$stmt = $pdo->prepare(<<<SQL
SELECT id
FROM a_table
SQL
) ;
$stmt->execute() ;
while (($ligne = $stmt->fetch()) !== false)
echo "<p>" . $ligne['id'] . "\n" ;
// Déconnexion automatique en fin de script
Simple, non ?
07:07:19
Programmation Web 2013-2014
15
Utilisation
require_once "mypdo.class.php" ;
myPDO::setConfiguration(
'mysql:host=mysql;dbname=my_db;charset=utf8',
'my_login', 'my_password') ;
$pdo = myPDO::getInstance() ;
$stmt = $pdo->prepare(<<<SQL
Laid
configuration ne doit pas se trouver
SELECT
dans chaque fichier nécessitant un
FROM a_table
accès à la base de données
SQL
) ;
$stmt->execute() ;
while (($ligne = $stmt->fetch()) !== false)
echo "<p>" . $ligne['id'] . "\n" ;
// Déconnexion automatique en fin de script
07:07:19
Programmation Web 2013-2014
16
Utilisation
require_once "mypdo.class.php" ;
myPDO::setConfiguration(
'mysql:host=mysql;dbname=my_db;charset=utf8',
'my_login', 'my_password') ;
require_once "my_db.mypdo.class.php" ;
$pdo = myPDO::getInstance() ;
$stmt = $pdo->prepare(<<<SQL
SELECT id
FROM a_table
SQL
) ;
…
07:07:19
Programmation Web 2013-2014
17