Question

Je le code suivant sur mon site (en utilisant PHP et Smarty) pour essayer d'éviter une forme Resoumission quand je frappe 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 les changements à vrai une fois le formulaire soumis avec succès. Le titre des variables Smarty et desc sont utilisés dans le modèle pour conserver le contenu du formulaire il dans le cas où il y a une erreur de l'utilisateur et ils ont besoin de changer ce qu'ils sont entrés.

Si le formulaire est soumis, il établit avec succès bln_added = true, de sorte que le second morceau de code ne doit pas seulement effacer les champs de formulaire, mais aussi vide $ _POST. Mais si je presse f5 les données de poste est toujours là.

Toutes les idées?

Était-ce utile?

La solution

Votre méthode pourrait fonctionner en théorie, mais il y a une façon beaucoup plus facile.

Après avoir soumis le formulaire avec succès, effectuer une redirection. Peu importe où, mais il va effacer le $ _POST.

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

Dans votre cas, il semble que vous souhaitez rediriger vers la page que vous êtes déjà. Annexer un paramètre $ _GET à l'URL si vous souhaitez afficher un message de confirmation.

Hope this helps,

Tom

Autres conseils

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

La meilleure façon de gérer les formes est d'utiliser l'auto-soumission 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.

Utilisation du 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');
}

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

I résolu ce (en php) par:

  1. sous la forme d'ajouter un identifiant unique (identifiant + compteur) pas en fonction du temps () (!!!)

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

  3. a) si la session avec identifiant unique n'a pas été trouvée: après la base de données et remplir la session avec identifiant unique

    b) si la session avec identifiant unique a été trouvé: rien faire

  4. soit après 3a / 3b rediriger au résultat page d'en-tête ( «Location: http://mydomain.com/ mypage ')

Le résultat est:
soumettre à nouveau aucune action de chaque rafraîchissement / backbutton et seulement soumettre à nouveau avertissement sur backbutton double clic (mais aucune action de soumettre à nouveau)

Utiliser l'emplacement en-tête après l'action post réussie

header('Location: '.$_SERVER['HTTP_REFERER']);

Il fonctionne pour moi si je l'utilise soit en-tête () ou de sortie () à la fin de mon code, par exemple, après que je sauve des données.

La meilleure méthode que je trouve est en utilisant javascript et css. en-tête de la méthode de redirection commune php ( 'Emplacement: http://www.yourdomain.com/url ); fonctionne, mais cause de l'avertissement « Attention: Impossible de modifier les informations d'en-tête - ont déjà été envoyés en-têtes » dans différents cadres et CMS comme WordPress, etc. Donc, ma drupal 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;

La balise de style est important sinon, l'utilisateur peut se sentir comme Page chargée deux fois. Si nous utilisons balise de style avec affichage du corps ne puis actualisez la page, l'expérience utilisateur sera comme même en php header ( 'Emplacement: ....);

J'espère que cela contribuera à:)

En-tête redirect après le post est nécessaire, mais insuffisante.

côté PHP après avoir soumis la forme avec succès, effectuer une redirection. Par exemple. header ( 'Location: http://www.example.com/form.php ');

Mais il ne suffit pas. Certains utilisateurs appuient sur des liens deux fois (double-clic). Un JavaScript est requis qui désactiverait le bouton soumettre après le premier clic.

Essayez mon un, peut-être il n'est pas la meilleure solution (fait rapidement), mais je l'ai tester et il 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top