Du formulaire HTML au traitement PHP
Voici le flux complet quand un utilisateur soumet un formulaire :
- L'utilisateur remplit le formulaire HTML et clique sur « Envoyer »
- Le navigateur envoie les données au serveur (via GET ou POST)
- PHP récupère les données dans
$_GETou$_POST - 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 <script>alert('hack')</script>
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 affichagefilter_var()— pour valider emails, URLs, nombrestrim()— supprimer les espaces parasitesempty()— 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:
- The user fills in the HTML form and clicks "Submit"
- The browser sends the data to the server (via GET or POST)
- PHP retrieves the data in
$_GETor$_POST - 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 <script>alert('hack')</script>
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 outputfilter_var()— to validate emails, URLs, numberstrim()— remove trailing whitespaceempty()— check that a field is not empty- Prepared statements — against SQL injection (lesson 6)
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.
$_GET pour l'URL page.php?id=42 ?