Comprendre les superglobales PHP : $_POST
Découvrez $_POST en PHP : lecture sécurisée des données de formulaire, différences avec $_GET, validation et gestion complète des formulaires.
Les superglobales PHP sont des variables intégrées toujours disponibles dans tous les contextes d'un script — vous n'avez jamais besoin de les déclarer avec global ni de les passer en arguments. Elles exposent des informations essentielles telles que les entrées utilisateur, les détails du serveur et les variables d'environnement. L'une des plus couramment utilisées est $_POST, le tableau que PHP remplit avec les données envoyées dans le corps d'une requête HTTP POST.
Ce chapitre explique ce qu'est $_POST, comment en lire les valeurs en toute sécurité, en quoi il diffère de $_GET, et comment gérer un formulaire complet de bout en bout. Pour un tour d'horizon des tableaux associés, consultez PHP superglobals.
Qu'est-ce que $_POST ?
$_POST est un tableau associatif qui collecte les données de formulaire soumises avec method="post". Le navigateur place chaque champ dans le corps de la requête (et non dans l'URL), et PHP analyse ce corps dans $_POST avant l'exécution de votre script. Les clés correspondent aux attributs name de vos contrôles de formulaire, et les valeurs sont ce que l'utilisateur a saisi.
Comme les données transitent dans le corps de la requête, $_POST est le bon choix pour les données sensibles ou volumineuses (mots de passe, textes longs, téléchargements de fichiers), pour les actions qui modifient l'état du serveur, et chaque fois que vous ne souhaitez pas que les valeurs apparaissent dans l'URL ou l'historique du navigateur.
$_POST vs $_GET
Les deux tableaux transmettent des données utilisateur, mais ils correspondent à des méthodes HTTP différentes et présentent des compromis distincts.
$_POST | $_GET | |
|---|---|---|
| Emplacement des données | Corps de la requête | Chaîne de requête URL (?key=value) |
| Visible dans l'URL | Non | Oui |
| Mémorisable / mise en cache | Non | Oui |
| Utilisation typique | Connexion, création/mise à jour, téléchargements | Recherche, filtres, pagination |
| Limite de taille | Grande (configurable côté serveur) | Limitée par la longueur de l'URL |
Utilisez POST lorsque la requête modifie des données ou contient des informations confidentielles ; utilisez GET pour des lectures sûres et reproductibles. Consultez $_GET pour la contrepartie, ou $_REQUEST si vous avez besoin des deux.
Comment lire une valeur
Accédez à une valeur par le nom de son champ, exactement comme pour n'importe quelle clé de tableau :
$username = $_POST['username'];$_POST n'est rempli qu'après la soumission d'un formulaire avec POST. Au premier chargement de la page, il s'agit d'un tableau vide, donc accéder à une clé absente déclenche un avertissement. Vérifiez toujours qu'une clé existe d'abord — utilisez isset() ou l'opérateur de fusion null de PHP 7+ pour fournir une valeur par défaut :
<?php
// Safe: never errors, falls back to an empty string
$username = $_POST['username'] ?? '';
if ($username === '') {
echo "Username is required.";
} else {
echo "Hello, " . htmlspecialchars($username);
}
?>L'opérateur de fusion null ?? retourne la valeur de droite chaque fois que la partie gauche est indéfinie ou null, ce qui correspond exactement à la situation avant la soumission du formulaire.
Sécurité : ne jamais faire confiance aux entrées utilisateur
Tout ce qui se trouve dans $_POST provient du client et peut être falsifié. Deux règles vous permettent de rester en sécurité :
- Échappement à la sortie. Passez toute valeur par
htmlspecialchars()avant de l'afficher dans une page pour prévenir les attaques de type cross-site scripting (XSS). - Validation et assainissement à l'entrée. Utilisez
filter_var()pour vérifier les formats (email, entier, URL), et employez des instructions préparées pour les requêtes de base de données afin de prévenir l'injection SQL — ne concaténez jamais directement des valeurs$_POSTdans du SQL.
<?php
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
if ($email === false) {
echo "Please enter a valid email address.";
}
?>Exemple : un formulaire de contact complet
Le formulaire ci-dessous envoie trois champs à contact.php en utilisant la méthode POST. Chaque contrôle possède un name unique, qui devient sa clé dans $_POST.
<form action="contact.php" method="post">
<label for="name">Name:</label>
<input type="text" id="name" name="name" />
<label for="email">Email:</label>
<input type="email" id="email" name="email" />
<label for="message">Message:</label>
<textarea id="message" name="message"></textarea>
<input type="submit" value="Submit" />
</form>Dans contact.php, commencez par confirmer que la requête a bien utilisé POST (afin que le même fichier puisse également servir le formulaire vide), puis lisez, validez et échappez chaque valeur :
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim($_POST['name'] ?? '');
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
$message = trim($_POST['message'] ?? '');
$errors = [];
if ($name === '') { $errors[] = "Name is required."; }
if ($email === false) { $errors[] = "A valid email is required."; }
if ($message === '') { $errors[] = "Message cannot be empty."; }
if (!$errors) {
// Safe to use the data — e.g. send an email or save to the database
echo "Thanks, " . htmlspecialchars($name) . "! Your message was received.";
} else {
foreach ($errors as $error) {
echo htmlspecialchars($error) . "<br>";
}
}
}
?>Vérifier $_SERVER['REQUEST_METHOD'] est la méthode standard pour déterminer si l'utilisateur consulte le formulaire ou le soumet. Pour une présentation plus approfondie, consultez PHP form handling et PHP form validation.
Lire plusieurs valeurs
Lorsque plusieurs contrôles partagent un nom se terminant par [] (cases à cocher, sélections multiples), PHP les transforme en tableau imbriqué :
<input type="checkbox" name="colors[]" value="red">
<input type="checkbox" name="colors[]" value="green"><?php
$colors = $_POST['colors'] ?? []; // e.g. ['red', 'green']
foreach ($colors as $color) {
echo htmlspecialchars($color) . "\n";
}
?>Notez qu'une case à cocher non cochée n'envoie rien — colors peut donc être entièrement absent, d'où l'importance de la valeur par défaut ?? [].
Conclusion
$_POST est l'outil incontournable pour recevoir les données de formulaire soumises dans le corps de la requête. Lire depuis ce tableau est aussi simple que d'indexer un tableau, mais le code en production doit toujours se prémunir contre les clés manquantes avec ?? ou isset(), valider les entrées avec filter_var() et échapper les sorties avec htmlspecialchars(). Combinées aux instructions préparées pour tout travail avec une base de données, ces habitudes vous permettent d'accepter des entrées utilisateur sans exposer votre application aux attaques XSS ou par injection SQL.