Bien que la validation côté client via JavaScript soit devenue la norme pour améliorer l'expérience utilisateur, la validation côté serveur reste un pilier indispensable de la sécurité d'une application web. En PHP, vérifier que les données transmises par un formulaire ne sont pas vides et respectent un format précis est une étape cruciale avant tout traitement en base de données.
Logique de traitement et de vérification
Le script suivant illustre comment intercepter les données d'un formulaire, nettoyer les entrées et accumuler les messages d'erreur dans un tableau avant de décider si l'on procède à l'insertion ou si l'on renvoie l'utilisateur vers le formulaire.
<?php
// Connexion à la base de données (exemple via PDO pour plus de modernité)
try {
$bdd = new PDO('mysql:host=localhost;dbname=videotheque', 'admin', 'password');
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
$action = $_GET['action'] ?? '';
$type = $_GET['type'] ?? '';
if ($action === 'ajouter' && $type === 'film') {
$erreurs = [];
// Nettoyage et vérification des champs obligatoires
$titre = isset($_POST['titre']) ? trim($_POST['titre']) : '';
if (empty($titre)) {
$erreurs[] = "Le titre du film est requis.";
}
$annee = isset($_POST['annee_sortie']) ? trim($_POST['annee_sortie']) : '';
if (empty($annee) || !is_numeric($annee)) {
$erreurs[] = "Une année de sortie valide est nécessaire.";
}
$date_publication = isset($_POST['date_pub']) ? trim($_POST['date_pub']) : '';
if (empty($date_publication)) {
$erreurs[] = "La date de publication est absente.";
} elseif (!preg_match('/^\d{2}-\d{2}-\d{4}$/', $date_publication)) {
$erreurs[] = "Format de date invalide (JJ-MM-AAAA).";
} else {
list($j, $m, $a) = explode('-', $date_publication);
if (!checkdate($m, $j, $a)) {
$erreurs[] = "La date saisie n'existe pas dans le calendrier.";
}
}
$note = $_POST['note_evaluation'] ?? '';
if (!is_numeric($note) || $note < 0 || $note > 10) {
$erreurs[] = "La note doit être comprise entre 0 et 10.";
}
// Gestion du résultat de la validation
if (count($erreurs) > 0) {
$message_erreur = urlencode(implode('<br />', $erreurs));
header("Location: formulaire_film.php?action=ajouter&statut=erreur&msg=" . $message_erreur);
exit();
} else {
// Procéder à l'insertion SQL ici
$query = "INSERT INTO films (titre, annee, date_parution, note) VALUES (?, ?, ?, ?)";
$stmt = $bdd->prepare($query);
$stmt->execute([$titre, $annee, $date_publication, $note]);
echo "Enregistrement réussi !";
}
}
?>
Affichage dynamique des erreurs dans le formulaire
Dans la page affichant le formulaire, il est nécessaire de récupérer les éventuels messages d'erreur transmis via l'URL (méthode GET) pour informer l'utilisateur des corrections à apporter.
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Gestion des Films</title>
<style>
.alerte-erreur {
background-color: #f8d7da;
color: #721c24;
padding: 15px;
border: 1px solid #f5c6cb;
margin-bottom: 20px;
}
</style>
</head>
<body>
<?php if (isset($_GET['msg'])): ?>
<div class="alerte-erreur">
<?php echo htmlspecialchars(urldecode($_GET['msg'])); ?>
</div>
<?php endif; ?>
<form action="traitement.php?action=ajouter&type=film" method="post">
<label>Nom du film :</label>
<input type="text" name="titre" value=""><br>
<label>Note (0-10) :</label>
<input type="text" name="note_evaluation" value="5"><br>
<label>Date de sortie (JJ-MM-AAAA) :</label>
<input type="text" name="date_pub" value="<?php echo date('d-m-Y'); ?>"><br>
<input type="submit" value="Enregistrer">
</form>
</body>
</html>
Fonctions PHP natives pour le contrôle de types
PHP propose une large gamme de fonctions permettant de vérifier la nature des variables. Voici les plus couramment utilisées lors de la validation de données :
- is_numeric() : Vérifie si une variable est un nombre ou une chaîne numérique.
- is_int() : Détermine si le type de la variable est un entier.
- is_string() : Vérifie si la variable est une chaîne de caractères.
- is_array() : Indique si la variable est un tableau.
- is_null() : Vérifie si la valeur est strictement NULL.
Pour des validations de chaînes plus performantes et spécifiques (souvent plus rapides que les expressions régulières pour des cas simples), les fonctions ctype sont recommandées :
- ctype_digit() : Vérifie que tous les caractères sont des chiffres.
- ctype_alpha() : Vérifie que la chaîne ne contient que des lettres.
- ctype_alnum() : Vérifei que la chaîne contient uniquement des caractères alphanumériques.
- ctype_space() : Vérifie si la chaîne est composée uniquement de caractères blancs (espaces, tabulations, etc.).
- ctype_xdigit() : Vérifie si les caractères correspondent à des chiffres hexadécimaux.
L'utilisation combinée de empty() pour la présence des données, de trim() pour le nettoyage des espaces inutiles et des fonctions is_* ou ctype_* permet de construire une couche de validation robuste garantissant l'intégrité de votre système d'information.