2013-03-05 108 views
17

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

这里有一些(简化)代码示例:

database.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... 
} 
?> 

现在提到,如果我点击链接,就带我到“view.php? ID =什么”。在该页面中,我刚刚从URL获得ID,以显示单个条目:

view.php:

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

?> 

如果我现在打的返回按钮,在database.php中的形式(用于过滤DB结果的那个)需要确认重新提交。这不仅非常烦人,对我也无用。

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

+3

** POST ** - > * ServerSide 302重定向* - > ** GET ** – scunliffe 2013-03-05 15:15:09

+0

我知道有很多这个主题的帖子。浏览他们我无法弄清楚我自己的问题,所以我决定把它作为一个新问题。 – user1889382 2013-03-05 15:16:19

+0

您可能想要使用'Post-Redirect-Get'模式,请参阅https://en.wikipedia.org/wiki/Post/Redirect/Get以及http://stackoverflow.com/questions/15288229/automatically-在浏览器中重新发送请求时使用后退按钮 – 2014-07-29 14:59:31

回答

9

我知道有两种方法可以做到这一点。简单的方式和艰难的方式。

无论如何,当您处理基于状态的页面(使用$_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,并在页面上的某个地方把它作为一个隐藏的输入或&_SESSION饼干。然后你在服务器上存储相同的标识为$_SESSION。如果它们不匹配,则一系列预编程的ifelse类型语句会在页面重新提交时发生任何事情(这是您在单击时尝试执行的操作)。

最简单的方法是简单地将用户重定向回表单提交页面,如果表单已成功提交,就像这样:

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

我希望这有助于!

+1

我不理解“简单的方法”..如果用户在“查看”页面上没有办法重定向他,因为我不知道他多久,他想要查看该页面上的信息。我包含一个重定向按钮,它将用户带回到表单页面;这并不麻烦。只有当用户按下回到整个数据库时,问题才会出现。 – user1889382 2013-03-05 15:10:13

+0

你会从你的表单提交到'Database.php',然后收集所有的信息,并在该脚本的末尾使用'header_'中的$ _GET'样式URL重定向用户('Location:http:// www.mydomain.com/view.php?databse=this&somethingelse=that');' – 2013-03-05 15:15:32

3

有一件事可能会帮助您的过滤器窗体使用GET方法而不是POST

浏览器通常会阻止POST输入被自动重新提交,这是使用GET输入时不会执行的操作。此外,这将让用户使用过滤器链接到您的页面。

+1

该解决方案最适合搜索/过滤表单。对于创建/更新表单重定向是最好的。 – 2015-09-02 10:14:32

17

我知道这个问题是旧的,但有这个问题我自己,两行我发现作品有:

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

我们必须添加这些行吗? – user3663 2017-09-25 07:58:35

+0

@ user3663我在所有页面上都使用了它,但可能仅在界面页面上工作,例如view.php关于OP的问题。 – 2017-09-25 12:52:35

-1

您需要删除请求从浏览器的历史POST数据

history.replaceState("", "", "/the/result/page") 

this答案

您也可以按照Post/Redirect/Get模式。

0

如果/当页面被重新加载时,另一种解决方案也可以使用,它涉及使用$ _SESSION检查帖子的原创性。简而言之,检查一个唯一的或随机的字符串。在if块

<input type="hidden" name="formToken" value="<?php echo microtime();?>"/> 

然后包裹PHP函数来验证并解析形式的数据:

在表单中,使用RAND()或microtime中()中设置的值增加一个输入元件:

if(!isset($_SESSION['formToken']) || $_POST['formToken'] !== $_SESSION['formToken'])){ 
     $_SESSION['formToken'] = $_POST['formToken']; 
     /*continue form processing */ 
} 
相关问题