1. Trang chủ
  2. » Công Nghệ Thông Tin

Pratique de MySQL et PHP- P39 pdf

5 219 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 5
Dung lượng 233,94 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

des contrôles, avant toute mise à jour, sur le type ou la longueur des données à insérer ; 5.. Elle permet d’obtenir sans aucun effort, par simple instanciation d’un objet suivi d’un app

Trang 1

2 la représentation de la table par un tableau HTML ;

3 la production d’un formulaire de saisie ou de mise à jour ;

4 des contrôles, avant toute mise à jour, sur le type ou la longueur des données

à insérer ;

5 enfin la production d’une interface de consultation, saisie ou mise à jour semblable à celle que nous avons étudiée page 78

La classe IhmBD (pour « Interface homme-machine et Bases de Données ») est une implantation de toutes ces fonctionnalités Elle permet d’obtenir sans aucun effort, par simple instanciation d’un objet suivi d’un appel de méthode, une inter-face complète sur une table de la base Bien entendu, cette interinter-face peut s’avérer insatisfaisante du point de vue de l’ergonomie, de la présentation, ou du respect des règles particulières de gestion pour une table donnée Dans ce cas on peut soit utiliser certaines méthodes pour régler des choix de présentation, soit définir une sous-classe spécialisée Tous ces aspects sont développés dans ce qui suit

Cette classe est un bon exemple du processus d’abstraction mis en œuvre cou-ramment en programmation objet, et visant à spécifier de manière générale un com-portement commun à de nombreuses situations (ici l’interaction avec une base de données) Le bénéfice de ce type de démarche est double En premier lieu on obtient des outils pré-définis qui réduisent considérablement la réalisation d’applications En second lieu on normalise l’implantation en décrivant à l’avance toutes les méthodes

à fournir pour résoudre un problème donné Tout cela aboutit à une économie importante d’efforts en développement et en maintenance Dernier avantage : la description de la classe va nous permettre de récapituler tout ce que nous avons vu sur les techniques d’accès à MySQL (ou plus généralement à une base de données) avec PHP

3.4.1 Utilisation

Dans sa version la plus simple, l’utilisation de la classe est élémentaire : on instancie

un objet en indiquant sur quelle table on veut construire l’interface, on indique

quelques attributs de présentation, et on appelle la méthode genererIHM() Les quelques lignes de code qui suivent, appliquées à la table Carte qui a déjà servi pour

la mini-application « Prise de commandes au restaurant » (voir page 99), suffisent

Exemple 3.10 exemples/ApplClasseIhmBD.php:Application de la classe ImhBD.

<? xml v e r s i o n = " 1 0 " e n c o d i n g = " i s o−8959−1 " ? >

<!DOCTYPE html PUBLIC "−//W3C/ / DTD XHTML 1 0 S t r i c t / / EN"

" h t t p : / / www w3 o r g / TR / xhtml1 /DTD/ xhtml1−s t r i c t dtd ">

<html xmlns= " h t t p : / / www w3 o r g / 1 9 9 9 / xhtml " xml : l a n g = " f r " >

<head >

< t i t l e > C r é a t i o n d ’ un f o r m u l a i r e < / t i t l e >

< l i n k r e l = ’ s t y l e s h e e t ’ h r e f =" f i l m s c s s " t y p e =" t e x t / c s s " / >

</ head >

Trang 2

<body >

<? php

r e q u i r e _ o n c e ( " BDMySQL php " ) ;

r e q u i r e _ o n c e ( " IhmBD php " ) ;

r e q u i r e ( " N o r m a l i s a t i o n php " ) ;

r e q u i r e ( " Connect php " ) ;

/ / N o r m a l i s a t i o n d e s e n t r é e s HTTP

N o r m a l i s a t i o n ( ) ;

t r y {

/ / Connexion à l a b a s e

$bd = new BDMySQL (NOM, PASSE , BASE , SERVEUR) ;

/ / C r e a t i o n de l ’ i n t e r f a c e s u r l a t a b l e C a r t e

$ihm = new IhmBD ( " C a r t e " , $bd ) ;

/ / L e s en −t ê t e s ( p a s o b l i g a t o i r e : l e nom du champ s e r t d ’ en− / / t ê t e s i n o n )

$ihm−>s e t E n t e t e ( " i d _ c h o i x " , " Numéro du p l a t " ) ;

$ihm−>s e t E n t e t e ( " l i b e l l e " , " L i b e l l é du p l a t " ) ;

$ihm−>s e t E n t e t e ( " t y p e " , " Type du p l a t " ) ;

/ / G é n é r a t i o n d e l ’ i n t e r f a c e

echo $ihm−>genererIHM ($_REQUEST) ;

}

c a t c h ( E x c e p t i o n $ e x c ) {

echo " <b> E r r e u r r e n c o n t r é e : < / b> " $exc−>g e t M e s s a g e ( ) "\n " ;

}

? >

Bien entendu on réutilise la classe BDMySQL qui fournit tous les services néces-saires pour accéder à la base, de même que la classe Tableau nous servira pour les tableaux et la classe Formulaire pour les formulaires Notez que l’utilisation d’une classe normalisée pour accéder à la base de données signifie que tout ce qui est décrit ci-dessous fonctionne également avec un SGBD autre que MySQL, en

instanciant simplement un objet bd servant d’interface avec ce SGBD et conforme

aux spécifications de la classe abstraite BD (voir page 130) La figure 3.7 montre l’affichage obtenu avec le script précédent Il s’agit de bien plus qu’un affichage d’ailleurs : on peut insérer de nouvelles lignes, ou choisir de modifier l’une des lignes existantes à l’aide du formulaire L’ajout de la fonction de destruction est, comme un certain nombre d’autres fonctionnalités, laissée en exercice au lecteur

On obtient donc un outil en partie semblable à ce qu’offre phpMyAdmin La

structure de la table est récupérée de MySQL (ou de tout autre SGBD) et utilisée

pour produire le formulaire, le tableau, les contrôles, etc Bien entendu phpMyAdmin

propose beaucoup plus de choses, mais il existe une différence de nature avec la classe

IhmBD Alors que phpMyAdmin est un outil intégré, nos objets fournissent des briques

Trang 3

Figure 3.7 — Affichage de l’interface sur la table Carte.

logicielles qui peuvent être intégrées dans toute application utilisant les méthodes publiques énumérées dans la table 3.9 Elles constituent une panoplie des accès à une table, à l’exception de l’ouverture d’un curseur pour accéder à un sous-ensemble des lignes

Tableau 3.9 — Les méthodes publiques de la classe IhmBD

formulaire ( action,ligne) Renvoie un formulaire en saisie ou en mise à jour

sur une ligne.

insertion ( ligne) Insère d’une ligne.

tableau ( attributs) Renvoie un tableau HTML avec le contenu de la

table.

setEntete ( nomAttribut,valeur) Affecte un en-tête descriptif à un attribut.

chercheLigne ( ligne,format) Renvoie une ligne recherchée par sa clé, au format

tableau associatif ou objet.

genererIHM ( paramsHTTP) Produit une interface de consultation/mise à jour,

basée sur les interactions HTTP.

REMARQUE –Ce besoin de disposer d’outils génériques pour manipuler les données d’une base relationnelle à partir d’un langage de programmation, sans avoir à toujours effectuer répétitivement les mêmes tâches, est tellement répandu qu’il a été « normalisé » sous le nom

d’Object-Relational Mapping (ORM) et intégré aux frameworks de développement tel que celui

Trang 4

présenté dans le chapitre 9 La classehmBDest cependant légèrement différente puisqu’elle permet de générer des séquences de consultation/saisie/mise à jour, ce que les outils d’ORM

ne font généralement pas.

Ces méthodes peuvent être utilisées individuellement ou par l’intermédiaire

des interactions définies dans la méthode genererIHM() Elles peuvent aussi être

rédéfinies ou spécialisées On aimerait bien par exemple disposer d’une liste

dérou-lante pour le type de plat dans le formulaire de la table Carte Il suffit alors de

définir une sous-classe IhmCarte dans laquelle on ne ré-implante que la méthode

formulaire() Toutes les autres méthodes héritées de la super-classe, restent donc

disponibles

3.4.2 Implantation

Voyons maintenant l’implantation de la classe Tout repose sur la connaissance du

schéma de la table, telle qu’elle est fournie par la méthode schemaTable de la classe

BD Rappelons (voir page 132) que cette méthode renvoie un tableau associatif avec, pour chaque attribut de la table, la description de ses propriétés (type, longueur, participation à une clé primaire) Ce tableau a donc deux dimensions :

1 la première est le nom de l’attribut décrit ;

2 la seconde est la propriété, soit type, soit longueur, soit cle_primaire, soit enfin not_null

Dans l’exemple de la table Carte, on trouvera dans le tableau décrivant le

schéma un élément [’id_choix’][’type’] avec la valeur integer, un élément [’id_choix’][’cle_primaire’] avec la valeur true, etc

REMARQUE –La classe ne fonctionne que pour des tables dotées d’une clé primaire, autrement dit d’un ou plusieurs attributs dont la valeur identifie une ligne de manière unique.

La présence d’une clé primaire est de toute façon indispensable : voir le chapitre 4.

Voici le début de la classe On énumère quelques constantes locales, puis des propriétés dont l’utilité sera détaillée ultérieurement, et enfin le constructeur de la classe

c l a s s IhmBD

{

/ / −−−− P a r t i e p r i v é e : l e s c o n s t a n t e s e t l e s v a r i a b l e s

c o n s t INS_BD = 1 ;

c o n s t MAJ_BD = 2 ;

c o n s t DEL_BD = 3 ;

c o n s t EDITER = 4 ;

p r o t e c t e d $bd , $ n o m S c r i p t , $nomTable , $ s c h e m a T a b l e , $ e n t e t e s ;

/ / Le c o n s t r u c t e u r

f u n c t i o n _ _ c o n s t r u c t ( $nomTable , $bd , $ s c r i p t = " moi " )

{

Trang 5

/ / I n i t i a l i s a t i o n d e s v a r i a b l e s p r i v é e s

$ t h i s−>bd = $bd ;

$ t h i s−>nomTable = $nomTable ;

i f ( $ s c r i p t == " moi " )

$ t h i s−>nomScript = $_SERVER [ ’ PHP_SELF ’ ] ;

e l s e

$ t h i s−>nomScript = $ s c r i p t ;

/ / L e c t u r e du s c h é m a d e l a t a b l e

$ t h i s−>schemaTable = $bd−>schemaTable ( $nomTable ) ;

/ / P a r d é f a u t , l e s t e x t e s d e s a t t r i b u t s s o n t l e u r s noms

f o r e a c h ( $ t h i s−>schemaTable a s $nom => $ o p t i o n s )

$ t h i s−>e n t e t e s [ $nom ] = $nom ;

}

Le constructeur prend en entrée un nom de table, un objet de la classe BD (poten-tiellement également instance d’une sous-classe de BD : BDMySQL, BDPostgreSQL, BDSQLite, etc.) et le nom du script gérant l’interface avec la table On com-mence par copier ces données dans les propriétés de l’objet pour les conserver durant toute sa durée de vie5 On recherche également le schéma de la table grâce à l’objet bd, et on le stocke dans la propriété schemaTable Si la table n’existe pas, l’objet bd lèvera en principe une exception qu’on pourrait « attraper » ici

REMARQUE –On reçoit un objet, bd, passé par référence, alors que toutes les autres variables sont passées par valeur (comportement adopté depuis PHP 5) On stocke également une référence à cet objet avec l’instruction :

$ t h i s>bd = $bd ;

L’opérateur d’affectation, pour les objets, n’effectue pas une copie comme pour tous les

autres types de données, mais une référence La variable $this->bd et la variable $bd

référencent donc le même objet après l’affectation ci-dessus (voir page 61 pour la présentation

des références) Il s’ensuit que deux codes indépendants vont travailler sur le même objet, ce qui peut parfois soulever des problèmes Le script appelant a en effet instancié$bdet peut

à bon droit estimer que l’objet lui appartient et qu’il peut en faire ce qu’il veut Un objet de

la classeIhmBDa lui aussi accès à cet objet et va le conserver durant toute sa durée de vie Chacun peut effectuer des opérations incompatibles (par exemple fermer la connexion à la base) avec des résultats potentiellement dangereux On pourrait effectuer une véritable copie

de l’objet avec l’opérateurclone:

$ t h i s>bd = c l o n e $bd ;

On s’assure alors qu’il n’y aura pas de problème posé par le partage d’un même objet, le prix (modique) à payer étant l’utilisation d’un peu plus de mémoire, et une opération de copie.

5 Par défaut, on utilise le script courant, ó l’objet aura été instancié, et dénoté

$_SERVER[’PHP_SELF’].

Ngày đăng: 06/07/2014, 00:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN