PHP Interface base de données
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
PHP Interface base de données
E N D
Presentation Transcript
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