Formulaires : transmettre des données avec GET et POST
Relier un formulaire HTML à un script PHP, lire $_GET et $_POST, vérifier les champs (isset, empty, filter_var), réafficher le formulaire avec les erreurs, et protéger l'affichage avec htmlspecialchars.
1Situer
Souk Atlas a besoin d'un formulaire de contact et d'une recherche de produits. Au module 04, vos formulaires ne partaient nulle part ; maintenant, chaque envoi est une requête HTTP que PHP reçoit, vérifie et traite. C'est le cœur d'un site dynamique.
2Comprendre
Du formulaire à $_GET et $_POST
Le visiteur remplit le formulaire de contact : un nom et une ville.
Quand on clique sur Envoyer, le navigateur envoie une requête à traitement.php avec prenom=...&ville=.... Dans le script, ces valeurs arrivent dans les superglobales$_POST (ou $_GET), des tableaux associatifs remplis automatiquement par PHP.
GET ou POST ?
GET
POST
Où sont les données ?
dans l’URL
dans le corps de la requête
Visible / favori / partage
oui
non
Taille
limitée (quelques milliers de caractères)
grande (fichiers possibles)
Usage
recherche, filtre, pagination, lien vers une fiche
inscription, connexion, commande, tout ce qui modifie
Vérifier avant d’utiliser
$erreurs= [];
if ($_SERVER['REQUEST_METHOD'] ==='POST') { // le formulaire a été envoyé$email=trim($_POST['email'] ??'');
$quantite= (int) ($_POST['quantite'] ??0);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$erreurs[] ="Email invalide.";
}
if ($quantite<1||$quantite>20) {
$erreurs[] ="Quantité entre 1 et 20.";
}
if (!$erreurs) {
// tout est bon : on enregistre (leçon C), puis on redirige
}
}
Réafficher le formulaire et protéger l’affichage
Un bon formulaire, en cas d’erreur, se réaffiche avec les valeurs déjà saisies (le visiteur n’a pas à tout retaper) et les messages d’erreur. C’est le formulaire « collant » de l’exercice ci-dessus : value="<?= htmlspecialchars($nom) ?>".
Plusieurs valeurs, champs cachés et boutons
Cases à cocher multiples : nommez-les name="villes[]" ; PHP reçoit un tableau$_POST['villes']. Une case non cochée n’est pas envoyée du tout : testez avec isset.
Champ caché : <input type="hidden" name="id" value="12"> transmet une valeur sans l’afficher (l’identifiant du produit modifié, par exemple). Il reste modifiable par le visiteur : on le vérifie comme le reste.
Plusieurs boutons : <button name="action" value="supprimer"> permet de savoir lequel a été cliqué ($_POST['action']).
Exemple simple
La carte postale et l'enveloppe
GET, c'est une carte postale : le message (les paramètres) est écrit à l'extérieur, dans l'URL, tout le monde peut le lire et on peut le garder en favori. POST, c'est une enveloppe : les données voyagent dans le corps de la requête, pour un mot de passe ou une commande.
Exemple simple
Le guichetier vérifie le dossier
Au guichet, on ne fait pas confiance au dossier rempli à la maison : l'agent vérifie chaque case avant de l'enregistrer. PHP fait pareil avec chaque champ reçu, même si le HTML avait déjà un « required ».
Publicité
3Manipuler
Le formulaire de contact envoie ses données en POST à la même page. Complétez la vérification, puis remplissez le formulaire dans le navigateur simulé et regardez la requête POST dans le détail des échanges.
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 /contact.php au serveur, qui exécutera le PHP et renverra du HTML.
Entre le navigateur et le serveuraucun échange pour l'instant
Consignes 0 / 3
Un message trop court (« Salut ») est refusé avec « au moins 10 caractères »
Un envoi correct affiche « Merci Amina, votre message a bien été envoyé. »
Un nom piégé « <b>Omar</b> » s'affiche comme du texte, pas en gras (htmlspecialchars)
4Pratiquer
Exercice 1 · Recherche en GET
Écrivez recherche.php : un formulaire GET avec un champ q, et sous le formulaire « Résultats pour : ... » quand q est rempli. Pourquoi GET est-il adapté ici ?
Voir le corrigé
<?php$q=trim($_GET['q'] ??''); ?><formmethod="get"action="recherche.php"><inputname="q"value="<?=htmlspecialchars($q) ?>">
<button>Chercher</button></form><?phpif ($q!==''):?><p>Résultats pour : <?=htmlspecialchars($q) ?></p><?phpendif; ?><?php// GET : la recherche ne modifie rien, et l'URL recherche.php?q=tajine// peut être partagée ou mise en favori.
Exercice 2 · Valider un âge et un email
Vérifiez que $_POST['email'] est un email valide et que $_POST['age'] est un entier entre 16 et 99, avec filter_var.
Voir le corrigé
<?php$email=filter_var($_POST['email'] ??'', FILTER_VALIDATE_EMAIL);
$age=filter_var($_POST['age'] ??'', FILTER_VALIDATE_INT, ['options'=> ['min_range'=>16, 'max_range'=>99]]);
if ($email===false) echo"Email invalide<br>";
if ($age===false) echo"Âge invalide (16 à 99)<br>";
Exercice 3 · Cases à cocher multiples
Un formulaire propose plusieurs villes de livraison en cases à cocher. Comment les nommer pour que PHP reçoive un tableau, et comment les afficher ?
Voir le corrigé
<label><inputtype="checkbox"name="villes[]"value="Fès"> Fès</label><label><inputtype="checkbox"name="villes[]"value="Safi"> Safi</label><?php// les crochets [] dans le name : PHP range les valeurs cochées dans un tableau$villes=$_POST['villes'] ?? [];
echo"Villes choisies : ".htmlspecialchars(implode(", ", $villes));