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.
<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
<?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.
<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>
<?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
// $_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.
<?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).
$_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
namedu champ HTML devient la clé dans$_GETou$_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 pastrim()nettoie les espaces,empty()vérifie si vide,filter_var()valide un emailhtmlspecialchars()— obligatoire avant tout affichage de données externes