W3docs

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éesCorps de la requêteChaîne de requête URL (?key=value)
Visible dans l'URLNonOui
Mémorisable / mise en cacheNonOui
Utilisation typiqueConnexion, création/mise à jour, téléchargementsRecherche, filtres, pagination
Limite de tailleGrande (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 $_POST dans 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 riencolors 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.

Pratique

Pratique
À quoi sert la méthode 'POST' en PHP ?
À quoi sert la méthode 'POST' en PHP ?
Was this page helpful?