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 相关文章推荐
Windows下PHP5和Apache的安装与配置
Sep 05 PHP
模仿OSO的论坛(三)
Oct 09 PHP
获取远程文件大小的php函数
Jan 11 PHP
PHP 面向对象 final类与final方法
May 05 PHP
PHP中的integer类型使用分析
Jul 27 PHP
PHP取得一个类的属性和方法的实现代码
May 22 PHP
php学习之运算符相关概念
Jun 09 PHP
php将字符串全部转换成大写或者小写的方法
Mar 17 PHP
PHP中仿制 ecshop验证码实例
Jan 06 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
Jun 29 PHP
PHP多线程模拟实现秒杀抢单
Feb 07 PHP
laravel 字段格式化 modle 字段类型转换方法
Sep 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
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
情人节之礼 js项链效果
2012/02/13 Javascript
javascript数字格式化通用类 accounting.js使用
2012/08/24 Javascript
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
与Math.pow 相反的函数使用介绍
2014/08/04 Javascript
JQUERY实现网页右下角固定位置展开关闭特效的方法
2015/07/27 Javascript
详解JavaScript ES6中的模板字符串
2015/07/28 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
js实现n秒倒计时后才可以点击的效果
2015/12/20 Javascript
浅谈angular.js跨域post解决方案
2017/08/30 Javascript
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
基于three.js编写的一个项目类示例代码
2018/01/05 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
2019/05/27 jQuery
如何使用JavaScript实现栈与队列
2019/06/24 Javascript
vue3.0中的双向数据绑定方法及优缺点
2019/08/01 Javascript
Vue的props父传子的示例代码
2020/05/20 Javascript
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
python算法学习之计数排序实例
2013/12/18 Python
Python的函数嵌套的使用方法
2014/01/24 Python
Tensorflow简单验证码识别应用
2017/05/25 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
2018/03/13 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
使用Python实现画一个中国地图
2019/11/23 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
PHP如何对用户密码进行加密
2014/07/31 面试题
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
学生逃课检讨书1000字
2014/10/20 职场文书
2014年销售员工作总结
2014/12/01 职场文书
幼儿园圣诞节活动总结
2015/05/06 职场文书
离婚代理词范文
2015/05/23 职场文书
趣味运动会口号
2015/12/24 职场文书