PHP Interface base de données

Download Report

Transcript PHP Interface base de données

PHP
Interface base de données
Jérôme CUTRONA
[email protected]
02:07:45
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 :



02:07:45
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)
02:07:46
<?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
<?php
class Departement {
private $depid ;
private $depnom ;
private $regid ;
private $region ;
Appartenir
function getRegion() …
}
1,n
Région
REGID
int(11)
REGNOM
varchar(50)
02:07:46
class Region {
private $regid ;
private $regnom ;
function getDepartements() …
}
?>
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
nbPlaces
0,n
TypePlace
TPLID
int(11)
TPLNOM
varchar(50)
02:07:46
<?php
class Camping {
private $cmpid ;
private $cmpnom ;
function getEmplacements() …
function getTypePlaces() …
}
class Emplacements {
private $nbPlaces ;
private $cmpid ;
private $tplid ;
private $camping ;
private $typeplace ;
function getCamping() …
function getTypePlace() …
}
...
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
nbPlaces
0,n
TypePlace
TPLID
int(11)
TPLNOM
varchar(50)
02:07:46
...
class TypePlace {
private $tplid ;
private $tplnom ;
function getCampings() …
function getEmplacements() …
}
?>
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)
02:07:46
<?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)
02:07:46
<?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 :







02:07:46
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 ?



attributs
méthodes concrètes
pas de méthodes "obligatoires"
 Classe abstraite ?



attributs
méthodes concrètes
méthodes abstraites "obligatoires"
 Interface ?

02:07:46
méthodes "obligatoires"
Programmation Web 2013-2014
10
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 :




02:07:46
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 ?



attributs
méthodes concrètes
pas de méthodes "obligatoires"
 Classe abstraite ?



attributs
méthodes concrètes
méthodes abstraites "obligatoires"
 Interface ?

02:07:46
méthodes "obligatoires"
Programmation Web 2013-2014
12
Approche proposée
 Constitution d'une classe générique :

tableau associatif des valeurs
 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()
initAttributs()
Initialisation
Lecture
Créationdans
dede
l'objet
lal'objet
BD
Enregistrement
$valeurs
clé
valeur
'AUTID'
1234
null
'AUTNOM'
"Zola"
null
__construct()
initAttributs()
02:07:46
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 initAttributs(
$_cles /* Tableau des clés */) {
$this->valeurs = array() ;
foreach (array_keys($_cles) as $cle)
$this->valeurs[$cle] = null ;
}
02:07:46
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
__set()!
public

Auteur
Enregistrement
$valeurs
'AUTID'
1234
'AUTNOM'
"Zola"
__construct()
initAttributs()
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.
02:07:46
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)."'") ;
}
02:07:46
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)."'") ;
}
02:07:46
Programmation Web 2013-2014
17
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'initialisation initAttributs($_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
02:07:46
Programmation Web 2013-2014
18
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 ?

02:07:46
méthodes "obligatoires"
Programmation Web 2013-2014
19
Définition des méthodes (1)
 Chargement de données :





02:07:46
à 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 :



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 :




02:07: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 :



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 :



02:07:46
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()
initAttributs()
lecture()
ecriture()
02:07:46
Enregistrement
table()"Auteur"
cle_pri()"AUTID"
etiquettes()…
'AUTID'
1234
'AUTNOM'
"Zola"
__construct()
initAttributs()
lecture()
ecriture()
Programmation Web 2013-2014
23
Définition des méthodes (4)
 Lecture :

table / clé primaire connues

SELECT * FROM table WHERE clé_pri=id

Chargement
 Écriture :





02:07:46
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 :


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 :



02:07:46
É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 initAttributs($_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()
{ …
02:07:46
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->initAttributs(self::$labels) ;
if (isset($_id))
$this->lecture($_id) ; }
}
}
}
}
02:07:46
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
02:07:46
Programmation Web 2013-2014
28
Implémentations plus élaborées
Requête d'information
Liste des champs
Nature des champs
Type de clé
02:07:46
Programmation Web 2013-2014
29