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异常处理技术,顶级异常处理器
Jun 13 PHP
php使HTML标签自动补全闭合函数代码
Oct 04 PHP
解析php中memcache的应用
Jun 18 PHP
PHP 通过Socket收发十六进制数据的实现代码
Aug 16 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
May 13 PHP
浅谈php中include文件变量作用域
Jun 18 PHP
PHP文件操作方法汇总
Jul 01 PHP
php提交过来的数据生成为txt文件
Apr 28 PHP
PHP检测链接是否存在的代码实例分享
May 06 PHP
thinkPHP自定义类实现方法详解
Nov 30 PHP
laravel实现前后台路由分离的方法
Oct 13 PHP
Yii框架自定义数据库操作组件示例
Nov 11 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网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
根据json字符串生成Html的一种方式
2013/01/09 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
2013/04/26 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
2014/11/08 Javascript
Yii2使用Bootbox插件实现自定义弹窗
2015/04/02 Javascript
CSS3实现动态背景登录框的代码
2015/07/28 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
three.js加载obj模型的实例代码
2017/11/10 Javascript
详解Vue单元测试Karma+Mocha学习笔记
2018/01/31 Javascript
JS简单获取并修改input文本框内容的方法示例
2018/04/08 Javascript
微信小程序scroll-view的滚动条设置实现
2020/03/02 Javascript
Python+Django在windows下的开发环境配置图解
2009/11/11 Python
Python selenium 三种等待方式解读
2016/09/15 Python
Python正则表达式匹配和提取IP地址
2019/06/06 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
Grid 宫格常用布局的实现
2020/01/10 HTML / CSS
CSS3实现彩色进度条动画的示例
2020/10/29 HTML / CSS
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
戴森西班牙官网:Dyson西班牙
2020/02/04 全球购物
介绍一下XMLHttpRequest对象的常用方法和属性
2013/05/24 面试题
《草原》教学反思
2014/02/15 职场文书
总经理秘书岗位职责
2014/03/17 职场文书
村干部培训班主持词
2014/03/28 职场文书
保洁公司服务承诺书
2014/05/28 职场文书
2014年城管个人工作总结
2014/12/08 职场文书
公司辞职信模板
2015/05/13 职场文书
离职信范本
2015/06/23 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书
Vue vee-validate插件的简单使用
2021/06/22 Vue.js