Comment éviter de re-valider un formulaire en raffraîchissant la page ?
Ceci est une bonne question, et la réponse a été longue à venir pour ma part. J'ai, depuis longtemps, été très embêté de voir qu'en appuyant sur cette maudite touche F5, ou en cliquant sur le bouton "page précédente" du navigateur, que ma base de données grossisaient avec toujours la même saisie...
Alors, un beau jour, j'ai pris mon clavier à deux mains et finalement, ce n'est pas si compliqué que cela :

J'utilise la méthode time qui va me permettre de savoir si le formulaire vient d'être validé où s'il s'agit d'un rafraichissement. Je m'explique :
Passons maintenant au code :

<form method='POST' action='valide.php'>
<input type='hidden' name='preventF5' value='"<?php echo time(); ?>"' />
 
Le formulaire est en méthod POST et la variable en question se nomme preventF5 à laquelle on affecte donc la valeur time(). Cette méthode retourne le timeStamp UNIX actuel, c'est-à dire le nombre de secondes depuis le début de l'époque UNIX.
Passons maintenant à la validation du formulaire :

if (isset($_POST["preventF5"])) {
    if (isset($_SESSION["preventF5"])) {
      if ($_SESSION["preventF5"] != $_POST["preventF5"]) {
        $_SESSION["preventF5"] = (isset($_POST["preventF5"])) ? $_POST["preventF5"] : "0" ;
        valider() ;
      }
    } else {
      $_SESSION["preventF5"] = (isset($_POST["preventF5"])) ? $_POST["preventF5"] : "0" ;
      valider() ;
    }
}
 
  • On vérifie d'abord si on a validé le formulaire en testant l'existence de la variable POSTée preventF5
  • On teste ensuite l'existence de la session (que je nomme également preventF5)
    • Dans le cas où la session n'existe pas encore, on la crée en lui donnant la valeur de la variable preventF5 et on peut passer au traitement du formulaire
    • Si la session existe et que sa valeur est différente de la valeur de preventF5, c'est qu"on revalide "normalement" le formulaire et on peut traiter le formulaire (méthode valider() à implémenter...)
    • Dans tous les autres cas, c'est qu'on a tenté de raffraichir la page... on ne fait rien !




 
laurent.rameil@free.fr