Kodokon kodokon.com

Formulaires : recevoir et valider des données

Traitez les formulaires comme un professionnel : bonne méthode HTTP, validation stricte des entrées et réaffichage sécurisé.

9 min · 3 questions

Ouvrir cette leçon dans Kodokon

Un formulaire est le premier point de contact entre vos utilisateurs et votre code PHP. La méthode get place les données dans l'URL (?q=pizza) : parfaite pour une recherche ou un filtre, car la page peut être mise en favori et partagée. La méthode post transporte les données dans le corps de la requête : c'est la méthode obligatoire dès que la requête modifie quelque chose (création de compte, commande, suppression) ou transporte des données sensibles. PHP range les valeurs reçues dans les superglobales $_GET et $_POST.

HTML
<form action="search.php" method="get">
  <label for="q">Recherche</label>
  <input id="q" name="q" type="text">
  <button type="submit">Chercher</button>
</form>
<?php
$query = trim($_GET['q'] ?? '');

if ($query !== '') {
    echo "<p>Vous cherchez : " .
        htmlspecialchars($query, ENT_QUOTES) . "</p>";
}
?>
search.php : le formulaire et son traitement sur la même page.

Règle professionnelle numéro un : ne faites jamais confiance aux données reçues. Un utilisateur peut envoyer n'importe quoi, y compris des valeurs forgées hors de votre formulaire. La fonction filter_input() lit et valide une valeur en une seule étape : elle renvoie la valeur validée, false si elle est invalide, et null si le champ est absent - trois cas à distinguer dans vos messages d'erreur.

PHP
<?php

declare(strict_types=1);

$errors = [];

$email = filter_input(
    INPUT_POST,
    'email',
    FILTER_VALIDATE_EMAIL
);

$age = filter_input(
    INPUT_POST,
    'age',
    FILTER_VALIDATE_INT,
    ['options' => ['min_range' => 18, 'max_range' => 120]]
);

$name = trim((string) ($_POST['name'] ?? ''));

if ($name === '' || mb_strlen($name) > 50) {
    $errors[] = "Nom requis (50 caractères max).";
}

if (!is_string($email)) {
    $errors[] = "Adresse e-mail invalide.";
}

if (!is_int($age)) {
    $errors[] = "Âge invalide (entre 18 et 120).";
}

if ($errors === []) {
    echo "Inscription valide.";
}
Validation d'une inscription avec filter_input().

Quand la validation échoue, ne renvoyez pas un formulaire vide : réaffichez les valeurs saisies (formulaire « collant ») et les messages d'erreur à côté des champs concernés. Toute valeur réaffichée doit passer par htmlspecialchars() : c'est elle qui neutralise les balises et empêche l'injection de scripts.

HTML
<?php
$name = trim($_POST['name'] ?? '');
$hasError = isset($_POST['name']) && $name === '';
$safeName = htmlspecialchars($name, ENT_QUOTES);
?>
<form method="post" action="">
  <label for="name">Votre nom</label>
  <input id="name" name="name"
    value="<?= $safeName ?>">
  <?php if ($hasError): ?>
    <p>Le nom est obligatoire.</p>
  <?php endif; ?>
  <button type="submit">Envoyer</button>
</form>
Formulaire collant : la saisie survit à l'erreur.

Quiz de validation

Vérifiez que vous avez bien retenu les points clés de cette leçon.

  1. Quelle méthode HTTP convient à un formulaire qui crée un compte utilisateur ?
    • GET, pour que les données restent visibles dans l'URL
    • POST, car la requête modifie l'état du serveur et les données ne doivent pas apparaître dans l'URL
    • Les deux se valent, c'est une question de style
  2. Que renvoie filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL) si le champ n'a pas été envoyé du tout ?
    • false
    • Une chaîne vide
    • null
    • Il lève une exception
  3. Pourquoi passer une valeur par htmlspecialchars() avant de la réafficher dans une page ?
    • Pour neutraliser les balises HTML et empêcher l'injection de scripts (faille XSS)
    • Pour corriger automatiquement les fautes de frappe
    • Pour compresser la valeur et accélérer l'affichage