【问题标题】:Prevent form submitting when user refreshes webpage用户刷新网页时阻止表单提交
【发布时间】:2014-01-15 13:53:32
【问题描述】:

我有一个简单的表单按钮点击计数器,效果很好,但是当用户刷新页面时,它会再次添加到计数器上。如果有人能帮助我在下面编写的编码,我将不胜感激。

PHP 代码

<?php
if( isset($_POST['clicks']) ) { 
    incrementClickCount();
}

function getClickCount()
{
    return (int)file_get_contents("clickcount.txt");
}

function incrementClickCount()
{
    $count = getClickCount() + 1;
    file_put_contents("clickcount.txt", $count);
}
?>

HTML 和 PHP 格式代码

<form action="<?php $_SERVER['PHP_SELF']; ?>" method="post">
            <input type="submit" value="click me!" name="clicks">
        </form> <div>Click Count: <?php echo getClickCount(); ?></div>

【问题讨论】:

    标签: javascript php html forms counter


    【解决方案1】:

    为防止这种情况,您需要实现POST/REDIRECT/GET pattern。

    【讨论】:

    • 感谢您的反馈。我将如何在我编写的代码中实现这一点?谢谢。
    【解决方案2】:

    Afroze 有一个很好的观点。使用标题刷新将重置所有表单数据,但它会强制页面刷新两次(第一次提交表单时,第二次当标题强制再次刷新时)。还有另一种方法可以防止“刷新提交”而不强制进行第二次刷新。

    试试这个(我将在下面解释代码):

    <?php
        //begin a session
        session_start();
    
        //generate a MD5 hash from concatenated form $_POST values
        $formDataHash = md5($_POST['clicks'] . $_POST['otherFormContent']);
    
    
        //if form has been submitted before, and the data passed from the form
        //is the same as the previous submission, return false (don't do anything)
    
        if(isset($_SESSION['formData']) && $_SESSION['formData'] == $formDataHash)
        {
            return false;
        }
        else
        {
            //increase click count
            incrementClickCount();
    
            //store the submission values
            $_SESSION['formData'] = $formDataHash;
        }
    

    上面的代码将检测每个表单提交,但不会处理重复项。它也不会刷新页面两次(这对于连接速度较慢的用户来说并不理想)。

    【讨论】:

      【解决方案3】:

      处理表单发布后,只需将请求重定向到同一页面。这可以在 PHP 中按如下方式完成:

      <?php header('Location: http://www.example.com/'); ?>
      

      如果用户刷新(在此重定向之后),则不会重新提交任何内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-09
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 2013-10-27
        相关资源
        最近更新 更多