La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Jérôme CUTRONA 11:51:49 Programmation Web 2012-2013 1 Bases de données Objet singleton pour la connexion.

Présentations similaires


Présentation au sujet: "Jérôme CUTRONA 11:51:49 Programmation Web 2012-2013 1 Bases de données Objet singleton pour la connexion."— Transcription de la présentation:

1 Jérôme CUTRONA 11:51:49 Programmation Web Bases de données Objet singleton pour la connexion

2 211:51:49Programmation Web Problème posé Développement d'un site nécessitant une BD : Développement d'un site nécessitant une BD : Connexion en début de chaque page PHP Connexion en début de chaque page PHP Requête(s) Requête(s) Déconnexion en fin de programme PHP Déconnexion en fin de programme PHP Développement objet d'un site avec une BD : Développement objet d'un site avec une BD : Connexion dès que la BD est utilisée Connexion dès que la BD est utilisée Requête(s) à divers endroits dans les diverses méthodes des diverses classes Requête(s) à divers endroits dans les diverses méthodes des diverses classes Déconnexion quand la BD nest plus utile Déconnexion quand la BD nest plus utile Quand doit-on se connecter, se déconnecter ? Quand doit-on se connecter, se déconnecter ?

3 311:51:49Programmation Web Solution : patron de conception Singleton Singleton : objet à instance unique Instance unique pour gérer une connexion BD unique Singleton : objet à instance unique Instance unique pour gérer une connexion BD unique Réalisation : Réalisation : 1 attribut statique 1 attribut statique Instance Instance 1 point d'accès 1 point d'accès méthode statique méthode statique limiter l'accès au constructeur limiter l'accès au constructeur privé / protégé privé / protégé interdire le clonage interdire le clonage

4 Singleton : Illustration du fonctionnement 411:51:49Programmation Web attr = "ours" ; public $attr = null ; public static function getInstance() { if (!self::$_instance instanceof self) { self::$_instance = new self() ; } return self::$_instance ; } } $i1 = Singleton::getInstance() ; $i2 = Singleton::getInstance() ; $i3 = Singleton::getInstance() ; $i1->attr = "ours" ; $i3->attr = 42 ; echo $i2->attr ; Classe Singleton getInstance() $_instance Instance Singleton $attr $i1 $i2 $i3 null null "ours" 42

5 511:51:49Programmation Web Solution : patron de conception Singleton Adaptation à la connexion BD : Connexion Adaptation à la connexion BD : Connexion 1 attribut statique 1 attribut statique instance instance 1 attribut de linstance 1 attribut de linstance Ressource BD Ressource BD 1 point d'accès 1 point d'accès Méthode statique requete Méthode statique requete constructeur privé constructeur privé établit la connexion à la BD établit la connexion à la BD destructeur destructeur termine la connexion à la BD termine la connexion à la BD mise hors service de la méthode __clone mise hors service de la méthode __clone private ET throw new Exception("…") ; private ET throw new Exception("…") ;

6 611:51:49Programmation Web Durée de vie de l'objet Connexion Nature de l'objet Nature de l'objet membre statique d'une classe variable globale membre statique d'une classe variable globale Construction Construction créé au premier appel de Connexion::requete() créé au premier appel de Connexion::requete() Destruction Destruction variable globale : durée de vie = le programme variable globale : durée de vie = le programme détruit automatiquement en fin de script détruit automatiquement en fin de script Bilan : Bilan : connexion automatique lors de la première requête connexion automatique lors de la première requête déconnexion automatique à la fin du script déconnexion automatique à la fin du script facile, propre et transparent pour le développeur facile, propre et transparent pour le développeur

7 711:51:49Programmation Web Raffinement possible : Débogage possibilité de collecter des messages informatifs pour se rendre compte de ce qu'il se passe et dépister les erreurs : possibilité de collecter des messages informatifs pour se rendre compte de ce qu'il se passe et dépister les erreurs : connexion… connexion… requête… requête… Cadre Web : Cadre Web : ne pas perturber la page : commentaires HTML ne pas perturber la page : commentaires HTML doit pouvoir être désactivé contenu des images doit pouvoir être désactivé contenu des images Implémentation : Implémentation : attribut booléen statique et méthodes statiques attribut booléen statique et méthodes statiques utilisation dun singleton de collecte dinformations utilisation dun singleton de collecte dinformations

8 811:51:49Programmation Web Une implémentation /// Singleton permettant d'effectuer une connexion unique à la BD class Connexion { // Paramètres de connexion à la base de données // Paramètres de connexion à la base de données private static $_host = null ; /// Hôte MySQL private static $_host = null ; /// Hôte MySQL private static $_user = null ; /// Utilisateur MySQL private static $_user = null ; /// Utilisateur MySQL private static $_passwd = null ; /// Mot de passe MySQL private static $_passwd = null ; /// Mot de passe MySQL private static $_base = null ; /// Base de données de travail private static $_base = null ; /// Base de données de travail // Gestion de l'instance unique // Gestion de l'instance unique private static $_instance = null ; /// Objet Connexion private static $_instance = null ; /// Objet Connexion // Traces d'exécution // Traces d'exécution private static $_traces = true ; /// Débogage actif ou non private static $_traces = true ; /// Débogage actif ou non // Attribut de l'objet : ressource de la connexion à la base de données // Attribut de l'objet : ressource de la connexion à la base de données private $_ressourceBD = null ; /// Connexion à la base private $_ressourceBD = null ; /// Connexion à la base

9 911:51:49Programmation Web Une implémentation /// Constructeur privé private function __construct() { self::msg("Construction de l'objet Connexion...") ; self::msg("Construction de l'objet Connexion...") ; // Vérifier la présence des paramètres de connexion // Vérifier la présence des paramètres de connexion if ( is_null(self::$_host) if ( is_null(self::$_host) || is_null(self::$_user) || is_null(self::$_user) || is_null(self::$_passwd) || is_null(self::$_passwd) || is_null(self::$_base)) || is_null(self::$_base)) throw new Exception("Connexion impossible : les paramètres de connexion sont absents") ; throw new Exception("Connexion impossible : les paramètres de connexion sont absents") ; // Etablir la connexion // Etablir la connexion if (! ($tmp if (! ($tmp self::$_user, self::$_passwd))) self::$_user, self::$_passwd))) throw new Exception("Connexion impossible à la base de données") ; throw new Exception("Connexion impossible à la base de données") ; $this->_ressourceBD = $tmp ; $this->_ressourceBD = $tmp ;

10 1011:51:49Programmation Web Une implémentation // Sélectionner la base de donnees // Sélectionner la base de donnees if if $this->_ressourceBD)) $this->_ressourceBD)) throw new Exception("Sélection de la base impossible : " throw new Exception("Sélection de la base impossible : ".mysql_error($this->_ressourceBD)) ;.mysql_error($this->_ressourceBD)) ; // Mise en place de la table de caractères // Mise en place de la table de caractères mysql_query("SET CHARACTER SET 'utf8'", mysql_query("SET CHARACTER SET 'utf8'", $this->_ressourceBD) ; $this->_ressourceBD) ; self::msg("Construction terminée") ; self::msg("Construction terminée") ;}

11 1111:51:49Programmation Web Une implémentation /// Destructeur public function __destruct() { self::msg( "Demande de destruction de l'objet Connexion..." ) ; self::msg( "Demande de destruction de l'objet Connexion..." ) ; // S'il y a une connexion établie... // S'il y a une connexion établie... if (!is_null($this->_ressourceBD)) { if (!is_null($this->_ressourceBD)) { //... il faut se déconnecter //... il faut se déconnecter self::msg("Demande de déconnexion...") ; self::msg("Demande de déconnexion...") ; mysql_close($this->_ressourceBD) ; mysql_close($this->_ressourceBD) ; $this->_ressourceBD = null ; $this->_ressourceBD = null ; self::$_instance = null ; self::$_instance = null ; self::msg("Déconnexion effectuée") ; self::msg("Déconnexion effectuée") ; } self::msg("Destruction terminée") ; self::msg("Destruction terminée") ; // Affichage des traces si le Débogage est actif // Affichage des traces si le Débogage est actif if (self::$_traces) { if (self::$_traces) { echo Traceur::affiche() ; echo Traceur::affiche() ; }}

12 1211:51:49Programmation Web Une implémentation /// Accesseur à l'instance qui sera créée si nécessaire private function donneInstance() { self::msg("Recherche de l'instance...") ; self::msg("Recherche de l'instance...") ; // Existe-t-il une instance de Connexion ? // Existe-t-il une instance de Connexion ? if (is_null(self::$_instance)) { if (is_null(self::$_instance)) { // NON : il faut en créer une // NON : il faut en créer une self::$_instance = new Connexion() ; self::$_instance = new Connexion() ; } self::msg("Instance trouvée") ; self::msg("Instance trouvée") ; return self::$_instance ; return self::$_instance ;} /// Accesseur à la connexion à la base de données private static function donneRessourceBD() { self::msg("Recherche de la ressource BD...") ; self::msg("Recherche de la ressource BD...") ; return self::donneInstance()->_ressourceBD ; return self::donneInstance()->_ressourceBD ;}

13 1311:51:49Programmation Web Une implémentation /// Fixer les paramètres de connexion public static function parametres($host, $user, $passwd, $base, $traces) { $base, $traces) { self::debogage($traces) ; self::debogage($traces) ; self::msg( self::msg( "Demande de positionnement des paramètres de connexion..." ) ; "Demande de positionnement des paramètres de connexion..." ) ; self::$_host = $host ; self::$_host = $host ; self::$_user = $user ; self::$_user = $user ; self::$_passwd = $passwd ; self::$_passwd = $passwd ; self::$_base = $base ; self::$_base = $base ; self::msg( "Positionnement des paramètres de connexion terminé" ) ; self::msg( "Positionnement des paramètres de connexion terminé" ) ;}

14 1411:51:49Programmation Web Une implémentation /// Effectuer une requête et retourner le résultat public static function requete($req) { self::msg("Demande d'exécution de la requête:\n$req") ; self::msg("Demande d'exécution de la requête:\n$req") ; $res $res self::donneRessourceBD()) ; self::donneRessourceBD()) ; if ($res === false) { if ($res === false) { throw new Exception("Erreur pour la requête '{$req}' : " throw new Exception("Erreur pour la requête '{$req}' : ".mysql_error(self::donneRessourceBD())) ;.mysql_error(self::donneRessourceBD())) ; } self::msg("Requête effectuée") ; self::msg("Requête effectuée") ; return $res ; return $res ;}

15 1511:51:49Programmation Web Une implémentation /// Protéger une chaîne de caractères avant de l'intégrer dans une requête public static function protectionChaine($chaine) { self::msg("Protection de la chaine '{$chaine}'") ; self::msg("Protection de la chaine '{$chaine}'") ; return mysql_real_escape_string($chaine, return mysql_real_escape_string($chaine, self::donneRessourceBD()) ; self::donneRessourceBD()) ;} /// Retouner le nombre d'enregistrements affectes public static function nombreLignesAffectees() { return mysql_affected_rows(self::donneRessourceBD()) ; return mysql_affected_rows(self::donneRessourceBD()) ;} /// Interdire le clonage private function __clone() { throw new Exception("Clonage de ".__CLASS__." interdit !") ; throw new Exception("Clonage de ".__CLASS__." interdit !") ;}

16 1611:51:49Programmation Web Une implémentation /// Collecte de messages de contrôle static function msg($message) { if (self::$_traces) if (self::$_traces) Traceur::trace($message) ; Traceur::trace($message) ;} /// Mise en marche ou arrêt des messages de contrôle static function debogage($etat) { self::$_traces = (bool) $etat ; self::$_traces = (bool) $etat ;}}

17 1711:51:49Programmation Web Une implémentation - Débogage /// Singleton permettant de collecter des messages informatifs class Traceur { // Gestion de l'instance unique private static $_instance = null ; /// Objet Traceur // Atttributs de l'objet private $_messages = array() ; /// Tableau des messages private $_temps = null ; /// Instant de création /// Constructeur privé private function __construct() { $this->_temps = microtime(true) ; $this->_temps = microtime(true) ;} /// Interdire le clonage private function __clone() { throw new Exception("Clonage de ".__CLASS__." interdit !") ; throw new Exception("Clonage de ".__CLASS__." interdit !") ;}

18 1811:51:49Programmation Web Une implémentation - Débogage /// Accesseur à l'instance qui sera créée si nécessaire private static function donneInstance() { if (is_null(self::$_instance)) { if (is_null(self::$_instance)) { self::$_instance = new self() ; self::$_instance = new self() ; } return self::$_instance ; return self::$_instance ;} /// Méthode statique de collecte de messages public static function trace($msg) { $instance = self::donneInstance() ; $instance = self::donneInstance() ; $instance->messages[] = $instance->duree(). " secondes : ".$msg ; $instance->messages[] = $instance->duree(). " secondes : ".$msg ;}

19 1911:51:49Programmation Web Une implémentation - Débogage /// Calcul du temps écoulé depuis la création du traceur private function duree() { return number_format(microtime(true) - $this->_temps, 4) ; return number_format(microtime(true) - $this->_temps, 4) ;} /// Méthode statique d'affichage des messages collectés public static function affiche($avant = " ") { $messages = self::donneInstance()->messages ; $messages = self::donneInstance()->messages ; $traces = null ; $traces = null ; if (count($messages)) { if (count($messages)) { $traces.= "{$avant}\n" ; $traces.= "{$avant}\n" ; foreach ($messages as $m) { foreach ($messages as $m) { $traces.= "{$m}\n" ; $traces.= "{$m}\n" ; } $traces.= "{$apres}\n" ; $traces.= "{$apres}\n" ; } return $traces ; return $traces ; } }

20 2011:51:49Programmation Web Utilisation require_once "connexion.mysql.template.class.php" ; Connexion::parametres('serveur', 'utilisateur', 'motdepasse', 'basededonees', true) ; 'motdepasse', 'basededonees', true) ; // Exemple d'utilisation : $res = Connexion::requete(<<


Télécharger ppt "Jérôme CUTRONA 11:51:49 Programmation Web 2012-2013 1 Bases de données Objet singleton pour la connexion."

Présentations similaires


Annonces Google