ThinkPHP防止重复提交表单的方法实例分析


Posted in PHP onMay 10, 2018

本文实例总结分析了ThinkPHP防止重复提交表单的方法。分享给大家供大家参考,具体如下:

为什么会有表单重复的坑

在开发中,如果一个新增或修改的表单,在后台完成数据库操作后我们设定的不是跳转到其他页面,还是返回本页面,这时点击浏览器的后退再提交或刷新页面,会导致form表单重复提交,即这条记录会被增加或修改两次。

导致表单重复提交的原因是:第一次提交的表单会被缓存到内存中,直到页面下次提交或页面关闭或转向其他页面时才消失。在自调用返回时,内存中的数据依然在,这时页面中的判断提交的代码依然可以检测到提交的值,顾会产生重复提交的效果。

如何解决?

总结网上的解决办法和自己的测试,可以用以下几个办法:

方法1:最简单:页面提交后转到另一个页面而不是本页面,举个栗子,比如你的页面地址为

http://yourdomain.com/User/Index/login

则该页面的表单action地址可以为另外的处理地址,如

<form action="{:U('User/Index/check_login')}" method="post">

这样报错返回,或者用户点击回退按钮,还是会回到上一个地址,不过这种情况也不保险。还要搭配方法2,一起比较保险

方法2:提交表单后提交按钮变灰/隐藏提交按钮

这种方式一般是结合方法1来做的,通过JS来动态监听用户的点击动作,动态将按钮属性置成disabeld,即为灰色不可用。代码如下:

HTML:

<form action="{:U('User/Index/check_login')}" method="post">
  <input type="text" name="username" value="" id="username" />
  <input type="password" name="userpwd" id="userpwd" />
  <input type="submit" name="login_btn" id="login_btn" value="登陆"/>
</form>

JS:

$().ready(function(){
   $("#login_btn").on('click',function(){
      $(this).attr('disabled',true);
   });
});

方法1+方法2 结合后,基本上90%以上的重复提交问题都能解决,但是大刘这里还是要说下第三种方法,即在服务端一劳永逸的解决这个问题

方法3:使用隐藏随机TOKEN值的方法进行重复提交判断

首先,在项目的functions.php中添加如下方法

//创建TOKEN
function createToken() {
  $code = chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)) .    chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)) . chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE));
  session('TOKEN', authcode($code));
}
//判断TOKEN
function checkToken($token) {
  if ($token == session('TOKEN')) {
    session('TOKEN', NULL);
    return TRUE;
  } else {
   return FALSE;
  }
}
/* 加密TOKEN */
function authcode($str) {
  $key = "YOURKEY";
  $str = substr(md5($str), 8, 10);
  return md5($key . $str);
}

在表单页面form中填入以下HTML代码

HTML:

<input type="hidden" name="TOKEN" value="{:session('TOKEN')}" />

在页面展示前调用creatToken()方法生成token,在相应控制器POST请求中 使用 checkToken() 进行判断是否重复提交

if(IS_POST)
{
$post_token = I('post.TOKEN');
 if(!checkToken($post_token)){
   $this->error('请不要重复提交页面',U('User/Index/login'));
 }
}

基本上,这3个方法配合着使用,就能解决ThinkPHP开发中表单重复提交问题,当然,有同学说可以使用ThinkPHP的令牌环机制,这样其实就更简单了,TP会默认在表单中生成一个隐藏域,到时候判断这个隐藏域是否存在以及和session中的值是否想的即可,原理和方法3是一样的。

PS:今天终于把内容用简书的markdown编辑器发出来了,果然markdown语法不是盖的,整个排版都清爽了,不错不错。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php计算数组不为空元素个数的方法
Jan 27 PHP
Laravel框架表单验证详解
Sep 04 PHP
Linux下PHP加速器APC的安装与配置笔记
Oct 24 PHP
PHP中mysql_field_type()函数用法
Nov 24 PHP
php实现微信公众平台账号自定义菜单类
Dec 02 PHP
PHP redis实现超迷你全文检索
Mar 04 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
PHP中实现中文字串截取无乱码的解决方法
May 29 PHP
Laravel 自带的Auth验证登录方法
Sep 30 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
Oct 15 PHP
thinkphp5实现微信扫码支付
Dec 23 PHP
php中加密解密DES类的简单使用方法示例
Mar 26 PHP
PHP实现用户登录的案例代码
May 10 #PHP
yii2多图上传组件的使用教程
May 10 #PHP
PHP数组去重的更快实现方式分析
May 09 #PHP
PHP+MySQL实现消息队列的方法分析
May 09 #PHP
PHP共享内存使用与信号控制实例分析
May 09 #PHP
php curl批处理实现可控并发异步操作示例
May 09 #PHP
php使用curl伪造来源ip和refer的方法示例
May 08 #PHP
You might like
使用PHP模拟HTTP认证
2006/10/09 PHP
php 删除记录同时删除图片文件的实现代码
2010/05/12 PHP
php在项目中寻找代码的坏味道(综艺命名)
2012/07/19 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
2015/07/06 PHP
PHP异步进程助手async-helper
2018/02/05 PHP
PHP基于递归算法解决兔子生兔子问题
2018/05/11 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
jquery 模式对话框终极版实现代码
2009/09/28 Javascript
Javascript 中 null、NaN和undefined的区别总结
2013/04/10 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
js使用onmousemove和onmouseout获取鼠标坐标的方法
2015/03/31 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
javascript获取以及设置光标位置
2017/02/16 Javascript
自制简易打赏功能的实例
2017/09/02 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
详解element-ui设置下拉选择切换必填和非必填
2019/06/17 Javascript
python编码总结(编码类型、格式、转码)
2016/07/01 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
2018/03/20 Python
python多线程并发让两个LED同时亮的方法
2019/02/18 Python
Python使用POP3和SMTP协议收发邮件的示例代码
2019/04/16 Python
python自动化测试之DDT数据驱动的实现代码
2019/07/23 Python
关于pandas的离散化,面元划分详解
2019/11/22 Python
python爬虫使用scrapy注意事项
2020/11/23 Python
玖熙女鞋美国官网:Nine West
2016/10/06 全球购物
Hotels.com韩国:海外国内旅行所需的酒店和住宿预订网站
2020/05/08 全球购物
外科实习自我鉴定
2013/10/06 职场文书
教师师德教育的自我评价
2013/10/31 职场文书
保险公司早会主持词
2014/03/22 职场文书
读书之星事迹材料
2014/05/12 职场文书
服务承诺书格式
2014/05/21 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
小学作文指导之如何写人?
2019/07/08 职场文书
php中pcntl_fork详解
2021/04/01 PHP
总结Java对象被序列化的两种方法
2021/06/30 Java/Android