如何真正解決表單重複提交問題php代碼

過去一切時代的精華盡在書中。以下是小編爲大家搜索整理的如何真正解決表單重複提交問題php代碼,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!

如何真正解決表單重複提交問題php代碼

以前用的js表單防止重複提交方法

代碼如下

<script type="text/javascript">
var checkSubmitFlg = false;
function checkSubmit() {
if (!checkSubmitFlg) {

// 第一次提交
checkSubmitFlg = true;
return true;
} else {

//重複提交
alert("Submit again!");
return false;
}
}
</script>

//以下三種方式分別調用

<form onsubmit="return checkSubmit();">

<input type="submit" onclick="return checkSubmit();" />

<input type="button" onclick="s[0]on='./test';s[0]it();return checkSubmit();" />

這樣如果我直接做一個表單,然後提交給/test,上面代理就是一個擺設了,那我們要如何解決此問題

如果您已經知道如何解決的話那麼這篇文章可能不適合你的口味,paperen這裏也打算從基礎開始討論,所以希望一步看到解決方案的您也可能不太適合,所以請注意。So~開始吧 ~

paperen想您一定知道表單是什麼吧,form元素就是表單,一般網頁需要輸入的地方必定使用了表單元素,也很常見,一般的代碼如下:

代碼如下

<form

method="post">
<p>
<label for="test">隨便輸入點什麼</label>
<input type="text" name="data" id="test" />
</p>
<p>
<input type="submit" value="提交" name="submit" />
</p>
</ul>
</form>

重點其實是form與input元素,p元素只是paperen私自加上去的,對後續的說明沒有任何影響,其實很簡單,所謂input就是輸入了,你可以完全將input 元素理解爲是用作用戶輸入,只是某些屬性的(type)不能作爲輸入而已(這裏就是submit),而form元素你完全可以將它理解爲是一個袋子,將所有用戶輸入數據到裝在它裏面之後用 來提交回服務端處理,但對於form元素值得注意的是method屬性,一般來說有get與post兩種方法,其實不要想得太複雜(因爲深入的不需要太理解,對於後續的內容沒有太多關係,如 有興趣不妨可以使用瀏覽器的調試工具查看請求頭部信息與發送信息,例如firebug),表現出來就是,使用get提交表單的話所有的input元素的值將會在地址欄處出現,而post則不會, 例如使用get提交此表單後的瀏覽器地址欄

代碼如下

http://localhost/mytest/token/

post則在 地址欄看不到了,使用fiebug可以看到如下信息

可以簡單認爲get是顯式傳送數據的,而 post則是隱式傳送數據的,但還有一個很大區別的是post支持更多更大的數據傳送。

Next,當表單代碼寫好了,那麼讓我們來進行服務器腳本的編寫(這裏就是PHP)。很簡單 ~

代碼如下
<?php
if ( isset( $_POST['submit'] ) ) {
//表單提交處理
$data = isset( $_POST['data'] ) ? htmlspecialchars( $_POST['data'] ) :

'';
//Insert or Update數據庫
$sql = "insert into test (`string`) values ('$data')";
//do query
echo $sql;
}
?>

因爲這裏是post傳送數據的,所以使用PHP的$_POST全局變量就能獲取到表單提交的數據,所有使用post方法的表單數據提交到服務端都會被保存在這個$_POST全局變 量中,不妨可以試試print_r( $_POST )這個變量你就明白了。

首先檢查一下是否在$_POST數組裏面存在submit,如果存在則證明是表單提交過來的,正如中好像有個 叫ispostback的一樣,只是這樣沒那麼嚴謹而已,但是不要緊之後會解決這個問題的。

之後接收輸入框的數據,就是$_POST['data'],別忘了使用htmlspecialchars對這個進 行一下html過濾,因爲防止輸入了html標籤或javascript造成問題(貌似叫做XSS漏洞)。最後就是拼接到sql語句中送入數據庫跑了(只是這裏paperen並沒有很詳細使用一些操作數據庫的 函數例如mysql_query,有興趣自己完成它)。恭喜,到了這裏你已經順利地完成了一個數據錄入的功能了,但是有個地方你總得改善吧,插入數據後總得給操作者一個提示吧~~至少提示 我操作失敗還是成功。所以整個代碼paperen寫成以下樣子。

代碼如下

<?php
if ( isset( $_POST['submit'] ) ) {
//表單提交處理
$data = isset(

$_POST['data'] ) ? htmlspecialchars( $_POST['data'] ) : '';
//connect
mysql_connect( 'localhost', 'root', 'root' );

//select db
mysql_select_db( 'test' );
//設置字符集防止亂碼
mysql_query( 'set names "utf8"' );
//SQL
$sql = "insert

into `token` (string) values ('$data')";
//query
mysql_query( $sql );
$insert_id = mysql_insert_id();
if (

$insert_id ) {
$state = 1;
} else {
$state = 0;
}
}
?>

<?php if ( isset( $state )

&& $state ) { //數據插入成功 ?>

<p>插入成功 <a href="">返回</a></p>

<?php } else { //失敗或者沒有插入動

作 ?>

<form method="post">

<p>

<label for="test">隨便輸入點什麼</label>

<input type="text"

name="data" id="test" />

</p>

<p>

<input type="submit" value="提交" name="submit" />

</p>

</ul>

</form>

<?php } ?>

html的聲明與head還有body都省略了,對比於一開始的代碼其實主要是實現了真正插入數據庫動作與給出 了操作反饋(通過$state變量),不妨自己拷貝代碼然後試試(當然請根據自己實際情況修改數據庫操作部分的代碼)。代碼正常,邏輯沒問題,但是有個問題,就是在顯示插入成功後再刷新頁 面又會執行了表單處理動作,又插了一遍數據!這就是所謂的重複插入問題。在放出解決方案之前您可以自己思考一下該如何解決。

你會不會認爲是接收數據與顯示處理結果都是 這個頁面所以纔會導致這個問題?也對,也可以這麼認爲,使用一些調試工具你會發現,瀏覽器還對post的數據進行了保留,故在提交完表單後再刷新的話該post數據會重新提交了一遍。

如果有辦法將瀏覽器的這個臨時保存的post數據清空掉不就解決問題了,但服務端是沒法 做到這點的,因爲這是瀏覽器自身的事情,要麼我們就重定向了不然再刷新還是會重複提交數據。

到目前爲止也許你已經瞭解到重複提交的意思與問題的惡劣所在,如果 你不是選用重定向的`辦法那麼就得另外想一個辦法了,所以令牌解決辦法就是這麼過來的。