Figure 2.6 — Le formulaire, au début de la session Exemple 2.29 exemples/ExSession.php:Exemple de commande avec session... Pour la suite du script, on dispose de l’identifiant de session
Trang 1echo " < 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 ’ / > \ n " ;
echo " </ form >\n " ;
}
? >
La figure 2.6 montre le formulaire affiché par le scriptExSession.php, avec les entrées Voici le code de ce script
Figure 2.6 — Le formulaire, au début de la session
Exemple 2.29 exemples/ExSession.php:Exemple de commande avec session
<? php
i f ( i s S e t ( $_COOKIE [ ’ i d _ s e s s i o n ’ ] ) ) {
/ / L ’ i d e n t i f i a n t d e s e s s i o n e x i s t e d é j à
$ i d _ s e s s i o n = $_COOKIE [ ’ i d _ s e s s i o n ’ ] ;
}
e l s e {
/ / C r é o n s un i d e n t i f i a n t
$ i d _ s e s s i o n = $_SERVER [ ’REMOTE_ADDR ’ ] d a t e ( "U" ) ;
/ / E n v o i du c o o k i e
S e t C o o k i e ( " i d _ s e s s i o n " , $ i d _ s e s s i o n ) ;
}
? >
<? 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 >
Trang 2< t i t l e >Une commande au r e s t a u r a n t < / 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> 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 $ i d _ s e s s i o n
< b r / > " ; FormCommande ( " E n t r é e " , " E x S e s s i o n php " , $ c o n n e x i o n ) ;
}
e l s e {
/ / I n s é r o n s d a n s l a t a b l e 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 = " INSERT INTO Commande ( i d _ s e s s i o n , i d _ c h o i x ) "
"VALUES ( ’ $ i d _ s e s s i o n ’ , ’ { $_POST [ ’ i d _ c h o i x ’ ] } ’ ) " ;
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 ) ;
/ / 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
$ r e q u e t e = " SELECT C2 ∗ FROM Commande C1 , Carte C2"
" WHERE i d _ s e s s i o n = ’ $ i d _ s e s s i o n ’ AND C1 i d _ c h o i x =C2 i d _ c h o i x " " ORDER BY C2 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 ) ;
w h i l e ( $ 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 ) )
echo " Vous a v e z c h o i s i : $ c h o i x−> l i b e l l e <br />\n " ;
/ / 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 " , " E x S e s s i o n 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 " , " E x S e s s i o n php " , $ c o n n e x i o n ) ;
}
e l s e {
/ / T r a i t e m e n t d e l a commande c o m p l è t e I c i on d é t r u i t
Trang 3echo " Nous a v o n s n o t é v o t r e commande M e r c i ! < b r / > " ;
$ r e q u e t e = " DELETE FROM Commande WHERE i d _ s e s s i o n = ’
$ i d _ s e s s i o n ’ " ;
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 ) ;
}
}
? >
</ body >
</ html >
La première partie est relativement analogue à celle du premier exemple avec
cookies, page 99 Si l’identifiant de session existe, on le conserve Sinon on le calcule,
et on crée le cookie pour le récupérer aux accès suivants Pour l’identifiant, nous
avons choisi ici simplement de concaténer l’adresse IP du client et le temps « Unix » lors de la première connexion (nombre de secondes depuis le 01/01/1970) Il y a raisonnablement peu de chances que deux utilisateurs utilisent la même machine au même moment (sauf cas ó, par exemple, plusieurs dizaines de personnes accèdent simultanément au site derrière une passerelle unique) Cela suffit pour cet exemple simple
Pour la suite du script, on dispose de l’identifiant de session dans la variable
$id_session On affiche alors successivement le formulaire pour les entrées, les
plats puis les desserts À chaque fois, on insère dans la table Commande le choix
effectué précédemment, et on récapitule l’ensemble des choix en les affichant dans
la page HTML C’est toujours l’identifiant de session qui permet de faire le lien entre ces informations Notez que la requête SQL qui récupère les choix de la session
courante est une jointure qui fait appel à deux tables Si vous ne connaissez pas SQL,
les jointures sont présentées dans le chapitre 7, page 289 Le langage SQL dans son ensemble fait l’objet du chapitre 10 Les figures 2.7 et 2.8 montrent respectivement
le formulaire après choix de l’entrée et du plat, et après le choix du dessert
Dans ce script, nous devons intégrer des éléments d’un tableau associatif dans une chaỵne de caractères Quand il s’agit d’une variable simple, le fait que le nom de la variable soit préfixé par « $ » suffit pour que PHP substitue la valeur de la variable C’est moins simple pour un tableau associatif On ne peut pas écrire en effet : echo " Ceci est un ´ el´ement de tableau : $tab[’code’] "; //Pas correct
Il existe deux manières correctes de résoudre le problème Première solution, une concaténation :
echo " Ceci est un ´ el´ement de tableau : " $tab[’code’]; //Correct
Seconde solution : on encadre par des accolades l’élément du tableau pour qu’il n’y ait plus d’ambigụté
echo " Ceci est un ´ el´ement de tableau : {$tab[’code’]} "; //Correct
Quand le dessert a été choisi, la session est terminée Il faudrait alors demander confirmation ou annulation, et agir en conséquence dans la base de données Ici nous nous contentons de détruire la commande, tâche accomplie !
Trang 4Figure 2.7 — Après choix du plat et de l’entrée
Figure 2.8 — Le menu est choisi
2.5.3 Prise en charge des sessions dans PHP
PHP fournit un ensemble de fonctions pour faciliter la gestion des sessions Ces fonctions permettent, pour l’essentiel :
1 d’engendrer automatiquement un identifiant de session, et de le récupérer à chaque nouvel accès ;
Trang 52 de stocker des informations associées à la session (par défaut le stockage a lieu dans un fichier temporaire) ;
3 de détruire toutes ces informations une fois la session terminée
Dans la mesure ó nous utilisons une base de données, une partie des fonctions
de gestion de session, notamment celles qui consistent à conserver des informations sur les interactions passées de l’utilisateur, peuvent être avantageusement remplacées par des accès MySQL L’intérêt est essentiellement de mieux protéger les accès aux donnés enregistrées dans le cadre de la session Nous allons donc nous contenter des fonctions PHP essentielles à la gestion de session, données ci-dessous :
Fonction Description
session_start() Initialise les informations de session Si aucune session n’existe, un
identifiant est engendré et transmis dans un cookie Si la session
(connue par son identifiant) existe déjà, alors la fonction instancie toutes les variables qui lui sont liées Cette fonction doit être appelée
au début de tout script utilisant les sessions (il faut que l’instruction Set-Cookie puisse être placée dans l’en-tête HTTP).
session_destroy() Détruit toutes les informations associées à une session.
session_id() Renvoie l’identifiant de la session.
session_start(), qui attribue ou récupère l’identifiant de la session (un cookie
nommé PHPSESSID) On peut associer des variables à la session en les stockant dans
le tableau $_SESSION Une fois qu’une variable a été associée à une session, elle est automatiquement recréée et placée dans le tableau $_SESSION à chaque appel à session_start() On peut la supprimer avec la fonction unset(), qui détruit une variable PHP Enfin, quand la session est terminée, session_destroy() supprime toutes les variables associées (équivalent à un appel à unset() pour chaque variable)
Le script ci-dessous montre la gestion d’une session, équivalente à la précédente, avec les fonctions PHP
Exemple 2.30 exemples/SessionPHP.php:Gestion de session avec les fonctions PHP
<? php
/ / La f o n c t i o n s e s s i o n _ s t a r t f a i t t o u t l e t r a v a i l
s e s s i o n _ s t a r t ( ) ;
? >
<? 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 >Une commande au r e s t a u r a n t < / 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 >