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 相关文章推荐
如何删除多级目录
Oct 09 PHP
怎样去阅读一份php源代码
Aug 21 PHP
比file_get_contents稳定的curl_get_contents分享
Jan 11 PHP
基于PHP常用字符串的总结(待续)
Jun 07 PHP
php的一个简单加密解密代码
Jan 14 PHP
实现获取http内容的php函数分享
Feb 16 PHP
PHP根据IP判断地区名信息的示例代码
Mar 03 PHP
destoon整合UCenter图文教程
Jun 21 PHP
推荐一款MAC OS X 下php集成开发环境mamp
Nov 08 PHP
php字符串操作针对负值的判断分析
Jul 28 PHP
PHP实现添加购物车功能
Mar 06 PHP
php封装db类连接sqlite3数据库的方法实例
Dec 19 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
如何冲泡挂耳包咖啡?技巧是什么
2021/03/04 冲泡冲煮
PHP 加密与解密的斗争
2009/04/17 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
2016/01/07 PHP
详解Yii2.0 rules验证规则集合
2017/03/21 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
由document.body和document.documentElement想到的
2009/04/13 Javascript
没有document.getElementByName方法
2013/08/19 Javascript
用jquery修复在iframe下的页面锚点失效问题
2014/08/22 Javascript
重写document.write实现无阻塞加载js广告(补充)
2014/12/12 Javascript
jQuery实现复选框成对选择及对应取消的方法
2015/03/03 Javascript
JavaScript 数组的深度复制解析
2016/11/02 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
jQuery EasyUI之验证框validatebox实例详解
2017/04/10 jQuery
基于jQuery实现瀑布流页面
2017/04/11 jQuery
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
javascript中undefined的本质解析
2019/07/31 Javascript
Node.js API详解之 V8模块用法实例分析
2020/06/05 Javascript
原生JS实现无缝轮播图片
2020/06/24 Javascript
jQuery 实现扁平式小清新导航
2020/07/07 jQuery
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
树莓派中python获取GY-85九轴模块信息示例
2013/12/05 Python
Python实现文件按照日期命名的方法
2015/07/09 Python
python判断文件夹内是否存在指定后缀文件的实例
2019/06/10 Python
python pandas.DataFrame.loc函数使用详解
2020/03/26 Python
python怎么提高计算速度
2020/06/11 Python
Bibloo荷兰:女士、男士和儿童的服装、鞋子和配饰
2019/02/25 全球购物
保安拾金不昧表扬信
2014/01/15 职场文书
反对四风自我剖析材料
2014/10/07 职场文书
《小乌鸦爱妈妈》教学反思
2016/02/19 职场文书
2016年小学党支部创先争优活动总结
2016/04/05 职场文书
2019旅游导游工作总结
2019/06/27 职场文书
少年的你:世界上没有如果,要在第一次就勇敢的反抗
2019/11/20 职场文书
MySQL分库分表与分区的入门指南
2021/04/22 MySQL
python文件与路径操作神器 pathlib
2022/04/01 Python
python游戏开发之pygame实现接球小游戏
2022/04/22 Python