7.PHP pour le web

7.3.Validation de formulaire

7.3.5.Au quotidien

7.3.5.1.Validation avec PEAR

7.3.5.1.2.Validation du formulaire

Nous pouvons alors remplacer le script précédent par
<?php
require_once("include_path_inc.php");
require_once("Validate.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 (!Validate::string($nom, array("min_length" => 1))) 
        $errs["nom"][] = "Le nom est obligatoire";
    if (!Validate::string($nom, array("max_length" => 64))) 
        $errs["nom"][] = "Le nom ne doit pas exceder 64 c.";
        
    $prenom = stripSlashes($_POST["prenom"]);
    if (!Validate::string($prenom, array("max_length" => 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 (!Validate::date($naissance, array("format"=>"%d/%m/%Y"))) {
        $errs["naissance"][] = "La date de naissance n'est pas valide.";
    }

    $email = stripSlashes($_POST["email"]);
    if (strlen($email) == 0) {
        $errs["email"][] = "L'email est obligatoire";
    } else if (!Validate::email($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 (!Validate::string($motDePasse, array("min_length" => 1))) {
            $errs["motdepasse"][] = "Le mot de passe est obligatoire";
    } else if (!Validate::string($motDePasse, array("min_length" => 1))) {
            $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 (!Validate::string($motDePasse, array("min_length" => 8))) {
        $errs["motdepasse"][] = "Le mot de passe doit contenir au moins 8 c.";
    } else if (!Validate::string($motDePasse, array("max_length" => 16))) {
        $errs["motdepasse"][] = "Le mot de passe ne peut exceder 16 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("Formulaire valide !");
    }
}
?>
<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>
include_path_inc.php est un script chargé d'ajouter la bibliothèque PEAR à l'ensemble des chemins de recherche des fichiers PHP (afin que le fichier Validate.php puisse être trouvé).
<?php 
// Adaptez les chemins de recherche a votre environnement
set_include_path(get_include_path().PATH_SEPARATOR.
                 // Si la bibliotheque PEAR est au meme niveau que ce fichier
                 dirname(__FILE__)."/pear".PATH_SEPARATOR.
                 // Si la biblotheque PEAR est a la racine du site
                 $_SERVER["DOCUMENT_ROOT"]."/pear".PATH_SEPARATOR.
                 // Si la biblotheque PEAR est au niveau superieur
                 $_SERVER["DOCUMENT_ROOT"]."/../pear".PATH_SEPARATOR);
                 ?>
Ce qui donne