【问题标题】:double submission when refresh php刷新php时双重提交
【发布时间】:2011-08-16 17:05:39
【问题描述】:

我正在尝试纠正我的脚本中的双重提交问题。当我按下提交时,它只更新一次mysql(这是我想要的)。但是,当我点击刷新时,它会再次更新 mysql。一旦点击刷新按钮,它似乎会忽略 if 语句。我该怎么做才能阻止它

这是我的代码

if (isset($_POST['submitButton'])) { 
//do something
 }


<form action = "table.php" method="post">
<label for="submitButton"></label>
<input type="submit" name="submitButton" id="submitButton"
value="Submit Form"/>
</form>

【问题讨论】:

    标签: php mysql xhtml double-submit-prevention


    【解决方案1】:

    当您刷新页面时 - POST 再次发送

    有些浏览器实际上会警告您发生这种情况。

    为了防止我这样做:

    if (isset($_POST['submitButton'])) { 
    //do something
    
    //..do all post stuff
    header('Location: thisPage.php'); //clears POST
    }
    
    
    <form action = "table.php" method="post">
    <label for="submitButton"></label>
    <input type="submit" name="submitButton" id="submitButton"
    value="Submit Form"/>
    </form>
    

    【讨论】:

    • 我宁愿在表单中使用 csrf-token 而不是创建 2 个提交请求,但我不得不说这是一个相当简洁且易于实现的技巧。也许死();在标头()之后; ?
    【解决方案2】:

    我使用会话来防止重新发布。

    session_start();
    
     if( isset($_SESSION['your_variable']) && 
         $_SESSION['your_variable'] == $_POST['your_variable'] ){
        // re-post, don't do anything. 
     }
     else{
        $_SESSION['your_variable'] = $_POST['your_variable'];
        // new post, go do something.
     } 
    

    【讨论】:

      【解决方案3】:

      这是一种标准行为:当您重新加载页面时,如果它已发布,您的浏览器会重放相同的请求(使用 POST)。

      为避免这种情况,您可以使用重定向到同一页面,使用:

       <?php
       header("location:".$mycurrentURl);
      

      这将通过获取请求重新加载页面。这将防止重复发布。

      【讨论】:

        【解决方案4】:

        当您刷新页面时。浏览器再次发布所有数据。所以在像这样再次将浏览器重定向到同一页面之后,同样的事情再次发生以克服这个问题

            if (isset($_POST['submitButton'])) { 
                 //do something
        
                 header("location:table.php");
            }
        

        【讨论】:

          【解决方案5】:

          我通常不担心这个,只依赖用户不重新发布,除非他们愿意。但是,如果你想禁止它,你可以使用 nonce

          http://en.wikipedia.org/wiki/Cryptographic_nonce

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-05-15
            • 1970-01-01
            • 1970-01-01
            • 2011-03-09
            • 2011-08-14
            • 2016-01-18
            • 2014-07-09
            • 2012-08-08
            相关资源
            最近更新 更多