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 相关文章推荐
example1.php
Oct 09 PHP
手把手教你使用DedeCms的采集的图文教程
Mar 11 PHP
php 什么是PEAR?
Mar 19 PHP
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
Jul 23 PHP
PHP图片验证码制作实现分享(全)
May 10 PHP
PHP中将ip地址转成十进制数的两种实用方法
Aug 15 PHP
PHP面向对象教程之自定义类
Jun 10 PHP
php中get_meta_tags()、CURL与user-agent用法分析
Dec 16 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
Dec 21 PHP
PHP绕过open_basedir限制操作文件的方法
Jun 10 PHP
基于laravel缓冲cache的用法详解
Oct 23 PHP
为你的 Laravel 验证器加上多验证场景的实现
Apr 07 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导出word文档与excel电子表格的简单示例代码
2014/03/08 PHP
ThinkPHP3.1之D方法实例详解
2014/06/20 PHP
CI框架给视图添加动态数据
2014/12/01 PHP
PHP实现的数组和XML文件相互转换功能示例
2018/03/15 PHP
Laravel框架路由管理简单示例
2019/05/07 PHP
Laravel框架查询构造器 CURD操作示例
2019/09/04 PHP
一行代码告别document.getElementById
2012/06/01 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
javascript实现继承的简单实例
2015/07/26 Javascript
JQuery实现鼠标滚轮滑动到页面节点
2015/07/28 Javascript
JS特效实现图片自动播放并可控的效果
2015/07/31 Javascript
JS实现带提示的星级评分效果完整实例
2015/10/30 Javascript
js倒计时抢购实例
2015/12/20 Javascript
详解Javascript模板引擎mustache.js
2016/01/20 Javascript
AngularJS包括详解及示例代码
2016/08/17 Javascript
在JavaScript中调用Java类和接口的方法
2016/09/07 Javascript
input输入密码变黑点密文的实现方法
2017/01/09 Javascript
JS中利用localStorage防止页面动态添加数据刷新后数据丢失
2017/03/10 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
关于jQuery库冲突的完美解决办法
2017/05/20 jQuery
JS实现碰撞检测的方法分析
2018/01/19 Javascript
用p5.js制作烟花特效的示例代码
2018/03/21 Javascript
webpack 插件html-webpack-plugin的具体使用
2018/04/09 Javascript
详解Webpack loader 之 file-loader
2018/11/07 Javascript
在vue中配置不同的代理同时访问不同的后台操作
2020/09/11 Javascript
Python基于分水岭算法解决走迷宫游戏示例
2017/09/26 Python
Python连接phoenix的方法示例
2017/09/29 Python
Python+OpenCV让电脑帮你玩微信跳一跳
2018/01/04 Python
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
英国发展最快的在线超市之一:Click Marketplace
2021/02/15 全球购物
英语故事演讲稿
2014/04/29 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
租房协议书
2014/09/12 职场文书
收款授权委托书
2014/10/02 职场文书
Python利用zhdate模块实现农历日期处理
2022/03/31 Python