php页面防重复提交方法总结

2015-01-24信息快讯网

有时候我们的程序执行比较慢,而且我们页面也不怎么友好,没什么提示信息。操作人员以为没有点击提交按钮,就会再一次点击提交。这会导致很多问题出现。下面介绍三种防重复提交的方法

1、提交按钮置disabled

      当用户提交后,立即把按钮置为不可用状态。这种用js来实现。

         提交前

        $("#submit").attr('disabled','true');
         $("#submit").val("正在提交,请稍等");

 

       ....................................................................................

    执行后,把按钮置为原来状态

      $('#submit ').removeAttr('disabled');
      $("#submit ").val("确定提交");


2、过期时间法

    思路:当用户提交按钮后生成一个token(每次业务提交token 为唯一值)存入session,并设置过期时间。当用户再此提交时,检测token是否一致且是否过期,若一致且没有过期,则认为提交了二次。当程序执行出错的时候,则需要清除存入session的值。见下面程序

function checkRepeatSubmit($uniqueid = '', $expire = 30) {

$uniqueid = empty($uniqueid) ? Yii::app()->user->id . Yii::app()->user->name . Yii::app()->user->mihome : $uniqueid; $token = md5("wms_check_repeat" . $uniqueid);

$time = time();

if (isset($_SESSION['token']) && !empty($_SESSION['token']) && $_SESSION['token'] == $token && ($time - $_SESSION['expire_time'] < $expire)) {

return false; } else {

$_SESSION['token'] = $token; $_SESSION['expire_time'] = $time; //session写入的时候会等待整个页面加载完成,用此函数可以立即写入 session_write_close(); return true; } }

//删除存入的值

function cancelRepeatSubmit() {

unset($_SESSION['token']); unset($_SESSION['expire_time']); }



3、token销毁法

思路:当页面进行加装的时候生成token,存在session中,并写在表单里。表单提交的时候随表单提交给服务端,服务端通过session存入的token与token进行比较,若相等,则销毁seesion中存入的token,当页面遭到二次提交的时候,由于存入session中的token不存在而报错。下面是代码

 /**
     * 第二种方案
     * 1、产生token,并存在session中
     * 2、随页面生成
     * 3、提交页面与session进行比对,成功后对session进行销毁
     * 4、第二次提交则不存在这个值而报错
     * @param type $uniqueid
     * @return type
     */
    function createToken($uniqueid) {

$uniqueid = empty($uniqueid) ? Yii::app()->user->id . Yii::app()->user->name . Yii::app()->user->mihome : $uniqueid; $token = md5("wms_check2_repeat" . $uniqueid); $_SESSION['form_token'] = $token;

​session_write_close();

return $token; }

function checkToken($token) {

if (!isset($_SESSION['form_token']) || empty($_SESSION['form_token']) || $_SESSION['form_token'] != $token) { return false; } else { unset($_SESSION['form_token']); return true; } }

上面总结了三种方法,个人感觉第一种跟第二种方法配合着用会达到更好的效果。第二种方法与第三种方法个人感觉第三种要有优势点。

第二种与第三种方法都是把token写在session中,这种方法好处是节省存储空间,但坏处是由于session是需要整个页面加载完毕才能写入,故当整个页面加载比较慢,且用户点击多次提交,可能由于session还没写入导致系统还认为是第一次输入。导致验证不起作用。好在php函数提供了一个牛逼的函数。   session_write_close(),可以立即把session写入,不用等待页面加载完成。同事对于session的存入也有很多种方法可以选择,可以存在redis,memcache或者数据库都可以的。

ThinkPHP3.1新特性之对页面压缩输出的支持
ThinkPHP3.1新特性之G方法的使用
php获取网页中图片、DIV内容的简单方法
PHP两种去掉数组重复值的方法比较
PHP mkdir()无写权限的问题解决方法
PHP中的多行字符串传递给JavaScript的两种方法
PHP防止post重复提交数据的简单例子
yii框架表单模型使用及以数组形式提交表单数据示例
php判断页面是否是微信打开的示例(微信打开网页)
通过curl模拟post和get方式提交的表单类
php生成静态页面的简单示例
php 使用GD库为页面增加水印示例代码
PHP_Cooikes不同页面无法传递的解决方法
php 表单提交大量数据发生丢失的解决方法
PHP对表单提交特殊字符的过滤和处理方法汇总
php导出word格式数据的代码实例
php用header函数实现301跳转代码实例
php使浏览器直接下载pdf文件的方法
限制ckeditor上传图片文件大小的方法
php ckeditor上传图片文件名乱码解决方法
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
php遍历目录与文件夹的多种方法详解
php不允许用户提交空表单(php空值判断)
php使用curl模拟登录后采集页面的例子
PHP防止跨域提交表单
PHP页面中文乱码分析
web server使用php生成web页面的三种方法总结
php 模拟post_验证页面的返回状态(实例讲解)
php用户注册页面利用js进行表单验证具体实例
php jq jquery getJSON跨域提交数据完整版
php+js实现图片的上传、裁剪、预览、提交示例
php中用socket模拟http中post或者get提交数据的示例代码
©2014-2024 dbsqp.com