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持久连接mysql_pconnect()函数使用介绍
Feb 05 PHP
Could not load type System.ServiceModel.Activation.HttpModule解决办法
Dec 29 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
Jan 29 PHP
PHP用星号隐藏部份用户名、身份证、IP、手机号等实例
Apr 08 PHP
PHP实现CSV文件的导入和导出类
Mar 24 PHP
使用PHP如何实现高效安全的ftp服务器(一)
Dec 20 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
Mar 30 PHP
PHP+Ajax无刷新带进度条图片上传示例
Feb 08 PHP
php正则表达式基本知识与应用详解【经典教程】
Apr 17 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
Jul 07 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
Nov 17 PHP
PHP进阶学习之Geo的地图定位算法详解
Jun 19 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 读取文件的正确方法
2009/04/29 PHP
解析thinkphp import 文件内容变量失效的问题
2013/06/20 PHP
PHP数据的提交与过滤基本操作实例详解
2016/11/11 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
PHP设计模式之适配器模式原理与用法分析
2018/04/25 PHP
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
JavaScript实现QueryString获取GET参数的方法
2013/07/02 Javascript
js函数名与form表单元素同名冲突的问题
2014/03/07 Javascript
jQuery添加/改变/移除CSS类及判断是否已经存在CSS
2014/08/20 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
2014/09/15 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
基于jQuery实现点击弹出层实例代码
2016/01/01 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
Javascript 引擎工作机制详解
2016/11/30 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
JS实现的集合去重,交集,并集,差集功能示例
2018/03/13 Javascript
Node错误处理笔记之挖坑系列教程
2018/06/05 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
python检查字符串是否是正确ISBN的方法
2015/07/11 Python
python 迭代器和iter()函数详解及实例
2017/03/21 Python
python爬虫神器Pyppeteer入门及使用
2019/07/13 Python
Django DRF路由与扩展功能的实现
2020/06/03 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
Glamest意大利:女性在线奢侈品零售店
2019/04/28 全球购物
一家专门经营包包的英国网站:MyBag
2019/09/08 全球购物
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
大雁塔英文导游词
2015/02/10 职场文书
交心谈心活动总结
2015/05/11 职场文书
自书遗嘱范文
2015/08/07 职场文书
2016年端午节红领巾广播稿
2015/12/18 职场文书
2016年班主任培训心得体会
2016/01/07 职场文书
python pyhs2 的安装操作
2021/04/07 Python
基于PostgreSQL/openGauss 的分布式数据库解决方案
2021/12/06 PostgreSQL