Le Web utilise le protocole HTTP et PHP fournit des variables superglobales pour travailler avec les informations transportées par ce protocole.

Ces informations sont regroupées sous la forme de tableaux superglobaux intialisés automatiquement par PHP.

### HTTP

Le Web est basé sur l'utilisation du protocole HTTP (HyperText Transfer Protocol) qui gére la demande de fichiers du client (le navigateur) et la réponse du serveur.
Quand un navigateur demande un fichier (request), il envoie un message HTTP au serveur. Ce message contient toujours des informations dans des lignes d'en-tête (header) et parfois dans un corps (body). Le serveur Web répond avec un message HTTP (response) qui contient toujours un en-tête et parfois un corps.

Le mot "fichier" doit être entendu comme tout type de fichier demandé par un navigateur : fichier HTML, CSS, JavaScript, JPG, GIF, PNG, PHP, JSP, ASP, PDF, etc, etc.

La première ligne d'une demande HTTP (request) peut ressembler à :
GET /index.html HTTP/1.1
La ligne spécifie une commande HTTP ou méthode (ici GET), suivie de l'adresse d'une page, et de la version du protocole utilisé. Traduction : je demande la page /index.html et j'utilise le protocole HTTP version 1.1.
Cette première ligne d'en-tête peut être suivie d'autres lignes d'en-tête. Par exemple :

    ...
    User-Agent: Mozilla/5.0 (Windows NT 6.1) Gecko/20100101 Firefox...
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,...
    Accept-Language: en-us,en;q=0.5
    Accept-Encoding: gzip, deflate
    Connection: keep-alive
    ...

L'en-tête User-Agent par exemple, donne des informations sur le navigateur qui fait la demande. L'en-tête Accept spécifie quant à lui les types MIME acceptés par le navigateur.

Après le "header", on trouvera ensuite éventuellement le corps ("body"") du message HTTP. Tous les messages n'ont pas un corps car certains échanges se limitent à l'envoi/réception d'en-tête : une requête GET par exemple. Ce corps si il existe est séparé du "header" par une ligne vide, et contiendra

- soit les informations envoyées par le serveur et à traiter par le navigateur (code HTML à afficher, code CSS pour la mise en forme, contenu binaire pour les images, etc)
- soit les informations envoyée par le navigateur et à traiter par le serveur (typiquement le contenu d'un formulaire).

Quand le serveur reçoit la demande (request), il la traite et généralement envoie une réponse (response). La première ligne d'une réponse peut ressembler à :
HTTP/1.1 200 OK
La ligne indique la version du protocole, un code de statut et la description de ce code. Après la ligne de statut, on trouve un "header" avec des en-têtes dans lesquels le serveur fournit des informations sur le logiciel serveur, le type MIME du contenu, le nombre de caractères transmis, etc. Aprés une ligne vide, on trouve dans le corps du message les données demandées (ie le code HTML d'un page, le contenu d'un fichier image, le code d'un fichier CSS, etc.).

demande et réponse

Les deux méthodes HTTP les plus traitée avec PHP sont GET et POST. GET est utilisée par le navigateur pour récupérer des informations sur le serveur (pages, images, etc.), disons pour simplifier, chaque fois qu'une URL est saisie par l'utilisateur ou qu'un lien est cliqué. POST est utilisé pour transmettre des données au serveur, et en particulier les données saisies dans un formulaire. Nous examinerons plus loin et en détail le traitement des formulaires.

Par exemple quand dans la page sommaire, vous avez cliqué sur le lien de cette page, le message HTTP suivant (ou quelque chose d'approchant) a été envoyé par votre navigateur au serveur qui héberge le tutoriel :

    GET /pl ... rts/php/php06/php06a.htm HTTP/1.1
    Host: moodle.univ-fcomte.fr
    User-Agent: Mozilla/5.0 (Windows NT 6.1; ...
    Accept: text/html,application/xhtml+xml,application/xml;q=0....
    Accept-Language: en-us,en;q=0.5
    Accept-Encoding: gzip, deflate
    Connection: keep-alive
    Referer: http://moodle.univ-fcomte.fr/pl ... rts/php/php/tutodef.htm
    Cookie: MoodleSession=2n1e9bzb8q810iu1200e3b16q4

Le serveur a envoyé la réponse suivante (ou quelque chose d'approchant) :

    HTTP/1.1 200 OK
    Date: Sat, 29 Sep 2012 16:17:22 GMT
    Server: Apache
    X-Powered-By: PHP/5.3.3-7+squeeze13
    Expires: Sun, 30 Sep 2012 16:17:22 GMT
    Last-Modified: Sat, 29 Sep 2012 16:17:22 GMT
    Content-Encoding: gzip
    Content-Length: 13818
    Content-Type: text/html

    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <title>Les formulaires</title>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <link rel="stylesheet" href="../_local/codemirror.css">
    <script src="../_local/codemi ....
    .......
    suite du code HTML de la page ....
    .......

### GET / POST dans HTML et PHP

Les formulaires permettent à l'utilisateur de saisir des données et de les envoyer au serveur pour traitement. Suivant la méthode utilisée pour envoyer ces données, elles ne se trouveront pas au même endroit dans le message HTTP.

Avec la méthode GET, les zones du formulaires seront envoyées dans l'URL (on parle de query string, ou paramètre ici).

Dans le formulaire suivant, saisissez quelque chose dans les 2 zones puis cliquez sur le bouton "Connexion". Un nouvel onglet va s'ouvrir avec le résultat de l'envoi du formulaire.

Login Mot de passe

Avec la méthode POST, les zones du formulaires seront envoyées dans le corps du message HTTP.

Faites la saisie de ce formulaire qui lui utilise la méthode POST.

LoginMot de passe

Les données sont envoyées au serveur sous la forme de couples nom=valeur
soit Nom_de_zone_dans_le_formulaire=données_saisies_dans_la_ zone.

Reprenons l'exemple du formulaire précédent qui contient deux zones de texte pour la saisie d'un login et d'un mot de passe et un bouton pour envoyer le formulaire. Le code HTML est quelque chose comme :

    <form method="POST" action="formulaire01_post.html">
    	Login
    	<input type="text" name="txtLogin">
    	Mot de passe
    	<input type="password" name="txtPasse">
    	<input type="submit" name="btnConnecter" value="Connexion">
    </form>

Le nom des zones est défini par l'attribut name. Si l'utilisateur saisit respectivement "moi" et "xyz", puis clique sur le bouton de soumission, l'envoi au serveur sera :
txtLogin=moi&txtPasse=xyz&btnConnecter=Connexion

Suivant la valeur de l'attribut method du tag l'attribut form, cette chaîne de caractères sera transmise

- après l'url spécifiée par l'attribut action du tag form si method="GET"
- dans le corps du message HTTP si method="POST"

Avec la méthode GET, les zones du formulaires seront envoyées dans l'URL (on parle de query string, ou paramètre ici).

Avec la méthode POST, les zones du formulaires seront envoyées dans le corps du message HTTP.

Une autre différence entre GET et POST se situe dans la définition du protocole HTTP : les demandes GET sont idempotentes, c'est à dire que les demandes pour une même URL devraient être considérées identiques, quelque soit les paramètres qui sont passés. Le navigateur pourrait donc mettre en cache le résultat d'une page soumise avec la méthode GET, et si vous soumettez à nouveau votre page, avec d'autres paramètres, vous risquez que la page stockée dans le cache soit réaffichée, à la place de ce que vous avez réellement demandé. Les demandes POST ne sont pas idempotentes, et les pages de résultat ne sont pas stockées dans le cache par le navigateur, garantissant un affichage correct des pages demandées.

### Des tableaux superglobaux

Dans le script PHP, les informations envoyées par le navigateur seront récupérées dans des tableaux superglobaux (dont nous avons déjà parlé dans "Notions de base - Variables et types de données").

Si le formulaire est envoyé avec la méthode POST, on retrouvera les couples nom/valeur dans le tableau superglobal associatif $_POST. Le nom des zones utilisé dans le formulaire deviendra le nom des clés du tableau, et les valeurs saisies seront les valeurs associées à ces clés.

Si le formulaire est envoyé avec la méthode GET, on retrouvera les couples nom/valeur dans le tableau superglobal associatif $_GET. On trouvera aussi dans ce tableau, tous les "paramètres" qui pourraient être passés à la suite d'une url sans qu'il soit besoin d'utiliser un formulaire.

On trouve dans PHP les tableaux superglobaux suivant :

$_COOKIE | ensemble des cookies
$_GET | variables passées au script par la méthode GET (formulaire en GET, ou via l'URL)
$_POST | variables passées au script via un formulaire validé avec la méthode POST
$_FILES | variables fournies par le protocole HTTP, suite à un téléchargement de fichier
$_REQUEST | constitué du contenu des variables $_GET, $_POST, $_COOKIE, et $_FILES
$_SESSION | variables créées lors d'une session.
$_ENV | variables de l'environnement d'exécution de PHP
$_SERVER | variables fournies par le serveur HTTP

Exemple : variables serveur
<?php require('bib_fonctions.php'); htmlDebut('variables serveur'); foreach($_SERVER as $cle => $valeur) { htmlInfo($cle); echo $valeur; } htmlFin(); ?>

Parmi les variables serveurs, la plus utilisée est sans doute PHP_SELF qui représente le nom de la page elle-même.