From: Kim Nguyễn Date: Thu, 20 Nov 2014 08:24:30 +0000 (+0100) Subject: . X-Git-Url: http://git.nguyen.vg/gitweb/?p=hacks%2FsimpleWebSlides.git;a=commitdiff_plain;h=e710b4da74b3fb2ffc4af8f6251ed5ad1b0476b1 . --- diff --git a/unix_prog_web/pdf/unix_prog_web_08.pdf b/unix_prog_web/pdf/unix_prog_web_08.pdf index ca5cae4..25230e0 100644 Binary files a/unix_prog_web/pdf/unix_prog_web_08.pdf and b/unix_prog_web/pdf/unix_prog_web_08.pdf differ diff --git a/unix_prog_web/pdf/unix_prog_web_08_print.pdf b/unix_prog_web/pdf/unix_prog_web_08_print.pdf index 0ee96d9..aa068ae 100644 Binary files a/unix_prog_web/pdf/unix_prog_web_08_print.pdf and b/unix_prog_web/pdf/unix_prog_web_08_print.pdf differ diff --git a/unix_prog_web/unix_prog_web_08.xhtml b/unix_prog_web/unix_prog_web_08.xhtml index 9bf82b5..76dda71 100644 --- a/unix_prog_web/unix_prog_web_08.xhtml +++ b/unix_prog_web/unix_prog_web_08.xhtml @@ -4,7 +4,7 @@ > - PHP : Sessions et persistance + Formulaires @@ -36,362 +36,245 @@ - +
-

Programmation Internet

+

Unix et Programmation Web

Cours 8

kn@lri.fr
http://www.lri.fr/~kn
-

En-tête de requêtes HTTP

- +

Formulaires (utilisation avancée)

-

Retour sur le protocole HTTP

-
-} ← type de contenu -} ← longueur du contenu -} ← contenu (2038 octets) - - +
+

Champs de texte long

+

Pour des textes multilignes, on utilise la + balise <textarea />. +

+ du texte! +]]> +

Apperçu: + Attributs: +

+ +

On peut pré-remplir la zone en mettant du texte entre la + balise ouvrante et fermante. + Accès à la valeur depuis PHP se fait + via $_GET["montexte"] ou $_POST["montexte"] + selon la valeur de l'attribut method de + l'élément form englobant.

-
-

Retour sur le protocole HTTP (2)

-
-
-

Modifier le content-type en PHP

-

Fichier notes_csv.php:

- <?php - header('Content-type: application/csv'); - header('Content-Disposition: attachement; filename="notes.csv"'); - echo "Nom, Note\n"; - foreach ($NOTES as $nom => $note) - echo $nom . ", " . $note . "\n"; +
+

Boutons à choix unique

+

On peut définir un choix avec la balise + <input type="radio">

+ + 12h + 20h +]]> + +

Apperçu : 8h +12h +20h +

+

+ Accès à la valeur depuis PHP se fait + via $_GET["h"] ou $_POST["h"] + selon la valeur de l'attribut method de + l'élément form englobant.
+ Attention il faut réutiliser la même valeur de + l'attribut name pour les boutons du même groupe. - ?>
-

⚠ Attention!

-
    -
  • Les appels à la fonction header() doivent se - trouver avant le premier echo() du code PHP
  • -
  • - Le code PHP doit générer (avec echo()) du contenu - compatible avec le type annoncé (et pas du HTML) -
  • -
+

+
+

Cases à choix multiples

+

On peut définir des cases à cocher à choix multiple avec la balise + <input type="radio">

+ + 12h + 20h +]]> + +

Apperçu: + 8h + 12h + 20h +

+

+ Accès à la valeur depuis PHP se fait + via $_GET["tab"] ou $_POST["tab"] + selon la valeur de l'attribut method de + l'élément form englobant.
+ Attention il faut rajouter [] dans l'attribut name pour + que PHP crée un tableau. tab[i] contient la + valeur de la ième cases cochée (à partir de 0). +

+
+

Variables super-globales (rappels)

-

Quelques en-tête utiles

-

En tête utilisés par le serveur dans ses réponses

-
-
Content-type
type MIME du contenu envoyé par le - serveur
-
Content-Disposition
permet de mentionner un nom de - fichier : attachment; filname="foobar.baz"
-
Cache-Control
permet de forcer le client à - retélécharger la page: no-cache, must-revalidate -
-
Last-Modified
date de dernière modification du - contenu demandé
-
-

En tête utilisés par le client dans ses requêtes

-
-
Range
permet de ne récupérer qu'un intervale - d'octets donné dans un fichier: bytes=500-999 -
- … -
+

Variables super-globales

+

PHP définit un certain nombre de variables dites + « super-globales Â». Ce sont des variables accessible + depuis n'importe où dans un programme PHP, y compris depuis des + fonctions, sans adjonction du mot clé global.

+ + $TOTO = 42; + function f() { + global $TOTO; // obligatoire, sinon $TOTO n'est pas visible + echo $TOTO; + echo $_GET["champ"]; //fonctionne toujours, même sans 'global' + //au début de la fonction. + + } + +
-

Retour sur le protocole HTTP (3)

-

On rappelle que HTTP est un protocole stateless - (sans état, i.e. le serveur Web ne conserve pas d'information - entre les connexions). Quel problème cela pose-t-il ?

-
    -
  • Pas de partage d'information entre plusieur - pages
  • -
  • Pas de mécanisme de reprise sur panne -
  • -
  • Pas de persistance de l'information
  • -
  • Pas d'authentification (impossible de savoir - que deux connexions successives ont été faites par le même - client)
  • -
-

⇒ difficle de réaliser une « application » - moderne répartie sur plusieurs pages

+

Variable $_GET et $_POST

+

+ Ces variables contiennent les valeurs des champs d'un formulaire. + Si l'attribut method de l'élément form + vaut get la variable $_GET contient les valeurs. + S'il vaut post la variable $_POST est à utiliser. +

- -

Cookies

-

Cookies

-

Un cookie est un packet de données envoyé par le - serveur, stocké par le client (navigateur Web) et renvoyé au serveur - lors d'une nouvelle connexion. Les propriétés d'un cookie sont: +

Variable $_FILES

+

+ Cette variable contient les informations relatives aux fichiers + envoyés par le client.
Si le nom du champ est fichier, + alors: +

-
Son nom
une chaîne de caractères
-
Sa valeur
une chaîne de caraceres
-
Sa durée de vie
jusqu'à la fin de la « session » ou pour - une période donnée
-
Son domaine
Le nom du site web émetteur du cookie
-
Son chemin
Le sous-répertoire (par rapport à la racine - du site) pour lequel le cookie est valide
-
-

⚠ Attention! seul le domaine qui a - déposé le cookie est capable de le relire

+
$_FILES["fichier"]["error"]
Code d'erreur + (0 si tout c'est bien passé, > 0 si une erreur s'est produite. Les + autres champs ne sont définis que si "error" vaut 0). +
+
$_FILES["fichier"]["tmp_name"]
Nom du fichier + temporaire sur le serveur où a été sauvegardé le contenu du + fichier envoyé
+
$_FILES["fichier"]["name"]
Nom original du fichier
+
$_FILES["fichier"]["size"]
Taille du + fichier
+
$_FILES["fichier"]["type"]
Le type MIME du fichier
+
-

Cookies en PHP

-

Créer ou mettre à jour un cookie sur le client:

- - setcookie($nom, $val, $date); - -
-
$nom
nom du cookie
-
$val
valeur du cookie
-
$date
date d'expiration en secondes - depuis epoch (1er janvier 1970 00:00:00) - ou NULL pour une expiration automatique.
-
-

(on peut récupérer le nombre de secondes depuis epoche avec - la fonction time()).
- Exemple: +

Variable $_SESSION

+

Contient les variables de sessions. La variable n'est + accessible qu'après un appel à session_start(). Ces + le contenu de cette variable persiste durant toute la durée de la + session même sur des pages différentes. La + variable $_SESSION est un tableau.

- setcookie("mon_cookie", "42", time() + 3600 * 24 * 30);
-

Cookies en PHP

-

On peut récupérer la valeur d'un cookie depuis PHP: -

- $_COOKIE["mon_cookie"] -

Un cookie "foo" existe (i.e. a été défini - auparavant) si une entrée correspondante existe dans le tableau - global $_COOKIE. On peut tester qu'une entrée - existe dans un tableau avec isset(). -

-

⚠ Attention!

-
    -
  • On ne peut pas écrire dans $_COOKIE (par - exemple $_COOKIE["foo"] = 42), il faut - utiliser setcookie(). -
  • -
  • setcookie() - utilise header() et doit donc être appelé avant - le premier echo() du fichier. -
  • -
  • Pour effacer un cookie, on peut lui donner une date - d'expiration antérieure à l'instant présent (0 par exemple)
  • -
-
- -
-

Avantages et inconvénients des cookies

-
    -
  • + stockage persistant
  • -
  • + interface simple d'utilisation (une - variable pour la lecture et setcookie pour l'écriture)
  • -
  • - limité en taille
  • -
  • - limité en nombre par domaine
  • -
  • - type de donnée limité à des chaînes - (on ne peut pas stocker un tableau PHP par exemple)
  • -
  • +/- stocké sur le client
  • -
-
-

Sessions

-
-

Sessions

-

Une session HTTP est un ensemble de requêtes/réponses HTTP - entre un serveur et un même client.
- Exemple d'un sondage en ligne: -

-
  1. Le visiteur arrive sur la page q1.php en cliquant sur - le lien « commencer le sondage » (Début de session) -
  2. -
  3. Sur q1.php, l'utilisateur coche des choix dans un formulaire et appuie - sur un boutton de soumission qui l'envoie sur q2.php -
  4. -
  5. …
  6. -
  7. Sur q10.php, l'utilisateur coche des choix dans un - formulaire et appuie sur un bouton de soumission qui l'envoie - sur resultat.php
  8. -
  9. Sur resultat.php, le résultat global du sondage (% - par question, nombre de participants jusqu'à présent etc...) est - affiché (Fin de session) -
  10. -
- -
-
-

Variables de session

-

Pour programmer une application Web, on souhaîte avoir accès à - des variables de session c'est à dire des variables qui - sont: -

-
  • Globale au serveur, et accessibles depuis plusieurs pages - PHP différentes
  • -
  • Spécifiques à un « utilisateur » (c'est à dire à une session - particulière) -
  • -
-

Les variables de sessions sont donc propres à chaque client et - persistent le temp de la session (le temps de session est décidé par - le serveur)

+

Variable $_COOKIE

+

Contient les cookies que le client à envoyé au serveur. + La + variable $_COOKIE est un tableau. +

+

Conception d'une application simple (étude de cas)

-

Variables de session en PHP

-

On initie une session avec la fonction:

- session_start(); -

Une fois appelée, la variable $_SESSION - contient un tableau que l'on peut utiliser entre plusieurs - pages. Les valeurs contenues dans le tableau persistent jusqu'à la - fin de la session. Une session se termine: +

Cahier des charges

+

On souhaite créer une application Web simple de gestion de QCM. + L'application doit répondre au contraintes suivantes :

-
  • Quand le client se déconnecte
  • -
  • Après un certain temps (« votre session a expiré, veuillez - vous reconnecter»)
  • -
  • Quand le code PHP - appelle session_end();
  • +
      +
    • Un QCM est un ensemble de questions, suivies d'une liste de + choix. Il peut y avoir plusieurs choix possible. La réponse à la + question est correcte si uniquement les bons choix sont + sélectionnés.
    • +
    • Un QCM doit être facilement modifiable/éditable
    • +
    • Après la réponse à la dernière question, le score de + l'utilisateur est affiché, ainsi que les bonnes réponses
    • +
    • Il y a un temps limite par question
    -

    ⚠ - Attention! session_start() doit être appelé - avant le premier echo du fichier.

-

Variables de session en PHP (2)

- - <?php /* Fichier page1.php */ - session_start(); - $_SESSION["Valeur"] = 42; - ?> - - - Veuillez cliquer sur le "page2.php"lien - - -]]> - - - La valeur est echo $_SESSION["Valeur"]; - - - -]]> -
-
-

Avantages et inconvénients des session

-
    -
  • + Informations stockées sur le serveur
  • -
  • + Pas de limite de taille
  • -
  • + Pas limité à des chaînes de caractères
  • -
  • - Valeurs perdues en fin de session
  • -
  • - Nécessite des cookies
  • -
-
-
-

Sessions PHP: détails d'implantation

-
-
Coté client
-
-
-
-
-
-
-
-
-
-Connexion à une page PHP (envoie du cookie ("php_ssid", "12345")) - - -
-
Coté serveur (PHP)
- session_start();
- - génération d'un ID unique "12345"
- - dépot d'un cookie "php_ssid", valeur "12345", durée 10 minutes - - création dans un tableau global d'une entrée:
- $_GLOBAL["12345"] = Array();
-
- $_SESSION = $_GLOBAL[$_COOKIE["php_ssid"]] -
-
-
+

But du jeu

+

Nous allons concevoir, le plus précisément possible l'application + (prenez des notes) : +

-
-

Dans la vraie VieTM

-

Mélange de variables de sessions, cookies et bases de données.
- Scénario réaliste: site de commerce en ligne -

-
    -
  • Login/mot de passe stocké dans - une BD
  • -
  • Panier courant stocké dans une variable de - session
  • -
  • Login, date de dernière visite, dernière page visitée stockés - dans un en cookie
  • -
-

Pourquoi ?

    -
  • BD: information persistante, - côté serveur (mais la mise à jour, récupération de l'info est - coûteuse (en temps)) -
  • -
  • Variables de sessions : le panier n'a pas forcément - besoin d'être conservé entre deux sessions, mais on ne veut pas - que le client puisse fabriquer un panier frauduleux -
  • -
  • Cookie : persistante à faible - coût (stocké sur le client), ce n'est pas grave si les - informations sont perdues ou corrompues -
  • +
  • Rafiner le cahier des charges
  • +
  • Prévoir plusieurs scénarios d'utilisation
  • +
  • Concevoir l'application (données, interface grapique, + code)
  • +
  • Tester/vérifier la robustesse
- -
+

Vous devrez écrire le code correspondant en TP

+
+ +