Le panneau « Déviation »
Une route est fermée : un panneau envoie les voitures par un autre chemin. Une redirection HTTP (code 302 et en-tête Location) dit au navigateur : « la page est par là », et il y va tout seul.
Ce que $_SERVER révèle de la requête et du serveur, passer une valeur d'une page à l'autre par l'URL, et rediriger avec header('Location') sans renvoyer deux fois un formulaire (modèle PRG).
Après une commande, Souk Atlas doit envoyer le client vers une page « Merci », lui afficher le numéro de sa commande, et éviter qu'un F5 ne crée une deuxième commande. Il faut aussi savoir d'où vient la requête (méthode, adresse, navigateur). Tout cela passe par les en-têtes HTTP et la superglobale $_SERVER.
Le navigateur envoie le formulaire de commande en POST à commande.php.
| Clé | Contenu | Exemple |
|---|---|---|
REQUEST_METHOD | méthode HTTP | POST |
REQUEST_URI | chemin + paramètres demandés | /souk/produit.php?id=4 |
QUERY_STRING | partie après le ? | id=4 |
HTTP_HOST | nom demandé par le navigateur | localhost |
SERVER_NAME / SERVER_ADDR | nom / adresse IP du serveur | localhost / 127.0.0.1 |
REMOTE_ADDR | adresse IP du visiteur | 127.0.0.1 |
HTTP_USER_AGENT | navigateur du visiteur | Mozilla/5.0 (...) |
PHP_SELF / SCRIPT_NAME | script exécuté | /souk/produit.php |
DOCUMENT_ROOT | dossier racine du site | C:/xampp/htdocs |
<!-- catalogue.php -->
<?php foreach ($produits as $id => $nom): ?>
<a href="produit.php?id=<?= $id ?>"><?= htmlspecialchars($nom) ?></a>
<?php endforeach; ?>
<?php // produit.php
$id = (int) ($_GET['id'] ?? 0); // on convertit : le visiteur peut écrire n'importe quoi
Pour des valeurs avec espaces ou accents, encodez-les : urlencode("Tapis berbère") donne Tapis+berb%C3%A8re, ou construisez toute la chaîne avec http_build_query($tableau).
Les autres moyens de transmettre une information d’une page à l’autre sont les champs cachés d’un formulaire (leçon précédente), les cookies et les sessions (leçon C.2).
header('Location: merci.php?commande=1042'); // 302 par défaut
exit; // on arrête le script ici
Pour une page qui a définitivement changé d’adresse : header('Location: /nouvelle.php', true, 301);. Pour signaler qu’une page n’existe pas : http_response_code(404);.
/commander.php : le script vérifie, enregistre la commande, puis header('Location: merci.php?commande=1042')./merci.php?commande=1042 : la page de confirmation s’affiche.Une route est fermée : un panneau envoie les voitures par un autre chemin. Une redirection HTTP (code 302 et en-tête Location) dit au navigateur : « la page est par là », et il y va tout seul.
Après avoir payé, on reçoit un ticket avec un numéro. Si on le relit dix fois, on ne paie pas dix fois. La page « Merci » après une commande joue ce rôle : la recharger ne recommande rien.
La page s'affichera ici.
Le navigateur demandera /index.php au serveur, qui exécutera le PHP et renverra du HTML.
Consignes 0 / 2
Sur la page catalogue, chaque produit doit mener à produit.php avec son id. Écrivez le lien pour l'id 4, puis le début de produit.php qui lit l'id en entier.
<a href="produit.php?id=4">Huile d'argan</a> <?php // produit.php $id = (int) ($_GET['id'] ?? 0); if ($id <= 0) { http_response_code(404); exit("Produit introuvable"); } echo "Fiche du produit n° $id";
Construisez proprement l'URL liste.php?categorie=Poterie&tri=prix&page=2 à partir d'un tableau, avec http_build_query.
<?php $params = ['categorie' => 'Poterie', 'tri' => 'prix', 'page' => 2]; $url = 'liste.php?' . http_build_query($params); echo "<a href=\"$url\">Page 2</a>"; // http_build_query encode aussi les espaces et les accents
Affichez la méthode de la requête, l'adresse IP du visiteur, le nom du serveur et la page demandée.
<?php echo "Méthode : " . $_SERVER['REQUEST_METHOD'] . "<br>"; echo "IP du visiteur : " . $_SERVER['REMOTE_ADDR'] . "<br>"; echo "Serveur : " . $_SERVER['SERVER_NAME'] . " (" . $_SERVER['SERVER_ADDR'] . ")<br>"; echo "Page : " . htmlspecialchars($_SERVER['REQUEST_URI']);