【问题标题】:form submit only one time [duplicate]表单只提交一次[重复]
【发布时间】:2012-02-22 10:02:51
【问题描述】:

可能重复:
Preventing duplicate form submissions

我设置的条件是

if(isset($_POST)){
    //do some action
}

第一次检查条件时,它工作正常,但如果用户刷新页面,它会第二次执行操作。我应该如何检查?

【问题讨论】:

  • 不明白你的问题?
  • 我认为 stackoverflow 本身必须有数千个答案......

标签: php forms


【解决方案1】:

您可以在数据库中插入或更新后取消设置提交按钮,例如 unset($_POST['btn_submit']);

【讨论】:

  • 如果页面被刷新,浏览器会重新提交数据,$_POST会被重新填充。
  • unset() 会破坏指定的变量。检查这个:php.net/manual/en/function.unset.php
  • 1.用户提交表单数据。 2. PHP 填充$_POST。 3. PHP 更新数据库。 4. PHP 删除$_POST 的数据。 5. 用户通过刷新重新提交表单数据。 5. PHP 重新填充 $_POST 与用户提交的数据。 6. PHP 更新数据库。 7. PHP删除$_POST中的数据。
  • 取消设置变量没有用,因为它通过发出 HTTP 请求的操作再次设置!脚本正在重新运行!
【解决方案2】:

为防止重复发布,通过使用浏览器刷新,请考虑此解决方案。

Preventing duplicate form submissions

http://en.wikipedia.org/wiki/Post/Redirect/Get

【讨论】:

    【解决方案3】:

    使用the Post-Redirect-Get pattern

    1. 浏览器发出 POST 请求
    2. 服务器修改数据库并返回重定向响应
    3. 浏览器发出 GET 请求
    4. 服务器在 200 响应中显示页面

    刷新只会重新加载第 4 步返回的页面,无需重复第 2 步。

    【讨论】:

      【解决方案4】:

      一般来说,表单处理可以分为3个步骤:

      • 显示表格
      • 处理数据
      • 重定向到结果页面(例如感谢页面)

      重定向是为了避免表单在刷新时再次提交。 因此,在您的情况下,在处理之后,您可以再次将用户重定向回相同的表单。如果他刷新页面,表单将不会再次提交,因为浏览器被重定向并且最后一个操作是GET请求,而不是POST

      要在 PHP 中进行实际重定向,您可以使用 header 函数:

      if(isset($_POST)) {
         ...
         // redirect back to the form
         header("Location: form.php");
      }
      

      【讨论】:

      • Location HTTP 响应标头采用绝对 URI,而不是相对 URI。不要依赖浏览器纠错。 (至少有一个浏览器会在向用户抱怨错误时重定向)。
      • 你是对的。我检查了 HTTP 规范 w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30,它需要一个绝对 URI。我不知道,谢谢你的提示。
      【解决方案5】:

      操作成功后,可以通过重定向页面来解决刷新问题

      if(isset($_POST))
      { 
          //  do some action 
      
      
      // redirect to same page so that values will not get posted again
      header("location:samepage.php"); 
      }
      

      【讨论】:

      • Location HTTP 响应标头采用绝对 URI,而不是相对 URI。不要依赖浏览器纠错。 (至少有一个浏览器会在向用户抱怨错误时重定向)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 2018-03-25
      • 1970-01-01
      • 2017-05-24
      • 2015-10-13
      • 1970-01-01
      相关资源
      最近更新 更多