PHP Interface base de donnes Jrme CUTRONA jerome
PHP Interface base de données Jérôme CUTRONA jerome. cutrona@univ-reims. fr 01: 39: 27 Programmation Web 2013 -2014 1
Problème de conception posé § Transcription d'un MCD en modèle objet PHP permettant de manipuler la base de données § Règles de transcription : n n n 01: 39: 31 Une entité (attributs) devient une classe (attributs) Un enregistrement correspond donc une instance DF / CIF Associations n, m Programmation Web 2013 -2014 2
MCD modèle objet : Entité MCD Modèle objet Auteur AUTID int(11) AUTNOM varchar(50) AUTPRN varchar(50) AUTNAISS int(11) AUTADR varchar(255) AUTCOMM varchar(255) AUTLOGIN varchar(50) AUTPASSWD varchar(50) AUTADMIN smallint(6) AUTMAIL varchar(150) 01: 39: 35 <? php class Auteur { private $autid ; private $autnom ; private $autprn ; private $autnaiss ; private $autadr ; private $autcomm ; private $autlogin ; private $autpasswd ; private $autadmin ; private $autmail ; } ? > Programmation Web 2013 -2014 3
MCD modèle objet : DF / CIF MCD Modèle objet Département DEPID int(11) DEPNOM varchar(50) 1, 1 Appartenir function get. Region() … } 1, n Région REGID int(11) REGNOM varchar(50) 01: 39: 40 <? php class Departement { private $depid ; private $depnom ; private $regid ; private $region ; class Region { private $regid ; private $regnom ; function get. Departements() … } ? > Programmation Web 2013 -2014 4
MCD modèle objet : Association n, m MCD Modèle objet Camping CMPID int(11) CMPNOM varchar(50) 1, n Emplacements nb. Places 0, n Type. Place TPLID int(11) TPLNOM varchar(50) 01: 39: 42 <? php class Camping { private $cmpid ; private $cmpnom ; function get. Emplacements() … function get. Type. Places() … } class Emplacements { private $nb. Places ; private $cmpid ; private $tplid ; private $camping ; private $typeplace ; function get. Camping() … function get. Type. Place() … }. . . Programmation Web 2013 -2014 5
MCD modèle objet : Association n, m MCD Modèle objet Camping CMPID int(11) CMPNOM varchar(50) 1, n Emplacements nb. Places 0, n Type. Place TPLID int(11) TPLNOM varchar(50) 01: 39: 47 . . . class Type. Place { private $tplid ; private $tplnom ; function get. Campings() … function get. Emplacements() … } ? > Programmation Web 2013 -2014 6
Problème de conception posé Table Auteur AUTID int(11) AUTNOM varchar(50) AUTPRN varchar(50) AUTNAISS int(11) AUTADR varchar(255) AUTCOMM varchar(255) AUTLOGIN varchar(50) AUTPASSWD varchar(50) AUTADMIN smallint(6) AUTMAIL varchar(150) 01: 39: 55 <? php class Auteur { private $autid ; private $autnom ; private $autprn ; private $autnaiss ; private $autadr ; private $autcomm ; private $autlogin ; private $autpasswd ; private $autadmin ; private $autmail ; public function __construct(. . . ) … public function lecture($id) … public function ecriture() … } ? > Programmation Web 2013 -2014 7
Problème de conception posé Table Personne PERSID int(11) GRPNUM int(11) PERSNOM varchar(50) PERSPRNM varchar(50) PERSAD varchar(100) PERSCP varchar(5) PERSVILLE varchar(50) PERSTEL varchar(10) PERSMAIL varchar(100) PERSETAT varchar(20) 01: 40: 00 <? php class Personne { private $persid ; private $grpnum ; private $persnom ; private $persprnm ; private $persad ; private $perscp ; private $persville ; private $perstel ; private $persmail ; private $persetat ; public function __construct(. . . ) … public function lecture($id) … public function ecriture() … } ? > Programmation Web 2013 -2014 8
Approche proposée § Créer un modèle des objets "ligne BD" § Doivent pouvoir gérer un enregistrement : n n n n 01: 40: 06 les valeurs et leurs étiquettes gestion des entrées / sorties avec la BD : lecture / insertion / mise à jour accès aux valeurs de façon sure modification des valeurs de façon sure affichage production de formulaire d'insertion / modification chargement à partir de données issues d'un formulaire / de la lecture de la base de données Programmation Web 2013 -2014 9
Conception du modèle § Classe ? n n n attributs méthodes concrètes pas de méthodes "obligatoires" § Classe abstraite ? n n n attributs méthodes concrètes méthodes abstraites "obligatoires" § Interface ? n 01: 40: 11 méthodes "obligatoires" Programmation Web 2013 -2014 10
Gestion des attributs (1) § Solution classique : n n n ajout de données membres dans la classe concernée impossibilité d'écrire des méthodes génériques à un niveau supérieur de la hiérarchie gestion des étiquettes associées aux valeurs ? § Approche proposée : n n 01: 40: 15 tableau associatif des valeurs d’une ligne d’une table confinement, itération, accès facilité possibilité d'écrire des méthodes génériques tableau associatif des étiquettes associées aux valeurs méthode d'initialisation du tableau des valeurs Programmation Web 2013 -2014 11
Conception du modèle § Classe ? n n n attributs méthodes concrètes pas de méthodes "obligatoires" § Classe abstraite ? n n n attributs méthodes concrètes méthodes abstraites "obligatoires" § Interface ? n 01: 40: 18 méthodes "obligatoires" Programmation Web 2013 -2014 12
Approche proposée § Constitution d'une classe générique : tableau associatif des valeurs n § Clés § Valeurs = noms des champs de la table = valeurs d'une ligne de la table Auteur Enregistrement $valeurs clé class Auteur extends Enregistrement valeur __construct() init. Attributs() Initialisation Lecture Créationdans dedel'objet lal'objet BD Enregistrement $valeurs clé valeur 'AUTID' 1234 null 'AUTNOM' " null Zola" __construct() init. Attributs() 01: 40: 21 Programmation Web 2013 -2014 13
Gestion des attributs (2) class Enregistrement { // Attributs de l'enregistrement protected $valeurs = array() ; /* Initialisation des noms des champs qui sont les clés du tableau $valeurs */ protected function init. Attributs( $_cles /* Tableau des clés */) { $this->valeurs = array() ; foreach (array_keys($_cles) as $cle) $this->valeurs[$cle] = null ; } 01: 40: 25 Programmation Web 2013 -2014 14
Accès aux attributs • Confinement • Itération possible • Accès sûr ? • Accès simple ? Surcharge $valeurs de __get() doitlourde être et Syntaxe assez public __set()! Auteur Enregistrement $valeurs 'AUTID' 1234 'AUTNOM' "Zola" __construct() init. Attributs() § Solutions possibles : Accès R/W par $aut->valeurs['AUTID'] 2. Accès R par $aut->donne('AUTID') Accès W par $aut->affecte('AUTID', 12) 3. Accès R/W par $aut->AUTID 1. 01: 40: 28 Programmation Web 2013 -2014 15
Gestion des attributs (3) /* Surcharge de __get pour donner accès aux valeurs sous la forme $e->un_champs */ public function __get( $_cle /** Nom du champs */) { if (array_key_exists($_cle, $this->valeurs)) return $this->valeurs[$_cle] ; throw new Exception( "Champs '$_cle' inconnu dans '". get_class($this). "'") ; } 01: 40: 31 Programmation Web 2013 -2014 16
Gestion des attributs (4) /* Surcharge de __set pour donner accès aux valeurs sous la forme $e->un_champs=val */ public function __set( $_cle /** Nom du champs */, $_val /** Nouvelle valeur */) { if (array_key_exists($_cle, $this->valeurs)) return $this->valeurs[$_cle] = $_val ; throw new Exception( "Champs '$_cle' inconnu dans '". get_class($this). "'") ; } 01: 40: 37 Programmation Web 2013 -2014 17
Gestion des étiquettes § Valeurs : n n Tableau associatif au niveau de la classe mère Accès simple à l'aide de __get et __set Traitements au niveau de la classe mère Méthode d'initialisation init. Attributs($_cles) § Étiquettes : n n n 01: 40: 39 Tableau associatif Propriété de la classe mère ? Communes à toutes les entités d'une classe dérivée Attribut statique de la classe dérivée Méthode abstraite etiquettes() (classe mère) Utilisable pour l'initialisation des attributs Programmation Web 2013 -2014 18
Conception du modèle § Classe ? n n n attributs méthodes concrètes pas de méthodes "obligatoires" § Classe abstraite ? n n n attributs méthodes concrètes méthodes abstraites "obligatoires" § Interface ? n 01: 40: 42 méthodes "obligatoires" Programmation Web 2013 -2014 19
Définition des méthodes (1) § Chargement de données : n n n 01: 40: 43 à partir de données issues d'un formulaire (tableau) à partir de la lecture de la base de données (tableau) possible si les clés de ces tableaux sont identiques à celles du tableau des valeurs démarche : pour chaque clé du tableau des valeurs, si cette dernière est présente dans le tableau des données fournies alors affecter la valeur fournie implémentation possible dans la classe mère Programmation Web 2013 -2014 20
Définition des méthodes (2) § Lecture BD nécessite : n n n de connaître la table de connaître la clé primaire de transférer les données lues dans les valeurs § Écriture BD nécessite : n n 01: 40: 46 de connaître la table de connaître la clé primaire de savoir si l'on doit insérer ou mettre à jour la table lecture préalable de disposer des valeurs Programmation Web 2013 -2014 21
Définition des méthodes (3) § Connaître la table : n n n Donnée des classes dérivées A la charge des classes dérivées Obligation d'implémentation méthode abstraite table() de la classe mère § Connaître la clé primaire : n n n 01: 40: 48 Donnée des classes dérivées A la charge des classes dérivées Obligation d'implémentation méthode abstraite cle_pri() de la classe mère Programmation Web 2013 -2014 22
Bilan (partiel) des méthodes Auteur Enregistrement table() cle_pri() etiquettes() $valeurs clé class Auteur extends Enregistrement $valeurs valeur __construct() init. Attributs() lecture() ecriture() 01: 40: 49 Enregistrement table() "Auteur" cle_pri() "AUTID" etiquettes() … 'AUTID' 1234 'AUTNOM' "Zola" __construct() init. Attributs() lecture() ecriture() Programmation Web 2013 -2014 23
Définition des méthodes (4) § Lecture : n table / clé primaire connues n SELECT * FROM table WHERE clé_pri=id n Chargement § Écriture : n n n 01: 40: 53 table / clé primaire connues Si id existe dans la base mise à jour SELECT COUNT(*) FROM table WHERE clé_pri=id == 1 UPDATE table WHERE clé_pri=id Sinon insertion SELECT COUNT(*) FROM table WHERE clé_pri=id == 0 INSERT INTO table Programmation Web 2013 -2014 24
Définition des méthodes (5) § Affichage : n n Peut être fait de façon générique grâce au parcours des attributs et étiquettes Serait plus judicieux d'être spécialisé par les classes dérivées § Production de formulaire : n n n 01: 40: 55 Éléments de formulaire et non formulaire complet Peut être fait de façon générique grâce au parcours des attributs et étiquettes Serait plus judicieux d'être spécialisé par les classes dérivées Programmation Web 2013 -2014 25
Bilan (1) abstract class Enregistrement { protected $valeurs = array() ; abstract public function __construct($_id=null) protected function init. Attributs($_cles) { … abstract protected function table() abstract protected function cle_pri() abstract public function etiquettes() public function etiquette($_cle) { … public function lecture($_id) { … public function ecriture() { … public function chargement($_donnees) { … public function affichage() { … public function formulaire() { … 01: 40: 59 Programmation Web 2013 -2014 ; } ; ; ; } } } 26
Bilan (2) public function __get($_cle) { … public function __set($_cle, $_val) { … public function __isset($_cle) { … public function __unset($_cle) { … } // Fin class Enregistrement class Etendue extends Enregistrement { const table = "la_table" ; const cle_pri = "LA_CLE_PRI" ; static private $labels = array('XXXXX' => 'Etiquette X', . . . ) public function __construct($_id=null) { $this->init. Attributs(self: : $labels) ; if (isset($_id)) $this->lecture($_id) ; } } } 01: 41: 01 27 Programmation Web 2013 -2014 ;
Bilan (3) protected function table() { return self: : table ; } protected function cle_pri() { return self: : cle_pri ; } protected function etiquettes() { return self: : $labels ; } public function affichage() { //. . . } public function formulaire() { //. . . } } // Fin class Etendue 01: 41: 05 Programmation Web 2013 -2014 28
Implémentations plus élaborées Requête d'information Liste des champs Nature des champs Type de clé 01: 41: 13 Programmation Web 2013 -2014 29
- Slides: 29