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程序中防止盗链
Apr 09 PHP
php 表单验证实现代码
Mar 10 PHP
PHP初学者常见问题集合 修正版(21问答)
Mar 23 PHP
遍历指定目录下的所有目录和文件的php代码
Nov 27 PHP
分享PHP header函数使用教程
Sep 05 PHP
php格式化日期和时间格式化示例分享
Feb 24 PHP
PHPThumb图片处理实例
May 03 PHP
php opendir()列出目录下所有文件的实例代码
Oct 02 PHP
PHP简单验证码功能机制实例详解
Mar 27 PHP
详解如何实现Laravel的服务容器的方法示例
Apr 15 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
Oct 09 PHP
Yii Framework框架开发微信公众平台示例
Apr 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
PHP mail 通过Windows的SMTP发送邮件失败的解决方案
2009/05/27 PHP
PHP 用数组降低程序的时间复杂度
2009/12/04 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
PHP进程通信基础之信号量与共享内存通信
2017/02/19 PHP
Prototype ObjectRange对象学习
2009/07/19 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
javascript监听鼠标滚轮事件浅析
2014/06/05 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
常用的Javascript数据验证插件
2015/08/04 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
JavaScript实现类似拉勾网的鼠标移入移出效果
2016/10/27 Javascript
angular-ui-sortable实现可拖拽排序列表
2016/12/28 Javascript
初探nodeJS
2017/01/24 NodeJs
详解node+express+ejs+bootstrap构建项目
2017/09/27 Javascript
详解Nuxt.js部署及踩过的坑
2018/08/07 Javascript
详解vuex之store源码简单解析
2019/06/13 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
NodeJS开发人员常见五个错误理解
2020/10/14 NodeJs
[45:18]2018DOTA2亚洲邀请赛 4.3 突围赛 Optic vs iG 第一场
2018/04/04 DOTA
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
TensorFlow神经网络优化策略学习
2018/03/09 Python
Python enumerate函数遍历数据对象组合过程解析
2019/12/11 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
2020/06/08 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
基于Python+QT的gui程序开发实现
2020/07/03 Python
python 下载文件的多种方法汇总
2020/11/17 Python
高职助产应届生自荐信
2013/09/24 职场文书
个人自我鉴定
2013/11/07 职场文书
英语商务邀请函范文
2014/01/16 职场文书
在校大学生个人的自我评价
2014/02/13 职场文书
园林设计专业毕业生求职信
2014/03/23 职场文书
新闻工作者先进事迹
2014/05/26 职场文书
党员民主生活会整改措施
2014/09/26 职场文书
英文邀请函
2015/02/02 职场文书
2016情人节宣传语
2015/07/14 职场文书