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 或网站服务器日志,并正确配置 PHP 安装(win+linux)
May 05 PHP
php实现按文件名搜索文件的远程文件查找器
May 10 PHP
smarty模板引擎从配置文件中获取数据的方法
Jan 22 PHP
使用XHGui来测试PHP性能的教程
Jul 03 PHP
四个PHP非常实用的功能
Sep 29 PHP
如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )
Feb 01 PHP
PHP微信开发之文本自动回复
Jun 23 PHP
Yii的Srbac插件用法详解
Jul 14 PHP
php 实现301重定向跳转实例代码
Jul 18 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
Aug 08 PHP
PHP回调函数概念与用法实例分析
Nov 03 PHP
laravel-admin的多级联动方法
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
PHP 向右侧拉菜单实现代码,测试使用中
2009/11/03 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
2013/04/22 PHP
PHP中的日期加减方法示例
2014/08/21 PHP
php实现生成验证码实例分享
2016/04/10 PHP
php处理复杂xml数据示例
2016/07/11 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
Google Map Api和GOOGLE Search Api整合实现代码
2009/07/18 Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
2010/12/02 Javascript
8款非常棒的响应式jQuery 幻灯片插件推荐
2012/02/02 Javascript
JQuery 获取json数据$.getJSON方法的实例代码
2013/08/02 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
JS实现仿雅虎首页快捷登录入口及导航模块效果
2015/09/19 Javascript
Vue.js每天必学之方法与事件处理器
2016/09/06 Javascript
浅谈jQuery中Ajax事件beforesend及各参数含义
2016/12/03 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
vue.js使用v-if实现显示与隐藏功能示例
2018/07/06 Javascript
vue vue-Router默认hash模式修改为history需要做的修改详解
2018/09/13 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
2018/10/12 Javascript
Vue表单之v-model绑定下拉列表功能
2019/05/14 Javascript
[37:02]OG vs INfamous 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Pycharm在指定目录下生成文件和删除文件的实现
2020/12/28 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
2021/02/20 Python
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
希尔顿酒店官方网站:Hilton Hotels
2017/06/01 全球购物
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
纽约海:Sea New York
2018/11/04 全球购物
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
linux下进程间通信的方式
2014/12/23 面试题
物流专业大学应届生求职信
2013/11/03 职场文书
采购类个人求职的自我评价
2014/02/18 职场文书
生物制药专业自我鉴定
2014/02/19 职场文书
大学社团计划书
2014/05/01 职场文书
简历自我评价范文
2019/04/24 职场文书
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS
六个好看实用的 HTML + CSS 后台登录入口页面
2022/04/28 HTML / CSS