7.PHP pour le web

7.3.Validation de formulaire

7.3.1.Introduction

Nous avons vu précédemment comment récupérer, en PHP, les valeurs saisies dans un formulaire HTML[c'est quoi?][comment?]. Les données ainsi récupérées pourront servir à envoyer un mail[comment?] à l'administrateur du site, stocker des informations sur un membre du site, etc. mais dans tous les cas, les données saisies devront être validées (contrôle des champs obligatoires, longueur max, validité des dates, etc.) avant toute autre opération (y compris s'il y a un contrôle effectué - coté client- en javascript[comment?]).
L'objet de ce chapitre est donc de présenter le principe de fonctionnement d'une telle validation.
Nous allons travailler, sur l'exemple d'un simple formulaire d'enregistrement d'un nouveau membre.
<body style="font-size:12pt">
<form>
Nom: <input type="text" name="nom" /><br />
Prenom: <input type="text" name="prenom" /><br />
Date de naissance (JJ/MM/AAAA): 
   <input type="text" size="10" maxlength="10" name="naissance" /><br />
Email: <input type="text" name="email" /><br />
Mot de passe: <input type="password" name="motdepasse" /><br />
Mot de passe (verif): <input type="password" name="motdepasseverif" /><br />
<input type="submit" value="Enregistrer" />
</form>
</body>
L'utilisateur devra saisir son nom (champ obligatoire limité à 64 caractères), son prénom (champ optionnel limité à 64 caractères), sa date de naissance (obligatoire), son email et son mot de passe (2 fois pour contrôle).

7.3.2.Structure

Pour intégrer la validation du formulaire, nous allons:
  • remplacer ce fichier HTML en fichier PHP, pour accéder aux valeurs saisies dans les différents champs via stripSlashes($_POST["nom du champ"]).
  • préparer un tableau de messages d'erreur
  • contrôler la validité champ après champ et compléter le tableau de messages d'erreur si besoin
  • exécuter l'action liée au formulaire si aucune erreur n'a été détectée (tableau vide) ou afficher la liste des erreurs s'il y en a
Ce qui donne la structure suivante
<?php
// Tableau contenant les messages d'erreur lies a la validation de chaque 
// champ du formulaire.
// On utilisera le nom du champ comme cle du tableau
$errs = array();


// S'il s'agit du premier affichage, le bouton submit n'a pas ete presse
// il n'y a pas de validation a effectuer. Sinon $_POST["submit"] n'est pas
// vide (et contient la valeur "Enregistrer")
if (strlen($_POST["submit"]) > 0) {

    // Inserer validation du nom: stripSlashes($_POST["nom"])
    // ajouter $errs["nom"][] = "Erreur blabla" en cas d'erreur de validation

    // Inserer validation du prenom: stripSlashes($_POST["prenom"])
    // ajouter $errs["prenom"][] = "Erreur blabla" en cas d'erreur de validation

    // etc.
    
    // Pour demo, nous allons simuler une erreur
    $errs["form"][] = "La validation du formulaire n'est pas implementee.";

    if (count($errs) == 0) {
        // Les donnees du formulaires ont ete validee (pas d'erreur trouvee)
        // faire ce qui doit etre fait (envoi de mail, enregistrement en base)
        // et rediriger vers la page suivante
        // header("Location: pagesuivante.php");
        die();
    }
}
?>
<body style="font-size:12pt">
<?php
// Si des erreurs ont été trouvée, les afficher sous forme de liste
if (count($errs) > 0) {
    echo "<ul>";
    foreach ($errs as $champEnErreur => $erreursDuChamp) {
        foreach ($erreursDuChamp as $erreur) {
            echo "<li>".$erreur."</li>";
        }
    }
    echo "</ul>";
}
?>
<form method="post">
Nom: <input type="text" name="nom" /><br />
Prenom: <input type="text" name="prenom" /><br />
Date de naissance (JJ/MM/AAAA): 
   <input type="text" size="10" maxlength="10" name="naissance" /><br />
Email: <input type="text" name="email" /><br />
Mot de passe: <input type="password" name="motdepasse" /><br />
Mot de passe (verif): <input type="password" name="motdepasseverif" /><br />
<input type="submit" name="submit" value="Enregistrer" />
</form>
</body>