2.3 MISE À JOUR D’UNE BASE PAR FORMULAIRE L’interface de mise à jour de la table FilmComplet donnée à la fin du chapitre 1 voir les exemples pages 47 et 49 est assez rudimentaire et fera
Trang 1Est-il nécessaire de préciser qu’il faut rester extrêmement prudent avec les don-nées transmises par HTTP ? Il est par exemple très délicat de proposer un formulaire pour saisir des commandes à effectuer, dans MySQL ou dans le système d’exploita-tion Encore une fois, reportez-vous au site php.net pour sa documentation sur la sécurité des applications PHP, et de nombreuses recommandations à ce sujet.
2.3 MISE À JOUR D’UNE BASE PAR FORMULAIRE
L’interface de mise à jour de la table FilmComplet donnée à la fin du chapitre 1
(voir les exemples pages 47 et 49) est assez rudimentaire et ferait rapidement hurler n’importe quel utilisateur Nous allons développer un système plus convivial pour insérer, mettre à jour ou détruire les lignes d’une table, en prenant comme cible la
table FilmSimple, qui est un peu plus facile à manipuler (voir le schéma page 28).
2.3.1 Script d’insertion et de mise à jour
Le script principal,FilmSimple.php, affiche une page dont le contenu varie en fonction
du mode choisi Voici les modes possibles :
1 En mode par défaut, on affiche la liste des films en leur associant une ancre
permettant d’accéder au formulaire de modification Une ancre placée sous le tableau permet d’accéder au formulaire d’insertion.
2 En mode modification d’un film, on affiche un formulaire présentant les champs
de saisie Chaque champ vaut par défaut la valeur couramment stockée dans la base pour ce film Seule exception : on ne peut pas modifier le titre puisqu’on
suppose ici que c’est le moyen d’identifier (et donc de retrouver) le film modifié.
3 Enfin, en mode insertion, on présente un formulaire de saisie, sans valeur par
défaut.
Pour commencer nous allons définir avec define() des constantes définissant les différents modes Les constantes permettent de manipuler des symboles, plus faciles
à utiliser et plus clairs que des valeurs.
/ / L e s c o n s t a n t e s p o u r l e mode
d e f i n e ( "MODE_DEFAUT" , " d e f a u t " ) ;
d e f i n e ( "MODE_INSERTION" , " i n s e r t i o n " ) ;
d e f i n e ( "MODE_MAJ" , " maj " ) ;
Ensuite, afin de ne pas se lancer dans un script d’une taille démesurée, on découpe
le travail en plusieurs parties, correspondant chacune à une fonctionnalité précise, puis on réalise chaque partie par une fonction.
La première fonction affiche le formulaire On pourrait prévoir une fonction pour
un formulaire en mise à jour et une autre pour un formulaire en insertion, mais la plus grande part du code serait commun, ce qui entraîne une double modification chaque fois que le site évolue (par exemple lors de l’ajout d’un champ dans la table).
Trang 2Il est beaucoup plus astucieux de programmer une seule fonction qui affiche un contenu légèrement différent en fonction du type de mise à jour souhaité (insertion
ou modification) Voici le code de cette fonction Le style de programmation adopté ici est du HTML dans lequel on insère ponctuellement des instructions PHP Ce style trouve très rapidement ses limites en terme de lisibilité, comme vous pourrez vous en convaincre en essayant de décrypter le contenu Rassurez-vous, c’est la dernière fois que j’utilise cette gestion obscure des accolades !
Exemple 2.16 exemples/FormFilmSimple.php:Le formulaire avec valeurs par défaut, et modes insertion
ou mise à jour
<? php
/ / F o r m u l a i r e d e s a i s i e , a v e c v a l e u r s p a r d é f a u t
f u n c t i o n F o r m F i l m S i m p l e ( $mode , $ v a l _ d e f a u t )
{
? >
<!−− On e s t en HTML −−>
< f o r m a c t i o n = ’ F i l m S i m p l e php ’ method= ’ p o s t ’ >
< i n p u t t y p e = ’ h i d d e n ’ name= " a c t i o n " v a l u e = " F o r m F i l m S i m p l e " / >
< i n p u t t y p e = ’ h i d d e n ’ name= " mode " v a l u e = " <? php echo $mode ? > " / >
< t a b l e >
<? php i f ( $mode == MODE_INSERTION) { ? >
< t r ><td > T i t r e : </ td ><td >< i n p u t t y p e = ’ t e x t ’ s i z e = ’ 40 ’ name=
’ t i t r e ’ v a l u e = " <? php echo $ v a l _ d e f a u t [ ’ t i t r e ’ ] ? > " / >
</ td > </ t r >
<? php } e l s e { ? >
< t r ><td >Mise à j o u r de </ td ><td > <? php echo $ v a l _ d e f a u t
[ ’ t i t r e ’ ] ? >
< i n p u t t y p e = ’ h i d d e n ’
name= ’ t i t r e ’
v a l u e = ’ <? php echo $ v a l _ d e f a u t [ ’ t i t r e ’ ] ? > ’ / >
</ td > </ t r >
<? php } ? >
< t r ><td >Année : </ td >
<td >< i n p u t t y p e = ’ t e x t ’ s i z e = ’ 4 ’ m a x l e n g t h = ’ 4 ’
name= " annee " v a l u e = " <? php
echo $ v a l _ d e f a u t [ ’ annee ’ ] ? > " / >
</ td > </ t r >
< t r ><td > R é a l i s a t e u r ( prénom − nom) : </ td >
<td >< i n p u t t y p e = ’ t e x t ’ s i z e = ’ 20 ’ name= " p r e n o m _ r e a l i s a t e u r "
v a l u e = " <? php
echo $ v a l _ d e f a u t [ ’ p r e n o m _ r e a l i s a t e u r ’ ] ? > " / >
< b r / >
< i n p u t t y p e = t e x t s i z e = ’ 20 ’ name= " n o m _ r e a l i s a t e u r "
v a l u e = " <? php echo $ v a l _ d e f a u t [ ’ n o m _ r e a l i s a t e u r ’ ] ? > " / >
</ td > </ t r >
Trang 3< t r ><td >Année de n a i s s a n c e :
<td >< i n p u t t y p e = ’ t e x t ’ s i z e = ’ 4 ’ m a x l e n g t h = ’ 4 ’
name= ’ a n n e e _ n a i s s a n c e ’
v a l u e = " <? php echo $ v a l _ d e f a u t [ ’ a n n e e _ n a i s s a n c e ’ ] ? > " / >
</ td > </ t r >
< t r >< t d c o l s p a n = ’ 2 ’ >< i n p u t t y p e = ’ s u b m i t ’ v a l u e = ’ E x é c u t e r ’ / >
</ td > </ t r >
</ t a b l e >
</ form >
<? php
}
? >
La fonction FormFilmSimple() prend en paramètres le mode (insertion ou modification) et un tableau contenant les valeurs par défaut à placer dans les champs.
Le mode est systématiquement placé dans un champ caché pour être transmis au script traitant les données du formulaire, et saura ainsi dans quel contexte elles ont été saisies :
<input type=’hidden’name="mode"value="<?php echo $mode ?>"/>
Les modes d’insertion et de modification correspondent à deux affichages diffé-rents du formulaire En insertion le champ « titre » est saisissable et sans valeur par défaut En mise à jour, il est affiché sans pouvoir être saisi, et il est de plus dans un champ caché avec sa valeur courante qui est transmise au script de traitement des données.
<? php i f ( $mode == MODE_INSERTION) { ? >
< t r ><td > T i t r e : </ td ><td >< i n p u t t y p e = ’ t e x t ’ s i z e = ’ 40 ’ name= ’
t i t r e ’
v a l u e = " <?= $ v a l _ d e f a u t [ ’ t i t r e ’ ] ? > " / > </ td
> </ t r >
<? php } e l s e { ? >
< t r ><td >Mise à j o u r de </ td ><td ><?= $ v a l _ d e f a u t [ ’ t i t r e ’ ] ? > < / td >
<td >< i n p u t t y p e = ’ h i d d e n ’
name= ’ t i t r e ’ v a l u e = ’ <?= $ v a l _ d e f a u t [ ’ t i t r e ’ ] ? > ’ / > </ td > </ t r
>
<? php } ? >
Le tableau des valeurs par défaut passé en paramètre à la fonction, $val_defaut, doit contenir un élément par champ, le nom de l’élément étant le nom du champ,
et sa valeur la valeur par défaut du champ Ce tableau associatif peut s’obtenir par
un appel à mysql_fetch_assoc() si le film vient de la base et doit être modifié.
Il peut également s’agir du tableau $_POST ou $_GET après saisie du formulaire, pour réafficher les données prises en compte La figure 2.4 montre le formulaire en modification.
Notez qu’on place un autre champ caché, action, dans le formulaire La trans-mission de cette variable action au scriptFilmSimple.phpindique que des valeurs ont
Trang 4été saisies dans le formulaire, et qu’elles doivent déclencher une insertion ou une mise à jour dans la base.
Figure 2.4 — Formulaire en modification du film Vertigo
La seconde fonction effectue les requêtes de mise à jour Elle prend en entrée le mode (insertion ou modification), un tableau associatif qui, comme $val_defaut,
contient les valeurs d’une ligne de la table FilmSimple, enfin l’identifiant de
connexion à la base.
Exemple 2.17 exemples/MAJFilmSimple.php:Fonction de mise à jour de la table
<? php
/ / F o n c t i o n d e m i s e à j o u r ou i n s e r t i o n d e l a t a b l e F i l m S i m p l e
f u n c t i o n MAJFilmSimple ( $mode , $ f i l m , $ c o n n e x i o n )
{
/ / P r é p a r a t i o n d e s v a r i a b l e s , e n t r a i t a n t p a r a d d S l a s h e s
/ / l e s c h a î n e s d e c a r a c t è r e s
$ t i t r e = a d d S l a s h e s ( $ f i l m [ ’ t i t r e ’ ] ) ;
$annee = $ f i l m [ ’ annee ’ ] ;
$ p r e n o m _ r e a l i s a t e u r = a d d S l a s h e s ( $ f i l m [ ’ p r e n o m _ r e a l i s a t e u r ’ ] ) ;
$ n o m _ r e a l i s a t e u r = a d d S l a s h e s ( $ f i l m [ ’ n o m _ r e a l i s a t e u r ’ ] ) ;
$ a n n e e _ n a i s s a n c e = $ f i l m [ ’ a n n e e _ n a i s s a n c e ’ ] ;
i f ( $mode == MODE_INSERTION)
$ r e q u e t e = " INSERT INTO F i l m S i m p l e ( t i t r e , annee , "
" p r e n o m _ r e a l i s a t e u r , n o m _ r e a l i s a t e u r , a n n e e _ n a i s s a n c e ) " " VALUES ( ’ $ t i t r e ’ , ’ $annee ’ , ’ $ p r e n o m _ r e a l i s a t e u r ’ , " " ’ $ n o m _ r e a l i s a t e u r ’ , ’ $ a n n e e _ n a i s s a n c e ’ ) " ;
e l s e
Trang 5$ r e q u e t e = "UPDATE F i l m S i m p l e SET annee = ’ $annee ’ , "
" p r e n o m _ r e a l i s a t e u r = ’ $ p r e n o m _ r e a l i s a t e u r ’ , "
" n o m _ r e a l i s a t e u r = ’ $ n o m _ r e a l i s a t e u r ’ , "
" a n n e e _ n a i s s a n c e = ’ $ a n n e e _ n a i s s a n c e ’ "
"WHERE t i t r e = ’ $ t i t r e ’ " ;
/ / E x é c u t i o n d e l ’ o r d r e SQL
E x e c R e q u e t e ( $ r e q u e t e , $ c o n n e x i o n ) ;
}
? >
Enfin, la troisième fonction affiche un tableau des films présents dans la table, en associant à chaque film une ancre pour la modification.
Exemple 2.18 exemples/TableauFilms.php:Tableau affichant la liste des films
<? php
/ / A f f i c h a g e du t a b l e a u d e s f i l m s
f u n c t i o n T a b l e a u F i l m s ( $ c o n n e x i o n )
{
$ r e s u l t a t = E x e c R e q u e t e ( " SELECT ∗ FROM FilmSimple " , $connexion ) ;
echo " < t a b l e b o r d e r = ’ 4 ’ c e l l s p a c i n g = ’ 2 ’ c e l l p a d d i n g = ’2 ’ > "
" < c a p t i o n a l i g n = ’ bot t om ’ > T a b l e < i > F i l m S i m p l e < / i > </ c a p t i o n > " " < t r ><th > T i t r e < / th ><th >Année < / th ><th > R é a l i s a t e u r < / th > "
" <th >Année n a i s s a n c e < / th ><th >Action < / th > </ t r >\n " ;
w h i l e ( $ f i l m = O b j e t S u i v a n t ( $ r e s u l t a t ) ) {
/ / On c o d e l e t i t r e p o u r l e p l a c e r d a n s l ’URL
$ t i t r e U R L = u r l E n c o d e ( $ f i l m−> t i t r e ) ;
echo " < t r ><td > $ f i l m−> t i t r e </ td ><td >$film −>annee </ td > "
" <td > $ f i l m−>p r e n o m _ r e a l i s a t e u r $film −>n o m _ r e a l i s a t e u r </ td > "
" <td > $ f i l m−>a n n e e _ n a i s s a n c e </ td > "
" <td ><a h r e f = ’ F i l m S i m p l e php ? mode= " MODE_MAJ
"& ; t i t r e = $ t i t r e U R L ’ > M o d i f i e r c e f i l m < / a > </ td > </ t r >\n " ; }
echo " </ t a b l e >\n " ;
}
? >
Le tableau est standard, la seule particularité se limite à une l’ancre qui contient deux arguments, le mode et le titre du film à modifier :
<a href=’FilmSimple.php?mode=maj&titre=$titreURL’>
Rappelons qu’il faut prendre garde à ne pas placer n’importe quelle chaîne de caractères dans une URL (voir page 67) : des caractères blancs ou accentués seraient sans doute mal tolérés et ne donneraient pas les résultats escomptés On ne doit