So stoppen Sie die erneute Übermittlung von Formularen bei der Seitenaktualisierung
9 Antworten
- Stimmen
-
- 2013-04-20
Anstelle von ...
} else { echo "<p>Your file has been uploaded.</p>"; }
…bei Erfolg aneine andere Adresse weiterleiten:
} else { $new_url = add_query_arg( 'success', 1, get_permalink() ); wp_redirect( $new_url, 303 ); exit; }
Der Statuscode 303 lösteine GET-Anforderung aus :
Diese Methode dient hauptsächlich dazu,dass die Ausgabeeines POST-aktivierten Skripts den Benutzeragenten zueiner ausgewählten Ressource umleitet. Derneue URIist keine Ersatzreferenzfür die ursprünglich angeforderte Ressource. Die 303-Antwort darf NICHT zwischengespeichert werden,aber die Antwort auf die zweite (umgeleitete) Anforderung kann zwischengespeichert werden.
Überprüfen Siein Ihrem Formularhandler zuerst,ob
$_GET['success']
festgelegtist und der Wert1
ist,und drucken Sie danneine Erfolgsmeldung. Der Besucher kann diese Seiteimmer wiederneu laden - undes wirdnichtsgesendet.Instead of …
} else { echo "<p>Your file has been uploaded.</p>"; }
… redirect to another address on success:
} else { $new_url = add_query_arg( 'success', 1, get_permalink() ); wp_redirect( $new_url, 303 ); exit; }
Status code 303 triggers a GET request:
This method exists primarily to allow the output of a POST-activated script to redirect the user agent to a selected resource. The new URI is not a substitute reference for the originally requested resource. The 303 response MUST NOT be cached, but the response to the second (redirected) request might be cacheable.
In your form handler check first if
$_GET['success']
is set and its value is1
, then print a success message. The visitor can reload this page again and again – and nothing will be sent.-
Leider hat dasnichtfunktioniert,undich habe keine Ahnung warum,weil das PHPnichtfunktioniert (nur um zubestätigen,dassichnur das Echoersetzen sollte?Unfortunately that didn't work, and I have no idea why because that php does stick up (just to confirm all I was supposed to do was replace the echo?
- 0
- 2013-04-20
- ameeromar
-
Siemüssen den Header senden,bevoreine Ausgabe an den Browsergesendet wurde.You have to send the header before any output has been sent to the browser.
- 1
- 2013-04-20
- fuxia
-
Also das PHP-Code-Bitin den Header setzen?so put the php code bit in the header?
- 0
- 2013-04-26
- ameeromar
-
@ameeromar Ja.Diegesamte Datenverarbeitung sollte durchgeführt werden,bevor Siemit der Erstellung der Ausgabebeginnen.@ameeromar Yes. All data processing should be done before you start creating output.
- 2
- 2013-04-26
- fuxia
-
- 2013-09-11
Ich hatte dasgleiche Problem undes war "kompliziert" durch die Tatsache,dassich alle URLsin eineeinzelne .php-Datei umleitete.Es stellte sich heraus,dassichnur denfolgenden Codeeinfügenmusste,bevor HTML auf die Seitegeschrieben wurde.
<?php if (isset($_POST['mypostvar']) && isset($_SERVER['REQUEST_URI'])) { [process the post data in 'mypostvar'] header ('Location: ' . $_SERVER['REQUEST_URI']); exit(); } ?>
Dies wird auf dieselbe Seite umgeleitet,nachdem die Postdaten wiegewünscht verarbeitet wurden. Nach der Weiterleitung verschwinden die ursprünglichen Postdaten und lösen dieerneute Übermittlungnicht aus. Die Funktion 'header ()'funktioniertnur,wenn Sie sieeinfügen,bevoretwas auf die Seitegeschrieben wird. exit ()isterforderlich.
Siemüssen die Post-Daten verarbeiten,bevor Sie den Header ()platzieren.
I had the same problem and it was "complicated" by the fact that I redirect all URLs to a single .php file. It turned out all I had to do to solve it was to insert the following piece of code before any html is written to the page.
<?php if (isset($_POST['mypostvar']) && isset($_SERVER['REQUEST_URI'])) { [process the post data in 'mypostvar'] header ('Location: ' . $_SERVER['REQUEST_URI']); exit(); } ?>
This will redirect to the same page after the postdata is processed as you want it. After the redirect the original postdata is vanished and will not trigger the resubmit. The function 'header()' will only work if you insert it before anything is written to the page. exit() is necessary.
You have to process the post data before you place the header().
-
- 2018-05-11
Grundsätzlichbesteht die allgemeine Idee darin,den Benutzernach dem Senden des Formulars aufeinige andere Seiten umzuleiten,wodurch dieerneute Übermittlung des Formularsbei der Seitenaktualisierunggestoppt wird. Wenn Sie den Benutzerjedochnach dem Senden des Formulars auf derselben Seite haltenmüssen,können Sie diestun Tun Sie dies auf verschiedene Arten.
Nichtgesetzte Formulardaten
Eine Möglichkeit,dieerneute Übermittlung von Seitenbei der Seitenaktualisierung zu stoppen,besteht darin,die Formulardatennach dem Senden zu deaktivieren,damit die Variable,in der Formulardatengespeichert sind,leer wird,und den Codeblockfür die Formularverarbeitung zu schließen,um zu überprüfen,ob das Formular leerist.
if (!empty ($ _ POST) && $ _SERVER ['REQUEST_METHOD']=='POST') { $ data=//hier Codes verarbeiten nichtgesetzte $ data; }}
Dadurch werden $ datanach der Verarbeitung leer und dieerste Klausel stoppt dieerneute Übermittlung von Formularenbei der Seitenaktualisierung.
JavaScript
Diese Methodeist rechteinfach undblockiert das Popup-Fenster,in dembeim erneuten Senden des Formularsnacherneuter Übermittlung des Formularsgefragt wird. Platzieren Sieeinfach diese Zeile Javascript-Codein der Fußzeile Ihrer Datei und sehen Sie die Magie.
& lt; Skript > if (window.history.replaceState) { window.history.replaceState (null,null,window.location.href); }} & lt;/script >
Basically, the general idea is to redirect the user to some other pages after the form submission which would stop the form resubmission on page refresh but if you need to hold the user in the same page after the form is submitted, you can do it in multiple ways.
Unset Form Data
One way to stop page resubmission on page refresh is to unset the form data after it is submitted so that the variable storing form data becomes empty and wrap up your form processing block of codes to check if the form is empty.
if(!empty($_POST) && $_SERVER['REQUEST_METHOD'] == 'POST'){ $data = // processing codes here unset $data; }
This will make $data empty after processing and the first clause would stop form resubmission on page refresh.
Javascript
This method is quite easy and blocks the pop up asking for form resubmission on refresh once the form is submitted. Just place this line of javascript code at the footer of your file and see the magic.
<script> if ( window.history.replaceState ) { window.history.replaceState( null, null, window.location.href ); } </script>
-
- 2013-09-12
Ich habe dieses Problemmithilfe der Aktiontemplate_redirectgelöst (entwederin einem Plugin oderin der Dateifunctions.php Ihres Themas).
add_action('template_redirect','myfunction') ; function myfunction() { global $post; $post_id = $post->ID; if ( isset( $_POST['html-upload'] ) && !empty( $_FILES ) ) { require_once(ABSPATH . 'wp-admin/includes/admin.php'); $id = media_handle_upload('async-upload', $post_id); //post id of Client Files page unset($_FILES); if ( is_wp_error($id) ) { $errors['upload_error'] = $id; $id = false; } } $error = ($errors) ? 1 : 0; wp_redirect( "/?p={$post_id}?errors={$error}",301); }
Dann können Sie auf Ihrer Seitenach Fehlern suchen
if ($_GET['errors']) { echo "<p>There was an error uploading your file.</p>"; } else { echo "<p>Your file has been uploaded.</p>"; }
(Ich habe diesen Codenichtgetestet. Er sollte Ihneneinen guten Ausgangspunktbieten.)
I solved this my using the template_redirect action (either in a a plugin or on your themes functions.php file).
add_action('template_redirect','myfunction') ; function myfunction() { global $post; $post_id = $post->ID; if ( isset( $_POST['html-upload'] ) && !empty( $_FILES ) ) { require_once(ABSPATH . 'wp-admin/includes/admin.php'); $id = media_handle_upload('async-upload', $post_id); //post id of Client Files page unset($_FILES); if ( is_wp_error($id) ) { $errors['upload_error'] = $id; $id = false; } } $error = ($errors) ? 1 : 0; wp_redirect( "/?p={$post_id}?errors={$error}",301); }
Then on your page you can check for errors
if ($_GET['errors']) { echo "<p>There was an error uploading your file.</p>"; } else { echo "<p>Your file has been uploaded.</p>"; }
(I've not tested this code.. it should give you a good starting point).
-
Mit "global $post"in derersten Zeileerhöhen sich die Chancen,dass diese Funktionfunktioniert ...With `global $post` in first line, chances this function works will increase...
- 1
- 2013-09-12
- gmazzap
-
- 2013-09-12
Sie können auch auf
$_SERVER['REQUEST_METHOD'] === 'POST'
testen,um sicherzustellen,dass die Seite über POST aktualisiert wurde,bevor Sie das Formular verarbeiten.if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) { // Do Stuff }
You can also test for
$_SERVER['REQUEST_METHOD'] === 'POST'
to make sure that the page has been refreshed via POST before processing the form.if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) { // Do Stuff }
-
- 2016-01-09
Eineeinfachere Möglichkeitbesteht darin,die Aktion aus Ihrem Formular zuentfernen undeine versteckte Aktion auszuführen,z. B.:
<html> <form action="" method="post><input type="text" name="name" /> <input type="submit" value="Submit" /> <input type="hidden" name="action" value="Submit" /> </form> </html>
Lassen Sie Ihren Controller auf Gültigkeit und Übermittlungprüfen,um zu überprüfen,ob das Formular übermittelt wurde:
<?php if (isset($_POST['action']) && $_POST['action'] == 'Submit'){ //you should add code to validate user input here //if all ok submit the form header('Location: .'); //redirects to the controller without resubmitting } ?>
Diese Methodeist sehrnützlichfür Skripte,bei denen Sie Datensätze aufeiner Administrationsseite hinzufügen oderentfernen,da die Seite ohneerneutes Sendenneugeladen wird und derentfernte oder hinzugefügte Datensatzentwederentfernt oder der Seite hinzugefügt wird :)
an easier way is to remove the action from your form and have a hidden action so for example:
<html> <form action="" method="post><input type="text" name="name" /> <input type="submit" value="Submit" /> <input type="hidden" name="action" value="Submit" /> </form> </html>
have your controller checking for validity and for submissions so to check if the form was submitted:
<?php if (isset($_POST['action']) && $_POST['action'] == 'Submit'){ //you should add code to validate user input here //if all ok submit the form header('Location: .'); //redirects to the controller without resubmitting } ?>
this method is very useful for scripts where you are adding or removing records on an admin page as it would reload the page without resubmitting and the record removed or added would be either removed or added to the page :)
-
- 2017-06-23
Diebeste Methode,dieichgefunden habe,ist die Verwendung von Javascript und CSS.Header der allgemeinen PHP-Umleitungsmethode ('Speicherort: http://www.yourdomain.com/url );wirdfunktionieren,aberes verursacht die Warnung "Warnung: Header-Informationen könnennichtgeändert werden - Header werdenbereitsgesendet"in verschiedenen Frameworks und CMS wie WordPress,Drupal usw. Mein Vorschlagist daher,demfolgenden Code zufolgen
echo '<style>body{display:none;}</style>'; echo '<script>window.location.href = "http://www.siteurl.com/mysuccesspage";</script>'; exit;
Das Style-Tagist wichtig,da der Benutzer sonst das Gefühl hat,dass die Seite zweimalgeladen wird.Wenn wir das Style-Tagmit der Body-Anzeigenone verwenden und dann die Seite aktualisieren,entspricht die Benutzererfahrung dem PHP-Header ('Location: ....);
Ich hoffe das wird helfen :)
The best method I found is using javascript and css. Common php redirection method header('Location: http://www.yourdomain.com/url); will work but It cause warning " Warning: Cannot modify header information - headers already sent" in different frameworks and cms like wordpress, drupal etc. So my suggestion is to follow the below code
echo '<style>body{display:none;}</style>'; echo '<script>window.location.href = "http://www.siteurl.com/mysuccesspage";</script>'; exit;
The style tag is important otherwise the user may feel like page loaded twice. If we use style tag with body display none and then refresh the page , then the user experience will be like same as php header('Location: ....);
I hope this will help :)
-
- 2020-04-30
Lösung 1: Wenn Sieeinen Beitragin den Beitragstypeinfügen,generieren Sieeinfach den Zufallscodemit der PHP-Funktion
rand()
und speichern Sie den Codebeim Einfügen des Beitrags.Stellen Sie dengleichen Code auchin der Variablen$_POST['uniqueid']
ein.Überprüfen Siebeim Einfügen,ob die aktuelleeindeutige IDin Posts vorhandenist odernicht. Sie können dies auchmit
wp_query()
tun.Lösung 2: Mit Javascript aufeine andere Seite umleiten.Aberbitte nicht,dass der Benutzer zur Seite zurückkehren kann undbeim erneuten Aktualisieren wird der Beitraggespeichert.Für dieses Problemist dieerste Lösung ambesten.
Lösung 3: Verwenden Sie Ajax,umeinen Beitrageinzufügen. Esgibt keine derartigen Probleme.Aber wenn Sie Seitentreffer wollen.Esist keinegute Idee,möglicherweisefür Google Adsense.
Ich habenur versucht,durchmeine Erfahrung zu helfen.Wennjemand Codebenötigt,um das Problem zubeheben,fragen Sieeinfach,ich werdeteilen.
Solution 1 : If you are inserting post in post type then just generate the random code using
rand()
php function and save the code while inserting post. Also set the same code in$_POST['uniqueid']
variable.Then check on insert if the the current uniqueid is there in posts or not, you can do the same using
wp_query()
.Solution 2 : Redirect to another page using javascript. But kindly not that user can go back to page and on again it will save post on refresh. For this issue the first solution is best.
Solution 3 : Use ajax to insert post there will be no issues like this. But if you want page hits. It's not a good idea, may be for Google Adsense.
I just tried to help by my experience. If anyone need code to fix the problem, simply ask, I will share.
-
- 2014-12-07
dieeinfache undeinfache Möglichkeit,diesin PHP zutun. Beispiel hier:
Vergiss die HTML-Tagsnicht (dieses Formular lässtes hiernicht zu,alsobenutzeich [this])
$firstname = $post[firstname] $lastname = $post[lastname] [form action="here.php" method="post"] first name[input type='firstname' name='firstname'] last name[input type='text' name='lastname'] [input type=submit value=submit] [/form] if($firstname==""||$lastname=="") { echo"the firstname and lastname are empty"; } else { mysql_query("YOUR DATABASE INSERT HERE"); header("Location:here.php"); }
Auf diese Weise wird verhindert,dass diein die Datenbankeingegebenen Daten dieselben Datenbei der Seitenaktualisierung zweimal veröffentlichen.
the simple and easy way to do this in php. example here:
dont forget the html tags(this form wont allow it here so i use [this])
$firstname = $post[firstname] $lastname = $post[lastname] [form action="here.php" method="post"] first name[input type='firstname' name='firstname'] last name[input type='text' name='lastname'] [input type=submit value=submit] [/form] if($firstname==""||$lastname=="") { echo"the firstname and lastname are empty"; } else { mysql_query("YOUR DATABASE INSERT HERE"); header("Location:here.php"); }
this is how to keep the data enter in the database from posting the same data twice on page refresh
Hallo,ich habeein Formular,das Anhänge zueinem Beitrag hinzufügt. Wenn das Formularjedoch Beiträge veröffentlicht,wird der Beitrag offensichtlichnicht angezeigt. Derneue Anhanggibt "Ihre Datei wurde hochgeladen" wieder. Wenn der Benutzer die Seite aktualisiert (um zu versuchen,seinenneuen Anhang anzuzeigen),wird das Formularerneut veröffentlicht!
Istesmöglich,entweder (1) die Formularbuchungbeim Aktualisierenerneut zu stoppen,(2) die Seite automatisch zu aktualisieren,um den Beitragmit seinemneuen Anhang anzuzeigen? (2ist vielbesser)
Danke! :)