290 likes | 420 Views
PHP Interface base de données. 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 : Une entité (attributs) devient une classe (attributs) Un enregistrement correspond donc une instance DF / CIF
E N D
PHPInterface base de données Programmation Web 2013-2014
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 : • Une entité (attributs) devient une classe (attributs)Un enregistrement correspond donc une instance • DF / CIF • Associations n,m Programmation Web 2013-2014
MCD modèle objet : Entité Programmation Web 2013-2014
Appartenir MCD modèle objet : DF / CIF 1,1 1,n Programmation Web 2013-2014
Emplacements nbPlaces MCD modèle objet : Association n,m 1,n 0,n Programmation Web 2013-2014
Emplacements nbPlaces MCD modèle objet : Association n,m 1,n 0,n Programmation Web 2013-2014
Problème de conception posé <?php class Auteur { private$autid ; private$autnom ; private$autprn ; private$autnaiss ; private$autadr ; private$autcomm ; private$autlogin ; private$autpasswd ; private$autadmin ; private$autmail ; publicfunction __construct(...) … publicfunction lecture($id) … publicfunction ecriture() … } ?> Programmation Web 2013-2014
Problème de conception posé <?php class Personne { private$persid ; private$grpnum ; private$persnom ; private$persprnm ; private$persad ; private$perscp ; private$persville ; private$perstel ; private$persmail ; private$persetat ; publicfunction __construct(...) … publicfunction lecture($id) … publicfunction ecriture() … } ?> Programmation Web 2013-2014
Approche proposée • Créer un modèle des objets "ligne BD" • Doivent pouvoir gérer un enregistrement : • 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
Conception du modèle • Classe ? • attributs • méthodes concrètes • pas de méthodes "obligatoires" • Classe abstraite ? • attributs • méthodes concrètes • méthodes abstraites "obligatoires" • Interface ? • méthodes "obligatoires" Programmation Web 2013-2014
Gestion des attributs (1) • Solution classique : • 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 : • tableau associatif des valeurs d’une ligne d’une tableconfinement, itération, accèsfacilité • 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
Conception du modèle • Classe ? • attributs • méthodes concrètes • pas de méthodes "obligatoires" • Classe abstraite ? • attributs • méthodes concrètes • méthodes abstraites "obligatoires" • Interface ? • méthodes "obligatoires" Programmation Web 2013-2014
Approche proposée • Constitution d'une classe générique : • tableau associatif des valeurs • Clés = noms des champs de la table • Valeurs = valeurs d'une ligne de la table Auteur class Auteur extends Enregistrement Enregistrement __construct() initAttributs() Enregistrement __construct() initAttributs() Initialisation de l'objet Lecture dans la BD Création de l'objet Programmation Web 2013-2014
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 */ protectedfunction initAttributs( $_cles/* Tableau des clés */) { $this->valeurs =array(); foreach(array_keys($_cles)as$cle) $this->valeurs[$cle]=null; } Programmation Web 2013-2014
Accès aux attributs • Solutions possibles : • Accès R/W par $aut->valeurs['AUTID'] • Accès R par $aut->donne('AUTID')Accès W par $aut->affecte('AUTID', 12) • Accès R/W par $aut->AUTID • Confinement • Itération possible • Accès sûr ? • Accès simple ? Auteur Enregistrement __construct() initAttributs() $valeurs doit être public! Syntaxe assez lourde Surcharge de __get() et __set() Programmation Web 2013-2014
Gestion des attributs (3) /* Surcharge de __get pour donner accès aux valeurs sous la forme $e->un_champs */ publicfunction__get( $_cle/** Nom du champs */){ if(array_key_exists($_cle, $this->valeurs)) return$this->valeurs[$_cle]; thrownewException( "Champs '$_cle' inconnu dans '" .get_class($this)."'"); } Programmation Web 2013-2014
Gestion des attributs (4) /* Surcharge de __set pour donner accès aux valeurs sous la forme $e->un_champs=val */ publicfunction__set( $_cle/** Nom du champs */, $_val/** Nouvelle valeur */){ if(array_key_exists($_cle, $this->valeurs)) return$this->valeurs[$_cle]=$_val; thrownewException( "Champs '$_cle' inconnu dans '" .get_class($this)."'"); } Programmation Web 2013-2014
Gestion des étiquettes • Valeurs : • 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'initialisationinitAttributs($_cles) • Étiquettes : • 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
Conception du modèle • Classe ? • attributs • méthodes concrètes • pas de méthodes "obligatoires" • Classe abstraite ? • attributs • méthodes concrètes • méthodes abstraites "obligatoires" • Interface ? • méthodes "obligatoires" Programmation Web 2013-2014
Définition des méthodes (1) • Chargement de données : • à 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
Définition des méthodes (2) • Lecture BD nécessite : • 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 : • de connaître la table • de connaître la clé primaire • de savoir si l'on doit inséreroumettre à jour la table lecture préalable • de disposer des valeurs Programmation Web 2013-2014
Définition des méthodes (3) • Connaître la table : • 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 : • 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
Bilan (partiel) des méthodes Auteur Enregistrement table()"Auteur" cle_pri()"AUTID" etiquettes()… __construct() initAttributs() lecture() ecriture() Enregistrement table() cle_pri() etiquettes() __construct() initAttributs() lecture() ecriture() class Auteur extends Enregistrement Programmation Web 2013-2014
Définition des méthodes (4) • Lecture : • table / clé primaire connues • SELECT * FROM table WHERE clé_pri=id • Chargement • Écriture : • table / clé primaire connues • Si id existe dans la base mise à jour • SELECT COUNT(*) FROM table WHERE clé_pri=id == 1 UPDATEtable WHERE clé_pri=id • Sinon insertion • SELECT COUNT(*) FROM table WHERE clé_pri=id== 0 INSERT INTO table Programmation Web 2013-2014
Définition des méthodes (5) • Affichage : • Peut être fait de façon générique grâce au parcours des attributsetétiquettes • Serait plus judicieux d'être spécialisé par les classes dérivées • Production de formulaire : • É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
Bilan (1) abstractclass Enregistrement { protected$valeurs=array(); abstractpublicfunction__construct($_id=null) ; protectedfunction initAttributs($_cles) { … } abstractprotectedfunction table() ; abstractprotectedfunction cle_pri(); abstractpublic function etiquettes(); publicfunction etiquette($_cle){ … } publicfunction lecture($_id){ … } publicfunction ecriture() { … } publicfunction chargement($_donnees){ … } publicfunction affichage(){ … } publicfunction formulaire() { … } Programmation Web 2013-2014
Bilan (2) publicfunction__get($_cle) { … } publicfunction__set($_cle, $_val) { … } publicfunction__isset($_cle) { … } publicfunction__unset($_cle){ … } } // Fin class Enregistrement class Etendue extends Enregistrement { const table = "la_table" ; const cle_pri = "LA_CLE_PRI" ; staticprivate$labels =array('XXXXX' => 'Etiquette X', ...); publicfunction__construct($_id=null){ $this->initAttributs(self::$labels); if(isset($_id)) $this->lecture($_id); } Programmation Web 2013-2014
Bilan (3) protectedfunction table(){ returnself::table ; } protectedfunction cle_pri(){ returnself::cle_pri ; } protectedfunction etiquettes(){ returnself::$labels; } publicfunction affichage(){ // ... } publicfunction formulaire(){ // ... } } // Fin class Etendue Programmation Web 2013-2014
Implémentations plus élaborées Requête d'information Liste des champs Nature des champs Type de clé Programmation Web 2013-2014