阻止在点击后退按钮时重新提交表单

2022-08-30 18:21:16

我在这里和其他地方搜索了许多帖子,但似乎找不到解决我的问题的方法。我有一个显示数据库条目的页面:数据库.php。可以使用表单筛选这些条目。当我过滤它们并仅显示我感兴趣的条目时,我可以单击一个条目(作为链接),它将我带到该条目页面(通过php GET)。当我在该条目页面(即“查看.php?id=1”)并点击后退按钮(返回数据库.php)时,过滤表单需要确认表单重新提交。有什么办法可以防止这种情况吗?

以下是一些(简化的)代码示例:

数据库.php:

<form>
    <select>
        <option>1</option>
        <option>2
        <option>
    </select>
    <input type="submit" name="apply_filter" />
</form>
<?php
if ( isset( $_POST[ "apply_filter" ] ) ) { // display filtered entries
    $filter = $_POST[ "filter" ];
    $q = "Select * from table where col = '" . $filter . "'";
    $r = mysql_query( $q );
} else { // display all entries
    $q = "Select * from table";
    $r = mysql_query( $q );
}
while ( $rec = mysql_fetch_assoc( $r ) ) {
    echo "<a href='view.php?id=" . $rec[ "id" ] . "'>" . $rec[ "name" ] . "</a><br />"; // this is where the link to the view.php page is...
}
?>

现在如前所述,如果我点击链接,它会带我“查看.php?id=whatever”。在该页面上,我只从URL中获取ID以显示该单个条目:

视图.php:

<?php
$id = $_GET[ "id" ];
$q = "Select * from table where id = '" . $id . "'";
$r = mysql_query( $q );
while (  ) {
    // display entry
}

?>

如果我现在点击后退按钮,数据库.php上的表单(用于过滤数据库结果的表单)需要确认才能重新提交。这不仅很烦人,对我来说也没用。

我该如何解决这个问题?我希望代码示例和我的问题的解释是足够的。如果没有让我知道,我会尝试指定。


答案 1

我知道这个问题已经很老了,但是我自己也有这个问题,我发现有两行作品是:

header("Cache-Control: no cache");
session_cache_limiter("private_no_expire");

答案 2

据我所知,有两种方法可以做到这一点。简单的方法和困难的方式。

无论如何,当您处理基于状态的页面(using)时,您应该这样做以保持页面的“活动”并在您的控制之下,以防止缓存所有页面,如下所示:$_SESSION

<?php
//Set no caching
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: no-store, no-cache, must-revalidate"); 
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>

困难的方法包括生成一个ID并将其作为隐藏输入或cookie存储在页面上的某个位置。然后,在服务器上存储与 .如果它们不匹配,则一系列预编程的类型语句会导致页面重新提交时不会发生任何事情(这是当您单击后退时它尝试执行的操作)。&_SESSION$_SESSIONifelse

简单的方法是,如果表单已成功提交,则只需将用户重定向回表单提交页面,如下所示:

header('Location: http://www.mydomain.com/redirect.php');

我希望这有帮助!


推荐