当前位置: 首页 > 面试题库 >

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

公孙驰
2023-03-14
问题内容

我有2页:

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

-用于将文本框的值存储到数据库的php和mysql代码。将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%的问题如下所示:

    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()之前。缓冲区将停止包括会话在内的所有输出,让header()首先发送输出。


问题答案:

而不是

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

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

所以在伪代码中

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

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

这样可以避免您的点击后退问题



 类似资料:
  • 问题内容: 在下一页中,使用Firefox的“删除”按钮提交表单,但“添加”按钮不提交。如何防止“删除”按钮提交表单? 问题答案: 你正在使用HTML5按钮元素。请记住,原因是此按钮具有默认的提交行为,如W3规范所述,如此处所示: W3C HTML5按钮 因此,你需要明确指定其类型: 为了覆盖默认的提交类型。我只想指出发生这种情况的原因=)

  • 问题内容: 我的问题是,当上一页由表单创建时,后退按钮会使浏览器说“页面已过期”。 例: 第1页:使用搜索条件提交的表单($ _POST请求,该表单指向第2页) page2:接收$ _POST请求并显示结果(带有链接的用户列表,指向page3) 第3页:显示用户个人资料 现在,当访客单击浏览器中的“后退”按钮时,它将显示类似“页面已过期”的信息。 而是应该在没有警告的情况下显示前一页(第2页,带有

  • 问题内容: 在表单中使用按钮时出现问题。我希望该按钮调用功能。它确实可以,但是刷新页面的结果令人讨厌。 我的简单代码是这样的 单击该按钮后,该函数将在页面刷新时被调用,这会重置所有我先前的请求,这会影响到当前页面,这是先前请求的结果。 我应该怎么做才能防止页面刷新? 问题答案: 让我们返回false。这将解决它。

  • 问题内容: 我想防止使用angular.js提交多个表单。 当用户单击表单提交按钮时,提交按钮的值/标签应更改为“正在加载..”,按钮的状态将设置为“已禁用”,并且应以正常方式触发提交事件,从而导致向服务器提交呼叫。这样,用户将看到以下效果: 立即:提交按钮的值更改为“正在加载..”并被禁用 服务器响应后:向用户显示服务器请求的结果(而服务器响应的处理无需任何干预) 我制作了这个小玩意来表达我的意

  • 问题内容: 我有一个简单的表格,我不想多次意外提交。 当他们第一次看到该页面时,我可以轻松地阻止他们进行多次单击,但是我无法控制他们单击“后退”按钮。 因此,在与Struts合作之后,我决定采用表单提交令牌。 有更容易的方法吗?Seam中已经有此功能吗?如果没有,我应该如何在Seam中构建此功能? //编辑//这里只是澄清一下,我不需要某些东西可以防止用户双击。已经解决了。 具体用例如下:用户单击

  • 问题内容: 我在网上浏览了很多,其中包括几个堆栈溢出示例,以解决该问题。具体来说,我尝试了以下方法: 两者都不如广告中所述。还有其他建议吗?请仅提供角度建议。谢谢。 问题答案: 您非常接近答案。您唯一错过的是使用调用按钮上的函数。 另一个问题是,控制器中的功能应该是,而不是 工作示例: index.html应该类似于: 您的控制器application.js就像: