• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
123457092 显示全部楼层 发表于 2021-10-25 20:14:59 |阅读模式 打印 上一主题 下一主题
本文实例总结分析了ThinkPHP防止重复提交表单的方法。分享给各人供各人参考,具体如下:
为什么会有表单重复的坑
在开辟中,假如一个新增或修改的表单,在配景完成数据库操作后我们设定的不是跳转到其他页面,还是返回本页面,这时点击欣赏器的退却再提交或革新页面,会导致form表单重复提交,即这条记录会被增长或修改两次。
导致表单重复提交的缘故原由是:第一次提交的表单会被缓存到内存中,直到页面下次提交或页面关闭或转向其他页面时才消失。在自调用返回时,内存中的数据依然在,这时页面中的判断提交的代码依然可以检测到提交的值,顾会产生重复提交的结果。
怎样办理?
总结网上的办理办法和本身的测试,可以用以下几个办法:
方法1:最简朴:页面提交后转到另一个页面而不是本页面,举个栗子,好比你的页面所在为
http://yourdomain.com/User/Index/login
则该页面的表单action所在可以为别的的处置惩罚所在,如
  1. <form action="{:U('User/Index/check_login')}" method="post">
复制代码
这样报错返回,或者用户点击回退按钮,还是会回到上一个所在,不过这种环境也不保险。还要搭配方法2,一起比较保险
方法2:提交表单后提交按钮变灰/隐藏提交按钮
这种方式一样平常是结合方法1来做的,通过JS来动态监听用户的点击动作,动态将按钮属性置成disabeld,即为灰色不可用。代码如下:
HTML:
  1. <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:
  1. $().ready(function(){
  2.    $("#login_btn").on('click',function(){
  3.       $(this).attr('disabled',true);
  4.    });
  5. });
复制代码
方法1+方法2 结合后,基本上90%以上的重复提交问题都能办理,但是大刘这里还是要说下第三种方法,即在服务端一劳永逸的办理这个问题
方法3:利用隐藏随机TOKEN值的方法举行重复提交判断
起首,在项目的functions.php中添加如下方法
  1. //创建TOKEN
  2. function createToken() {
  3.   $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));
  4.   session('TOKEN', authcode($code));
  5. }
  6. //判断TOKEN
  7. function checkToken($token) {
  8.   if ($token == session('TOKEN')) {
  9.     session('TOKEN', NULL);
  10.     return TRUE;
  11.   } else {
  12.    return FALSE;
  13.   }
  14. }
  15. /* 加密TOKEN */
  16. function authcode($str) {
  17.   $key = "YOURKEY";
  18.   $str = substr(md5($str), 8, 10);
  19.   return md5($key . $str);
  20. }
复制代码
在表单页面form中填入以下HTML代码
HTML:
  1. <input type="hidden" name="TOKEN" value="{:session('TOKEN')}" />
复制代码
在页面展示前调用
  1. creatToken()
复制代码
方法天生token,在相应控制器POST哀求中 利用
  1. checkToken()
复制代码
举行判断是否重复提交
  1. if(IS_POST)
  2. {
  3. $post_token = I('post.TOKEN');
  4. if(!checkToken($post_token)){
  5.    $this->error('请不要重复提交页面',U('User/Index/login'));
  6. }
  7. }
复制代码
基本上,这3个方法配合着利用,就能办理ThinkPHP开辟中表单重复提交问题,固然,有同砚说可以利用ThinkPHP的令牌环机制,这样实在就更简朴了,TP会默认在表单中天生一个隐藏域,到时候判断这个隐藏域是否存在以及和session中的值是否想的即可,原理和方法3是一样的。
PS:本日终于把内容用简书的markdown编辑器发出来了,果然markdown语法不是盖的,整个排版都清新了,不错不错。
更多关于thinkPHP相干内容感爱好的读者可查察本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作本事总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。
盼望本文所述对各人基于ThinkPHP框架的PHP步伐筹划有所帮助。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作