Come fermare il reinvio del modulo all'aggiornamento della pagina
9 risposta
- voti
-
- 2013-04-20
Invece di ...
} else { echo "<p>Your file has been uploaded.</p>"; }
... reindirizza a un altroindirizzoin caso di successo:
} else { $new_url = add_query_arg( 'success', 1, get_permalink() ); wp_redirect( $new_url, 303 ); exit; }
Il codice di stato 303 attiva una richiesta GET :
Questometodoesisteprincipalmenteper consentire all'output di uno script attivato POST di reindirizzareilprogramma utente a una risorsa selezionata. Ilnuovo URInon è un riferimento sostitutivoper la risorsa richiesta originariamente. La risposta 303 NON DEVEesserememorizzatanella cache,ma la risposta alla seconda richiesta (reindirizzata)potrebbeesserememorizzabilenella cache.
Neltuogestore dimoduli controllaprima se
$_GET['success']
èimpostatoe il suo valore è1
,quindi stampa unmessaggio di successo. Il visitatorepuò ricaricare questapagina ancorae ancorae non verràinviatonulla.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.-
Sfortunatamentenon hafunzionato,e non hoidea delperchéperché quelphp siblocca (soloper confermare chetutto quello che avrei dovutofareera sostituire l'eco?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
-
Deviinviare l'intestazioneprima che qualsiasi output sia statoinviato albrowser.You have to send the header before any output has been sent to the browser.
- 1
- 2013-04-20
- fuxia
-
quindimetti ilbit di codicephpnell'intestazione?so put the php code bit in the header?
- 0
- 2013-04-26
- ameeromar
-
@ameeromar Sì.Tutta l'elaborazione dei dati deveessereeseguitaprima diiniziare a creare l'output.@ameeromar Yes. All data processing should be done before you start creating output.
- 2
- 2013-04-26
- fuxia
-
- 2013-09-11
Ho avuto lo stessoproblemaed è stato "complicato" dalfatto che reindirizzotuttigli URL a un singolofile .php.Si è scoperto chetutto ciò che dovevofareper risolverloerainserireil seguentepezzo di codiceprima che qualsiasi HTMLfosse scrittonellapagina.
<?php if (isset($_POST['mypostvar']) && isset($_SERVER['REQUEST_URI'])) { [process the post data in 'mypostvar'] header ('Location: ' . $_SERVER['REQUEST_URI']); exit(); } ?>
Questo reindirizzerà alla stessapagina dopo chei postdata saranno statielaborati come desideri. Dopoil reindirizzamento,i postdata originali scompaionoe non attiveràil reinvio. Lafunzione 'header ()'funzionerà solo se lainserisciprima che venga scritto qualcosa sullapagina. exit () ènecessario.
Devielaborarei dati delpostprima diinserire l'intestazione ().
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
Fondamentalmente,l'ideagenerale è di reindirizzare l'utente ad alcune altrepagine dopo l'invio delmodulo,il cheinterromperà l'invio delmodulo all'aggiornamento dellapagina,ma se ènecessariomantenere l'utentenella stessapagina dopo l'invio delmodulo,èpossibilefalloin piùmodi.
Annullaimpostazione datimodulo
Unmodoperinterrompereil reinvio dellapagina all'aggiornamento dellapagina è annullare l'impostazione dei dati delmodulo dopo che è statoinviatoin modo che la variabile chememorizzai dati delmodulo diventi vuotae racchiudereilblocco di codici dielaborazione delmoduloper verificare seilmodulo è vuoto.
if (!empty ($ _ POST) && $ _SERVER ['REQUEST_METHOD']=='POST') { $ data=//elaborazione dei codici qui unset $ data; }
Ciò renderà $ data vuota dopo l'elaborazionee laprima clausolainterromperàil reinvio delmodulo all'aggiornamento dellapagina.
<"Javascript"
Questometodo è abbastanza semplicee bloccailpop-up che chiede di reinviareilmodulo all'aggiornamento una voltainviatoilmodulo. Bastaposizionare questa riga di codicejavascript apiè dipagina delfilee vedere lamagia.
& lt; script > 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
Ho risolto questoproblema usando l'azionetemplate_redirect (in unplugin onelfilefunctions.php deitemi).
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); }
Quindi sullatuapaginapuoi verificare lapresenza dierrori
if ($_GET['errors']) { echo "<p>There was an error uploading your file.</p>"; } else { echo "<p>Your file has been uploaded.</p>"; }
(Non hotestato questo codice .. dovrebbe darti unbuonpunto dipartenza).
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).
-
Con `global $post`nellaprima riga,lepossibilità che questafunzionefunzioni aumenteranno ...With `global $post` in first line, chances this function works will increase...
- 1
- 2013-09-12
- gmazzap
-
- 2013-09-12
Puoi anchetestare
$_SERVER['REQUEST_METHOD'] === 'POST'
per assicurarti che lapagina sia stata aggiornatatramite POSTprima dielaborareilmodulo.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
unmodopiù semplice è rimuovere l'azione dalmoduloe avere un'azionenascosta,adesempio:
<html> <form action="" method="post><input type="text" name="name" /> <input type="submit" value="Submit" /> <input type="hidden" name="action" value="Submit" /> </form> </html>
chiedi altuo controller di verificare la validitàe gliinviiin modo da controllare seilmodulo è statoinviato:
<?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 } ?>
questometodo èmolto utilepergli scriptin cui stai aggiungendo o rimuovendo record su unapagina di amministrazionein quanto ricaricherebbe lapagina senza reinviarlae il record rimosso o aggiunto verrebbe rimosso o aggiunto allapagina :)
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
Ilmetodomigliore che hotrovato è usarejavascripte css.Intestazione delmetodo di reindirizzamentophp comune ("Location: http://www.yourdomain.com/url );funzioneràma causerà l'avviso "Attenzione:impossibilemodificare leinformazioni diintestazione -intestazionigiàinviate"in diversiframeworke cms come wordpress,drupalecc. Quindiilmio suggerimento è di seguireil codice seguente
echo '<style>body{display:none;}</style>'; echo '<script>window.location.href = "http://www.siteurl.com/mysuccesspage";</script>'; exit;
Iltag di stile èimportante altrimenti l'utentepotrebbe sentirsi come se lapaginafosse caricata due volte.Se usiamoiltag di stile conbody displaynonee poi aggiorniamo lapagina,l'esperienza utente sarà la stessa dell'intestazionephp ('Location: ....);
Spero che questopossa aiutare :)
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
Soluzione 1: Se staiinserendo unpostneltipo dipost,genera semplicementeil codice casuale utilizzando lafunzione
rand()
phpe salvail codice durante l'inserimento delpost.Imposta lo stesso codice anchenella variabile$_POST['uniqueid']
.Quindi controllain insert se l'attuale univoco èpresente omenonei post,puoifare lo stesso usando
wp_query()
.Soluzione 2: Reindirizza a un'altrapagina utilizzandojavascript.Magentilmentenon quell'utentepuòtornare allapaginae dinuovo salveràilpost all'aggiornamento.Per questoproblema laprima soluzione è lamigliore.
Soluzione 3: Usa ajaxperinserirepostnon ci sarannoproblemi come questo.Ma se vuoi visite allapagina.Non è unabuonaidea,potrebbeessereper Google Adsense.
Ho solo cercato di aiutarein base allamiaesperienza.Se qualcuno habisogno di codiceper risolvereilproblema,basta chiedere,lo condividerò.
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
ilmodo semplicee facileperfarloin php. esempio qui:
non dimenticarei tag html (questomodulonon lo consentirà qui,quindi uso [questo])
$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"); }
questo èilmodoin cuiimpedire ai datiimmessinel database dipubblicaregli stessi dati due volte durante l'aggiornamento dellapagina
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
Ciao,ho unmodulo che aggiunge allegati a unpost,tuttavia quandoilmodulopubblica ovviamentenonmostrailpost conilnuovo allegato chefaeco "iltuofile è stato caricato". Quando l'utente aggiorna lapagina (perprovare amostrareilnuovo allegato)ilmodulopubblica dinuovo!
Èpossibile (1)interromperenuovamente lapubblicazione delmodulo all'aggiornamento,(2) aggiornare automaticamente lapaginaper visualizzareilmessaggio conil suonuovo allegato?? (2 è decisamentemigliore)
Grazie! :)