Home  >  Article  >  php教程  >  php 避免form表单重复提交的方法

php 避免form表单重复提交的方法

WBOY
WBOYOriginal
2016-06-08 17:20:201112browse

要防止重复提交我们通过需要增加一些额外的一些验证了,像数据库查询或表单的key验证或最简单的jquery事件监控了,下面我们一起来看看。

<script>ec(2);</script>


比如下面的情况就会导致表单重复提交:
点击提交按钮两次。
点击刷新按钮。
使用浏览器后退按钮重复之前的操作,导致重复提交表单。
使用浏览器历史记录重复提交表单。
浏览器重复的HTTP请求。
网页被恶意刷新。

下面是几种解决的方法:

一:利用js设置按钮点击后变成灰色


$(document).ready(function(){
  $(input:submit).click(){
      setTimeout(function(){obj.disabled=true;},100)
  };
});

二:利用session

在session中存放一个特殊标志。当表单页面被请求时,生成一个特殊的字符标志串,存在session中,同时放在表单的隐藏域里。接受处理表单数据时,检查标识字串是否存在,并立即从session中删除它,然后正常处理数据。

如果发现表单提交里没有有效的标志串,这说明表单已经被提交过了,忽略这次提交。

这使你的web应用有了更高级的XSRF保护


加载提交的页面时候,生成一个随机数,
$code = mt_rand(0,1000000);
存储在表单的隐藏输入框中:

在接收页面的PHP代码如下:

session_start();
if(isset($_POST['code'])) { 
    if($_POST['code'] == $_SESSION['code']){
         // 重复提交表单了
    }else{ 
         $_SESSION['code'] =$_POST['code']; //存储code
    } 
}?>

三:利用cookies

原理和session差不多,但是cookies一旦用户浏览器禁用cookies,这功能就失效了


if(isset($_POST['submit'])){
    setcookie("tempcookie","",time()+30); 
    header("Location:".$_SERVER[PHP_SELF]);exit(); 
}
if(isset($_COOKIE["tempcookie"])){ 
    setcookie("tempcookie","",0);echo "您已经提交过表单"; 
}

四:利用header函数跳转

一旦用户点击提交按钮,处理完数据后跳到其他页面

if (isset($_POST['submit'])) {
   header('location:success.php');//处理数据后,转向到其他页面
}
五:利用数据库来添加约束

直接在数据库里添加唯一约束或创建唯一索引,一旦发现用户重复提交了,直接抛出警告或者提示,
或者只处理第一次提交的数据,这是最直接有效的方法,要求前期的数据库设计和架构要考虑周全

六:Post/Redirect/Get模式。

在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面。

if (isset($_POST['action']) && $_POST['action'] == 'submitted') {
//处理数据,如插入数据后,立即转向到其他页面
header('location:submits_success.php');
}

这能避免用户按F5导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样问题。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn