Aller au contenu
M07 · B. Programmer en PHP

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
nomAmina villeFès method=? GET /contact.php?nom=Amina&ville=F%C3%A8s POST /contact.php Content-Type: …urlencoded nom=Amina&ville=F%C3%A8s contact.php $_GET = ['nom' => 'Amina','ville' => 'Fès' ] $_POST = ['nom' => 'Amina','ville' => 'Fès' ] mot de passe, ajout, suppression → POST

Le visiteur remplit le formulaire de contact : un nom et une ville.

1 / 5

Du formulaire HTML au script PHP

<form action="traitement.php" method="post">
  <input name="prenom">
  <select name="ville">
    <option>Fès</option><option>Safi</option>
  </select>
  <button type="submit">Envoyer</button>
</form>

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 ?

GETPOST
Où sont les données ?dans l’URLdans le corps de la requête
Visible / favori / partageouinon
Taillelimitée (quelques milliers de caractères)grande (fichiers possibles)
Usagerecherche, filtre, pagination, lien vers une ficheinscription, 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 ».

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 serveur aucun échange pour l'instant

Consignes 0 / 3

  1. Un message trop court (« Salut ») est refusé avec « au moins 10 caractères »
  2. Un envoi correct affiche « Merci Amina, votre message a bien été envoyé. »
  3. 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'] ?? ''); ?>
<form method="get" action="recherche.php">
  <input name="q" value="<?= htmlspecialchars($q) ?>">
  <button>Chercher</button>
</form>
<?php if ($q !== ''): ?>
  <p>Résultats pour : <?= htmlspecialchars($q) ?></p>
<?php endif; ?>
<?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><input type="checkbox" name="villes[]" value="Fès"> Fès</label>
<label><input type="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));

5Vérifier

1. Un formulaire en method="get" envoie ses données :
2. Pourquoi utiliser htmlspecialchars() avant d'afficher une saisie ?
3. Le champ <input name="prenom"> arrive dans PHP sous quel nom ?