Comment arrêter la nouvelle soumission du formulaire lors de l'actualisation de la page
9 réponses
- votes
-
- 2013-04-20
Au lieu de…
} else { echo "<p>Your file has been uploaded.</p>"; }
… rediriger vers une autre adresseen cas de succès:
} else { $new_url = add_query_arg( 'success', 1, get_permalink() ); wp_redirect( $new_url, 303 ); exit; }
Le code d'état 303 déclenche une requête GET :
Cetteméthodeexisteprincipalementpourpermettre la sortie d'un script activépar POSTpour rediriger l'agent utilisateur vers une ressource sélectionnée. Lenouvel URIn'estpas une référence de substitutionpour la ressource demandée à l'origine. La réponse 303 NE DOIT PAS êtremiseen cache,mais la réponse à la deuxième demande (redirigée)peut êtremiseen cache.
Dans votregestionnaire deformulaire,vérifiez d'abord si
$_GET['success']
est définiet sa valeurest1
,puisimprimez unmessage de réussite. Le visiteurpeut recharger cettepageencoreet encore -et rienne seraenvoyé.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.-
Malheureusement,celan'apasfonctionné,et jene saispaspourquoiparce quephptient le coup (justepour confirmertout ce quej'étais censéfaire était de remplacer l'écho?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
-
Vous devezenvoyer l'en-tête avant quetoute sortiene soitenvoyée aunavigateur.You have to send the header before any output has been sent to the browser.
- 1
- 2013-04-20
- fuxia
-
alorsmettez lebit de codephp dans l'en-tête?so put the php code bit in the header?
- 0
- 2013-04-26
- ameeromar
-
@ameeromar Oui.Tout letraitement des données doit êtreeffectué avant de commencer à créer une sortie.@ameeromar Yes. All data processing should be done before you start creating output.
- 2
- 2013-04-26
- fuxia
-
- 2013-09-11
J'aieu lemêmeproblèmeet c'était "compliqué"par lefait queje redirigetoutes les URL vers un seulfichier .php.Il s'est avéré quetout ce quej'avais àfairepour le résoudre était d'insérer lemorceau de code suivant avant qu'un code HTMLne soit écrit sur lapage.
<?php if (isset($_POST['mypostvar']) && isset($_SERVER['REQUEST_URI'])) { [process the post data in 'mypostvar'] header ('Location: ' . $_SERVER['REQUEST_URI']); exit(); } ?>
Cela redirigera vers lamêmepage unefois que les donnéespostales auront ététraitées comme vous le souhaitez. Après la redirection,les donnéespostales d'origine ont disparuet ne déclencherontpas lanouvelle soumission. Lafonction 'header ()'ne fonctionnera que si vous l'insérez avant que quoi que ce soitne soit écrit sur lapage. exit ()estnécessaire.
Vous deveztraiter les données depublication avant deplacer l'en-tête ().
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
Fondamentalement,l'idéegénéraleest de rediriger l'utilisateur vers d'autrespages après la soumission duformulaire,ce qui arrêterait lanouvelle soumission duformulaire lors de l'actualisation de lapage,mais si vous devezmaintenir l'utilisateur sur lamêmepage après l'envoi duformulaire,vouspouvezfaites-le deplusieursmanières.
Données deformulairenon définies
Unefaçon d'arrêter la resoumission de lapage lors de l'actualisation de lapage consiste à annuler la définition des données duformulaire après leur soumission afin que la variable stockant les données duformulaire devienne videet àboucler votrebloc de codes detraitement deformulairepour vérifier si leformulaireest vide.
if (! vide ($ _ POST) && $ _SERVER ['REQUEST_METHOD']=='POST') { $ data=//traitement des codesici unset $ data; }
Cela rendra $ data vide après letraitementet lapremière clause arrêtera lanouvelle soumission duformulaire lors de l'actualisation de lapage.
Cetteméthodeest assez simpleet bloque lafenêtre contextuelle demandant unenouvelle soumission deformulaire lors de l'actualisation unefois que leformulaireest soumis. Placez simplement cette ligne de codejavascript aupied de votrefichieret voyez lamagie.
& 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
J'ai résolu ceproblèmeen utilisant l'actiontemplate_redirect (soit dans unplugin,soit sur votrefichierfunctions.php dethèmes).
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); }
Ensuite,sur votrepage,vouspouvez vérifier leserreurs
if ($_GET['errors']) { echo "<p>There was an error uploading your file.</p>"; } else { echo "<p>Your file has been uploaded.</p>"; }
(jen'aipastesté ce code .. cela devrait vous donner unbonpoint de départ).
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).
-
Avec `global $post`en première ligne,les chances que cettefonctionfonctionne augmentera ...With `global $post` in first line, chances this function works will increase...
- 1
- 2013-09-12
- gmazzap
-
- 2013-09-12
Vouspouvez égalementtester
$_SERVER['REQUEST_METHOD'] === 'POST'
pour vous assurer que lapage a été actualisée via POST avant detraiter leformulaire.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
unmoyenplus simpleest de supprimer l'action de votreformulaireet d'avoir une actionmasquée,parexemple:
<html> <form action="" method="post><input type="text" name="name" /> <input type="submit" value="Submit" /> <input type="hidden" name="action" value="Submit" /> </form> </html>
demandez à votre contrôleur de vérifier la validitéet les soumissions afin de vérifier si leformulaire a été soumis:
<?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 } ?>
cetteméthodeesttrès utilepour les scripts dans lesquels vous ajoutez ou supprimez desenregistrements sur unepage d'administration carelle rechargerait lapage sans la soumettre ànouveauet l'enregistrement supprimé ou ajouté serait soit supprimé,soit ajouté à lapage :)
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
Lameilleureméthode quej'aitrouvéeest d'utiliserjavascriptet css.En-tête deméthode de redirectionphp commune ('Location: http://www.yourdomain.com/url );fonctionneramais celaprovoquera un avertissement "Attention:impossible demodifier lesinformations d'en-tête -en-têtes déjàenvoyés" dans différentsframeworkset cms comme wordpress,drupaletc. Doncma suggestionest de suivre le code ci-dessous
echo '<style>body{display:none;}</style>'; echo '<script>window.location.href = "http://www.siteurl.com/mysuccesspage";</script>'; exit;
Labalise de styleestimportante sinon l'utilisateurpeut avoir l'impression que lapageest chargée deuxfois.Sinous utilisons labalise de style avecbody displaynone,puis actualisons lapage,l'expérience utilisateur sera lamême que celle de l'en-têtephp ('Location: ....);
J'espère que cela aidera :)
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
Solution 1: Si vousinsérez unmessage dans letype demessage,générez simplement le code aléatoireen utilisant lafonctionphp
rand()
et enregistrez le code lors de l'insertion dumessage.Définissez également lemême code dans la variable$_POST['uniqueid']
.Ensuite,vérifiez lors de l'insertion si l'identifiant unique actuelestprésent dans lesmessages ounon,vouspouvezfaire demêmeen utilisant
wp_query()
.Solution 2: Redirigez vers une autrepageen utilisantjavascript.Maisgentiment pas que l'utilisateurpuisse revenir à lapageet ànouveau,ilenregistrera lemessage lors de l'actualisation.Pour ceproblème,lapremière solutionest lameilleure.
Solution 3: Utilisez ajaxpourinsérer unmessage,iln'y aurapas deproblèmes comme celui-ci.Mais si vous voulez des visites depages.Cen'estpas unebonneidée,peut-êtrepour Google Adsense.
J'aijusteessayé d'aiderparmonexpérience.Si quelqu'un abesoin de codepour résoudre leproblème,demandez simplement,je partagerai.
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
lemoyen simpleet facile de lefaireen php. exempleici:
n'oubliezpas lesbalises html (ceformulairene l'autorisepasici doncj'utilise [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"); }
voici commentempêcher les données saisies dans labase de données depublier deuxfois lesmêmes données lors de l'actualisation de lapage
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
Bonjour,j'ai unformulaire qui ajoute despiècesjointes à unmessage,cependant,lorsque leformulaireposte,ilne montre évidemmentpas lemessage avec lanouvellepiècejointefaisant écho "votrefichier a ététéléchargé". Lorsque l'utilisateur actualise lapage (pouressayer d'afficher sanouvellepiècejointe),leformulairepublie ànouveau!
Est-ilpossible soit (1) d'arrêter ànouveau lapublication duformulaire lors de l'actualisation,(2) d'actualiser automatiquement lapagepour afficher lemessage avec sanouvellepiècejointe?? (2 c'estbien mieux)
Merci! :)