如果页面重新加载,PHP $ _POST表单将过期

如果页面重新加载,PHP $ _POST表单将过期

问题描述:

I have a form (for A) that redirects to another form (form B).

When the user is redirected to form B, the if $_POST is set, an email function is triggered. This is a problem b/c if the user reloads the page, this email is sent again.

I would like to stop sending the email if the page is realoaded.

Hence, I included a field in form A, type=hidden with value=send, and when the email (form B) is sent I unset this field, but if I reaload the page the email is sent anyway.

if(isset($_POST['emailtrigger'])){

            emailfunction();        
    unset($_POST['emailtrigger']);


  }

How could I cue to the page that after the email has been sent, if page (form B) is reloaded, to skip email function?

Thank you

我有一个表单(用于A)重定向到另一个表单(表单B)。 p>

当用户被重定向到表单B时,如果设置了if $ _POST,则会触发电子邮件功能。 这是一个问题b / c如果用户重新加载页面,则会再次发送此电子邮件。 p>

如果页面是真实的,我想停止发送电子邮件。 p>

因此,我在表单A中包含一个字段,使用value = send键入= hidden,当发送电子邮件(表单B)时,我取消设置此字段,但是如果我自动加载页面 无论如何都会发送电子邮件。 p>

  if(isset($ _ POST ['emailtrigger'])){
 
 emailfunction();  
 \ unset($ _ POST ['emailtrigger']); 
 
 
} 
  code>  pre> 
 
 

我怎么能提示电子邮件发送后的页面? 发送,如果重新加载页面(表单B),跳过电子邮件功能? p>

谢谢 p> div>

If you want to avoid redirects, or want to protect yourself against users that press "Back" and resubmit the form after redirect, simple solution would be to add a hidden field with a random value, generated when form if loaded. After form submit, just write this field value into session data. Then, if user submits same form data you will compare random field and what is written in the session data. If there's that value - you don't process the form data.

This is obviously done by redirecting to the same page after processing your form. So if your form is processed by script form.php, then after sending email you should do redirect:

header('location: form.php');

This is invisible for users and after reloading no $_POST values are sent again.

Once A did it's job, continue with form B, $_POST would be available.

Once B is done, execute

header('location: formConfirm.php');
exit;

The script formConfirm.php would print the confirmation message, nothing else. Especially, it shouldn't update the DB or send email.

More general, you might implement a generic formConfirm.php, which you always use to present confirmations - e.g. somehow passing the actual confirmation message.