So verhindern Sie die erneute Übermittlung von Formularen beim Aktualisieren der Seite (F5 / STRG + R)


131

Ich habe ein einfaches Formular, das Text an meine SQL-Tabelle sendet. Das Problem ist, dass der Benutzer nach dem Absenden des Textes die Seite aktualisieren kann und die Daten erneut gesendet werden, ohne das Formular erneut auszufüllen. Ich könnte den Benutzer auf eine andere Seite umleiten, nachdem der Text gesendet wurde, aber ich möchte, dass Benutzer auf derselben Seite bleiben.

Ich erinnere mich, dass ich etwas darüber gelesen habe, jedem Benutzer eine eindeutige Sitzungs-ID zu geben und sie mit einem anderen Wert zu vergleichen, der das Problem gelöst hat, aber ich habe vergessen, wo es ist.



1
Warum möchten Sie den Benutzer nicht auf eine andere Seite umleiten?
Adam

@Adam: Da dies zu viel ist, um eine weitere Anforderung an den Server zu senden, die wiederum einige Daten aus der Datenbank abruft. Dies ist jedoch eine Verschwendung von Ressourcen, da wir bereits alle erforderlichen Daten während der Verarbeitung der POSTAnfrage
abrufen

@EugenKonkov Im PRG-Muster würden Sie einfach zu einer Seite weiterleiten, auf der eine Erfolgsmeldung angezeigt wird. Kein weiteres Abrufen aus der Datenbank erforderlich.
Adam

@Adam: Sie können auch den gesamten Datensatz anzeigen, der durch POSTDaten erstellt wird. In diesem Fall müssen Sie SELECTes aus der DB. Wenn Sie beispielsweise die Rechnung erstellen, werden Sie weitergeleitet, auf /invoices/53der die gesamte Rechnung angezeigt wird, anstatt nur "Erfolg"
Eugen Konkov,

Antworten:


96

Verwenden Sie das Post / Redirect / Get-Muster. http://en.wikipedia.org/wiki/Post/Redirect/Get

Auf meiner Website speichere ich eine Nachricht in einem Cookie oder einer Sitzung, leite sie nach dem Beitrag um, lese das Cookie / die Sitzung und lösche dann den Wert dieser Sitzung oder Cookie-Variablen.


1
Dies macht Chrom für die Entwicklung unbrauchbar, bei der Unternehmen nur einen Beitrag benötigen!
John Peters

26
Wenn Sie das PRG-Muster verwenden, verlassen Sie die Seite tatsächlich richtig? War nicht die Frage, wie man Dinge zum Laufen bringt, wenn man nicht umleitet?
Adam

Mir scheint, wenn Sie auf dieselbe Seite umleiten, wird $ _POST gelöscht. So wie ich es verstehe, war das der gewünschte Effekt. Das war sowieso MEIN gewünschter Effekt. Ich denke, die Antwort wäre besser, wenn sie dies explizit machen würde.
Donutguy640

Funktioniert gut, meine einzige Empfehlung ist, sicherzustellen, dass Sie strenge Fehlertests aktivieren, damit Sie Fehler lokal während der Entwicklung abfangen, da sie sonst unbemerkt bleiben können.
Maurice

Beantwortet die Frage nicht. Ich bin mir nicht sicher, warum es die akzeptierte Antwort ist.
YungGun

123

Ich möchte auch darauf hinweisen, dass Sie einen Javascript-Ansatz verwenden können window.history.replaceState, um ein erneutes Senden bei Aktualisierung und Zurück zu verhindern.

<script>
    if ( window.history.replaceState ) {
        window.history.replaceState( null, null, window.location.href );
    }
</script>

Proof of Concept hier: https://dtbaker.net/files/prevent-post-resubmit.php

Ich würde immer noch einen Post / Redirect / Get-Ansatz empfehlen, aber dies ist eine neuartige JS-Lösung.


1
Danke, @dtbaker, es ist großartig :)
Gufran Hasan

1
Tks, das ist Arbeit perfekt für mich, es musste nur 404 Seite erstellen, um Missverständnisse der Benutzer zu vermeiden
tess hsu

Einfach unglaublich. Thankyou
user4906240

2
es funktioniert nicht in Safari, es hat href geändert, aber behält die Daten mit Post-Anfrage zu senden
Vo Thanh Tung

Das hat bei mir funktioniert, danke! Warum empfehlen Sie den PRG-Ansatz?
iJassar

16

Sie sollten wirklich ein Post Redirect Get-Muster verwenden, um dies zu handhaben. Wenn Sie jedoch in einer Position gelandet sind, in der PRG nicht realisierbar ist (z. B. befindet sich das Formular selbst in einem Include, um Weiterleitungen zu verhindern), können Sie einige der Anforderungsparameter hashen um eine Zeichenfolge basierend auf dem Inhalt zu erstellen und dann zu überprüfen, ob Sie sie noch nicht gesendet haben.

//create digest of the form submission:

    $messageIdent = md5($_POST['name'] . $_POST['email'] . $_POST['phone'] . $_POST['comment']);

//and check it against the stored value:

    $sessionMessageIdent = isset($_SESSION['messageIdent'])?$_SESSION['messageIdent']:'';

    if($messageIdent!=$sessionMessageIdent){//if its different:          
        //save the session var:
            $_SESSION['messageIdent'] = $messageIdent;
        //and...
            do_your_thang();
    } else {
        //you've sent this already!
    }

Vielen Dank für das Teilen, aber das scheint nicht zu funktionieren. Durch das Aktualisieren der Seite wird das Formular tatsächlich erneut für mich gesendet. Vielleicht fehlt mir etwas?
aLearner

Durch das Aktualisieren der Seite wird alles erneut gesendet, aber wir werden die Übermittlungsdaten nur dann verarbeiten, wenn sie sich von den zuletzt gesendeten Daten unterscheiden (die wir in der Sitzungsvariablen 'messageIdent' speichern). Verarbeiten Sie Ihre Formularübermittlung innerhalb der Klausel 'if messageIdents are different' (dh wo 'do_your_thang ()' ist)?
Moob

Danke für deine Antwort. Am Ende habe ich nur das Post / Redirect / Get-Muster implementiert, daher kann ich mich jetzt nicht erinnern, was genau mich ausgelöst hat. Nochmals vielen Dank für das Zurückkreisen.
aLearner

Diese Methode soll nicht die erneute Übermittlung blockieren, sondern die erneute Übermittlung erkennen, damit Sie Ihren Code so ändern können, dass Sie nicht "tun", was Sie tun würden, wenn dies eine neue Übermittlung wäre. Mit anderen Worten: Mit dieser Methode können Sie die "ursprüngliche" Übermittlung erkennen und Ihre Daten platzieren. Wenn es NICHT original ist, platzieren Sie Ihre Daten nicht. Zeigen Sie entweder eine Warnung "Betrugsversuch" oder stattdessen eine "Bestätigung" an.
TheSatinKnight

Damit dies funktioniert, müssen Sie eine Sitzung durch Hinzufügen session_start();am Anfang der Datei gestartet haben . w3schools.com/php/php_sessions.asp sagt Hinweis: Die Funktion session_start () muss das allererste in Ihrem Dokument sein. Vor HTML-Tags.
wkille

16

Ich verwende diese Javascript-Zeile, um das Popup zu blockieren und nach der erneuten Übermittlung des Formulars beim Aktualisieren zu fragen, sobald das Formular gesendet wurde.

if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}

Platzieren Sie diese Zeile einfach in der Fußzeile Ihrer Datei und sehen Sie die Magie


Wäre schön eine Version davon, die auf Client-Seite nicht deaktiviert werden kann, aber kurz, einfach, schnell ... und das tut, was sie tun muss. Behält den Verlauf bei, damit der Benutzer zurück navigieren kann, ohne den Beitrag erneut zu senden.
Péter Vértényi

16

Sie können die erneute Übermittlung von Formularen über eine Sitzungsvariable verhindern.

Zuerst müssen Sie rand()in einem Textfeld und $_SESSION['rand']auf der Formularseite Folgendes festlegen :

<form action="" method="post">
  <?php
   $rand=rand();
   $_SESSION['rand']=$rand;
  ?>
 <input type="hidden" value="<?php echo $rand; ?>" name="randcheck" />
   Your Form's Other Field 
 <input type="submit" name="submitbtn" value="submit" />
</form>

Überprüfen Sie danach $_SESSION['rand']mit einem Textfeldwert $_POST['randcheck']wie folgt :

if(isset($_POST['submitbtn']) && $_POST['randcheck']==$_SESSION['rand'])
{
    // Your code here
}

3
wir können <input type="hidden" name="randcheck" id="randcheck" value="<?php echo microtime(); ?>" />stattdessen verwenden
Nikolay Bronskiy

Ja, wir können sowohl microtime () als auch time () anstelle von rand () verwenden, unabhängig von der Funktion oder Variablen, die einen anderen Wert ergibt. ABER stellen Sie sicher, dass Sie diesen Wert auf die Variable SESSION setzen. Hier ist SESSION ein Muss, um mit dem Randcheck-Feld zu prüfen und zu verhindern, dass das Formular erneut eingereicht wird.
Savoo

Sollte die Sitzungsvariable nicht gelöscht werden, nachdem überprüft wurde, ob die Sitzungs- und Post-Variablen übereinstimmen?
Denoise

1
@denoise Ich glaube, die Idee von @Savoo ist, dass nach $_POSTden Formulardaten dieselbe Seite neu geladen wird, um die Sitzungs- und Post-Variablen zurückzusetzen. Die Erstellung von Variablen sollte auch erfolgen, nachdem überprüft wurde, ob die Variablen übereinstimmen. Daher unsetwird nicht benötigt.
HalfMens

13

Wenn das Formular verarbeitet wird, leiten Sie auf eine andere Seite weiter:

... process complete....
header('Location: thankyou.php');

Sie können auch auf dieselbe Seite umleiten.

Wenn Sie so etwas wie Kommentare ausführen und möchten, dass der Benutzer auf derselben Seite bleibt, können Sie Ajax verwenden, um die Formularübermittlung durchzuführen


11
  1. Verwenden Sie die Kopfzeile und leiten Sie die Seite um.

    header("Location:your_page.php"); Sie können auf dieselbe oder eine andere Seite umleiten.

  2. Deaktivieren Sie $ _POST, nachdem Sie es in die Datenbank eingefügt haben.

    unset($_POST);


54
Das Deaktivieren von $ _POST wirkt sich überhaupt nicht auf die erneute Übermittlung von Formularen aus, zumindest nicht in Chrome.
Gavin

2
Es wird nicht funktionieren. Wenn der Benutzer zur Rückseite wechselt, werden die POST-Variablen erneut eingerichtet.
Sandhu

Was ist der Grund für die Verwendung unset? Bitte fügen Sie Ihrer Antwort eine Erklärung hinzu, damit andere daraus lernen können
Nico Haase

11

Ich habe die nächste Problemumgehung gefunden. Sie können die Umleitung nach der Verarbeitung der POSTAnforderung durch Bearbeiten des historyObjekts umgehen.

Sie haben also das HTML-Formular:

<form method=POST action='/process.php'>
 <input type=submit value=OK>
</form>

Wenn Sie dieses Formular auf Ihrem Server verarbeiten, leiten Sie den Benutzer nicht weiter, /the/result/pageindem Sie den LocationHeader wie folgt einrichten:

$cat process.php
<?php 
     process POST data here
     ... 
     header('Location: /the/result/page');
     exit();
?>

Geben Sie hier die Bildbeschreibung ein

Nach der Verarbeitung der POSTDaten rendern Sie klein <script>und das Ergebnis/the/result/page

<?php 
     process POST data here
     render the <script>         // see below
     render `/the/result/page`   // OK
?>

Das <script>solltest du rendern:

<script>
    window.onload = function() {
        history.replaceState("", "", "/the/result/page");
    }
</script>

Das Ergebnis ist:

Geben Sie hier die Bildbeschreibung ein

Wie Sie sehen können, werden die Formulardaten POSTin ein process.phpSkript umgewandelt.
Dieses Skript verarbeitet POSTDaten und rendert /the/result/pagesofort mit:

  1. keine Umleitung
  2. Keine erneuten POSTDaten beim Aktualisieren der Seite (F5)
  3. Nein, POSTwenn Sie durch den Browserverlauf zur vorherigen / nächsten Seite navigieren

UPD

Als eine andere Lösung bitte ich Feature - Anfrage die Mozilla FireFox Team Benutzer einrichten , damit NextPageHeader, wie funktioniertLocation Header und Makepost/redirect/get veraltet Muster.

Zusamenfassend. Wenn der Server Formulardaten POSTerfolgreich verarbeitet, gilt Folgendes:

  1. Setup- NextPageHeader anstelle vonLocation
  2. POSTRendern Sie das Ergebnis der Verarbeitung von Formulardaten so, wie es für die GETAnforderung im post/redirect/getMuster gerendert würde

Der Browser wiederum, wenn der NextPageHeader angezeigt wird :

  1. window.locationMit NextPageWert einstellen
  2. Wenn der Benutzer die Seite aktualisiert, handelt der Browser eine GETAnfrage aus, NextPageanstatt POSTDaten neu zu formulieren

Ich denke, das wäre exzellent, wenn es implementiert würde, nicht wahr? =)


7

Ein ziemlich todsicherer Weg besteht darin, eine eindeutige ID in den Beitrag zu implementieren und im Cache zwischenzuspeichern

<input type='hidden' name='post_id' value='".createPassword(64)."'>

Dann machen Sie in Ihrem Code Folgendes:

if( ($_SESSION['post_id'] != $_POST['post_id']) )
{
    $_SESSION['post_id'] = $_POST['post_id'];
    //do post stuff
} else {
    //normal display
}

function createPassword($length)
{
    $chars = "abcdefghijkmnopqrstuvwxyz023456789";
    srand((double)microtime()*1000000);
    $i = 0;
    $pass = '' ;

    while ($i <= ($length - 1)) {
        $num = rand() % 33;
        $tmp = substr($chars, $num, 1);
        $pass = $pass . $tmp;
        $i++;
    }
    return $pass;
}

Ich habe gerade etwas Ähnliches geschrieben, habe mir aber nicht die Mühe gemacht, ein Passwort zu erstellen. Ich habe nur meine Formulare aufgelistet (z. B. Schritte 1 bis 5). Wenn sie also gleich sind, können wir weitermachen. Andernfalls speichern Sie nicht in der Datenbank und senden Sie keine E-Mails. Aber lassen Sie den Benutzer landen, wohin er ihn führt.
Fernando Silva

1
Ich denke, dies ist eine bessere Lösung als das Neuladen der Seite, da ich eine Nachricht zeige, wenn der Beitrag erfolgreich ist und das Neuladen der Seite die Nachricht löscht. Dies funktioniert Gitter für mich, Sie können auch eine Uniqid verwenden
Julio Popócatl

6

Diese Methode funktioniert bei mir gut und ich denke, dies ist die einfachste, um diesen Job zu erledigen.

Die allgemeine Idee besteht darin, den Benutzer nach dem Senden des Formulars auf einige andere Seiten umzuleiten, wodurch die erneute Übermittlung des Formulars bei der Seitenaktualisierung gestoppt wird. Wenn Sie den Benutzer nach dem Absenden des Formulars auf derselben Seite halten müssen, können Sie dies auf verschiedene Arten tun. Hier beschreibe ich jedoch die Javascript-Methode.

Javascript-Methode

Diese Methode ist recht einfach und blockiert das Popup-Fenster, in dem beim erneuten Senden des Formulars nach erneuter Übermittlung des Formulars gefragt wird. Platzieren Sie einfach diese Zeile Javascript-Code in der Fußzeile Ihrer Datei und sehen Sie die Magie.

<script>
if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}
</script>


Das hilft mir auch
Ankit

4

Javascript

Diese Methode ist recht einfach und blockiert das Popup-Fenster, in dem beim erneuten Senden des Formulars nach erneuter Übermittlung des Formulars gefragt wird. Platzieren Sie einfach diese Zeile Javascript-Code in der Fußzeile Ihrer Datei und sehen Sie die Magie.

<script>
    if ( window.history.replaceState ) {
        window.history.replaceState( null, null, window.location.href );
    }
</script>

3

Leiten Sie es einfach auf dieselbe Seite um, nachdem Sie Formulardaten verwendet haben, und es funktioniert. Ich habe es versucht.

header('location:yourpage.php');

4
Dies wiederholt nur die gleiche Antwort, die jemand anderes Jahre zuvor gegeben hat. (In der Tat zwei andere!)
Nick Rice

Wenn Sie die Antworten anderer Personen duplizieren, sollten Sie Ihrer Antwort zumindest eine Erklärung hinzufügen, um sie interessant zu machen
Nico Haase,

3

Eine verfeinerte Version von Moobs Beitrag. Erstellen Sie einen Hash des POST, speichern Sie ihn als Sitzungscookie und vergleichen Sie die Hashes jeder Sitzung.

// Optionally Disable browser caching on "Back"
header( 'Cache-Control: no-store, no-cache, must-revalidate' );
header( 'Expires: Sun, 1 Jan 2000 12:00:00 GMT' );
header( 'Last-Modified: ' . gmdate('D, d M Y H:i:s') . 'GMT' );

$post_hash = md5( json_encode( $_POST ) );

if( session_start() )
{
    $post_resubmitted = isset( $_SESSION[ 'post_hash' ] ) && $_SESSION[ 'post_hash' ] == $post_hash;
    $_SESSION[ 'post_hash' ] = $post_hash;
    session_write_close();
}
else
{
    $post_resubmitted = false;
}

if ( $post_resubmitted ) {
  // POST was resubmitted
}
else
{
  // POST was submitted normally
}

2

Grundsätzlich müssen Sie von dieser Seite umleiten, aber es kann immer noch ein Problem verursachen, während Ihr Internet langsam ist (Header von der Serverseite umleiten).

Beispiel eines Basisszenarios:

Klicken Sie zweimal auf die Schaltfläche "Senden"

Weg zu lösen

  • Client-Seite

    • Deaktivieren Sie die Schaltfläche "Senden", sobald der Client darauf klickt
    • Wenn Sie Jquery verwenden: Jquery.one
    • PRG-Muster
  • Serverseite

    • Verwenden eines differenzierungsbasierten Hashing-Zeitstempels / Zeitstempels, wenn eine Anforderung gesendet wurde.
    • Userequest-Token. Wenn der Hauptlader geladen wird, weisen Sie einen temporären Anforderungs-Token zu, der bei Wiederholung ignoriert wird.

2

So verhindern Sie die erneute Übermittlung von PHP-Formularen ohne Weiterleitung. Wenn Sie $ _SESSION (nach session_start) und ein $ _POST-Formular verwenden, können Sie Folgendes tun:

if ( !empty($_SESSION['act']) && !empty($_POST['act']) && $_POST['act'] == $_SESSION['act'] ) {
  // do your stuff, save data into database, etc
}

Geben Sie in Ihr HTML-Formular Folgendes ein:

<input type="hidden" id="act" name="act" value="<?php echo ( empty($_POST['act']) || $_POST['act']==2 )? 1 : 2; ?>">
<?php
if ( $_POST['act'] == $_SESSION['act'] ){
    if ( empty( $_SESSION['act'] ) || $_SESSION['act'] == 2 ){
        $_SESSION['act'] = 1;
    } else {
        $_SESSION['act'] = 2;
    }
}
?>

Jedes Mal, wenn das Formular gesendet wird, wird ein neuer Akt generiert, in der Sitzung gespeichert und mit dem Post-Akt verglichen.

Ps: Wenn Sie ein Get-Formular verwenden, können Sie alle POSTs einfach mit GET ändern und es funktioniert auch.


1

Rufen Sie nach dem Einfügen in die Datenbank die Methode unset () auf, um die Daten zu löschen.

nicht gesetzt ($ _ POST);

Führen Sie nach dem Einfügen des Datensatzes eine Seitenumleitung auf dieselbe Seite oder eine andere Seite durch, um das Einfügen von Aktualisierungsdaten zu verhindern.

Header ('Location:'. $ _ SERVER ['PHP_SELF']);


1
Bitte fügen Sie Ihrer Antwort eine Erklärung hinzu, damit andere daraus lernen können - warum wird dieser unsetAnruf benötigt? Was würde passieren, wenn Sie es überspringen würden?
Nico Haase

0

Es ist eine gute Idee, das Post / Redirect / Get-Muster von Keverw zu verwenden. Sie können jedoch nicht auf Ihrer Seite bleiben (und ich denke, das war es, wonach Sie gefragt haben?). Außerdem kann es manchmal fehlschlagen :

Wenn ein Webbenutzer aufgrund einer Serververzögerung aktualisiert wird, bevor die erste Übermittlung abgeschlossen ist, führt dies bei bestimmten Benutzeragenten zu einer doppelten HTTP-POST-Anforderung.

Eine andere Möglichkeit wäre, in einer Sitzung zu speichern, wenn Text wie folgt in Ihre SQL-Datenbank geschrieben werden soll:

if($_SERVER['REQUEST_METHOD'] != 'POST')
{
  $_SESSION['writeSQL'] = true;
}
else
{
  if(isset($_SESSION['writeSQL']) && $_SESSION['writeSQL'])
  {
    $_SESSION['writeSQL'] = false;

    /* save $_POST values into SQL */
  }
}

0

Wie andere gesagt haben, ist es nicht möglich, post / redirect / get nicht mehr zu verwenden. Gleichzeitig ist es jedoch recht einfach, das zu tun, was Sie serverseitig tun möchten.

Auf Ihrer POST-Seite validieren Sie einfach die Benutzereingaben, reagieren jedoch nicht darauf, sondern kopieren sie in ein SESSION-Array. Anschließend leiten Sie wieder zur Hauptübermittlungsseite zurück. Ihre Hauptübermittlungsseite beginnt mit der Überprüfung, ob das von Ihnen verwendete SESSION-Array vorhanden ist. Wenn ja, kopieren Sie es in ein lokales Array und deaktivieren Sie es. Von dort aus können Sie darauf reagieren.

Auf diese Weise erledigen Sie Ihre Hauptarbeit nur einmal und erreichen das, was Sie tun möchten.


0

Ich suchte nach einer Lösung, um eine erneute Einreichung in einem großen Projekt zu verhindern. Der Code funktioniert sehr gut mit $ _GET und $ _POST, und ich kann das Verhalten von Formularelementen nicht ändern, ohne das Risiko unvorhergesehener Fehler. Also, hier ist mein Code:

<!-- language: lang-php -->
<?php

// Very top of your code:

// Start session:
session_start();

// If Post Form Data send and no File Upload
if ( empty( $_FILES ) && ! empty( $_POST ) ) {
    // Store Post Form Data in Session Variable
    $_SESSION["POST"] = $_POST;
    // Reload Page if there were no outputs
    if ( ! headers_sent() ) {
        // Build URL to reload with GET Parameters
        // Change https to http if your site has no ssl
        $location = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        // Reload Page
        header( "location: " . $location, true, 303 );
        // Stop any further progress
        die();
    }
}

// Rebuilt POST Form Data from Session Variable
if ( isset( $_SESSION["POST"] ) ) {
    $_POST = $_SESSION["POST"];
    // Tell PHP that POST is sent
    $_SERVER['REQUEST_METHOD'] = 'POST';
}

// Your code:
?><html>
    <head>
        <title>GET/POST Resubmit</title>
    </head>
    <body>

    <h1>Forms:</h1>
    <h2>GET Form:</h2>
    <form action="index.php" method="get">
        <input type="text" id="text_get" value="test text get" name="text_get"/>
        <input type="submit" value="submit">
    </form>
    <h2>POST Form:</h2>
    <form action="index.php" method="post">
        <input type="text" id="text_post" value="test text post" name="text_post"/>
        <input type="submit" value="submit">
    </form>
    <h2>POST Form with GET action:</h2>
    <form action="index.php?text_get2=getwithpost" method="post">
        <input type="text" id="text_post2" value="test text get post" name="text_post2"/>
        <input type="submit" value="submit">
    </form>
    <h2>File Upload Form:</h2>
    <form action="index.php" method="post" enctype="multipart/form-data">
        <input type="file" id="file" name="file">
        <input type="submit" value="submit">
    </form>

    <h1>Results:</h1>
    <h2>GET Form Result:</h2>
    <p>text_get: <?php echo $_GET["text_get"]; ?></p>
    <h2>POST Form Result:</h2>
    <p>text_post: <?php echo $_POST["text_post"]; ?></p>
    <h2>POST Form with GET Result:</h2>
    <p>text_get2: <?php echo $_GET["text_get2"]; ?></p>
    <p>text_post2: <?php echo $_POST["text_post2"]; ?></p>
    <h2>File Upload:</h2>
    <p>file:
    <pre><?php if ( ! empty( $_FILES ) ) {
            echo print_r( $_FILES, true );
        } ?></pre>
    </p>
    <p></p>
    </body>
    </html><?php
// Very Bottom of your code:
// Kill Post Form Data Session Variable, so User can reload the Page without sending post data twice
unset( $_SESSION["POST"] );

Es funktioniert nur, um die erneute Übermittlung von $ _POST zu vermeiden, nicht von $ _GET. Aber das ist das Verhalten, das ich brauche. Das Problem der erneuten Übermittlung funktioniert nicht beim Hochladen von Dateien!


0

Was für mich funktioniert ist:

if ( !refreshed()) {
   //Your Submit Here
        if (isset( $_GET['refresh'])) {
            setcookie("refresh",$_GET['refresh'], time() + (86400 * 5), "/");
        }

    }    
}


function refreshed()
{
    if (isset($_GET['refresh'])) {
        $token = $_GET['refresh'];
        if (isset($_COOKIE['refresh'])) {
            if ($_COOKIE['refresh'] != $token) {
                return false;
            } else {
                return true;
            }
        } else {
            return false;
        }
    } else {
        return false;
    }
}  


function createToken($length) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

?>

Und in deiner Form

 <form  action="?refresh=<?php echo createToken(3)?>">



 </form>

-2
if (($_SERVER['REQUEST_METHOD'] == 'POST') and (isset($_SESSION['uniq']))){
    if($everything_fine){
        unset($_SESSION['uniq']);
    }
}
else{
    $_SESSION['uniq'] = uniqid();
}

Bitte fügen Sie Ihrer Antwort eine Erklärung hinzu, damit andere daraus lernen können - woher kommt $everything_finesie?
Nico Haase

-3

Warum nicht einfach die $_POST['submit']Variable als logische Anweisung verwenden, um alles im Formular zu speichern? Sie können jederzeit auf dieselbe Seite umleiten (Falls sie aktualisiert werden und wenn sie go backim Browser angezeigt werden, wird die Variable "Beitrag senden" nicht mehr festgelegt. Stellen Sie einfach sicher, dass Ihre Schaltfläche "Senden" ein nameund idvon enthält submit.


1
Schauen Sie sich en.wikipedia.org/wiki/Post/Redirect/Get an ! Dies ist der richtige Ansatz
Januar 267
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.