轉載於:http://www.hlmblog.com/183.html
在提交表單的時候,可能遇到網速等導致頁面突然加載變慢,用戶重複地點擊提交按鈕,將在數據庫產生多條數據,導致不可控情況。
例如下面的情況就會導致表單重複提交:
點擊提交按鈕兩次。
點擊刷新按鈕。
使用瀏覽器後退按鈕重複先前的操作,導致重複提交表單。
使用瀏覽器歷史記錄重複提交表單。
瀏覽器重複的HTTP請求。
網頁被惡意刷新。
下面是幾個解決的方法:
一:利用js設定按鈕點擊後變成灰色
$(document).ready(function(){ $(input:submit).click(){ setTimeout(function(){obj.disabled=true;},100) }; });
二:利用session
表單隱藏域中存放session(表單被要求時產生的標記)。
採用此方法在接收表單資料後,檢查此標誌值是否存在,先進行刪除,然後處理資料; 若不存在,說明已提交過,忽略本次提交。
//服务端生成随机数存入session, 分配至表单页 $data['sess_id'] = $_SESSION['sid'] = mt_rand(1000, 9999); $this->load->view('form', $data); //表单页隐藏域存放此session值 <input type="hidden" name="sid" value="<?=$sess_id; ?>"> //处理 if($_POST['sid'] != '' && $_POST['sid'] == $_SESSION['sid']) { unset($_SESSION['sid']); echo '处理数据'; } else { echo '已提交过表单'; }
三:利用cookies
原理和session差不多,但是cookies一旦用戶瀏覽器禁用cookies,這功能就失效了
if(isset($_POST['submit'])){ setcookie("tempcookie","",time()+30); header("Location:".$_SERVER[PHP_SELF]);exit(); } if(isset($_COOKIE["tempcookie"])){ setcookie("tempcookie","",0);echo "您已经提交过表单"; }
四:利用header函數跳轉
if (isset($_POST['submit'])) { header('location:success.php');//处理数据后,转向到其他页面 }
rrreee點擊完資料後跳到其他頁面
rrreee
五:利用資料庫來新增約束
直接在資料庫中新增唯一約束或建立唯一索引,一旦發現使用者重複提交了,直接拋出警告或提示,
或只處理第一次提交的數據,這是最直接有效的方法,要求前期的資料庫設計和架構要考慮周全以上就介紹了php 解決和避免form表單重複提交的方法,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。 🎜 🎜 🎜