前言
為什麼要避免form表單被重複提交呢?因為我們不想讓我們的伺服器重複處理沒必要的資料,同時我們也是避免我們的資料庫產生重複的資料,避免表單重複提交也是讓我們的**更安全的一種表現。
先看一下有哪些情況下回導致表單重複提交呢,知道哪些情況下可能會出現表單重複提交就可以從根源處理表單重複提交的情況了。
下面的情況就會導致表單重複提交:
點選提交按鈕兩次。
點選重新整理按鈕。
使用瀏覽器後退按鈕重複之前的操作,導致重複提交表單。
使用瀏覽器歷史記錄重複提交表單。
瀏覽器重複的http請求。
&nbs程式設計客棧p; 網頁被惡意重新整理。
下面是幾種解決辦法:
一:利用js設定按鈕點選後變成灰色
點選完按鈕之後變成灰色就不能點選了,使用者需要再次提交表單的話就要重新整理頁面之後重新填寫資料再提交了。
二:利用session
在session中放乙個特殊標誌。當表單頁面被請求時,生成乙個特殊的字元標誌串,存在session中,同時放在表單的隱藏域裡。接受處理表單資料時,檢查標識字串是否存在,並立即從session中刪除它,然後正常處理資料。
如果發現表單提交裡沒有有效的標誌串,這說明表單已經被提交過了,忽略這次提交。
這使你的web應用有了更高階的xsrf保護
載入提交的頁面時候,生成乙個隨機數,
$code = mt_rand(0,1000000);
儲存在表單的隱藏輸入框中:
< input type=」hidden」 name=」code」 value=」」>
在接收頁面的php**如下:
<?php session_start();
if(isset($_post[『code'])) else
}?>
三:利用cookies
原理和session差不多,但是cookies一旦使用者瀏覽器禁用cookies,這功能就失效了
if(is程式設計客棧set($_post[『submit']))
if(isset($_cookie[「tempcookie」]))
四:利用header函式跳轉
一旦使用者點選提交按鈕,處理完資料後跳到其他頁面
if (isset($_post[『submit']))
五:利用資料庫來新增約束
直接在資料庫裡新增唯一約束或建立唯一索引,一旦發現使用者重複提交了,直接丟擲警告或者提示,或者只處理第一次提交的資料,這是最直接有效的方法,要求前期的資料庫設計和架構要考慮周全.程式設計客棧
六:post/redirect/get模式。
在提交後執行頁面重定向,這就是所謂的post-redirect-get (prg)模式。簡言之,當使用者提交了表單後,你去執行乙個客戶端的重定向,轉到提交成功資訊頁面。
if (isset($_post[『action']) && $_post[『action'] == 『submitted')
總結
php 解決和避免form表單重複提交的方法
在提交表單的時候,可能遇到網速等導致頁面突然載入變慢,使用者重複地點選提交按鈕,將在資料庫產生多條資料,導致不可控情況。比如下面的情況就會導致表單重複提交 點選提交按鈕兩次。點選重新整理按鈕。使用瀏覽器後退按鈕重複之前的操作,導致重複提交表單。使用瀏覽器歷史記錄重複提交表單。瀏覽器重複的http請求...
PHP 表單(FORM)例項
php 的表單處理往往是php應用的第乙個學習單元。學好表單處理,也就開始了php實用之旅。先看 和瀏覽結果,然後一一解釋 第一張圖是html檔案,當然也可以直接用.php做字尾,效果是一樣的。我這裡只擷取了body的部分。表單屬於html的內容,但和php的關聯相當緊密。表單的標籤就是 form ...
解決PHP接受form表單限制1000個變數的問題
問題現象 php開發過程中post方式提交乙個大於1000個核取方塊的form表單時,發現提交的後面部分內容被截斷,但是少於1000時就正常。分析 1.首先確認表單正確,發現前段的核取方塊數量是夠的但是傳到後台就被部分截斷,這時候應該就是後台接受的問題 2.兩種情況 第一種是對表單提交資料的大小有限...