7.PHP pour le web

7.3.Validation de formulaire

7.3.3.Exemple d'implémentation

Vous pouvez maintenant implémenter la validation des différents champs du formulaire comme bon vous semble. En voici, un exemple:
<?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) {

    $nom = stripSlashes($_POST["nom"]);
    if (strlen($nom) == 0) 
        $errs["nom"][] = "Le nom est obligatoire";
    if (strlen($nom) > 64) 
        $errs["nom"][] = "Le nom ne doit pas exceder 64 c.";
        
    $prenom = stripSlashes($_POST["prenom"]);
    if (strlen($prenom) > 64) 
        $errs["prenom"][] = "Le prenom ne doit pas exceder 64 c.";
        
    $naissance = stripSlashes($_POST["naissance"]);
    if (strlen($naissance) == 0) {
        $errs["naissance"][] = "La date de naissance est obligatoire";
    } else if (!ereg("^([0-9]){2}/([0-9]){2}/([1-2])([0-9]){3}$", $naissance)) {
        $errs["naissance"][] = "La date de naissance n'est pas au bon format.";
    } else {
        $champsDate = explode("/", $naissance);
        if (!checkdate($champsDate[1], $champsDate[0], $champsDate[2])) {
            $errs["naissance"][] = "La date de naissance est invalide.";
        }
    }

    $email = stripSlashes($_POST["email"]);
    if (strlen($email) == 0) {
        $errs["email"][] = "L'email est obligatoire";
    } else if (!ereg("^([a-zA-Z0-9._-]*)@([a-zA-Z0-9._-]*)\.([a-zA-Z]*)$", $email)) {
        // REM: Ce test de conformite est certainement incomplet
        $errs["email"][] = "L'email n'est pas au bon format.";
    }
    
    $motDePasse = stripSlashes($_POST["motdepasse"]);
    $motDePasseVerif = stripSlashes($_POST["motdepasseverif"]);
    if (strlen($motDePasse) == 0) {
        $errs["motdepasse"][] = "Le mot de passe est obligatoire";
    } else if (strlen($motDePasseVerif) == 0) {
        $errs["motdepasse"][] = "Le mot de passe doit etre saisi 2 fois";
    } else if ($motDePasse != $motDePasseVerif) {
        $errs["motdepasse"][] = "Les 2 mots de passe saisis sont différents";
    } else if (strlen($motDePasse) < 8) {
        $errs["motdepasse"][] = "Le mot de passe doit contenir au moins 8 c.";
    }
        // Inserer validation du 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.

    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>

Comme vous pouvez le constater, techniquement, la validation fonctionne correctement mais le script reste incomplet. En effet, à chaque erreur, il faut à nouveau saisir tous les champs du formulaire. Le solution est pourtant bien simple, il suffit de remplir l'attribut <value> des balises <input>. Les valeurs ne peuvent toutefois pas être intégrées directement dans ces attributs, à cause de la possible présence de caractères comme <, > ou " qui peuvent interférer avec le code HTML. Il faut au préalable faire appel à la fonction htmlEntities.
<?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();

$nom = "";
$prenom = "";
$naissance = "";
$email= "";

// 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) {

    $nom = stripSlashes($_POST["nom"]);
    if (strlen($nom) == 0) 
        $errs["nom"][] = "Le nom est obligatoire";
    if (strlen($nom) > 64) 
        $errs["nom"][] = "Le nom ne doit pas exceder 64 c.";
        
    $prenom = stripSlashes($_POST["prenom"]);
    if (strlen($prenom) > 64) 
        $errs["prenom"][] = "Le prenom ne doit pas exceder 64 c.";
        
    $naissance = stripSlashes($_POST["naissance"]);
    if (strlen($naissance) == 0) {
        $errs["naissance"][] = "La date de naissance est obligatoire";
    } else if (!ereg("^([0-9]){2}/([0-9]){2}/([1-2])([0-9]){3}$", $naissance)) {
        $errs["naissance"][] = "La date de naissance n'est pas au bon format.";
    } else {
        $champsDate = explode("/", $naissance);
        if (!checkdate($champsDate[1], $champsDate[0], $champsDate[2])) {
            $errs["naissance"][] = "La date de naissance est invalide.";
        }
    }

    $email = stripSlashes($_POST["email"]);
    if (strlen($email) == 0) {
        $errs["email"][] = "L'email est obligatoire";
    } else if (!ereg("^([a-zA-Z0-9._-]*)@([a-zA-Z0-9._-]*)\.([a-zA-Z]*)$", $email)) {
        // REM: Ce test de conformite est certainement incomplet
        $errs["email"][] = "L'email n'est pas au bon format.";
    }
    
    $motDePasse = stripSlashes($_POST["motdepasse"]);
    $motDePasseVerif = stripSlashes($_POST["motdepasseverif"]);
    if (strlen($motDePasse) == 0) {
        $errs["motdepasse"][] = "Le mot de passe est obligatoire";
    } else if (strlen($motDePasseVerif) == 0) {
        $errs["motdepasse"][] = "Le mot de passe doit etre saisi 2 fois";
    } else if ($motDePasse != $motDePasseVerif) {
        $errs["motdepasse"][] = "Les 2 mots de passe saisis sont différents";
    } else if (strlen($motDePasse) < 8) {
        $errs["motdepasse"][] = "Le mot de passe doit contenir au moins 8 c.";
    }
        // Inserer validation du 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.

    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" 
            value="<?php echo htmlEntities($nom);?>" /><br />
Prenom: <input type="text" name="prenom" 
               value="<?php echo htmlEntities($prenom);?>" /><br />
Date de naissance (JJ/MM/AAAA): 
   <input type="text" size="10" maxlength="10" name="naissance" 
          value="<?php echo htmlEntities($naissance);?>" /><br />
Email: <input type="text" name="email" value="<?php echo htmlEntities($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>

rem
  • Si vos données sont encodées en UTF-8, songez à remplacer les appels htmlEntities($valeur) par htmlEntities($valeur, ENT_COMPAT, "UTF-8").