Cette persistance est obtenue en stockant les valeurs du tableau dans un fichier temporaire, situé par exemple sous Unix dans le répertoire /tmp et configurable avec le paramètre session
Trang 1<h1> F a i t e s v o t r e commande au r e s t a u r a n t < / h1>
<? php
r e q u i r e _ o n c e ( " Connect php " ) ;
r e q u i r e _ o n c e ( " Connexion php " ) ;
r e q u i r e _ o n c e ( " E x e c R e q u e t e php " ) ;
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 ( " FormCommande php " ) ;
/ / C o n n e x i o n à l a b a s e
$ c o n n e x i o n = Connexion (NOM, PASSE , BASE , SERVEUR) ;
/ / 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 e t y p e d e c h o i x n ’ e s t p a s d é f i n i : on co mmence
/ / p a r p r o p o s e r l e s e n t r é e s
i f ( ! i s S e t ( $_POST [ ’ t y p e _ c h o i x ’ ] ) ) {
echo " B o n j o u r Nous v o u s a v o n s a t t r i b u é l a s e s s i o n "
s e s s i o n _ i d ( ) " < b r / > " ;
FormCommande ( " E n t r é e " , " S e s s i o n P H P php " , $ c o n n e x i o n ) ;
}
e l s e {
/ / E n r e g i s t r o n s l e c h o i x q u i v i e n t d ’ ê t r e f a i t
/ / I l f a u d r a i t t e s t e r q u e i d _ c h o i x e s t d é f i n i
$ r e q u e t e = " SELECT l i b e l l e FROM C a r t e "
"WHERE i d _ c h o i x = ’ $_POST [ i d _ c h o i x ] ’ " ;
$ r e s u l t a t = 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 ) ;
$ c h o i x = O b j e t S u i v a n t ( $ r e s u l t a t ) ;
$_SESSION [ $_POST [ ’ t y p e _ c h o i x ’ ] ] = $ c h o i x−> l i b e l l e ;
/ / A f f i c h a g e d e s c h o i x d é j à e f f e c t u é s
i f ( i s S e t ( $_SESSION [ ’ E n t r é e ’ ] ) )
echo " V o t r e e n t r é e : " $_SESSION [ ’ E n t r é e ’ ] " < b r / > " ;
i f ( i s S e t ( $_SESSION [ ’ P l a t ’ ] ) )
echo " V o t r e p l a t : " $_SESSION [ ’ P l a t ’ ] " < b r / > " ;
i f ( i s S e t ( $_SESSION [ ’ D e s s e r t ’ ] ) )
echo " V o t r e d e s s e r t : " $_SESSION [ ’ D e s s e r t ’ ] " < b r / > " ;
/ / A f f i c h a g e d e l a s u i t e
i f ( $_POST [ ’ t y p e _ c h o i x ’ ] == ’ E n t r é e ’ )
FormCommande ( " P l a t " , " S e s s i o n P H P php " , $ c o n n e x i o n ) ;
e l s e i f ( $_POST [ ’ t y p e _ c h o i x ’ ] == ’ P l a t ’ )
FormCommande ( " D e s s e r t " , " S e s s i o n P H P php " , $ c o n n e x i o n ) ;
e l s e {
echo " <p>Nous a v o n s n o t é v o t r e commande M e r c i ! < p / > " ;
s e s s i o n _ d e s t r o y ( ) ;
}
}
Trang 2? >
</ body >
</ html >
Les deux différences principales sont, d’une part, le recours à la fonction
session_start() qui remplace la manipulation explicite des cookies (voir le script
ExSession.php, page 103), et d’autre part l’utilisation du tableau $_SESSION à la place
de la table Commande.
Ce tableau peut être vu comme une variable PHP persistante entre deux échanges client/serveur Cette persistance est obtenue en stockant les valeurs du tableau
dans un fichier temporaire, situé par exemple sous Unix dans le répertoire /tmp (et
configurable avec le paramètre session_save_path dans le fichierphp.ini)
Ce mécanisme, valable pour la mise en place d’un système de gestion des ses-sions très simple, trouve rapidement ses limites Si de très nombreuses informations doivent être associées à une session, il est préférable de les placer dans la base
de données, en les référençant par l’identifiant de session (donné par la fonction session_id()) Une base de données permet de mieux structurer les informations Elle persiste sur une très longue durée, contrairement à un fichier temporaire D’autre part, elle est plus sûre puisque seuls les utilisateurs autorisés peuvent y accéder Les principes de gestion de session présentés ici seront repris de manière plus étendue dans le chapitre 7 pour développer des utilitaires robustes et associer la ges-tion de sessions à l’authentificages-tion des utilisateurs dans une base MySQL Les fonc-tionnalités de PHP présentées précédemment nous suffiront puisque nous utilisons MySQL, mais vous pouvez consulter les autres fonctions PHP dans la documentation
si vous pensez avoir à utiliser le mécanisme natif PHP Il est possible en particulier
d’éviter l’utilisation des cookies en demandant à PHP la réécriture de chaque URL
dans une page pour y inclure l’identifiant de session Comme expliqué au début de cette section, cette méthode reste cependant globalement insatisfaisante et peu sûre
2.6 SQL DYNAMIQUE ET AFFICHAGE MULTI-PAGES
Dans la plupart des cas les requêtes SQL exécutées dans les scripts PHP sont fixées par
le programmeur et ce dernier connaît le type du résultat (nombre d’attributs et noms des attributs) Il peut arriver que les ordres SQL soient « dynamiques », c’est-à-dire déterminés à l’exécution C’est le cas par exemple quand on permet à l’utilisateur d’effectuer directement des requêtes SQL sur la base et d’afficher le résultat sous forme de table On peut alors faire appel à des fonctions MySQL qui donnent des informations sur le type du résultat
Voici une illustration de cette fonctionnalité avec, en guise de garniture, l’af-fichage « multi-pages » du résultat Au lieu de donner en bloc, dans une seule page HTML, toutes les lignes du résultat de la requête, on affiche seulement un sous-groupe de taille fixée (ici, 10), et on donne la possibilité de passer d’un groupe à l’autre avec des ancres
Trang 32.6.1 Affichage d’une requête dynamique
Commençons par écrire une fonction qui prend en argument le résultat d’une requête (tel qu’il est rendu par la fonction mysql_query()), la position de la première ligne
à afficher, et le nombre de lignes à afficher
Exemple 2.31 exemples/AfficheResultat.php:Affichage partiel du résultat d’une requête SQL
<? php
/ / A f f i c h a g e p a r t i e l du r é s u l t a t d ’ u n e r e q u ê t e
r e q u i r e ( " UtilBD php " ) ;
f u n c t i o n A f f i c h e R e s u l t a t ( $ r e s u l t a t , $ p o s i t i o n , $ n b r L i g n e s )
{
/ / A f f i c h a g e d ’ un t a b l e a u HTML, a v e c a u t a n t d e c o l o n n e s
/ / q u e d ’ a t t r i b u t s On a f f i c h e $ n b r L i g n e s l i g n e s ,
/ / à p a r t i r d e l a l i g n e i n d i q u é e p a r $ p o s i t i o n ,
echo " < t a b l e b o r d e r = ’4 ’ > " ;
$ c o m p t e u r L i g n e s = 1 ;
$ n b A t t r = m y s q l _ n u m _ f i e l d s ( $ r e s u l t a t ) ;
$ n o L i g n e = 0 ;
w h i l e ( $ t a b A t t r = m y s q l _ f e t c h _ r o w ( $ r e s u l t a t ) ) {
/ / A v a n t l a p r e m i è r e l i g n e , on a f f i c h e l ’ en−t ê t e de l a t a b l e
i f ( $ c o m p t e u r L i g n e s == 1 ) {
echo " < t r > " ;
/ / A f f i c h a g e d e s noms d ’ a t t r i b u t s
f o r ( $ i = 0 ; $ i < $ n b A t t r ; $ i ++)
echo " <th > " m y s q l _ f i e l d _ n a m e ( $ r e s u l t a t , $ i ) " </ th >\n " ;
}
/ / A f f i c h a g e d e c h a q u e l i g n e d a n s l a f o u r c h e t t e [ p r e m i è r e ,
d e r n i è r e ]
i f ( $ c o m p t e u r L i g n e s >= $ p o s i t i o n
and $ c o m p t e u r L i g n e s <= $ p o s i t i o n + $ n b r L i g n e s −1) {
$ c l a s s e = "A" ( ( $ n o L i g n e ++) % 2 ) ;
echo " < t r c l a s s = ’ $ c l a s s e ’ > " ;
f o r ( $ i = 0 ; $ i < $ n b A t t r ; $ i ++) {
i f ( empty ( $ t a b A t t r [ $ i ] ) ) $ t a b A t t r [ $ i ] = " Champ v i d e " ; echo " <td > $ t a b A t t r [ $ i ] < / td > " ;
}
echo " </ t r >\n " ;
}
/ / I n u t i l e d e c o n t i n u e r s i t o u t e s t a f f i c h é
i f ( $ c o m p t e u r L i g n e s ++ >= $ p o s i t i o n + $ n b r L i g n e s − 1) break ;
}
Trang 4echo " </ t a b l e >\n " ;
}
? >
La fonction AfficheResultat() utilise quelques nouvelles fonctionnalités de l’interface MySQL/PHP Elles permettent d’obtenir la description du résultat, en plus
du résultat lui-même
1 mysql_num_fields() donne le nombre d’attributs dans le résultat ;
2 mysql_field_name() donne le nom de l’un des attributs ;
3 mysql_fetch_row() renvoie la ligne sous forme d’un tableau indicé, plus facile à manipuler que les tableaux associatifs ou les objets quand on doit exploiter le résultat de requêtes quelconques pour lesquelles on ne connaît
pas, a priori, le type du résultat et donc le nom des attributs.
L’affichage comprend deux boucles La première, classique, permet de parcourir toutes les lignes du résultat Notez qu’ici on ne prend en compte que les lignes à présenter, à savoir celles dont la position est comprise entre $position et
$position+$nbrLignes-1 La seconde boucle parcourt, pour une ligne donnée, tous les attributs
echo " < t r c l a s s = ’A ’ " ( ( $ n o L i g n e ++) % 2 ) " > " ;
f o r ( $ i = 0 ; $ i < $ n b A t t r ; $ i ++) {
i f ( empty ( $ t a b A t t r [ $ i ] ) ) $ t a b A t t r [ $ i ] = " Champ v i d e " ;
echo " <td > $ t a b A t t r [ $ i ] < / td > " ;
}
echo " </ t r >\n " ;
On alterne la couleur de fond pour rendre la table plus lisible Notre feuille de style,films.css, définit deux couleurs de fond pour les classes A0 et A1
tr.A0 {background-color:white}
tr.A1 {background-color:yellow}
On utilise alternativement les classes A0 et A1 pour la balise <tr> On concatène
pour cela le caractère ’A’ avec le résultat de l’expression $l++ % 2 La variable $l++ est un entier qui, auto-incrémenté par l’opérateur ’++’, vaut successivement 0, 1, 2,
3, etc En prenant cette valeur modulo 2 (l’opérateur ’%’), on obtient l’alternance souhaitée de 0 et de 1
2.6.2 Affichage multi-pages
Voyons maintenant comment réaliser l’affichage multi-pages, une technique très utile pour afficher de longues listes et utilisée, par exemple, par les moteurs de recherche
Trang 5Exemple 2.32 exemples/ExecSQL.php:Affichage multi-pages du résultat d’une requête
<? 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 > I n t e r r o g a t i o n a v e c SQL< / 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> I n t e r r o g a t i o n a v e c SQL< / h1>
< f o r m method= ’ p o s t ’ a c t i o n = ’ ExecSQL php ’ >
< t e x t a r e a name= ’ r e q u e t e ’ c o l s = ’ 50 ’ r o w s = ’ 3 ’ ><? php
i f ( i s S e t ($_REQUEST [ ’ r e q u e t e ’ ] ) )
echo $_REQUEST [ ’ r e q u e t e ’ ] ;
e l s e
echo " SELECT ∗ FROM FilmSimple " ;
? >
</ t e x t a r e a >
< b r / >
< i n p u t name= ’ s u b m i t ’ t y p e = ’ s u b m i t ’ v a l u e = ’ E x é c u t e r ’ / >
</ form >
<? php
r e q u i r e _ o n c e ( " UtilBD php " ) ;
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 ( " A f f i c h e R e s u l t a t php " ) ;
d e f i n e ( "TAILLE_GROUPE " , 1 0 ) ;
/ / C o n n e x i o n à l a b a s e
$ c o n n e x i o n = Connexion (NOM, PASSE , BASE , SERVEUR) ;
/ / 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 ( ) ;
/ / La r e q u ê t e e x i s t e ? I l f a u t l a t r a i t e r
i f ( i s S e t ($_REQUEST [ ’ r e q u e t e ’ ] ) ) {
$ r e s u l t a t = E x e c R e q u e t e ($_REQUEST [ ’ r e q u e t e ’ ] , $ c o n n e x i o n ) ;
/ / On c o d e l a r e q u ê t e p o u r l a p l a c e r d a n s u n e URL
$ r e q u e t e C o d e e = u r l E n c o d e ($_REQUEST [ ’ r e q u e t e ’ ] ) ;
/ / On v i e n t d e s o u m e t t r e l a r e q u ê t e d a n s l e f o r m u l a i r e ? Dans / / c e c a s l a
/ / p r e m i è r e l i g n e d o i t ê t r e a f f i c h é e S i n o n on r é c u p è r e l a
p o s i t i o n c o u r a n t e
i f ( i s S e t ( $_POST [ ’ s u b m i t ’ ] ) ) {
$ p o s i t i o n = 1 ;