2012-05-11 97 views
0

我有一個php註冊過程的用途。當用戶到達註冊過程的倒數第二頁時,它會顯示所有註冊詳細信息和提交按鈕(基本上確認和付款按鈕)的摘要。現在,當用戶單擊此按鈕時,所有這些細節都會發布到sql數據庫,並且該用戶是使用用戶名和密碼在數據庫中創建的。現在的問題是,如果您多次點擊提交按鈕,它將重新提交數據並在數據庫中創建重複條目,其中每個重複條目都具有相同的詳細信息(名稱,電子郵件等),但用戶名和密碼不同。 我該如何預防?我知道你可以提交併自我回復後,但我該怎麼做呢?我試圖實現這個代碼,但它不工作:http://www.bjw.co.nz/developer/general/75-how-to-prevent-form-resubmissionphp:防止表單重新申請

感謝

+1

我從來沒有做過這樣的形式與任何東西,但我認爲這樣做會在加載的形式首次創建窗體鍵的最簡單的方法,和將該密鑰保存在文件或數據庫中。提交表單時,它應該發佈密鑰,然後接收php腳本應該從有效密鑰的文件或數據庫中刪除該密鑰。 – Vulcan

+0

您是否嘗試禁用提交按鈕 –

回答

3

我想在這種情況下奉勸一些JavaScript。添加以下的提交按鈕:

onclick="this.disabled=true;" 

一旦點擊,使其無法再次點擊這將禁用按鈕。

+0

使用Noscript時不起作用。雖然這個和我所建議的組合會很好。 Stackoverflow真的需要複合答案:) – sinni800

+0

那麼,如果用戶足夠聰明,可以安裝noscript,他們也應該足夠聰明,不要點擊提交按鈕兩次。 –

+1

99%的用戶將擁有javascript工作。安裝了noscript的用戶將理解表單提交的工作方式 – clem

3

您應該使用$_SESSION將值保存到PHP會話中,以確定表單是否已提交。當每個請求執行時,PHP會話被鎖定,所以當第一次提交鎖定它時,第二次必須等到第一次提交完成並設置了值。第二個請求將在之後讀取,並在設置爲已提交的值時中斷。

下面是一個如何做到這一點的例子。如果一個用戶同時進行多次註冊,它可能會包含錯誤(他爲什麼要這麼做?)。

在包含表單的提交按鈕的頁面,您應該設置一個標記:

session_start(); 
$_SESSION["RegistrationSubmitted"] = false; 

這就是說,用戶目前正在做登記尚未提交。

在頁面被提交(發佈),你可以檢查該值:

session_start(); 
if (isset($_SESSION["RegistrationSubmitted"]) { 
    if ($_SESSION["RegistrationSubmitted"] == true) { 
     die("Registration has already been submitted!"); 
    } else { 
     // Process registration here 
     $_SESSION["RegistrationSubmitted"] == true; 
    } 
} else { 
    die("Last registration page hasn't been reached! (A bot?)"); 
} 
+0

感謝您的回答,但問題是這樣的:我知道PHP,但不是很好。所以我不知道如何創建這個。我試過這個例子:http://www.bjw.co.nz/developer/general/75-how-to-prevent-form-resubmission,並且在一個知道php的人的幫助下調用,他可以實現這也是。你可能有一個示例代碼/剪切?將不勝感激。我想標記你的答案作爲解決方案,但如果我不能得到它的工作,那麼我將不得不與大衛的javascript解決方案 – DextrousDave

+0

@DextrousDave在這裏你去:) – sinni800

+0

謝謝,將測試這並報告回來 – DextrousDave

0

您就可以創建一個表單鍵:

<input type="hidden" name="form-key" value="<?php echo $last_order_datetime; ?>" /> 

然後,當一個新秩序提交後,檢查$ _POST ['form-key']的值是否與存儲的最近訂單完全相同。

如果是,處理表格。 否則,它是重新提交或其他嘗試。

+0

可以使用檢查元素來操縱該值,但不應使用客戶端驗證。 –

+0

驗證在服務器上完成。他們可以將價值改變爲他們想要的任何東西,除非它與最近的訂單相匹配,否則將失敗 – Nate

+0

@Nate從用戶的角度而不是從整個網站的角度看'$ last_order_datetime'?另外:如果一個請求在10秒內由於......情況而遲到,該怎麼辦?我知道,只是給它一個寬容:D – sinni800

1

除了搞亂PHP代碼或DOM,爲什麼不修改你的數據庫表來使用唯一鍵。這樣,無論用戶點擊提交按鈕的次數多少,數據庫都不會在意。

這可能會幫助您:「INSERT IGNORE」 vs 「INSERT … ON DUPLICATE KEY UPDATE」

+0

從建築的角度來看,我會說最好的答案。但這意味着人們應該偏離通常的「AUTO_INCREMENT」模式。讓數據庫處理這樣的事情總是一個不錯的選擇。通過程序代碼執行一致性規則就是這麼......很醜陋。我遇到過很多使用數據庫存儲的人,而不是驗證它的內容:D – sinni800