PHP : Poster vers la même page

Pourquoi ?

Au lieu d'avoir deux fichiers (formulaire + traitement), on peut tout mettre dans un seul fichier.
C'est plus simple pour les petits cas d'usage.


Structure d'une page auto-postée

<?php

$message = "";   // Message à afficher après soumission

// Cette partie ne s'exécute que si le formulaire a été soumis
if ($_SERVER["REQUEST_METHOD"] === "POST") {

    $prenom = htmlspecialchars(trim($_POST["prenom"] ?? ""));

    if (!empty($prenom)) {
        $message = "Bonjour, $prenom ! Formulaire reçu ✅";
    } else {
        $message = "Erreur : le prénom est vide ❌";
    }
}
?>
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title>Formulaire</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">

    <h1>Mon formulaire</h1>

    <!-- Affiche le message si le formulaire a été soumis -->
    <?php if ($message) : ?>
        <div class="alert alert-info"><?= $message ?></div>
    <?php endif; ?>

    <!-- action="" = poster vers la même page -->
    <form method="POST" action="">
        <div class="mb-3">
            <label class="form-label">Prénom</label>
            <input type="text" name="prenom" class="form-control" required>
        </div>
        <button type="submit" class="btn btn-primary">Envoyer</button>
    </form>

</div>
</body>
</html>

action="" ou action="<?= $_SERVER['PHP_SELF'] ?>" → le formulaire s'envoie à lui-même.


Conserver les valeurs après soumission

Si le formulaire a une erreur, il est agréable de garder ce que l'utilisateur a tapé :

<!-- On remet la valeur dans le champ avec value= -->
<input type="text"
       name="prenom"
       class="form-control"
       value="<?= htmlspecialchars($_POST['prenom'] ?? '') ?>">

Redirect après succès (PRG pattern)

Pour éviter le "re-soumission du formulaire" quand on actualise la page :

<?php
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    // ... traitement ...

    // Redirige vers la même page (ou une autre) après le traitement
    header("Location: " . $_SERVER['PHP_SELF'] . "?success=1");
    exit;  // Important ! Arrête l'exécution après la redirection
}

$success = isset($_GET['success']);
?>

🧪 À tester

Crée un formulaire dans le site modulaire (dans contact.php) qui :

  1. Demande nom + email + message
  2. Valide que les champs ne sont pas vides
  3. Affiche un message de confirmation si tout est bon
  4. Affiche les erreurs en rouge si un champ est vide

Pour aller plus loin