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 :
- Un champ caché (de type hidden possède la valeur time()
- Lors de la validation du formulaire, on crée une session dans laquelle on enregistre cette valeur
- C'est cette valeur qui va être testée lors de la validation du formulaire
- Si cette valeur n'est pas modifiée lors de la validation, c'est que l'on vient de raffraichir la page
- Sinon (ou que la session n'existe pas), c'est bon, on peut continuer la validation du formulaire
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 !