Éviter de soumettre à nouveau le formulaire en php en appuyant sur f5

j'ai le code suivant sur mon site (en utilisant php et smarty) pour essayer d'éviter qu'un formulaire se réinitialise lorsque je clique f5:

if ($this->bln_added == false) {
    if (isset($_POST['submit'])) {
        $this->obj_site->obj_smarty->assign('title', $_POST['tas_heading']);
        $this->obj_site->obj_smarty->assign('desc', $_POST['tas_description']);
    }
} else {
    $this->obj_site->obj_smarty->assign('title', '');
    $this->obj_site->obj_smarty->assign('desc', '');
    unset($_POST);
}

bln_added est false par défaut, mais change à true une fois que le formulaire est soumis avec succès. Les variables smarty title et desc sont utilisées dans le modèle pour y conserver le contenu du formulaire en cas d'erreur de l'utilisateur et ils doivent changer ce qu'ils ont saisi.

Si le formulaire est soumis avec succès il définit bln_added = true, alors la le second bit de code ne devrait pas seulement effacer les champs du formulaire, mais aussi vider $_POST. Mais si j'appuie sur f5 les données post est toujours là.

des idées?

14
demandé sur code-jaff 2009-04-06 22:06:54

10 réponses

Votre méthode pourrait fonctionner en théorie, mais il y a un moyen beaucoup plus facile.

après avoir soumis le formulaire avec succès, effectuer une redirection. Ça n'a pas d'importance où, mais ça nettoiera le coût.

header('Location: http://www.example.com/form.php');

dans votre cas, on dirait que vous voulez rediriger vers la page où vous êtes déjà. Ajoutez un paramètre $_GET à L'URL si vous voulez afficher un message de confirmation.

j'Espère que cette aide,

Tom

39
répondu Tom Wright 2009-04-06 18:12:49

La solution est un modèle communément appelé Post / Redirect / Get

9
répondu David Snabel-Caunt 2009-04-06 18:45:33

La meilleure façon de traiter les formulaires à utiliser l'auto-présentation et une redirection. Quelque chose comme ceci:

if (isset($_POST)) {
  // Perform your validation and whatever it is you wanted to do
  // Perform your redirect
}

// If we get here they didn't submit the form - display it to them.

cadre CodeIgniter:

function index() {
  $this->load->library('validation');
  // Your validation rules

  if ($this->form_validation->run()) {
    // Perform your database changes via your model
    redirect('');
    return;
  }
  // The form didn't validate (or the user hasn't submitted)
  $this->load->view('yourview');
}
6
répondu Michael Wales 2009-04-06 18:12:25

vous pouvez réécrire votre formulaire-submit en AJAX-way. Si vous avez besoin de montrer le contenu HTML, retournez-le dans le format JSON et insérez avec JavaScript(jQuery par exemple.)

2
répondu ShiftedReality 2014-10-17 05:32:32

j'ai résolu ceci (en php) par:

  1. dans le formulaire ajouter un identifiant unique (id+compteur) pas basé sur le temps() (!!!)

  2. post dans un fichier séparé (postform.php) qui a vérifié pour une session avec cet identifiant unique

  3. a) si la session avec identifiant unique n'a pas été trouvée: postez à la base de données et remplissez la session avec identifiant unique

    b) si la session avec identifiant unique a été trouvée: do de rien

  4. après 3a/3b rediriger vers la page de résultat avec en-tête ('Location:http://mydomain.com/mypage')

Résultat:

aucune action de resubmit sur refresh / backbutton et seulement un avertissement de resubmit sur double clic backbutton (mais aucune action de resubmit)

1
répondu Paul 2011-12-19 11:11:25

utiliser L'emplacement de L'en-tête après une action de post réussie

header('Location: '.$_SERVER['HTTP_REFERER']);
1
répondu Mehmet Ali Uysal 2013-05-23 13:47:46

cela fonctionne pour moi si j'utilise l'en-tête() ou la sortie() à la fin de mon code, par exemple, après avoir enregistré quelques données.

1
répondu Misterk 2015-09-13 03:09:28

la meilleure méthode que j'ai trouvée est d'utiliser javascript et css. En-tête de la méthode de redirection php courante ('Location:http://www.yourdomain.com/url); fonctionnera mais il cause avertissement "Warning: Cannot modify header information - headers already sent" dans différents cadres et cms comme wordpress, drupal, etc. Donc, ma suggestion est de suivre le code ci-dessous

echo '<style>body{display:none;}</style>'; 
echo '<script>window.location.href = "http://www.siteurl.com/mysuccesspage";</script>'; 
exit;

l'étiquette de style est importante sinon l'utilisateur peut se sentir comme page chargée deux fois. Si nous utilisons l'étiquette de style avec le corps afficher aucun et puis actualisez la page , puis l'expérience de l'utilisateur sera comme même que le php header('location: ....);

j'espère que cela aide :)

1
répondu Ajith 2017-06-23 12:30:11

redirection de L'en-tête après la publication est nécessaire, mais insuffisante.

côté PHP après avoir soumis le formulaire avec succès, effectuer une redirection. Par exemple. en-tête ('Location:http://www.example.com/form.php');

mais ce n'est pas assez. Certains utilisateurs pressent les liens deux fois (doubleclick). Un JavaScript est requis pour désactiver le bouton Soumettre après le premier clic.

0
répondu Mangirdas Skripka 2011-11-27 16:44:19

essayez le mien, peut-être que ce n'est pas la meilleure solution (faite rapidement), mais je l'ai testé et cela fonctionne. Testé sur Chrome. Cliquez pour voir à quoi il ressemble BR

 <?php 
session_start(); // Start session
?>
<html>
 <head>
  <title>
    Test
  </title>
 </head>
 <body>
   <form name="test" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">
   <input type="text" name="name"><br>
   <input type="submit" name="submit" value="Submit Form"><br>
  </form>

  <?php

  if(isset($_POST['submit']))
    {
     $_SESSION['name'] = $_POST['name']; //  Assign $_POST value to $_SESSION variable
      header('Location: refresh.php'); // Address of this - reloaded page - in this case similar to PHP_SELF
    } else session_destroy(); // kill session, depends on what you want to do / maybe unset() function will be enough

  if(isset($_SESSION['name']))
    {
     $name = $_SESSION['name'];

     echo "User Has submitted the form and entered this name : <b> $name </b>";
     echo "<br>You can use the following form again to enter a new name."; 
    }
  ?>
 </body>
</html>
0
répondu Adrian Rybka 2018-02-02 21:48:39