• 如何避免页面刷新导致数据重复写入数据库


    当表单的数据是提交给本页面处理并写入数据库时,点提交后,刷新页面的话使数据重复写入数据库。解决方案有如下几种:

    一、把一页面分开为两个,数据提交给另一个页面处理,之后再跳转到输入页面。

    总的说来,这是一种不错的解决方案。但是要防止用户使用浏览器的返回按钮返回上一页,然后再刷新页面,重复插入数据。

    if (isset($_POST['action']) && $_POST['action'] == 'submitted') {
        // 处理数据,如插入数据后,立即转向到其他页面
        header('location:submits_success.php');     //效果与JSP里面的sendRedirect类似
    }
    二、在数据入库之前执行一次验证查询,看数据库里是否已经存在了相同的记录,由此来决定是否写入数据。

    三、利用PHP的Session功能,也能避免重复提交表单。Session保存在服务器端,在PHP运行过程中可以改变Session变量,下次访问这个变量时,得到的是新赋的值,所以,可以用一个Session变量记录表单提交的值,如果不匹配,则认为是用户在重复提交。例:

    A页面的代码:

    <?php
    session_start();   //根据当前SESSION生成随机数
    $code = mt_rand(0,1000000);
    $_SESSION['code'] = $code;    //将此随机数暂存入到session
    ?>
    
    <form id="form1" name="form1" method="post" action="t2.php">
        说明:
    	<input type="text" name="titile" />
        <input type="hidden" name="originator" value="<?php echo $code;?>">
    	<input type="submit" name="Submit" value="提交" />
    </form>

    B页面的代码:

    <?php
    session_start();
    if(isset($_POST['originator'])) {
        if($_POST['originator'] == $_SESSION['code']){
            echo "ok";
            unset($_SESSION["code"]);   //将其清除掉此时再按F5则无效
        }else{
            echo "请不要刷新本页面或重复提交表单";
        }
    }
    ?>

    最近我有一个点击领红包的项目,第一页有一个【领红包】的按钮,它的url是:/index/add_hongbao/用户id,当我点击这个按钮后,它就会到控制器找到add_hongbao方法,这个方法会执行insert操作,往数据库中插入一条中奖纪录,然后再返回一个中奖的提示页面,可是在这个页面上就出问题了。因为这个提示页的url正是/index/add_hongbao/用户id,因此只要重复刷新页面,就能不断的向数据库中重复插入记录!因为一个用户可以领取多个红包,所以不能根据用户id判断是否允许再次插入数据。这个时候就只能用页面跳转这个方法了,当我执行了add_hongbao()这个方法插入记录后,使用head()方法跳转到/index/add_hongbao2,这个方法没有数据库操作,只返回中奖的提示页,这样就可以防止用户进行页面的重复刷新了。
  • 相关阅读:
    深入字节码 -- 计算方法执行时间
    RubyCritic:一款不错的检测代码质量工具
    云告警平台 OneAlert :如何帮助运维工程师做好汇报?
    企业应用程序安全的新「守护神」
    另辟蹊径:云计算给企业带来的4个好处
    年度十佳 DevOps 博客文章(后篇)
    自定义 Lint 规则简介
    静态分析安全测试(SAST)优缺点探析
    css添加了原始滚动条要隐藏滚动条的显示
    jquery实现图片切换
  • 原文地址:https://www.cnblogs.com/moqiang02/p/4061161.html
Copyright © 2020-2023  润新知