Si on commence à utiliser le passage par référence pour certaines fonctions, on se retrouve donc dans un monde incertain ó certaines variables sont modifiées après un appel à une fonctio
Trang 1$ c e t t e A n n e e = d a t e ( ’ Y ’ ) ;
/ / R i e n à r e n v o y e r !
}
? >
Voici maintenant la fonction équivalente renvoyant la date courante sous forme d’un tableau à trois entrées, jour, mois et an
Exemple 2.6 exemples/RenvoiTableau.php:Fonction renvoyant la date courante
<? php
/ / E x e m p l e d e f o n c t i o n r e n v o y a n t p l u s i e u r s v a l e u r s g r â c e à un / / t a b l e a u
f u n c t i o n a u j o u r d h u i _ t a b ( )
{
/ / I n i t i a l i s a t i o n du r e t o u r
$ r e t o u r = a r r a y ( ) ;
/ / On c a l c u l e l e j o u r , l e m o i s e t l ’ a n n é e c o u r a n t e
$ r e t o u r [ ] = d a t e ( ’ d ’ ) ;
$ r e t o u r [ ] = d a t e ( ’m ’ ) ;
$ r e t o u r [ ] = d a t e ( ’ Y ’ ) ;
/ / R e n v o i du t a b l e a u
r e t u r n $ r e t o u r ;
}
? >
L’exemple ci-dessous montre l’utilisation des deux fonctions précédentes On utilise la décomposition du tableau en retour grâce à l’opérateur list, mais on pourrait également récupérer une seule variable de type tableau, et la traiter ensuite :
Exemple 2.7 exemples/QuelJour.php:Appel des fonctions précédentes
<? php
/ / E x e m p l e d ’ a p p e l à u n e f o n c t i o n r e n v o y a n t p l u s i e u r s
/ / v a l e u r s : p a s s a g e p a r r é f é r e n c e e t p a s s a g e p a r t a b l e a u
r e q u i r e _ o n c e ( ’ R e n v o i T a b l e a u php ’ ) ;
r e q u i r e _ o n c e ( ’ R e f e r e n c e s php ’ ) ;
/ / On v e u t o b t e n i r l e j o u r , l e m o i s , l ’ an
$an = $ m o i s = $ j o u r = " " ;
/ / P a s s a g e d e s v a l e u r s p a r r é f é r e n c e
a u j o u r d h u i _ r e f ( $ j o u r , $mois , $an ) ;
echo " Nous sommes l e $ j o u r / $ m o i s / $an < b r / > " ;
/ / A p p e l , e t r é c u p é r a t i o n d e s v a l e u r s du t a b l e a u
Trang 2l i s t ( $ j o u r , $mois , $an ) = a u j o u r d h u i _ t a b ( ) ;
echo " C o n f i r m a t i o n : n o u s sommes l e $ j o u r / $ m o i s / $an < b r / > " ;
? >
Une caractéristique de cette syntaxe est que l’on ne sait pas, en regardant ce code,
que la fonction aujourdhui_ref() modifie les valeurs de ses paramètres et a donc
un impact invisible sur le script appelant Si on commence à utiliser le passage par référence pour certaines fonctions, on se retrouve donc dans un monde incertain ó certaines variables sont modifiées après un appel à une fonction sans que l’on sache pourquoi Du point de vue de la compréhension du code, le passage des paramètres par valeur est donc préférable
Ce qui nous amène au second argument en faveur du passage par référence : le passage par valeur entraỵne des copies potentiellement pénalisantes Cet argument est à prendre en considération si on pense que la fonction en cause est appelée très fréquemment et manipule des données volumineuses, mais on doit être conscient que
le recours aux références est plus délicat à manipuler et rend le code moins sûr Dans le cadre de ce livre, ó la lisibilité des exemples et du code est un critère primordial, aucune fonction n’utilise de passage par référence (et encore moins de variable globale) Cela montre, incidemment, qu’il est tout à fait possible de se passer totalement de ces mécanismes Dans la plupart des cas on y gagne un code sain, sans impacter les performances Je reviendrai à quelques occasions sur ce choix pour discuter d’une autre stratégie de développement consistant à recourir au passage par références Comme indiqué ci-dessus, les objets sont une exception en PHP : ils sont toujours passés par référence
2.2 TRAITEMENT DES DONNÉES TRANSMISES PAR HTTP
Pour étudier de manière concrète les problèmes soulevés par l’échange de données via HTTP (et leurs solutions), nous allons étudier une application très simplifiée d’envoi
de courrier électronique (terme que nous simplifierons en e-mail) dont la figure 2.1 donne le schéma Il s’agit d’un script unique,Mail.php, qui fonctionne en deux modes :
1 Si aucune donnée ne lui est soumise, le script affiche un formulaire de saisie d’un e-mail L’utilisateur peut alors entrer les données du formulaire et les soumettre Elles sont transmises, au même script, via HTTP
2 Si des données sont soumises (cas ó on est donc passé par le mode précédent),
le script récupère les données et doit :
• envoyer l’e-mail,
• stocker l’e-mail dans la base de données,
• l’afficher en HTML pour confirmer la prise en charge de l’envoi
Ce qui nous intéresse ici, c’est le traitement des données transférées dans trois contextes différents : envoi sous forme de texte pur, insertion dans MySQL et
Trang 3affichage avec HTML Chaque traitement est implanté par une fonction détaillée dans ce qui suit Voici le script général,Mail.php, qui appelle ces différentes fonctions
Message à envoyer ?
Oui Non
Saisie, puis soumission
Affichage du formulaire
Stockage dans
la base Affichage à l’écran
MySQL
HTML
Figure 2.1 — Le schéma de l’application d’envoi d’un e-mail
Exemple 2.8 exemples/Mail.php:Script de gestion d’un e-mail
<? 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 > E n v o i d ’ un e−mail </ 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 >
<body >
<h1> E n v o i de m a i l < / h1>
<? php
/ / I n c l u s i o n d e s f i c h i e r s c o n t e n a n t l e s d é c l a r a t i o n s de f o n c t i o n s
r e q u i r e _ o n c e ( " N o r m a l i s a t i o n php " ) ;
r e q u i r e _ o n c e ( " C o n t r o l e M a i l php " ) ;
r e q u i r e _ o n c e ( " S t o c k e M a i l php " ) ;
r e q u i r e _ o n c e ( " A f f i c h e M a i l php " ) ;
r e q u i r e _ o n c e ( " E n v o i M a i l 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 ( ) ;
/ / S i l a v a r i a b l e $ e n v o y e r e x i s t e , d e s d o n n é e s o n t é t é s a i s i e s / / d a n s l e f o r m u l a i r e
Trang 4i f ( i s S e t ( $_POST [ ’ e n v o y e r ’ ] ) ) {
/ / C o n t r ô l e d e s d o n n é e s en e n t r é e
i f ( ! C o n t r o l e M a i l ( $_POST ) ) {
/ / Un p r o b l è m e q u e l q u e p a r t ? I l f a u t r é a g i r
echo " <p>Quelque c h o s e ne va p a s < / p > " ;
e x i t ;
}
/ / On a p a s s é l e t e s t : s t o c k a g e d a n s l a b a s e
S t o c k e M a i l ( $_POST ) ;
/ / On a f f i c h e l e t e x t e de l ’ e−mail
A f f i c h e M a i l ( $_POST ) ;
/ / E n v o i d e l ’ e−m a i l
E n v o i M a i l ( $_POST ) ;
}
e l s e {
/ / On a f f i c h e s i m p l e m e n t l e f o r m u l a i r e
r e q u i r e ( " FormMail html " ) ;
}
? >
</ body >
</ html >
Le premier mode de l’application, avec le formulaire de saisie, est présenté figure 2.2
Figure 2.2 — Formulaire d’envoi d’un e-mail
Trang 52.2.1 Échappement et codage des données HTTP
Quand l’utilisateur soumet un formulaire, le navigateur code les données saisies dans les champs pour les inclure dans un message HTTP Rappelons que :
• en mode get les paramètres sont placés dans l’URL appelée ;
• en mode post les paramètres sont transmis dans le corps du message HTTP Nous allons utiliser le mode post car la méthode get a l’inconvénient de créer des URL très longues pour y stocker les paramètres Une partie de ces derniers peut d’ailleurs être perdue si la taille limite (256 caractères selon le protocole HTTP) est dépassée Un mode de passage des paramètres imposant le mode get est celui ó l’on place directement les paramètres dans une ancre du document HTML Supposons par exemple qu’on place quelque part dans le document HTML une ancre dans laquelle
on passe le sujet de l’e-mail :
echo "<a href=’Mail.php?sujet=$sujet’>Message</a>";
Il faut être attentif dans ce cas à bien coder l’URL selon les règles HTTP Si
le sujet est par exemple Wallace & Gromit ou l’ours ?, l’esperluette « & » et
le point d’interrogation « ? », placés littéralement dans l’URL, rendront le message HTTP incompréhensible pour le script On obtiendra en effet :
echo "<a href=’Mail.php?sujet=Wallace & Gromit ou l’ours ?>Message</a>";
Le codage s’obtient en appliquant la fonction urlEncode() aux chaỵnes placées dans les ancres Voici donc la bonne version :
$ s u j e t = " W a l l a c e & Gromit ou l ’ o u r s ? " ;
$ s u j e t P o u r U R L = u r l E n c o d e ( $ s u j e t ) ;
echo " <a h r e f = ’ M a i l php ? s u j e t = $ s u j e t P o u r U R L ’ > M e s s a g e < / a > " ;
L’URL sera alors codée comme suit :
Mail.php?sujet=Wallace+%5C%26+Gromit+ou+l%27ours+%3F
Revenons au cas ó l’on utilise un formulaire, ce qui garantit que le navigateur effectuera le codage pour nous Après soumission, le message est transmis au script indiqué dans l’attribut action du formulaire Dans notre cas, le script est « réen-trant » car il reçoit lui-même les données soumises par le formulaire qu’il a affiché
Il suffit d’être capable de déterminer, à l’entrée du script, si le formulaire vient d’être soumis ou non On utilise un champ caché, de nom envoyer, qui provoquera donc l’instanciation d’une variable PHP après soumission
Exemple 2.9 exemples/FormMail.html:Le formulaire de saisie des e-mails
< !−− F o r m u l a i r e b a s i q u e p o u r l ’ e n v o i d ’ un e−m a i l −−>
<form a c t i o n = ’ M a i l php ’ method = ’ p o s t ’ >
< !−− Champ c a c h é p o u r i n d i q u e r que l e f o r m u l a i r e a é t é s o u m i s −−>