首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在单击“后退”按钮后防止重新提交表单

问在单击“后退”按钮后防止重新提交表单
EN

Stack Overflow用户
提问于 2011-10-12 23:00:51
回答 6查看 27.2K关注 0票数 4

我有两页:

page1.php :

  • 有一个带有文本框和“提交”按钮的表单。例:<form name="frm_register" action="page1.php" method="post">
  • php和mysql代码将文本框的值存储到数据库中。在将值提交到数据库后,Javascript将将页面重定向到php2.php。例:
代码语言:javascript
复制
$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%的问题如下:

​

代码语言:javascript
复制
    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');重定向到自己的页面(相同的页面),使页面忘记以前的表单提交。代码示例:

​

代码语言:javascript
复制
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()首先发送输出。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-10-12 23:18:44

而不是

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

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

所以在psuedo代码中,

单击page.php动作提交page1.php page1.php将数据提交给数据库调用

代码语言:javascript
复制
header('Location: http://example.com/page2.php');

这将防止您的单击回退问题。

票数 4
EN

Stack Overflow用户

发布于 2011-10-12 23:16:57

您可以通过实现后重定向-获取(PRG模式)来防止重新提交。

如果您有http_redirect函数,那么可能只是一行:

代码语言:javascript
复制
http_redirect("page2.php");

而不是你的javascript回显。

如果没有,这是两行:

代码语言:javascript
复制
header("Location: http://example.com/page2.php");
exit;

用站点的主机名替换example.com。

相关:员额);我对PHP Post/重定向/Get感到困惑

票数 1
EN

Stack Overflow用户

发布于 2011-10-12 23:05:34

一种方法是通过Ajax将Formdata提交到远程脚本,如果查询返回成功,则可以跳过a“谢谢”页面。这样用户就可以点击Back Button,"Reload“请求就不会弹出。

希望这个想法对你有帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7747569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档