如果用戶發佈表單,然後單擊瀏覽器刷新按鈕,以下操作是否會停止我數據庫中意外重複的條目?如何通過瀏覽器刷新防止重複的帖子?
<?php
if($_SERVER['REQUEST_METHOD']=='POST') {
try {
// write to database
} catch($e) {
// error reporting
}
}
?>
如果用戶發佈表單,然後單擊瀏覽器刷新按鈕,以下操作是否會停止我數據庫中意外重複的條目?如何通過瀏覽器刷新防止重複的帖子?
<?php
if($_SERVER['REQUEST_METHOD']=='POST') {
try {
// write to database
} catch($e) {
// error reporting
}
}
?>
使用Post-Redirect-Get pattern - 數據成功提交後總是重定向。
我沒有看到有任何代碼可以區分第一篇文章和重複文章。你應該做的是在處理POST後將瀏覽器重定向到不同的URL,這樣如果他們按下刷新,他們不會刷新表單的目標並重新POST。
您應該使用Dan Grossman的方法,POST操作後總是重定向。這也是另一種選擇,它增加了額外的安全性:
將一次性令牌添加到您的表單並將其保存爲$_SESSION
-變量。然後,如果它被使用(表單被提交),從會話中刪除它(或創建一個新的標記)。如果表單再次發送,則兩個標記不匹配,並且您有一個重複的條目(例如,您可以忽略第二個條目)。
不,因爲如果他們點擊刷新按鈕(或後退/前進,無論什麼),瀏覽器將嘗試再次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.
}
?>
你試過了嗎? – JJJ