避免表单重复提交-PHP

问题的起因是这样的:我们平台新增了支付方式,但后面他们测试的时候,发现有报订单异常(有订单号验证,发现有重复订单号,就不允许再次提交)的提示.

开始我去看的时候,未能重现问题,后面在提交的时候,猛戳那个提交按钮,就出现异常提示,无法充值.我立即明白过来,这是重复提交的问题了.

对于重复提交,两种解决办法:1.客户端;2.服务器端.

1.服务器端

每个订单号只能提交一次,已有订单号验证,所以这里可不处理.

但对于其他的表单,可以在表单中加入

<input type='hidden' value="<?=uniqid()?>" id='duplicate' name='duplicate' />

然后在处理请求的时候

$uid = '';//用户名
if(isset($_SESSION[$uid]) && $_SESSION[$uid] == $_POST['duplicate']){
     //跳转提示重复提交  
}else{
   $_SESSION[$uid] = $_POST['duplicate'];
}

2.客户端

我JS不好,不会写一些高深的东西来避免页面表单重复提交.

第一种方法:HTML+JS

<!--增加onsubmit触发事件-->
<form action='./index.php' method='get' onSubmit='checkSubmit();'>
<!--添加id,便于选择-->
<input id='payImg' type='image' src='' />
<script type="text/javascript">
function checkSubmit(){
    $('#payImg').attr('disabled',true);
}
</script>

每提交一次,就添加元素属性disabled,并将之设置为true

第二种方法:JS

无需再添加HTML的东西,只需添加JS即可

这样可捕捉页面form表单的提交事件,每次提交后,对页面提交按钮添加并设置disabled属性

$(function(){
      $('form').submit(function(){
            $(':submit',this).attr('disabled','disabled');
     }); 
})    

在客户端处理可以增加用户体验,但恶意攻击者是可以绕过客户端的,所以为了安全性,还需要添加服务器端代码.

现在看网上的一些文章,有些喜欢写的很全,很深.有时东西写了半天,其实也解决不了问题,对于语言理解不够的人来说,也不知道是否正确.示例也搞的很复杂的样子.

原文地址:https://www.cnblogs.com/ouzhenzhou/p/3363388.html