2009-04-06 12 views
13

Je le code suivant sur mon site (en utilisant PHP et Smarty) pour essayer d'éviter une forme Resoumission quand je frappe f5:Éviter forme soumettre à nouveau en php lorsque vous appuyez sur 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 faux par défaut, mais devient true une fois le formulaire envoyé avec succès. Le titre et la descente des variables smarty sont utilisés dans le modèle pour conserver le contenu du formulaire là où il y a une erreur de l'utilisateur et ils doivent changer ce qu'ils ont entré.

Si le formulaire est soumis avec succès, il définit bln_added = true, donc le deuxième bit de code doit non seulement effacer les champs de formulaire, mais aussi vide $ _POST. Mais si j'appuie sur f5, les données postales sont toujours là.

Des idées?

Répondre

38

Votre méthode pourrait fonctionner en théorie, mais il y a une façon beaucoup plus facile. Après avoir envoyé le formulaire avec succès, effectuez une redirection. Peu importe où, mais cela effacera 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à. Ajoutez un paramètre $ _GET à l'URL si vous souhaitez afficher un message de confirmation.

Hope this helps,

Tom

+3

Grande réponse, PRG est certainement la voie à suivre: http://en.wikipedia.org/wiki/Post/Redirect/Get –

+0

Ai-je besoin de l'URL complète pour l'en-tête? – wheresrhys

+0

Juste essayé et il est en conflit avec un jeu d'en-tête ailleurs dans l'application. Je n'ai pas tout écrit, je n'ai donc aucune idée d'où aller pour arrêter le réglage. – wheresrhys

6

La meilleure façon de gérer les formulaires est d'utiliser self-submission 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 framework:

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

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

En PHP côté après avoir soumis le formulaire avec succès, effectuez une redirection. Par exemple. header ('Localisation: http://www.example.com/form.php');

Mais ce n'est pas suffisant. Certains utilisateurs appuient deux fois sur les liens (double clic). Un JavaScript est requis pour désactiver le bouton d'envoi après le premier clic.

1

J'ai résolu ce (en php) par:

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

  2. poste à un fichier séparé (postform.php) qui vérifiait 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é : ne rien faire

  4. après soit 3a/3b redirection pour résultat avec 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)

+0

Merci Paul, j'ai une idée de base, pourquoi nous ne devrions pas utiliser la soumission de formulaire dans la même page.Les temps précédents j'utilisais le formulaire soumettent à la même page. Après avoir manipulé le formulaire, je le redirige vers moi-même avec un paramètre get. –

1

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

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

Vous pouvez réécrire votre formulaire soumettre en AJAX -façon. Si vous avez besoin d'afficher du contenu HTML, retournez-le au format JSON et insérez-le avec JavaScript (jQuery par exemple.)

1

Cela fonctionne pour moi si j'utilise header() ou exit() à la fin de mon code , par exemple, après avoir sauvegardé des données.

1

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 commune ('Emplacement: http://www.yourdomain.com/url); fonctionne, mais cause de l'avertissement « Attention: Impossible de modifier les informations d'en-tête - têtes déjà envoyés » dans différents cadres et CMS comme Wordpress, Drupal, etc. Je propose donc 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 avoir l'impression que la page est chargée deux fois. Si nous utilisons aucune balise de style avec l'affichage du corps, puis actualiser la page, l'expérience utilisateur sera identique à celle de l'en-tête php ('Location: ....);

J'espère que cela vous aidera :)

0

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. Click to see how it looks 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>