Valider les champs soumis
Objectif : Accepter un contact uniquement si ses champs respectent des règles définies.
Un formulaire peut être envoyé sans passer par les contrôles du navigateur : les données reçues ne sont donc jamais fiables par défaut. Dans cette leçon, vous vérifiez côté serveur que le nom et l’adresse e-mail sont présents, que le nom reste dans une taille prévue et que l’adresse a un format valide.
Vous prolongez la page contact-ajouter.php de la leçon précédente. Elle distinguait déjà une ouverture directe d’une soumission POST ; vous allez maintenant remplacer le simple comptage des champs par une décision fondée sur leur contenu. Les règles du carnet sont simples : le nom et le courriel sont obligatoires, le nom ne dépasse pas 100 octets et le courriel doit être valide.
Récupérer les valeurs soumises
filter_input() lit une valeur directement depuis une source externe, ici INPUT_POST. Avec le filtre FILTER_UNSAFE_RAW, vous récupérez le contenu sans transformation inattendue ; cela ne le rend pas valide et ne remplace donc pas les contrôles métier. L’option FILTER_REQUIRE_SCALAR écarte notamment une valeur envoyée sous forme de tableau au lieu d’une chaîne.
Valider avant de préparer le rendu
Remplacez le contenu de contact-ajouter.php par le fichier complet ci-dessous. Il conserve les inclusions communes du projet et affiche seulement la section pertinente de la page. Le formulaire renvoie vers la même adresse ; une ouverture directe affiche le formulaire, tandis qu’une soumission est contrôlée avant qu’un message d’acceptation soit préparé.
<?php
declare(strict_types=1);
$estSoumission = ($_SERVER['REQUEST_METHOD'] ?? '') === 'POST';
$nom = null;
$courriel = null;
$contactValide = false;
$message = '';
if ($estSoumission) {
$nomRecu = filter_input(
INPUT_POST,
'nom',
FILTER_UNSAFE_RAW,
FILTER_REQUIRE_SCALAR
);
$courrielRecu = filter_input(
INPUT_POST,
'courriel',
FILTER_UNSAFE_RAW,
FILTER_REQUIRE_SCALAR
);
$nom = is_string($nomRecu) ? trim($nomRecu) : '';
$courriel = is_string($courrielRecu) ? trim($courrielRecu) : '';
$nomValide = $nom !== '' && strlen($nom) <= 100;
$courrielValide = $courriel !== ''
&& filter_var($courriel, FILTER_VALIDATE_EMAIL) !== false;
$contactValide = $nomValide && $courrielValide;
$message = $contactValide
? 'Les champs du contact sont valides.'
: 'Vérifiez les champs obligatoires, la longueur du nom et le format du courriel.';
}
require __DIR__ . '/includes/entete.php';
?>
<main class="carnet-principal">
<section aria-labelledby="titre-contact">
<h2 id="titre-contact">Ajouter un contact</h2>
<?php if ($message !== ''): ?>
<p class="carnet-message<?= $contactValide ? '' : ' carnet-message--erreur' ?>" role="<?= $contactValide ? 'status' : 'alert' ?>">
<?= htmlspecialchars($message, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ?>
</p>
<?php endif; ?>
<form class="carnet-formulaire" action="contact-ajouter.php" method="post">
<label class="carnet-champ" for="nom">Nom</label>
<input id="nom" name="nom" type="text" required>
<label class="carnet-champ" for="courriel">Adresse e-mail</label>
<input id="courriel" name="courriel" type="email" required>
<label class="carnet-champ" for="telephone">Téléphone</label>
<input id="telephone" name="telephone" type="tel">
<div class="carnet-actions">
<button type="submit">Vérifier le contact</button>
<button type="reset">Effacer</button>
</div>
</form>
</section>
</main>
<?php
require __DIR__ . '/includes/pied.php';Pour un POST contenant nom « Ada Lovelace » et courriel « [email protected] », la page affiche « Les champs du contact sont valides. ». Un nom vide, trop long ou un courriel mal formé déclenche le message d’erreur générique.La validation du nom combine une vérification de présence après trim() et une limite avec strlen(). Cette limite porte sur les octets, pas sur le nombre de caractères : des lettres accentuées peuvent occuper plusieurs octets en UTF-8. Pour cette règle d’exemple, la limite est donc définie explicitement en octets ; ne la présentez pas comme une limite de caractères.
Pour le courriel, FILTER_VALIDATE_EMAIL sert à vérifier le format attendu. Ce contrôle ne prouve pas que la boîte existe ou que la personne la contrôle : il vérifie seulement que la valeur correspond à un format d’adresse accepté. Le champ téléphone reste facultatif et n’est pas encore traité dans cette étape.
Comprendre le résultat et les limites
Essayez le formulaire avec un nom renseigné et une adresse telle que [email protected], puis avec un nom vide ou un courriel sans arobase. Dans le premier cas, la page indique que les champs sont valides ; dans les autres, elle présente une erreur sans interrompre son rendu. Pour la tester, ouvrez le carnet avec le serveur PHP déjà lancé, puis soumettez le formulaire depuis le navigateur.
La page ne conserve pas encore les valeurs saisies et ne les associe pas à des erreurs individuelles. Ces comportements seront traités dans la leçon « Afficher les erreurs et conserver la saisie ». Elle ne crée pas non plus de contact : la sauvegarde arrivera dans la partie consacrée au stockage JSON.
À retenir
- Lisez chaque champ POST avec filter_input et vérifiez son type avant de le traiter.
- Une chaîne obligatoire doit être présente après nettoyage ; fixez clairement la limite appliquée au nom.
- Utilisez FILTER_VALIDATE_EMAIL pour contrôler le format d’une adresse, sans confondre format et existence de la boîte.
- Effectuez les contrôles côté serveur avant d’accepter les données ; cette leçon ne réalise pas encore leur enregistrement.
Dans la leçon suivante, vous organiserez les retours de validation par champ et conserverez les valeurs soumises pour faciliter la correction.