Leçon 8 / 12
Leçon 08 · Partie 2 — Aller plus loin

Formulaires GET & POST

À quoi ça sert dans la vraie vie ?

Les formulaires font entrer les données dans ton site. Nom, email, mot de passe, avis... Tout site interactif en a.

Cette leçon explique comment PHP reçoit ces données et comment les traiter en sécurité.

Comment les données voyagent du navigateur au serveur

L'utilisateur remplit un formulaire et clique "Envoyer". Le navigateur envoie les données au serveur. Deux façons : GET et POST.

PHP reçoit ces données dans des variables spéciales appelées superglobales : $_GET et $_POST. Ce sont des tableaux disponibles partout.

La méthode GET — les données dans l'URL

Avec GET, les données apparaissent dans l'URL. Exemple : quand tu cherches sur Google, l'URL devient google.com/search?q=PHP+tutoriel. La partie après ?, c'est GET.

GET convient aux recherches et filtres — données non sensibles qu'on peut partager ou mettre en favori.

formulaire.html
<form method="get" action="traitement.php">
  <input type="text" name="prenom" placeholder="Ton prénom">
  <button>Rechercher</button>
</form>

Quand on envoie ce formulaire, l'URL devient : traitement.php?prenom=Marie

traitement.php
<?php
// $_GET est un tableau associatif. La clé correspond à l'attribut "name" du champ
$prenom = $_GET["prenom"];
echo "Tu as cherché : " . htmlspecialchars($prenom);

L'attribut name du champ (name="prenom") devient la clé dans $_GET["prenom"]. C'est le lien entre le formulaire HTML et PHP.

La méthode POST — les données cachées

Avec POST, les données sont invisibles dans l'URL. Pour les mots de passe, données bancaires, infos personnelles — utilise POST.

GET pour un mot de passe ? Il apparaîtrait dans l'URL, l'historique, les logs du serveur. Catastrophique.

login.html
<form method="post" action="login.php">
  <input type="email"    name="email"       placeholder="Email">
  <input type="password" name="mot_de_passe" placeholder="Mot de passe">
  <button>Connexion</button>
</form>
login.php
<?php
// Même principe que GET, mais avec $_POST
$email = $_POST["email"];
$mdp   = $_POST["mot_de_passe"];

// Traitement... (on ne l'affiche jamais directement sans protection !)
echo "Email reçu : " . htmlspecialchars($email);

Vérifier si le formulaire a été soumis

Si la page PHP s'ouvre sans formulaire soumis, $_POST["email"] n'existe pas encore. PHP génère une erreur.

Solution : vérifie toujours si le formulaire a été envoyé avant d'accéder aux données.

PHP
<?php
// $_SERVER["REQUEST_METHOD"] contient la méthode HTTP utilisée
// "GET" quand on arrive sur la page normalement
// "POST" quand le formulaire vient d'être soumis
if ($_SERVER["REQUEST_METHOD"] === "POST") {

    // ?? "" signifie : si la clé n'existe pas, utiliser "" par défaut
    $prenom = $_POST["prenom"] ?? "";

    if (!empty($prenom)) {
        echo "Bonjour, " . htmlspecialchars($prenom) . " !";
    } else {
        echo "Le champ prénom est obligatoire.";
    }

} else {
    // On affiche le formulaire (la page vient d'être ouverte)
    echo '<form method="post">...</form>';
}

?? (opérateur null coalescent) : $_POST["prenom"] ?? "" = "si la clé existe, prends sa valeur ; sinon, chaîne vide". Évite les erreurs.

empty() retourne true si la valeur est vide, nulle ou zéro. Idéal pour vérifier qu'un champ a été rempli.

Formulaire complet avec validation

Exemple réaliste : un seul fichier qui affiche le formulaire ET le traite. C'est le pattern le plus courant en PHP.

contact.php
<?php
$message_resultat = ""; // contiendra le message de succès ou d'erreur

if ($_SERVER["REQUEST_METHOD"] === "POST") {

    // trim() supprime les espaces en début et fin — "  Marie  " devient "Marie"
    $nom   = trim($_POST["nom"] ?? "");
    $email = trim($_POST["email"] ?? "");

    // Validation étape par étape
    if (empty($nom) || empty($email)) {
        $message_resultat = "Tous les champs sont obligatoires.";

    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        // FILTER_VALIDATE_EMAIL vérifie que l'email est au bon format (x@y.z)
        $message_resultat = "L'adresse email n'est pas valide.";

    } else {
        // Tout est bon ! On peut traiter (envoyer un email, sauver en BDD...)
        $message_resultat = "Merci, " . htmlspecialchars($nom) . " ! Message envoyé.";
    }
}
?>

<!-- On affiche le message si le formulaire a été soumis -->
<?php if ($message_resultat): ?>
  <p><?= htmlspecialchars($message_resultat) ?></p>
<?php endif; ?>

<form method="post">
  <input name="nom"   placeholder="Ton nom">
  <input name="email" type="email" placeholder="Ton email">
  <button>Envoyer</button>
</form>
💡

<?= $var ?> est un raccourci pour <?php echo $var; ?>. Pratique dans les templates.

⚠️

3 règles des formulaires :

1. Toujours htmlspecialchars() avant d'afficher les données. Sans ça, du code malveillant peut s'exécuter.

2. Toujours valider côté PHP — jamais faire confiance au HTML (required, type="email"). Un utilisateur peut les contourner.

3. GET = données non sensibles (recherche). POST = données sensibles (login, infos perso).

// À retenir
  • $_GET — données envoyées dans l'URL (visibles). Pour les recherches et filtres.
  • $_POST — données envoyées dans le corps de la requête (invisibles). Pour les formulaires sensibles.
  • L'attribut name du champ HTML devient la clé dans $_GET ou $_POST
  • Vérifie toujours si le formulaire a été soumis avec $_SERVER["REQUEST_METHOD"] === "POST"
  • $_POST["champ"] ?? "" — valeur par défaut si la clé n'existe pas
  • trim() nettoie les espaces, empty() vérifie si vide, filter_var() valide un email
  • htmlspecialchars() — obligatoire avant tout affichage de données externes