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传输数据的代码
Nov 13 PHP
按上下级层次关系输出内容的PHP代码
Jul 17 PHP
一个PHP缓存类代码(附详细说明)
Jun 09 PHP
PHP判断远程url是否有效的几种方法小结
Oct 08 PHP
php基础教程 php内置函数实例教程
Aug 21 PHP
php截取字符串并保留完整xml标签的函数代码
Feb 06 PHP
sql注入与转义的php函数代码
Jun 17 PHP
php获取字符串中各个字符出现次数的方法
Feb 23 PHP
PHP邮箱验证示例教程
Jun 01 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
实例讲解通过​PHP创建数据库
Jan 20 PHP
php设计模式之适配器模式原理、用法及注意事项详解
Sep 24 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图片上传类带图片显示
2006/11/25 PHP
PHP速成大法
2015/01/30 PHP
php die()与exit()的区别实例详解
2016/12/03 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
2017/06/09 PHP
JavaScript面向对象设计二 构造函数模式
2011/12/20 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
举例简介AngularJS的内部语言环境
2015/06/17 Javascript
javascript中JSON对象与JSON字符串相互转换实例
2015/07/11 Javascript
JS常见问题之为什么点击弹出的i总是最后一个
2016/01/05 Javascript
基于JavaScript实现表单密码的隐藏和显示出来
2016/03/02 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
vue 组件简介
2020/07/31 Javascript
[10:18]2018DOTA2国际邀请赛寻真——Fnatic能否笑到最后?
2018/08/14 DOTA
[01:05:07]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第一场2月1日
2021/03/11 DOTA
python 生成不重复的随机数的代码
2011/05/15 Python
Python pickle模块用法实例
2015/04/14 Python
从Python的源码浅要剖析Python的内存管理
2015/04/16 Python
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
python 函数传参之传值还是传引用的分析
2017/09/07 Python
机器学习经典算法-logistic回归代码详解
2017/12/22 Python
解读python logging模块的使用方法
2018/04/17 Python
Python基于QQ邮箱实现SSL发送
2020/04/26 Python
python绘制趋势图的示例
2020/09/17 Python
css3发光搜索表单分享
2014/04/11 HTML / CSS
意大利灯具购物网站:Lampade.it
2018/10/18 全球购物
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
小学生自我评价范文
2014/01/25 职场文书
新闻专业毕业生英文求职信
2014/03/19 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
调研座谈会发言材料
2014/08/23 职场文书
2014年教研室工作总结
2014/12/06 职场文书
2015年食品安全工作总结
2015/05/15 职场文书
Win11开始菜单添加休眠选项
2022/04/19 数码科技