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

Pratique de MySQL et PHP- P25 pptx

5 316 0

Đ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 157,42 KB

Nội dung

98 Chapitre 2. Techniques de base // Téléchargement d’une photo identifiée par $_GET[ ’ id ’] // On commence par incrémenter le compteur $connexion = Connexion (NOM, PASSE, BASE, SERVEUR) ; $requete = "UPDATE Album SET compteur=compteur+1 " . "WHERE id = ’ {$_GET [ ’ id ’ ] } ’ " ; $resultat = ExecRequete ($requete , $connexion); // On envoie un en−tête forçant le transfert (download) $fichier = $_GET[ ’id ’] . ".jpg"; $ ch e m i n = "PHOTOS / " ; header ("Content−type: application / force−download") ; header ("Content−disposition : filename=$fichier "); // Après l ’en−tête on transmet le contenu du fichier lui−même readFile ($chemin . $fichier ) ; ?> L’incrémentation du compteur est totalement transparente pour l’utilisateur. L’in- formation Content-type de l’en-tête demande au navigateur de traiter le contenu du message HTTP comme un fichier à stocker, tandis que Content-disposition permet de proposer un nom par défaut, dans la fenêtre de téléchargement, pour ce fichier. Enfin, la fonction readfile() ouvre un fichier et transfère directement son contenu au navigateur. L’intérêt de ce genre de script est de permettre d’exécuter un traitement quel- conque en PHP, sans aucun affichage, puis de renvoyer à une autre URL sans que l’utilisateur ait à intervenir. On pourrait ici, en plus de l’incrémentation du compteur, regarder qui vient chercher une image (en inspectant son adresse IP, disponible dans la variable serveur REMOTE_ADDR, ou toute autre information contenue dans les variables CGI, voir page 16). L’en-tête Location: autreURL par exemple permet de renvoyer à l’URL autreURL, qui peut être un script PHP ou un fichier HTML produisant réellement l’affichage. 2.5 SESSIONS Comme nous l’avons déjà évoqué dans le chapitre 1, le protocole HTTP ne conserve pas d’informations sur la communication entre un programme client et un pro- gramme serveur. Le terme de session web désigne les mécanismes qui permettent d’établir une certaine continuité dans les échanges entre un client et un serveur donnés. Ces mécanismes ont en commun l’attribution d’un identifiant de session àun utilisateur, et la mise en œuvre d’un système permettant de transmettre systématique- ment l’identifiant de session à chaque accès du navigateur vers le serveur. Le serveur sait alors à qui il a affaire, et peut accumuler de l’information sur cet interlocuteur. 2.5 Sessions 99 2.5.1 Comment gérer une session web ? Il existe essentiellement deux systèmes possibles. Le premier consiste à insérer l’iden- tifiant de session dans toutes les URL des pages transmises au client, ainsi que dans tous ses formulaires. Cette solution, conforme au standard HTTP, est très lourde à mettre en œuvre. De plus elle s’avère très fragile puisqu’il suffit que l’internaute accède à ne serait-ce qu’une seule page d’un autre site pour que l’identifiant de session soit perdu. La deuxième solution est de créer un ou plusieurs cookies pour stocker l’identifiant de session, (et peut-être d’autres informations) du côté du programme client. Rappe- lons (voir la fin du chapitre 1, page 16) qu’un cookie est essentiellement une donnée transmise par le programme serveur au programme client, ce dernier étant chargé de la conserver pour une durée déterminée. Cette durée peut d’ailleurs excéder la durée d’exécution du programme client lui-même, ce qui implique que les cookies soient stockés dans un fichier texte sur la machine cliente. On peut créer des cookies à partir d’une application PHP avec la fonction SetCookie(), placée dans l’en-tête du message HTTP. Dès que le navigateur a reçu (et accepté) un cookie venant d’un serveur, il renvoie ce cookie avec tous les accès à ce même serveur, et ce durant toute la durée de vie du cookie. Ce processus est relativement sécurisé puisque seul le programme serveur qui a créé un cookie peut y accéder, ce qui garantit qu’un autre serveur ne peut pas s’emparer de ces informations. En revanche, toute personne pouvant lire des fichiers sur la machine cliente peut alors trouver les cookies en clair dans le fichier cookies. Les cookies ne font pas partie du protocole HTTP, mais ont justement été inventés pour pallier les insuffisances de ce dernier. Ils sont reconnus par tous les navigateurs, même si certains proposent à leurs utilisateurs de refuser d’enregistrer les cookies sur la machine. Voici un script PHP qui montre comment gérer un compteur d’accès au site avec un cookie. Exemple 2.25 exemples/SetCookie.php : Un compteur d’accès réalisé avec un cookie <?php // Est−ce que le cookie existe ? if ( i s S e t ($_COOKIE[ ’ compteur ’ ] ) ) { $message = " Vous ê t e s déjà venu { $_COOKIE [ ’ compteur ’ ] } f o i s " . "me rendre visite <br/>\n"; // On incrémente le compteur $valeur = $_COOKIE[ ’compteur ’ ] + 1; } else { // Il faut créer le cookie avec la valeur 1 $message = "Bonjour , je vous envoie un cookie<br/>\n" ; $valeur = 1; } 100 Chapitre 2. Techniques de base // Envoi du cookie SetCookie ("compteur" , $valeur ) ; ?> <?xml version=" 1.0 " encoding="iso −8959−1"?> <!DOCTYPE html PUBLIC " −/ /W3C / / DTD XHTML 1 . 0 S t r i c t / / EN " "http ://www.w3. org/TR/xhtml1/DTD/xhtml1−strict .dtd"> <html xmlns="http ://www.w3. org/1999/xhtml" xml: lang=" fr " > <head> <title >Les cookies </ title > < link rel=’stylesheet ’ href="films . css" type="text/css"/> </head> <body> <h1>Un compteur d ’ accès au site avec cookie </h1> <?php echo $message ; ?> </body> </html> L’affichage se limite à un message qui varie selon que c’est la première fois ou non qu’un utilisateur se connecte au site. À chaque passage (essayez de recharger plusieurs fois la page) le compteur stocké dans le cookie est récupéré et incrémenté. Ces instructions sont placées avant toute sortie HTML puisque la définition d’un cookie fait partie de l’en-tête HTTP. Si l’on commet l’erreur de transmettre ne serait- ce qu’un caractère blanc avant le cookie, on obtient le message suivant: Warning: Cannot modify header information - headers already sent by (output started at /Applications/MAMP/htdocs/exemples/SetCookie.php:2) in /Applications/MAMP/htdocs/exemples/SetCookie.php on line 18 Dans ce cas regardez votre code à l’emplacement indiqué par le message, et cherchez les caractères transmis avant toute instruction plaçant quelque chose dans l’en-tête. REMARQUE – Dans les fichiers contenant des déclarations de fonctions ou de classes, une bonne habitude à prendre est de ne pas placer la balise fermante PHP. Cela ne gène pas l’interpréteur, tout en évitant d’introduire des caractères parasites après la balise fermante. L’appel à SetCookie() crée le cookie la première fois, et modifie sa valeur les fois suivantes. Par défaut, la durée de vie de ce cookie est celle du processus client (le navigateur) mais il est possible de donner une date pour le garder plusieurs jours, mois ou années (voir page 16). 2.5 Sessions 101 2.5.2 Gestion de session avec cookies Voyons maintenant comment utiliser les cookies pour gérer des sessions et enregistrer des informations sur un internaute dans une base de données. Les étapes à mettre en œuvre sont les suivantes : 1. quand un internaute arrive pour la première fois sur le site, on lui attribue un identifiant unique, et on lui transmet cet identifiant dans un cookie ; 2. à chaque accès ultérieur on est capable de reconnaître l’internaute par son identifiant, et on peut mémoriser les informations le concernant dans une ou plusieurs tables ; 3. quand la session est terminée, on peut valider définitivement l’ensemble des actions effectuées par l’internaute, éventuellement en lui demandant confir- mation. L’exemple donné ci-dessous consiste à proposer un menu en plusieurs phases : les entrées, les plats, puis les desserts, en conservant à chaque fois l’information sur les choix précédents. REMARQUE – PHP propose un mécanisme pour gérer les sessions. Cependant, pour clarifier les choses, nous décrivons dans un premier temps une technique indépendante avant de montrer l’équivalent avec les fonctions PHP. Le chapitre 7 montre comment combiner sessions web et authentification d’accès à un site. Voici la table Carte contenant les choix possibles, avec leur type. Exemple 2.26 exemples/Carte.sql : La carte du restaurant # Création d ’une table pour la carte d ’un restaurant CREATE TABLE Carte (id_choix INTEGER AUTO_INCREMENT NOT NULL, libelle TEXT, type ENUM ("Entrée" , "Plat" , "Dessert") , PRIMARY KEY (id_choix) ); INSERT INTO Carte(libelle , type) VALUES("Crudités" , "Entrée"); INSERT INTO Carte(libelle , type) VALUES("Charcuterie" , "Entrée"); INSERT INTO Carte(libelle , type) VALUES("Hareng" , " Entrée "); INSERT INTO Carte(libelle , type) VALUES("Steak" , "Plat "); INSERT INTO Carte(libelle , type) VALUES("Turbot" , " Plat "); INSERT INTO Carte(libelle , type) VALUES("Choucroute" , " Plat "); INSERT INTO Carte(libelle , type) VALUES(" Paris −Brest" , "Dessert"); INSERT INTO Carte(libelle , type) VALUES("Crème caramel" , "Dessert"); INSERT INTO Carte(libelle , type) VALUES("Tarte citron" , "Dessert"); 102 Chapitre 2. Techniques de base Il nous faut une autre table pour conserver les choix d’un internaute. Cette table associe l’internaute représenté par son identifiant de session, et un choix de la carte représenté par son identifiant id_choix. Exemple 2.27 exemples/Commande.sql : Les commandes de l’internaute # Création d ’une table pour les commandes au restaurant CREATE TABLE Commande ( i d _ s e s s i o n VARCHAR ( 4 0 ) NOT NULL , i d _ c h o i x INTEGER NOT NULL, PRIMARY KEY (id_session , id_choix) ); Passons maintenant à la réalisation du système de commandes. Il faut d’abord prévoir une fonction pour afficher les choix de la carte en fonction du type (entrée, plat ou dessert). Ces choix sont proposés avec un bouton de type radio. Exemple 2.28 exemples/FormCommande.php : Le formulaire d’affichage d’un choix à la carte <?php // Formulaire de saisie d’un choix à la carte function FormCommande ($type_choix , $script , $connexion) { // Un message pour indiquer à quel stade on en est if ($type_choix == "Entrée") echo "Pour commencer nous vous proposons les entrées<br/>"; else if ($type_choix == " Plat") echo "Maintenant choisissez un plat <br/>" ; else echo "Enfin choisissez un dessert<br/>"; // Maintenant on crée le formulaire echo "<form action=’$script ’ method=’post’>\n"; // Champ caché avec le type de choix echo "<input type=’hidden ’ name=’type_choix ’ value=’ $type_choix ’/>" ; // Recherche des choix selon le type (entrée , plat ou dessert ) $ r e q u e t e = "SELECT ∗ FROM Carte WHERE type=’$type_choix ’" ; $resultat = ExecRequete ($requete , $connexion); // Affichage des choix while ($choix = ObjetSuivant ( $resultat )) echo "$choix−>libelle : " . "<input type=’radio ’ name=’id_choix ’ value=’$choix−> id_choix ’/><br/>"; . ont en commun l’attribution d’un identifiant de session àun utilisateur, et la mise en œuvre d’un système permettant de transmettre systématique- ment l’identifiant de session à chaque accès du navigateur. lui attribue un identifiant unique, et on lui transmet cet identifiant dans un cookie ; 2. à chaque accès ultérieur on est capable de reconnaître l’internaute par son identifiant, et on peut mémoriser. l’internaute acc de à ne serait-ce qu’une seule page d’un autre site pour que l’identifiant de session soit perdu. La deuxième solution est de créer un ou plusieurs cookies pour stocker l’identifiant de session,

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

TỪ KHÓA LIÊN QUAN