php解决和避免form表单重复提交的几种方法


Posted in PHP onAugust 31, 2016

前言

为什么要避免form表单被重复提交呢?因为我们不想让我们的服务器重复处理没必要的数据,同时我们也是避免我们的数据库产生重复的数据,避免表单重复提交也是让我们的网站更安全的一种表现。

先看一下有哪些情况下回导致表单重复提交呢,知道哪些情况下可能会出现表单重复提交就可以从根源处理表单重复提交的情况了。

下面的情况就会导致表单重复提交:

      点击提交按钮两次。

      点击刷新按钮。

      使用浏览器后退按钮重复之前的操作,导致重复提交表单。

      使用浏览器历史记录重复提交表单。

      浏览器重复的HTTP请求。

      网页被恶意刷新。

下面是几种解决办法:

一:利用js设置按钮点击后变成灰色

<form name=form1 method=”POST” action=”/” target=_blank>

<p>

<input type=”text” name=”T1″ size=”20″>

<input type=”button” value=”提交” onclick=”javascript:{this.disabled=true;document.form1.submit();}”>

</p>

</form>

点击完按钮之后变成灰色就不能点击了,用户需要再次提交表单的话就要刷新页面之后重新填写数据再提交了。

二:利用session

session中放一个特殊标志。当表单页面被请求时,生成一个特殊的字符标志串,存在session中,同时放在表单的隐藏域里。接受处理表单数据时,检查标识字串是否存在,并立即从session中删除它,然后正常处理数据。

如果发现表单提交里没有有效的标志串,这说明表单已经被提交过了,忽略这次提交。

这使你的web应用有了更高级的XSRF保护

加载提交的页面时候,生成一个随机数,

$code = mt_rand(0,1000000);

存储在表单的隐藏输入框中:

< input type=”hidden” name=”code” value=””>

在接收页面的PHP代码如下:

<?php

session_start();

if(isset($_POST[‘code'])) {

if($_POST[‘code'] == $_SESSION[‘code']){

// 重复提交表单了

}else{

$_SESSION[‘code'] =$_POST[‘code']; //存储code

}

}?>

三:利用cookies

原理和session差不多,但是cookies一旦用户浏览器禁用cookies,这功能就失效了

if(isset($_POST[‘submit'])){

setcookie(“tempcookie”,””,time()+30);

header(“Location:”.$_SERVER[PHP_SELF]);exit();

}

if(isset($_COOKIE[“tempcookie”])){

setcookie(“tempcookie”,””,0);echo “您已经提交过表单”;

}

四:利用header函数跳转

一旦用户点击提交按钮,处理完数据后跳到其他页面

if (isset($_POST[‘submit'])) {

header(‘location:success.php');//处理数据后,转向到其他页面

}

五:利用数据库来添加约束

直接在数据库里添加唯一约束或创建唯一索引,一旦发现用户重复提交了,直接抛出警告或者提示,或者只处理第一次提交的数据,这是最直接有效的方法,要求前期的数据库设计和架构要考虑周全.

六:Post/Redirect/Get模式。

在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面。

if (isset($_POST[‘action']) && $_POST[‘action'] == ‘submitted') {

//处理数据,如插入数据后,立即转向到其他页面

header('location:submits_success.php');

}

总结

以上就是关于PHP解决和避免form表单重复提交的几种方法,通过以上几种方法就能避免用户按F5导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样问题。希望这篇文章对大家的学习和工作能带来一定的帮助。

PHP 相关文章推荐
用PHP连接Oracle for NT 远程数据库
Oct 09 PHP
解析php时间戳与日期的转换
Jun 06 PHP
php调用nginx的mod_zip模块打包ZIP文件
Jun 11 PHP
destoon复制新模块的方法
Jun 21 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
Nov 18 PHP
php页面,mysql数据库转utf-8乱码,utf-8编码问题总结
Aug 27 PHP
Yii2 rbac权限控制之rule教程详解
Jun 23 PHP
smarty循环嵌套用法示例分析
Jul 19 PHP
深入了解PHP中的Array数组和foreach
Nov 06 PHP
PHP实现的XXTEA加密解密算法示例
Aug 28 PHP
php用户名的密码加密更安全的方法
Jun 21 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
Nov 13 PHP
PHP Callable强制指定回调类型的方法
Aug 30 #PHP
thinkphp配置文件路径的实现方法
Aug 30 #PHP
总结PHP删除字符串最后一个字符的三种方法
Aug 30 #PHP
功能强大的php文件上传类
Aug 29 #PHP
功能强大的PHP发邮件类
Aug 29 #PHP
微信网页授权(OAuth2.0) PHP 源码简单实现
Aug 29 #PHP
Laravel 5.3 学习笔记之 错误&amp;日志
Aug 28 #PHP
You might like
PHP变量的定义、可变变量、变量引用、销毁方法
2013/12/20 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
2015/12/25 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
javascript最常用与实用的创建类的代码
2010/08/12 Javascript
深入分析js中的constructor和prototype
2012/04/07 Javascript
JavaScript实现自己的DOM选择器原理及代码
2013/03/04 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
2013/07/07 Javascript
运用jQuery定时器的原理实现banner图片切换
2014/10/22 Javascript
nodejs调用cmd命令实现复制目录
2015/05/04 NodeJs
jquery在ie7下选择器的问题导致append失效的解决方法
2016/01/10 Javascript
Bootstrap轮播插件使用代码
2016/10/11 Javascript
微信小程序 封装http请求实例详解
2017/01/16 Javascript
jQuery判断邮箱格式对错实例代码讲解
2017/04/12 jQuery
详解使用nvm管理多版本node的方法
2017/08/30 Javascript
Vue2 模板template的四种写法总结
2018/02/23 Javascript
关于jquery layui弹出层的使用方法
2018/04/21 jQuery
vue项目打包为APP,静态资源正常显示,但API请求不到数据的操作
2020/09/12 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[03:11]TI9战队档案 - Alliance
2019/08/20 DOTA
跟老齐学Python之变量和参数
2014/10/10 Python
Python实现的飞速中文网小说下载脚本
2015/04/23 Python
python在非root权限下的安装方法
2018/01/23 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
Pytorch maxpool的ceil_mode用法
2020/02/18 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
node中使用shell脚本的方法步骤
2021/03/23 Javascript
开展党的群众路线教育实践活动方案
2014/02/05 职场文书
2014预备党员批评与自我批评思想汇报
2014/09/20 职场文书
2014年店长工作总结
2014/11/17 职场文书
那些美到让人窒息的诗句,值得你收藏!
2019/08/20 职场文书
MySQL中InnoDB存储引擎的锁的基本使用教程
2021/05/26 MySQL
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python
解决pycharm下载库时出现Failed to install package的问题
2021/09/04 Python