防止点击“返回”后重新提交表单;按钮


Prevent resubmit form after click "back" button

我有两个页面:

page1.php:
-有一个带有文本框和"提交"按钮的表单。例如:<form name="frm_register" action="page1.php" method="post">

—PHP和mysql代码将文本框的值存储到数据库。在将值提交给数据库后,Javascript会将页面重定向到php2.php。例如:

$query = "INSERT INTO traceuser (username) VALUES ('{$username}')";
$result = mysql_query($query, $connection);
echo '<script language="javascript">window.location="page2.php";</script>';

page2.php

问题:当我按下"返回"按钮时,浏览器会弹出一个警告消息,说表单将被重新提交。如何防止在点击"返回"按钮时重新提交表单?我是否需要清除page1.php的缓存?如何做它与php或javascript或ajax?


更新1:感谢您将javascript window.location="page2.php"替换为php header('Location: home2.php');的答案。它解决了80%的问题。剩下的20%的问题如下:

    if (strtotime($_SESSION['servertime']) < time()-3){ //10800 = 3 hours 3600 = 1 hour
                if (($username != "") AND ($username != $_SESSION[username])){
                    $_SESSION['servertime'] = $servertime; 
                    $_SESSION['username'] = $username;
                    $query = "INSERT INTO traceuser (username) VALUES ('{$username}')";
                    $result = mysql_query($query20, $connection);
                    header('Location: page2.php');
                    exit;
                } else {
                    echo "same name"; //problem here
                }
            }else{
                echo "submit multiple data too fast"; //problem here too.
            }
   }

执行以下步骤时出现问题:
1)用户提交数据成功,跳转到page2.php查看记录
2)用户点击"返回"按钮,跳转回page1.php。
3)用户提交数据失败,停留在page1.php。(因为太快或者同名)
4)用户提交数据成功,跳转到page2.php查看记录
5)用户点击"返回"按钮,浏览器提示"表单将被重新提交"

问题出在步骤3。步骤3没有运行header('Location: page2.php');,没有跳转到page2.php。因此,它导致第5步显示警告消息。如何解决这个问题?


更新2:我已经找到了解决20%问题的方法,它工作得很好。我使用session['error123']来决定是否要显示错误信息"同名"。我杀死session['error123']如果成功提交数据到数据库或如果成功跳转到page2.php。我还使用header('Location: page1.php');重定向到自己的页面(同一页面),使页面忘记之前的表单提交。代码示例:

if ($_SESSION['error123'] == "toofast"){
    echo $_SESSION['error123'] ;
}elseif ($_SESSION['error123'] == "samename"){
    echo $_SESSION['error123'] ;
}
if (strtotime($_SESSION['servertime']) < time()-3){ //10800 = 3 hours 3600 = 1 hour
                if (($username != "") AND ($username != $_SESSION['username'])){
                    $_SESSION['username'] = $username;
                    $query = "INSERT INTO traceuser (username) VALUES ('{$username}')";
                    $result = mysql_query($query20, $connection);
                    $_SESSION['error123'] = "aa";
                    header('Location: http://localhost/plekz/page2.php');
                    exit;
                } else {
                    $_SESSION['error123'] = "samename";
                    header('Location: http://localhost/plekz/page1.php');
                    exit;
                }
            }else{
                $_SESSION['error123'] = "toofast";
                header('Location: http://localhost/plekz/page1.php');
                    exit;
            }
        }
    }

注意:你需要缓冲<?php ob_start();?>的输出,因为$_SESSION不能放在header()之前。Buffer将停止包括session在内的所有输出,让header()先发送输出

而不是

echo '<script language="javascript">window.location="page2.php";</script>';

你应该使用header()函数在提交后重定向你的用户。

在psuedo代码中,

在page.php上点击提交动作page1.phpPage1.php提交数据到数据库调用

header('Location: http://example.com/page2.php');

这应该可以防止你点击返回的问题

您可以通过实现Post-Redirect-Get (PRG模式)来防止重新提交。

可以只是一行,如果你有http_redirect函数:

http_redirect("page2.php");

代替javascript的echo。

如果没有,那就是两行:

header("Location: http://example.com/page2.php");
exit;

example.com替换为站点的主机名

相关:返回按钮重新提交表单数据($_POST);我很困惑PHP Post/Redirect/Get

一种方法是通过Ajax将Formdata提交给远程脚本,如果查询返回成功,则可以跳转到"Thank you"页面。所以用户可以点击后退按钮,"重新加载"请求不会弹出。

希望这个想法对你有帮助

可以通过Ajax调用来代替吗?表单上没有任何动作,提交将调用Ajax函数。Ajax调用将执行查询,并提供响应(您可以只是回送一个结果),然后您可以根据结果提供动态反馈。你永远不会离开这页。

<form id="thisForm">
...form input fields...
<input type="button" onclick="return submitForm('thisForm')"/>
</form>
function submitForm(formId) {
    $.ajax( {
        type: "post",
        url: 'page2.php',
        data: $('#' + formId + ' input').serialize(),
        ... any other Ajax parameters...,
        success: function(data) {
        }
    });
    return false;
}

在用户单击后退按钮时显示为脱机的页面中添加以下代码:

<?php
 session_start();
 header_remove("Expires");
 header_remove("Cache-Control");
 header_remove("Pragma");
 header_remove("Last-Modified");
?>

创建如下所示的会话

你应该使用session并从每个页面验证用户,你会惊讶于session是如何工作的!神奇的!