单击“返回”按钮后阻止重新提交表单

时间:2011-10-12 23:00:51

标签: php javascript mysql

我有2页:

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

- 用于将textbox的值存储到数据库的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
- mysql从数据库中检索数据并显示在此页面上。

问题:当我按“返回”按钮时,浏览器会弹出一条警告消息,提示表单将重新提交。单击“返回”按钮时如何防止重新提交表单?是否需要清除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']来决定是否要显示错误消息“同名”。如果成功将数据提交到数据库或成功跳转到page2.php,我会终止session['error123']。我还使用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()之前。缓冲区将停止包括会话在内的所有输出,让header()先发送输出。

6 个答案:

答案 0 :(得分:4)

而不是

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

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

所以在psuedo代码中,

点击page.php action page1.php上的提交 page1.php将数据提交给数据库调用

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

这可以防止您点击回来的问题

答案 1 :(得分:1)

您可以通过实施Post-Redirect-Get (PRG Pattern)来阻止重新提交。

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

http_redirect("page2.php");

而不是你的javascript回声。

如果没有,那就是两行:

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

example.com替换为网站的主机名。

相关:Back button re-submit form data ($_POST); I am confused about PHP Post/Redirect/Get

答案 2 :(得分:0)

一种方法是通过Ajax将Formdata提交到远程脚本,如果Query返回成功,您可以跳转到“谢谢”页面。 因此,用户可以点击后退按钮,并且不会弹出“重新加载”请求。

希望理念帮助你

答案 3 :(得分:0)

您可以通过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;
}

答案 4 :(得分:0)

在用户点击后退按钮时,在显示为离线的页面中添加此代码:

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

答案 5 :(得分:-1)

创建如here

所示的会话

你应该使用会话并从每个页面验证用户,你会惊讶于SESSION如何工作!惊人!