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 相关文章推荐
一个oracle+PHP的查询的例子
Oct 09 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
Jun 30 PHP
PHP实现AES256加密算法实例
Sep 22 PHP
Laravel中使用自己编写类库的3种方法
Feb 10 PHP
Yii视图操作之自定义分页实现方法
Jul 14 PHP
PHP仿微信多图片预览上传实例代码
Sep 13 PHP
基于PHP制作验证码
Oct 12 PHP
PHP常用算法和数据结构示例(必看篇)
Mar 15 PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 PHP
PHP中“=&gt;
Mar 01 PHP
php array 转json及java 转换 json数据格式操作示例
Nov 13 PHP
laravel5.6 框架邮件队列database驱动简单demo示例
Jan 26 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
eAccelerator的安装与使用详解
2013/06/13 PHP
php实现二进制和文本相互转换的方法
2015/04/18 PHP
PHP易混淆知识整理笔记
2015/09/24 PHP
ThinkPHP3.2.3实现分页的方法详解
2016/06/03 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
HTML中事件触发列表与解说
2007/07/09 Javascript
Prototype RegExp对象 学习
2009/07/19 Javascript
Jquery解析Json格式数据过程代码
2014/10/17 Javascript
javascript弹出页面回传值的方法
2015/01/28 Javascript
JavaScript仿百度图片浏览效果
2016/11/23 Javascript
javascript实现简单的ajax封装示例
2016/12/28 Javascript
JQuery和HTML5 Canvas实现弹幕效果
2017/01/04 Javascript
vue中axios的封装问题(简易版拦截,get,post)
2018/06/15 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
ES6顶层对象、global对象实例分析
2019/06/14 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
2019/12/07 Javascript
[58:12]Ti4第二日主赛事败者组 LGD vs iG 3
2014/07/21 DOTA
一些Python中的二维数组的操作方法
2015/05/02 Python
分享一下如何编写高效且优雅的 Python 代码
2017/09/07 Python
django fernet fields字段加密实践详解
2019/08/12 Python
python随机生成库faker库api实例详解
2019/11/28 Python
Python读写压缩文件的方法
2020/07/30 Python
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
英国鲜花速递:Serenata Flowers
2018/04/03 全球购物
德国电子产品购物网站:TechInTheBasket德国
2018/12/07 全球购物
中层竞聘演讲稿
2014/01/09 职场文书
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
目标责任书范本
2014/04/16 职场文书
英文求职信范文
2014/05/23 职场文书
领导干部廉政自律承诺书
2014/05/26 职场文书
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
2014年技术部工作总结
2014/12/12 职场文书
天鹅湖观后感
2015/06/09 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
Kubernetes控制节点的部署
2022/04/01 Servers
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电