在提交表單的時候,可能遇到網(wǎng)速等導(dǎo)致頁面突然加載變慢,用戶重復(fù)地點擊提交按鈕,將在數(shù)據(jù)庫產(chǎn)生多條數(shù)據(jù),導(dǎo)致不可控情況。
比如下面的情況就會導(dǎo)致表單重復(fù)提交:
點擊提交按鈕兩次。
點擊刷新按鈕。
使用瀏覽器后退按鈕重復(fù)之前的操作,導(dǎo)致重復(fù)提交表單。
使用瀏覽器歷史記錄重復(fù)提交表單。
瀏覽器重復(fù)的HTTP請求。
網(wǎng)頁被惡意刷新。
下面是幾種解決的方法:
一:利用js設(shè)置按鈕點擊后變成灰色
1 2 3 4 5
| $(document).ready(function(){
$(input:submit).click(){
setTimeout(function(){obj.disabled=true;},100)
};
}); |
二:利用session
加載提交的頁面時候,生成一個隨機數(shù),
$code = mt_rand(0,1000000);
存儲在表單的隱藏輸入框中:
< input type="hidden" name="code" value="“>
在接收頁面的PHP代碼如下:
1 2 3 4 5 6 7 8 9
| <?php
session_start();
if( isset($_POST['code'])) {
if($_POST['code'] == $_SESSION['code']){
// 重復(fù)提交表單了
}else{
$_SESSION['code'] =$_POST['code']; //存儲code
}
}?> |
三:利用cookies
原理和session差不多,但是cookies一旦用戶瀏覽器禁用cookies,這功能就失效了
四:利用header函數(shù)跳轉(zhuǎn)
一旦用戶點擊提交按鈕,處理完數(shù)據(jù)后跳到其他頁面
1 2 3
| if ( isset($_POST['submit'])) {
header('location:success.php');//處理數(shù)據(jù)后,轉(zhuǎn)向到其他頁面
} |
五:利用數(shù)據(jù)庫來添加約束
直接在數(shù)據(jù)庫里添加唯一約束或創(chuàng)建唯一索引,一旦發(fā)現(xiàn)用戶重復(fù)提交了,直接拋出警告或者提示,
或者只處理第一次提交的數(shù)據(jù),這是最直接有效的方法,要求前期的數(shù)據(jù)庫設(shè)計和架構(gòu)要考慮周全
|