2.1 · Formulaires & superglobales ($_GET, $_POST)

Niveau 2 · PHP & le Web

2.1Formulaires & superglobales ($_GET, $_POST)

Objectif : Recevoir les données de formulaire via $_GET/$_POST et les traiter correctement (validation et assainissement côté serveur systématiques) — le cœur de l'interaction web et le premier rempart de sécurité.
Temps estimé : 12 min · lecture autonome · Si vous n'avez que 5 min : lisez « L'essentiel en 30s » + le schéma.

L'essentiel en 30 secondes

  • GET lit, POST modifie : GET expose les données dans l'URL (recherche, filtres, liens partageables) ; POST les envoie dans le corps (inscription, connexion, données sensibles) — jamais de mot de passe en GET.
  • Ne jamais faire confiance aux entrées : toute donnée reçue est potentiellement erronée ou malveillante — validation serveur obligatoire, la validation JavaScript ne suffit jamais.
  • Valider puis assainir selon le contexte : filter_var vérifie le format, htmlspecialchars protège l'affichage, les requêtes préparées protègent la base — un outil par usage.

Mini-cas filé — Riad et le formulaire d'inscription à Constantine

Riad, développeur web à Constantine, crée le formulaire d'inscription d'une association locale : nom, e-mail, wilaya. Sa première version affiche directement ce que l'utilisateur tape — un test avec un script dans le champ nom casse la page. Il reconstruit le traitement en trois temps : récupérer via $_POST, valider côté serveur (champ requis, e-mail valide avec filter_var), échapper avec htmlspecialchars avant tout affichage. Ce même chantier revient en 2.2 (garder l'utilisateur connecté en session), 2.3 (factoriser le formulaire par inclusions) et 2.4 (valider l'e-mail et dater l'inscription).

Fil conducteur du niveau 2 : ce même chantier de Riad revient dans le cours, le schéma, le script et le défi 48h — et continue en 2.2, 2.3 et 2.4.

1. $_GET et $_POST : deux méthodes, deux usages

Une application web INTERAGIT avec l'utilisateur, surtout via des formulaires. Quand le formulaire est soumis, les données partent au serveur et PHP les RÉCUPÈRE grâce aux superglobales — des tableaux spéciaux disponibles partout dans le code. La méthode GET passe les données dans l'URL (la « query string » : recherche.php?q=chaise) : elles sont VISIBLES, historisées, partageables et mises en favori — idéale pour LIRE (recherche, filtre, pagination, tri), car la requête est idempotente (la recharger ne change rien). PHP les lit dans $_GET ($_GET['q']). La méthode POST passe les données dans le CORPS de la requête (invisibles dans l'URL) : idéale pour CRÉER/MODIFIER (inscription, connexion, commande) et pour les données sensibles ou volumineuses. PHP les lit dans $_POST. Le formulaire HTML déclare la méthode (method='post') et la cible (action : le fichier PHP qui traite). Riad l'applique : sa recherche d'adhérents part en GET (URL partageable), son inscription part en POST. D'autres superglobales existent : $_FILES (uploads, section 2.3), $_SERVER (infos requête), $_SESSION/$_COOKIE (section 2.2). À éviter : $_REQUEST, qui mélange GET et POST et manque de précision.

2. Ne jamais faire confiance aux entrées

Le réflexe fondamental du développeur web : ne JAMAIS faire confiance aux données reçues. Tout ce qui vient du client (formulaire, URL, en-tête) est potentiellement ERRONÉ ou MALVEILLANT : un utilisateur peut désactiver JavaScript, modifier le code dans son navigateur, ou envoyer des requêtes forgées directement au serveur sans jamais passer par votre page. La validation côté client (JavaScript) sert l'EXPÉRIENCE (retour immédiat, guidage) mais elle est contournable ; la validation côté serveur (PHP) sert la SÉCURITÉ et elle est obligatoire — c'est la seule que vous contrôlez. Riad en a fait l'expérience : son contrôle JavaScript « champ requis » n'a rien bloqué quand un testeur a envoyé le formulaire vide via un outil direct. Règle : on re-vérifie TOUT côté serveur, toujours.

3. Valider, puis assainir selon le contexte

Le traitement serveur tient en deux gestes. Valider : vérifier que les données ont le format attendu (champ requis rempli ? e-mail valide ? nombre positif ?) et rejeter/signaler sinon — PHP aide avec filter_var() (e-mail, URL, entier…). Assainir/échapper : traiter les données selon l'usage qui en est fait — htmlspecialchars() avant d'AFFICHER (contre le XSS, qui injecte du HTML/JavaScript dans vos pages), requêtes préparées avant de mettre en BASE (contre l'injection SQL, niveau 3). Un outil par contexte, jamais l'inverse. Le formulaire de Riad valide donc l'e-mail avec filter_var($email, FILTER_VALIDATE_EMAIL) puis affiche le nom avec htmlspecialchars($nom) — systématiquement, sans exception.

Erreur d'interprétation fréquente : « Mon JavaScript vérifie déjà tout, la validation PHP est redondante ». Non. Le navigateur appartient à l'utilisateur, pas à vous : JavaScript désactivé, code modifié via les outils de développement, ou requête forgée envoyée directement au serveur — dans ces trois cas votre validation client n'existe tout simplement pas. Ne garder que le contrôle client, c'est laisser la porte ouverte aux données invalides, à la corruption de données et aux failles (XSS, injection SQL). La règle de Riad : client pour le confort (souhaitable), serveur pour la sécurité (impératif) — on re-vérifie tout côté serveur, à chaque fois.
Traiter une donnée de formulaire Recevoir, valider, assainir Formulaire GET (URL) ouPOST (corps)Récupérer $_GET /$_POST côté serveurValider Format attendu(filter_var)Assainir htmlspecialchars,requêtes préparées
Recevoir, valider, assainir
Version texte du schéma (SEO / lecteurs d'écran / traduction) : 1) Le FORMULAIRE de Riad envoie les données : sa recherche part en GET (URL partageable), son inscription en POST (corps, non visible). 2) Il RÉCUPÈRE côté serveur avec $_GET / $_POST — jamais $_REQUEST. 3) Il VALIDE : champ requis, e-mail valide via filter_var, sinon rejet. 4) Il ASSAINIT selon l'usage : htmlspecialchars avant d'afficher (anti-XSS), requête préparée avant la base. Leçon : recevoir, valider, assainir — toujours côté serveur, car le client est contournable.

🔎 Exemple concret — 🔎 Exemple concret — L'inscription de Riad, validée côté serveur

Le premier rempart, comme dans le formulaire de Riad :

$nom = trim($_POST['nom'] ?? '');
$email = trim($_POST['email'] ?? '');
if ($nom === '' || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
  echo 'Inscription invalide.';
} else {
  echo 'Merci ' . htmlspecialchars($nom, ENT_QUOTES, 'UTF-8') . ' !';
}

Lecture : récupération via $_POST, validation du format, échappement avant affichage.

Leçon : la validation JavaScript ne suffit JAMAIS — le serveur re-vérifie tout.

Vocabulaire de la section

Formulaire / superglobales
Les formulaires envoient des données au serveur, que PHP récupère via des superglobales, tableaux spéciaux disponibles partout : $_GET, $_POST, $_FILES, $_SESSION…

Exemple simple : Riad lit le nom saisi avec $_POST['nom'].

Ce que ce n'est pas : des variables ordinaires limitées à une fonction.

Réflexe : donnée venue du client = superglobale + méfiance.

$_GET vs $_POST
GET : données dans l'URL, visibles et partageables, pour lire (recherche, filtres). POST : données dans le corps, non visibles dans l'URL, pour modifier ou pour les données sensibles.

Exemple simple : La recherche de Riad part en GET, son inscription en POST.

Ce que ce n'est pas : deux syntaxes interchangeables sans conséquence.

Réflexe : lire = GET ; modifier ou sensible = POST.

Ne jamais faire confiance aux entrées
Toute donnée utilisateur est potentiellement erronée ou malveillante ; toujours valider et assainir côté SERVEUR avant de l'utiliser.

Exemple simple : Riad re-vérifie l'e-mail côté serveur même avec un contrôle JavaScript.

Ce que ce n'est pas : une donnée affichée telle quelle parce qu'elle vient de son propre formulaire.

Réflexe : entrée reçue = entrée suspecte jusqu'à validation.

Valider
Vérifier que les données ont le format attendu (requis rempli, e-mail valide, nombre correct) et rejeter sinon ; filter_var() aide pour e-mail, URL, entier.

Exemple simple : filter_var($email, FILTER_VALIDATE_EMAIL) accepte ou rejette l'inscription.

Ce que ce n'est pas : afficher la donnée en espérant qu'elle soit correcte.

Réflexe : chaque champ = une règle de validation explicite.

Validation serveur obligatoire
La validation client (JavaScript) améliore l'expérience mais est contournable ; la validation serveur (PHP) est obligatoire car c'est la seule fiable.

Exemple simple : Le testeur de Riad contourne le JavaScript, le PHP bloque quand même.

Ce que ce n'est pas : un contrôle JavaScript considéré comme une protection.

Réflexe : confort côté client, sécurité côté serveur.

En pratique — En pratique — Recevoir et traiter des données de formulaire

  1. Créez un formulaire HTML (method='post', action vers un fichier PHP) et récupérez les données côté serveur via $_POST['champ'].
  2. Comparez GET et POST : un formulaire de recherche en GET (données dans l'URL) vs un formulaire d'inscription en POST (corps, non visible).
  3. VALIDEZ les données côté serveur : champ requis rempli ? e-mail valide (filter_var) ? nombre correct ? — rejetez/signalez si invalide.
  4. ASSAINISSEZ : échappez avec htmlspecialchars() avant d'afficher des données utilisateur — et retenez que la validation client (JS) ne suffit JAMAIS.
Vous recevez les données de formulaire via $_GET/$_POST et les traitez correctement (validation et assainissement côté serveur systématiques) — le cœur de l'interaction web et le premier rempart de sécurité.

Script prêt à dire — expliquer la double validation à un collègue (30 s)

« Pour le formulaire d'inscription, je garde le contrôle JavaScript pour le confort — retour immédiat. Mais je re-vérifie tout en PHP : champ requis, e-mail avec filter_var, et htmlspecialchars avant d'afficher. Le JavaScript se contourne en deux clics, le PHP c'est le seul endroit que je contrôle vraiment. »

À dire en montrant une requête forgée qui contourne le JavaScript mais se fait bloquer par le PHP.

Modèle copier-coller — traitement de formulaire sûr

' . htmlspecialchars($e, ENT_QUOTES, 'UTF-8') . '

'; } return; } echo '

Merci ' . htmlspecialchars($nom, ENT_QUOTES, 'UTF-8') . ' (' . htmlspecialchars($email, ENT_QUOTES, 'UTF-8') . ') !

';

Recherche partageable

Le catalogue de Riad se filtre en GET : l'URL contient les critères, on la partage et on la met en favori.

Inscription sensible

Nom, e-mail et mot de passe partent en POST : rien dans l'URL, rien dans l'historique — puis HTTPS pour le transport.

Liste blanche de valeurs

La wilaya vient d'une liste fermée : Riad vérifie que la valeur reçue appartient aux choix autorisés, sinon rejet.

Formulaire volumineux

Message long, plusieurs champs : POST accepte plus de données que GET, limité par la longueur de l'URL.

Prudence : Tout affichage d'une donnée utilisateur sans htmlspecialchars() ouvre une faille XSS : un attaquant injecte du HTML ou du JavaScript qui s'exécute dans le navigateur des visiteurs (vol de session, défiguration). Échappez systématiquement chaque donnée affichée, sans exception. Ce guide donne le geste de base — pour les contextes sensibles, faites valider votre code par un développeur expérimenté.

✓ Bonnes pratiques

  • GET pour lire (recherche, filtre) ; POST pour modifier ou pour les données sensibles.
  • Valider systématiquement côté serveur (filter_var, vérifications explicites).
  • Échapper avec htmlspecialchars avant d'afficher la moindre donnée utilisateur.

✗ Pièges fréquents

  • Se reposer sur la validation JavaScript (contournable en deux clics).
  • Passer un mot de passe en GET (visible dans l'URL, l'historique, les logs).
  • Utiliser $_REQUEST (mélange GET/POST, moins précis et moins sûr).

Points clés à retenir

  • Les FORMULAIRES envoient des données que PHP récupère via des SUPERGLOBALES : $_GET (URL, recherches/filtres) et $_POST (corps, formulaires qui modifient/données sensibles).
  • RÉFLEXE FONDAMENTAL : ne JAMAIS faire confiance aux données utilisateur (potentiellement erronées ou malveillantes) — toujours VALIDER et ASSAINIR côté SERVEUR avant usage.
  • VALIDER (format attendu : e-mail, nombre, requis — filter_var) et ASSAINIR/ÉCHAPPER selon le contexte (htmlspecialchars avant d'afficher, requêtes préparées avant la base).
  • La validation CÔTÉ CLIENT (JavaScript) améliore l'expérience mais est CONTOURNABLE ; la validation CÔTÉ SERVEUR (PHP) est OBLIGATOIRE — c'est elle qui protège réellement.

Défi 48h — appliquez demain

Prenez un vrai formulaire (le vôtre ou celui de Riad : nom + e-mail) et ajoutez le traitement serveur complet : récupération via $_POST, validation (requis + filter_var), affichage avec htmlspecialchars systématique. Puis contournez votre propre JavaScript et vérifiez que le PHP bloque.

Checklist sortie de section
  • Je peux expliquer quand utiliser GET et quand utiliser POST, avec un exemple de chacun.
  • Je sais valider côté serveur (requis, filter_var) et échapper avant affichage.
  • J'ai testé qu'une requête forgée ne passe pas mon traitement serveur.
Auto-évaluation 1-5 : est-ce que je valide systématiquement côté serveur ?est-ce que j'échappe chaque donnée affichée avec htmlspecialchars ?

Questions fréquentes

GET ou POST : comment choisir la bonne méthode pour un formulaire ?

Selon la nature de l'action et la sensibilité des données. GET : données ajoutées à l'URL (visibles, historisées, partageables, mises en favori). POST : données dans le corps (pas dans l'URL). Règle : utilisez GET pour LIRE/RÉCUPÉRER (recherche, filtre, pagination, tri, lien) — la requête est idempotente (rechargeable sans risque) et l'URL partageable. Utilisez POST pour CRÉER/MODIFIER/SUPPRIMER (inscription, connexion, envoi, commande) — ces actions ne doivent pas se refaire par accident au rechargement (le navigateur prévient avant de renvoyer des données POST), les données ne polluent pas l'URL, et POST accepte plus de données. Données SENSIBLES (mot de passe) → POST, jamais GET — mais POST seul ne chiffre rien : il faut HTTPS pour la vraie confidentialité (POST évite l'exposition dans l'URL, HTTPS protège le transport). Les formulaires HTML ne supportent nativement que GET et POST ; les API (section 4-4) utilisent aussi PUT/PATCH/DELETE.

Pourquoi la validation côté serveur est-elle obligatoire si je valide déjà côté client (JavaScript) ?

Parce que le client n'est PAS fiable. La validation CLIENT (JavaScript) sert l'EXPÉRIENCE : retour immédiat, guidage — utile mais facilement CONTOURNABLE : JavaScript désactivé (validation ignorée), code modifié via les outils du navigateur, ou requête envoyée DIRECTEMENT au serveur (outil ou script) sans jamais passer par votre page. Rien ne garantit qu'une requête reçue vient de votre formulaire. La validation SERVEUR (PHP) sert la SÉCURITÉ : c'est le seul endroit fiable, que VOUS contrôlez. Sans elle : données corrompues, bugs, et FAILLES (injection SQL, XSS). Faites les deux : client pour le confort (souhaitable), serveur pour la sécurité (impératif) — re-vérifiez TOUT (requis, formats, longueurs, valeurs autorisées) et assainissez selon l'usage. Image : la validation client est un panneau poli, la validation serveur est le contrôle réel.

Vérifiez votre compréhension

La validation côté client (JavaScript) suffit-elle pour la sécurité ?

Ressources supplémentaires (optionnel, pour aller plus loin)

Examen du niveau 2Questions inédites et durcies pour valider vos acquis