Leçon 4/6 8 min

Formulaires et GET/POST

Récupérez les données envoyées par vos utilisateurs via des formulaires HTML et validez-les côté serveur.

Du formulaire HTML au traitement PHP

Voici le flux complet quand un utilisateur soumet un formulaire :

  1. L'utilisateur remplit le formulaire HTML et clique sur « Envoyer »
  2. Le navigateur envoie les données au serveur (via GET ou POST)
  3. PHP récupère les données dans $_GET ou $_POST
  4. PHP traite, valide et répond
<!-- Le formulaire HTML -->
<form action="traitement.php" method="POST">
    <label>Votre nom :</label>
    <input type="text" name="nom">

    <label>Votre email :</label>
    <input type="email" name="email">

    <button type="submit">Envoyer</button>
</form>
// traitement.php
$nom = $_POST['nom'];
$email = $_POST['email'];
echo "Merci $nom, nous vous contacterons à $email.";

$_GET vs $_POST

Les deux méthodes pour envoyer des données :

  • GET — données visibles dans l'URL : page.php?q=php&page=2
  • POST — données invisibles (dans le corps de la requête)
// GET — pour les recherches, filtres, pagination
// URL : recherche.php?q=php&page=2
$recherche = $_GET['q'];      // "php"
$page = $_GET['page'];        // "2"

// POST — pour les formulaires sensibles (login, contact, paiement)
$email = $_POST['email'];
$password = $_POST['password'];

Règle : utilisez POST pour tout ce qui modifie des données ou contient des informations sensibles. GET uniquement pour lire/rechercher.

Validation des données

Règle d'or : ne jamais faire confiance aux données utilisateur. Un utilisateur (ou un bot) peut envoyer n'importe quoi.

// Vérifier que le champ existe et n'est pas vide
if (empty($_POST['nom'])) {
    $erreur = "Le nom est obligatoire.";
}

// Valider un email
$email = $_POST['email'];
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $erreur = "Email invalide.";
}

// Nettoyer les données contre le XSS
$nom = htmlspecialchars($_POST['nom'], ENT_QUOTES, 'UTF-8');
// Transforme <script>alert('hack')</script>
// en &lt;script&gt;alert('hack')&lt;/script&gt;

htmlspecialchars() est votre bouclier contre les attaques XSS (Cross-Site Scripting). Utilisez-le chaque fois que vous affichez des données saisies par un utilisateur.

Exemple complet : formulaire de contact

<?php
$erreurs = [];
$succes = false;

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 1. Récupérer et nettoyer
    $nom   = htmlspecialchars(trim($_POST['nom'] ?? ''), ENT_QUOTES, 'UTF-8');
    $email = trim($_POST['email'] ?? '');
    $msg   = htmlspecialchars(trim($_POST['message'] ?? ''), ENT_QUOTES, 'UTF-8');

    // 2. Valider
    if (empty($nom))   $erreurs[] = "Le nom est obligatoire.";
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) $erreurs[] = "Email invalide.";
    if (strlen($msg) < 10) $erreurs[] = "Message trop court (min 10 caractères).";

    // 3. Traiter si pas d'erreurs
    if (empty($erreurs)) {
        // Envoyer un email, sauvegarder en BDD, etc.
        $succes = true;
    }
}
?>

<?php if ($succes): ?>
    <p class="success">Merci <?= $nom ?>, message envoyé !</p>
<?php else: ?>
    <?php foreach ($erreurs as $e): ?>
        <p class="error"><?= $e ?></p>
    <?php endforeach; ?>

    <form method="POST">
        <input name="nom" value="<?= $nom ?? '' ?>" placeholder="Nom">
        <input name="email" value="<?= $email ?? '' ?>" placeholder="Email">
        <textarea name="message"><?= $msg ?? '' ?></textarea>
        <button>Envoyer</button>
    </form>
<?php endif; ?>

Sécurité : ne jamais faire confiance

Résumé des bonnes pratiques :

  • htmlspecialchars() — contre le XSS, à chaque affichage
  • filter_var() — pour valider emails, URLs, nombres
  • trim() — supprimer les espaces parasites
  • empty() — vérifier qu'un champ n'est pas vide
  • Requêtes préparées — contre l'injection SQL (leçon 6)

From HTML form to PHP processing

Here's the full flow when a user submits a form:

  1. The user fills in the HTML form and clicks "Submit"
  2. The browser sends the data to the server (via GET or POST)
  3. PHP retrieves the data in $_GET or $_POST
  4. PHP processes, validates and responds
<!-- The HTML form -->
<form action="process.php" method="POST">
    <label>Your name:</label>
    <input type="text" name="name">

    <label>Your email:</label>
    <input type="email" name="email">

    <button type="submit">Submit</button>
</form>
// process.php
$name = $_POST['name'];
$email = $_POST['email'];
echo "Thanks $name, we'll contact you at $email.";

$_GET vs $_POST

Two methods to send data:

  • GET — data visible in the URL: page.php?q=php&page=2
  • POST — data invisible (in the request body)
// GET — for searches, filters, pagination
// URL: search.php?q=php&page=2
$search = $_GET['q'];      // "php"
$page = $_GET['page'];     // "2"

// POST — for sensitive forms (login, contact, payment)
$email = $_POST['email'];
$password = $_POST['password'];

Rule: use POST for anything that modifies data or contains sensitive info. GET only for reading/searching.

Data validation

Golden rule: never trust user data. A user (or a bot) can send anything.

// Check that the field exists and isn't empty
if (empty($_POST['name'])) {
    $error = "Name is required.";
}

// Validate an email
$email = $_POST['email'];
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $error = "Invalid email.";
}

// Sanitize data against XSS
$name = htmlspecialchars($_POST['name'], ENT_QUOTES, 'UTF-8');
// Transforms <script>alert('hack')</script>
// into &lt;script&gt;alert('hack')&lt;/script&gt;

htmlspecialchars() is your shield against XSS attacks (Cross-Site Scripting). Use it every time you display user-entered data.

Complete example: contact form

<?php
$errors = [];
$success = false;

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 1. Retrieve and sanitize
    $name  = htmlspecialchars(trim($_POST['name'] ?? ''), ENT_QUOTES, 'UTF-8');
    $email = trim($_POST['email'] ?? '');
    $msg   = htmlspecialchars(trim($_POST['message'] ?? ''), ENT_QUOTES, 'UTF-8');

    // 2. Validate
    if (empty($name))  $errors[] = "Name is required.";
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) $errors[] = "Invalid email.";
    if (strlen($msg) < 10) $errors[] = "Message too short (min 10 characters).";

    // 3. Process if no errors
    if (empty($errors)) {
        // Send email, save to DB, etc.
        $success = true;
    }
}
?>

<?php if ($success): ?>
    <p class="success">Thanks <?= $name ?>, message sent!</p>
<?php else: ?>
    <?php foreach ($errors as $e): ?>
        <p class="error"><?= $e ?></p>
    <?php endforeach; ?>

    <form method="POST">
        <input name="name" value="<?= $name ?? '' ?>" placeholder="Name">
        <input name="email" value="<?= $email ?? '' ?>" placeholder="Email">
        <textarea name="message"><?= $msg ?? '' ?></textarea>
        <button>Submit</button>
    </form>
<?php endif; ?>

Security: never trust input

Summary of best practices:

  • htmlspecialchars() — against XSS, on every output
  • filter_var() — to validate emails, URLs, numbers
  • trim() — remove trailing whitespace
  • empty() — check that a field is not empty
  • Prepared statements — against SQL injection (lesson 6)
Formulaire avec validation
Avec l'IA

Copiez ce prompt dans Claude ou ChatGPT :

Crée un formulaire d'inscription PHP complet avec validation : nom, email, mot de passe (min 8 caractères), confirmation du mot de passe. Affiche les erreurs au-dessus du formulaire et pré-remplit les champs en cas d'erreur.
Quelle méthode HTTP utiliser pour un formulaire de login ?
Quelle fonction PHP protège contre les attaques XSS ?
Que contient $_GET pour l'URL page.php?id=42 ?
Quelle est la première chose à faire avec les données d'un formulaire ?
Besoin d'un développeur pour votre projet ?

Réponse sous 24h — Sans engagement