Aller au contenu
M07 · B. Programmer en PHP

Variables d'environnement, passage de paramètres et redirections

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).

1Situer

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.

2Comprendre

Une redirection : deux allers-retours
Navigateur commande.php Merci ! F5 → GET merci.php Serveur commande.php merci.php POST /commande.php 302 FoundLocation: merci.php GET /merci.php 200 OK + page

Le navigateur envoie le formulaire de commande en POST à commande.php.

1 / 5

$_SERVER : la fiche de la requête

CléContenuExemple
REQUEST_METHODméthode HTTPPOST
REQUEST_URIchemin + paramètres demandés/souk/produit.php?id=4
QUERY_STRINGpartie après le ?id=4
HTTP_HOSTnom demandé par le navigateurlocalhost
SERVER_NAME / SERVER_ADDRnom / adresse IP du serveurlocalhost / 127.0.0.1
REMOTE_ADDRadresse IP du visiteur127.0.0.1
HTTP_USER_AGENTnavigateur du visiteurMozilla/5.0 (...)
PHP_SELF / SCRIPT_NAMEscript exécuté/souk/produit.php
DOCUMENT_ROOTdossier racine du siteC:/xampp/htdocs

Transmettre des valeurs entre pages

<!-- 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).

Rediriger avec header(‘Location’)

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);.

Le modèle Post / Redirect / Get

  1. POST /commander.php : le script vérifie, enregistre la commande, puis header('Location: merci.php?commande=1042').
  2. Le serveur répond 302 Found, sans page.
  3. GET /merci.php?commande=1042 : la page de confirmation s’affiche.
  4. F5 recharge l’étape 3 seulement.
Exemple simple

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.

Exemple simple

Le ticket de caisse

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.

3Manipuler

commander.php reçoit le formulaire. Complétez-le pour qu'il redirige vers merci.php en passant le numéro de commande dans l'URL, puis passez une commande dans le navigateur et observez les deux requêtes (POST puis GET).
Pas à pas dans le lab ↗ Cliquez sur Exécuter : PHP 8.3 démarre dans votre navigateur (environ 5 Mo à télécharger, une seule fois).

La page s'affichera ici.

Le navigateur demandera /index.php au serveur, qui exécutera le PHP et renverra du HTML.

Entre le navigateur et le serveur aucun échange pour l'instant

Consignes 0 / 2

  1. Après l'envoi du formulaire, commander.php répond 302 avec Location: merci.php?commande=...
  2. La page finale affiche « Commande n° 1xxx enregistrée. »

4Pratiquer

Exercice 1 · Lien vers une fiche produit

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.

Voir le corrigé
<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";

Exercice 2 · Plusieurs paramètres dans l'URL

Construisez proprement l'URL liste.php?categorie=Poterie&tri=prix&page=2 à partir d'un tableau, avec http_build_query.

Voir le corrigé
<?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

Exercice 3 · Informations sur la requête

Affichez la méthode de la requête, l'adresse IP du visiteur, le nom du serveur et la page demandée.

Voir le corrigé
<?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']);

5Vérifier

1. Pourquoi écrire exit; juste après header('Location: ...') ?
2. Que contient $_SERVER['REQUEST_METHOD'] quand on envoie un formulaire method="post" ?
3. Le modèle PRG (Post / Redirect / Get) sert à :