HTML form : GET, POST, action et name avec un exemple PHP

HTML <form> regroupe les contrôles de saisie dans un formulaire soumis à un serveur. action sélectionne l'adresse de traitement et method sélectionne la méthode d'envoi. GET place les valeurs dans la requête URL et POST les place dans le corps de la requête, mais POST n'encrypte pas lui-même les données.

Les rôles de action, method et name

action est l'adresse que le navigateur demande. Si elle est omise, le formulaire est soumis à l'adresse du document actuel. La méthode par défaut est get, adaptée aux recherches et récupérations qui ne modifient pas l'état. La création et les mises à jour utilisent généralement post, avec authentification côté serveur, autorisation et validation des requêtes.

Le id d'un contrôle l'identifie dans le document et associe son étiquette ; name est la clé des données soumises. Les entrées ordinaires sans nom sont omises, tout comme les contrôles désactivés et les boutons radio ou cases à cocher non cochés. Ne pas imbriquer un formulaire dans un autre.

Préparez le formulaire complet de pratique

Pour vérifier également le serveur récepteur, ouvrir un fichier HTML seul n'est pas suffisant. Créez un dossier de pratique vide dans un environnement local avec PHP 8.x installé, et enregistrez les deux fichiers ci-dessous dans ce dossier. Cet exemple affiche les valeurs reçues ; il ne stocke pas de données, n'envoie pas de courriels et ne modifie pas les comptes.

Le premier fichier est index.html. Le deuxième bouton de soumission utilise formmethod afin que les mêmes entrées puissent être comparées en utilisant GET et POST.

<!doctype html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Exercice de formulaire GET et POST</title>
</head>
<body>
  <h1>Comparer les méthodes de requête</h1>
  <form action="receive.php" method="get">
    <p>
      <label for="query">Terme recherché</label>
      <input type="text" id="query" name="q" maxlength="80" required>
    </p>
    <p>
      <label for="note">Note</label>
      <textarea id="note" name="note" maxlength="300"></textarea>
    </p>
    <button type="submit">Vérifier avec GET</button>
    <button type="submit" formmethod="post">Vérifier avec POST</button>
    <button type="reset">Réinitialiser</button>
  </form>
</body>
</html>

Le deuxième fichier est receive.php. Il lit les chaînes de la collection de saisie pour la méthode de requête et rejette les tableaux ou les longueurs invalides. La sortie est échappée pour son contexte HTML.

<?php
declare(strict_types=1);
header('Content-Type: text/html; charset=UTF-8');
$method = $_SERVER['REQUEST_METHOD'];
if ($method !== 'GET' && $method !== 'POST') {
    header('Allow: GET, POST');
    http_response_code(405);
    exit('Méthode de requête non prise en charge.');
}
$input = $method === 'POST' ? $_POST : $_GET;
$q = $input['q'] ?? '';
$note = $input['note'] ?? '';
if (!is_string($q) || !is_string($note) || trim($q) === '' ||
    strlen($q) > 320 || strlen($note) > 1200) {
    http_response_code(400);
    exit('Vérifiez les chaînes du terme recherché et de la note.');
}
function h(string $text): string {
    return htmlspecialchars($text, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
?>
<!doctype html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Résultat reçu</title>
</head>
<body>
  <h1>Résultat reçu</h1>
  <p>Méthode de requête : <?= h($method) ?></p>
  <p>Terme recherché: <?= h($q) ?></p>
  <p>Note: <?= h($note) ?></p>
  <p><a href="index.html">Revenir au formulaire</a></p>
</body>
</html>

HTML maxlength et la vérification de la longueur du serveur utilisent des mesures différentes. Cet exemple de serveur limite les octets avec strlen ; il ne reproduit pas une politique complète de comptage des caractères. Validez les entrées importantes selon les règles réelles de l’application du serveur.

Exécutez l’exemple et comparez GET avec POST

Dans le dossier contenant les deux fichiers, exécutez cette commande et ouvrez http://127.0.0.1:8000/index.html. Si php n’est pas trouvé, vérifiez son chemin d’installation et le paramètre PATH. Le serveur intégré de PHP est destiné au développement local et à la pratique, pas à la production.

php -S 127.0.0.1:8000
  1. La soumission avec un terme de recherche vide est bloquée par la validation obligatoire.
  2. Entrez HTML comme terme de recherche et Practice comme note, puis soumettez avec GET. La requête URL contient q et note, et la réponse affiche GET comme méthode.
  3. Retournez au formulaire et entrez les mêmes valeurs, puis soumettez avec POST. Les valeurs saisies ne sont pas ajoutées à l'URL, et la réponse affiche POST. Les outils de développement peuvent montrer le corps dans le panneau Réseau.
  4. Envoyez <b>Practice</b> dans la note. La réponse affiche les balises comme du texte, sans mise en gras. Arrêtez ensuite le serveur avec Ctrl+C dans le terminal.

Vérifiez les méthodes de soumission, la sécurité et les échecs courants

Les contenus POST restent visibles dans les outils de développement et sur le serveur ; HTTPS est nécessaire pour protéger les données en transit. Les requêtes GET peuvent rester dans les adresses, l'historique ou les journaux, donc ne mettez pas de valeurs sensibles comme les mots de passe dans celles-ci. Les contrôles HTML required et maxlength aident les utilisateurs mais ne remplacent pas la validation côté serveur.

Les formulaires de téléversement de fichiers nécessitent généralement method="post" et enctype="multipart/form-data". L'encodage par défaut est application/x-www-form-urlencoded. La gestion réelle des fichiers nécessite également des vérifications de taille, de type et de lieu de stockage, au-delà de cet exercice d'entrée de chaînes.

Pour une réponse 404, vérifiez le chemin d'action relatif et le nom du fichier. Pour les valeurs manquantes, vérifiez le nom et si le serveur lit la collection pour la méthode de requête correcte. Définissez explicitement type="button" pour les boutons d'action ordinaires afin d'éviter une soumission accidentelle. Reset restaure les valeurs par défaut originales plutôt que de vider systématiquement les champs. Consultez la référence de formulaire MDN et le tutoriel sur les formulaires PHP.