2011-07-16 47 views
3

如果用戶發佈表單,然後單擊瀏覽器刷新按鈕,以下操作是否會停止我數據庫中意外重複的條目?如何通過瀏覽器刷新防止重複的帖子?

<?php 
    if($_SERVER['REQUEST_METHOD']=='POST') { 

     try { 
      // write to database 
     } catch($e) { 
      // error reporting 
     } 
    } 
?> 
+1

你試過了嗎? – JJJ

回答

2

我沒有看到有任何代碼可以區分第一篇文章和重複文章。你應該做的是在處理POST後將瀏覽器重定向到不同的URL,這樣如果他們按下刷新,他們不會刷新表單的目標並重新POST。

2

您應該使用Dan Grossman的方法,POST操作後總是重定向。這也是另一種選擇,它增加了額外的安全性:

將一次性令牌添加到您的表單並將其保存爲$_SESSION-變量。然後,如果它被使用(表單被提交),從會話中刪除它(或創建一個新的標記)。如果表單再次發送,則兩個標記不匹配,並且您有一個重複的條目(例如,您可以忽略第二個條目)。

3

不,因爲如果他們點擊刷新按鈕(或後退/前進,無論什麼),瀏覽器將嘗試再次POST。你想要的是Post/Redirect/Get範例。請注意,這隻會阻止通過導航重複提交。如果您想防止通過多次點擊表單提交重複提交,您必須在發佈後嘗試使用javascript來以某種方式禁用按鈕。

一些代碼:

<?php 
    if ('POST' == $_SERVER['REQUEST_METHOD']) { 
     //do processing 
     //303 forces a GET request 
     header("Location: thank-you-page", true, 303); 
     exit; 
    } 
    else { 
     //handle bad page visit. 
    } 
?> 
相關問題