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冒泡排序算法代码详细解读
Jul 17 PHP
如何使用php判断所处服务器操作系统的类型
Jun 20 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
Jun 24 PHP
php通过字符串调用函数示例
Mar 02 PHP
php计算两个日期时间差(返回年、月、日)
Jun 19 PHP
php快速排序原理与实现方法分析
May 26 PHP
php封装json通信接口详解及实例
Mar 07 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
php strftime函数的详细用法
Jun 21 PHP
PHP利用百度ai实现文本和图片审核
May 08 PHP
yii2.0框架场景的简单使用示例
Jan 25 PHP
PHP pthreads v3下worker和pool的使用方法示例
Feb 21 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
codeigniter教程之多文件上传使用示例
2014/02/11 PHP
thinkphp实现图片上传功能分享
2014/03/04 PHP
PHP中Fatal error session_start()错误解决步骤
2014/08/05 PHP
PHP发送短信代码分享
2015/08/11 PHP
微信公众号判断用户是否已关注php代码解析
2016/06/24 PHP
js资料toString 方法
2007/03/13 Javascript
js 无提示关闭浏览器页面的代码
2010/03/09 Javascript
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
2012/06/22 Javascript
基于promise.js实现nodejs的promises库
2014/07/06 NodeJs
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
js实现a标签超链接提交form表单的方法
2015/06/24 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
JS中的BOM应用
2018/02/02 Javascript
webpack4.x下babel的安装、配置及使用详解
2019/03/07 Javascript
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
js实现多个标题吸顶效果
2020/01/08 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
2020/04/01 jQuery
JavaScript中reduce()的5个基本用法示例
2020/07/19 Javascript
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
Python unittest模块用法实例分析
2018/05/25 Python
Python迭代器与生成器用法实例分析
2018/07/09 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
2020/02/12 Python
Etam艾格英国官网:法国著名女装品牌
2019/04/15 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
德国便宜的宠物店:Brekz.de
2020/10/23 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
关于感恩的演讲稿800字
2014/08/26 职场文书
高中国旗下的演讲稿
2014/08/28 职场文书
初中生旷课检讨书范文
2014/10/06 职场文书
今日说法观后感
2015/06/08 职场文书
被委托人身份证明
2015/08/07 职场文书
工作后的感想
2015/08/07 职场文书
《鸡兔同笼》教学反思
2016/02/19 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
入门学习Go的基本语法
2021/07/07 Golang