Frage

Ich habe den folgenden Code auf meiner Website (mit PHP und Smarty), um zu versuchen und einem Formular erneut einreichen zu vermeiden, wenn ich f5 getroffen:

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 ist falsch standardmäßig, aber Änderungen auf true, wenn das Formular erfolgreich abgegeben. Die Smarty-Variablen Titel und Abs sind in der Vorlage verwendet es den Formularinhalt zu halten, falls es ein Benutzerfehler, und sie müssen sich ändern, was sie eingegeben werden.

Wenn das Formular erfolgreich abgegeben wird setzt es bln_added = true, so dass das zweite Stück Code sollte nicht nur die Formularfelder löschen, sondern auch leere _POST $. Aber wenn ich f5 die Post-Daten drücken ist immer noch da.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Ihre Methode könnte in der Theorie funktionieren, aber es gibt einen viel einfacheren Weg.

Nachdem Sie das Formular erfolgreich einreichen, führen Sie eine Umleitung. Dabei spielt es keine Rolle, wo, aber es wird den $ _POST löscht.

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

In Ihrem Fall, es klingt wie Sie auf die Seite umleiten möchten Sie bereits sind. Fügen Sie einen $ _GET Parameter an die URL, wenn Sie eine Bestätigungsmeldung angezeigt werden sollen.

Hope, das hilft,

Tom

Andere Tipps

Die Lösung ist ein Muster, allgemein bekannt als Pfosten- / Redirect / Get

Der beste Weg, Formen zu handhaben ist selbst Vorlage und eine Umleitung zu verwenden. So etwas wie folgt aus:

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.

Mit dem CodeIgniter Rahmen :

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

Sie Ihre neu schreiben können form einreichen in AJAX-way. Wenn Sie HTML-Inhalt zeigen müssen, bringen Sie es in JSON-Format und fügen Sie mit JavaScript (jQuery zum Beispiel).

Ich löste dieses (in PHP) von:

  1. in der Form eine eindeutige Kennung (ID + Zähler) in nicht basierend auf Zeit () (!!!)

  2. Geben Sie in einer separaten Datei (postform.php), die für eine Sitzung mit diesem eindeutigen Kennung geprüft

  3. a) wenn Sitzung mit eindeutiger Kennung nicht gefunden wurde: Post an die Datenbank und füllt Sitzung mit eindeutiger Kennung

    b) wenn Sitzung mit eindeutiger Kennung gefunden wurde: nichts tut

  4. nach entweder 3a / 3b Weiterleitungsseite mit Kopf führen ( "Ort: http://mydomain.com/ mypage ')

Das Ergebnis ist:
erneut keine Aktionen auf beiden Refresh / Backbutton und nur erneut auf Doppelklick auf backbutton Warnung (aber keine Resubmit Aktion)

Verwenden Headerort nach erfolgreicher Beitrag Aktion

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

Es funktioniert für mich, wenn ich entweder header () oder exit () am Ende meines Codes verwenden, zum Beispiel, nachdem ich einige Daten speichern.

Die beste Methode, die ich gefunden ist JavaScript und CSS verwenden. Gemeinsame php Umleitungsmethode header ( 'Location: http://www.yourdomain.com/url ); funktioniert, aber es verursacht Warnung „Warnung: Kann nicht modify header information - headers already sent“ in verschiedenen Frameworks und CMS wie Wordpress, Drupal etc. Also mein Vorschlag ist, den Code unten folgen

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

Der Stil-Tag ist wichtig, da sonst der Benutzer wie Seite zweimal geladen fühlen. Wenn wir Stil-Tag mit Körperanzeige keine verwenden und aktualisieren Sie die Seite, dann wird der Benutzer Erfahrung wie gleiche wie php header ( 'Location: ....);

Ich hoffe, dass dies dazu beitragen wird:)

Rubrik umleiten nach Post ist notwendig, aber nicht ausreichend.

In PHP Seite nach dem Formular erfolgreich einreichen, führen Sie eine Umleitung. Z.B. header ( 'Location: http://www.example.com/form.php ');

Aber es ist nicht genug. Einige Benutzer drücken Links zweimal (Doppelklick). Ein JavaScript ist erforderlich, dass die Taste nach dem ersten Klick einreichen deaktivieren würde.

Versuchen Sie meinen eigenen, vielleicht ist es nicht beste Lösung (done schnell), aber ich habe es Test und es funktioniert. Getestet auf Chrome. Klicken Sie, um zu sehen, wie es BR

sieht
 <?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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top