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 03 PHP
php向js函数传参的几种方法
Aug 10 PHP
php跨服务器访问方法小结
May 12 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
Apr 22 PHP
Yii2数据库操作常用方法小结
May 04 PHP
弹出模态框modal的实现方法及实例
Sep 19 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
PHP检查URL包含特定字符串实例方法
Feb 11 PHP
Thinkphp5框架ajax接口实现方法分析
Aug 28 PHP
Laravel实现搜索的时候分页并携带参数
Oct 15 PHP
thinkphp5使html5实现动态跳转的例子
Oct 16 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
Oct 30 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获取地址栏信息的代码
2008/10/08 PHP
php生成局部唯一识别码LUID的代码
2012/10/06 PHP
浅谈PHP调用Webservice思路及源码分享
2014/06/04 PHP
php设计模式之单例模式代码
2016/06/11 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
laravel框架 api自定义全局异常处理方法
2019/10/11 PHP
extjs 学习笔记(一) 一些基础知识
2009/10/13 Javascript
JQUERY操作JSON实例代码
2010/02/09 Javascript
Js 时间函数getYear()的使用问题探讨
2013/04/01 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
利用require.js与angular搭建spa应用的方法实例
2017/07/19 Javascript
浅谈Vue.js中的v-on(事件处理)
2017/09/05 Javascript
JS/HTML5游戏常用算法之碰撞检测 像素检测算法实例详解
2018/12/12 Javascript
基于mpvue小程序使用echarts画折线图的方法示例
2019/04/24 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
vue中添加与删除关键字搜索功能
2019/10/12 Javascript
JS实现手风琴特效
2020/11/08 Javascript
python 远程统计文件代码分享
2015/05/14 Python
python中urllib.unquote乱码的原因与解决方法
2017/04/24 Python
python实现随机梯度下降(SGD)
2020/03/24 Python
Python实现最大子序和的方法示例
2019/07/05 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
python 多线程中join()的作用
2020/10/29 Python
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
跑步爱好者一站式服务网站:Jack Rabbit
2016/09/01 全球购物
英国轻奢珠宝品牌:Astley Clarke
2016/12/18 全球购物
2014年小学植树节活动方案
2014/03/02 职场文书
2014市府办领导班子“四风问题”对照检查材料思想汇报
2014/09/24 职场文书
四风自我剖析材料思想汇报
2014/10/01 职场文书
秋季运动会开幕词
2015/01/28 职场文书
确保工程质量承诺书
2015/04/29 职场文书
经济纠纷起诉状
2015/05/20 职场文书
儿子满月酒致辞
2015/07/29 职场文书
springboot集成redis存对象乱码的问题及解决
2022/06/16 Java/Android