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 相关文章推荐
3.从实例开始
Oct 09 PHP
Php获取金书网的书名的实现代码
Jun 11 PHP
php 截取字符串并以零补齐str_pad() 函数
May 07 PHP
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
Jun 17 PHP
php读取mysql中文数据出现乱码的解决方法
Aug 16 PHP
测试php函数的方法
Nov 13 PHP
destoon供应信息title调用出公司名称的方法
Aug 22 PHP
php实现最简单的MVC框架实例教程
Sep 08 PHP
php实现简单的语法高亮函数实例分析
Apr 27 PHP
PHP memcache在微信公众平台的应用方法示例
Sep 13 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
Oct 07 PHP
Yii框架模拟组件调用注入示例
Nov 11 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开启gzip页面压缩实例代码
2010/03/11 PHP
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
php转换上传word文件为PDF的方法【基于COM组件】
2019/06/10 PHP
IE浏览器PNG图片透明效果代码
2008/09/02 Javascript
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
JavaScript高级程序设计 错误处理与调试学习笔记
2011/09/10 Javascript
jquery获取特定name所有选中的checkbox,支持IE9标准模式
2013/03/18 Javascript
window.print打印指定div指定网页指定区域的方法
2014/08/04 Javascript
AngularJS中的表单简单入门
2016/07/28 Javascript
简单学习vue指令directive
2016/11/03 Javascript
浅谈Javascript中的Label语句
2016/12/14 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
2017/11/16 Javascript
面包屑导航详解
2017/12/07 Javascript
vue.js this.$router.push获取不到params参数问题
2020/03/03 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
Python实现list反转实例汇总
2014/11/11 Python
Python制作豆瓣图片的爬虫
2017/12/28 Python
python3 cvs将数据读取为字典的方法
2018/12/22 Python
使用python接入微信聊天机器人
2020/03/31 Python
Python何时应该使用Lambda函数
2019/07/02 Python
Python try except异常捕获机制原理解析
2020/04/18 Python
如何实现更换Jupyter Notebook内核Python版本
2020/05/18 Python
PyCharm 解决找不到新打开项目的窗口问题
2021/01/15 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
2021/01/21 Python
app内嵌H5 webview 本地缓存问题的解决
2020/10/19 HTML / CSS
Expedia马来西亚旅游网站:廉价酒店,度假村和航班预订
2016/07/26 全球购物
size?瑞典:英国伦敦的球鞋精品店
2018/03/01 全球购物
介绍一下木马病毒的种类
2015/07/26 面试题
计算机专业个人求职自荐信
2013/09/21 职场文书
财务助理岗位职责
2013/11/10 职场文书
电信营业员自我评价分享
2014/01/17 职场文书
常务副县长“三严三实”对照检查材料思想汇报
2014/10/05 职场文书
2014年会计人员工作总结
2014/12/10 职场文书
党校个人总结
2015/03/04 职场文书