js 阻止重複提交
第一個是將告訴瀏覽器禁用submit按鈕的表單被提交之後,第二個是將更改按鈕的文本來給使用者一些知道發生了什麼。這是代碼添加到你的表單標記:onsubmit="document.getElementById('myButton').disabled=true;document.getElementById('myButton').value='Submitting, please wait...';"你的表單標記將類似於:
或jquery做法
$(document).ready(function(){
$(input:submit).click(){
setTimeout(function(){obj.disabled=true;},100)
};
});
PHP程式員就是這樣實現防止使用者多表單提交的;這種方法應用於大多數的瀏覽器(IE +,FireFox、Opera、…)。
Session阻止重複提交
由於表單變數的內容由$_POST[‘name’]引用,也許在處理完表單後,直接將$_POST[‘name’]銷毀(unset())即可, 其實不然可能由於頁面預設對錶單內容進行了緩衝,所以,即使銷毀了$_POST[‘name’],重新整理後,$_POST[‘name’]還是會被賦值,一 樣有效。
可利用Session解決。首先給Session賦個值,比如400,第一次提交成功後改變Session的值,當第二次提交時去檢查這個Session的值,如果不是400,就不再處理表單中的資料。 可設定Session的有效時間?
<?php
if (isset($_POST[‘action’]) && $_POST[‘action’] == ’submitted’) {
session_start();
isset($_SESSION[‘num’]) or die (“no session”);
if ($_SESSION[‘num’]==400){
echo ‘<a href=”‘.$_SERVER[PHP_SELF] .'”>Please try again</a>';
$_SESSION[‘num’]=500;
} else {
echo “However you have submitted”;
}
} else {
session_start() or die(“session is not started”);
$_SESSION[‘num’]= 400;
?>
<form action=”<?php echo $_SERVER[‘PHP_SELF’]; ?>” method=”POST”>
Name: <input type=”text” name=”personal[name]”><br>
Email: <input type=”text” name=”personal[email]”><br>
Beer: <br>
<select multiple name=”beer[]”>
<option value=”warthog”>Warthog</option>
<option value=”guinness”>Guinness</option>
<option value=”stuttgarter”>Stuttgarter Schwabenbr</option>
</select><br>
<input type=”hidden” name=”action” value=”submitted”>
<input type=”submit” name=”submit” value=”submit me!”>
</form>
<?php
}
?>
cookie阻止重複提交
引入cookie機制來解決(這個方法不建議用,原因後面會寫到)
提交頁面代碼如下a.php代碼如下:
<form id="form1" name="form1" method="post" action="b.php">
<p>說明
<input type="text" name="titile" />
</p>
<p>
<input type="submit" name="Submit" value="提交" />
</p>
</form>
<?php
setcookie("onlypost", 't'); //設定cookie,可以帶上時間值。像有些論壇防止灌水就可以將你的一些基本資料存放到裡面。
?>
處理頁面b.php代碼如下:
<?php
if($_COOKIE['onlypost'] == 't'){
printr($COOKIE);
//處理提交的內容 如果驗證成功則處理
print "ok";
setcookie("onlypost", 'f'); //改變cooike值刪除也可以了
}
?>
利用header函數跳轉
一旦使用者點擊提交按鈕,處理完資料後跳到其他頁面
if (isset($_POST['submit'])) {
header('location:success.php');//處理資料後,轉向到其他頁面
}
利用資料庫來添加約束
直接在資料庫裡添加唯一約束或建立唯一索引,一旦發現使用者重複提交了,直接拋出警告或者提示,
或者只處理第一次提交的資料,這是最直接有效方法,要求前期的資料庫設計和架構要考慮周全