48 votes

Comment supprimer la variable $_POST en appuyant sur le bouton 'Refresh' du navigateur avec PHP ?

Lorsque j'appuie sur le bouton "rafraîchir" de mon navigateur, il semble que $_POST est préservée lors du rafraîchissement.

Si je veux supprimer le contenu de $_POST que dois-je faire ? Utilisation de unset pour les domaines de $_POST n'a pas aidé.

Comment faire ? Merci !

41voto

burntblark Points 1640

L'en-tête de la requête contient des données POST. Quoi que vous fassiez, lorsque vous rechargez la page, la requête est à nouveau envoyée.

La solution simple consiste à rediriger vers une nouvelle page (si ce n'est la même). Ce modèle est très courant dans les applications web, et est appelé Poster/Rediriger/Retrouver . Il est courant que tous les formulaires fassent un POST, puis, en cas de succès, une redirection.

Essayez autant que possible de toujours séparer (dans des fichiers différents) votre vue script (html principalement) de votre contrôleur script (logique métier et autres). De cette façon, vous posterez toujours des données dans un contrôleur séparé script et vous redirigerez ensuite vers une vue script qui, une fois rendue, ne contiendra aucune donnée POST dans l'en-tête de la requête.

25voto

Peter Points 1994

Pour empêcher les utilisateurs de rafraîchir la page ou d'appuyer sur le bouton "retour" et de soumettre à nouveau le formulaire, j'utilise la petite astuce suivante.

<?php

if (!isset($_SESSION)) {
    session_start();
}

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $_SESSION['postdata'] = $_POST;
    unset($_POST);
    header("Location: ".$_SERVER['PHP_SELF']);
    exit;
}
?>

Les données POST sont maintenant dans une session et les utilisateurs peuvent les rafraîchir autant qu'ils le souhaitent. Cela n'aura plus d'effet sur votre code.

8voto

Une solution PHP simple pour cela :

if (isset($_POST['aaa'])){
echo '
<script type="text/javascript">
location.reload();
</script>';
}

Lorsque la page est rechargée, les nouvelles données sont mises à jour à l'écran et le fichier $_POST est effacé. ;)

4voto

Kai Qing Points 13588

C'est une question courante ici.

Voici un lien vers une question similaire. Vous pouvez y voir ma réponse. Pourquoi POST['submit'] est défini lorsque je recharge ?

La réponse de base est de regarder dans post/redirect/get, mais comme il est plus facile de voir par l'exemple, il suffit de vérifier le lien ci-dessus.

3voto

alx Points 304

Ma technique habituelle pour cela est la suivante :

<?php
if ($_POST) {
   $errors = validate_post($_POST);

   if ($!errors) {
       take_action($_POST);
       // This is it (you may want to pass some additional parameters to generate visual feedback later):
       header('Location: ?');
       exit;
   }
}
?>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X