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