2014-01-11 17 views
0

我正在使用PHP和MySQL接受表單註冊。對此問題的大多數回覆都假定只有一個人在同一時間使用該應用程序。但是,任何人都可以一次完成該表格。我如何將註冊人數量限制在給定數量(例如1000)?請考慮以下情況:限制表單提交的數量(考慮多人同時提交)

  1. 2:00 pm - 用戶A訪問表單。我的代碼檢查數據庫,並有999個條目。
  2. 2:01 pm - 用戶B訪問表單。我的代碼檢查數據庫,並有999個條目。 (用戶A尚未提交表格)。
  3. 下午2:08 - 用戶A提交表單。現在,有1000個條目。用戶B仍在填寫表格。

由於用戶B已經開始填寫表單(但尚未完成),我想讓他/她完成。 編寫我的應用程序以最大限度地減少此情況發生的可能性的最佳方法是什麼?

謝謝。

+0

我想了一下幾種方法,但它取決於表單和項目規範,你可以在990處停下來,以便在表格填寫開始時使用AJAX檢查,扔掉多餘的一個或拖曳可能會.. – 2014-01-11 03:30:02

回答

0

在插入表單數據之前,可以使用數據庫觸發器輕鬆完成此操作,您可以計算數據庫中註冊表的數量,並且如果達到限制,則會返回受控錯誤。

唯一的問題是,用戶將不得不填寫所有表格並提交。

在您的頁面上,您只需檢查它是否達到阻止表單的限制。在限制之前訪問表單的人將被觸發器阻止(如果多個用戶同時訪問)。

數據庫觸發器將一次註冊一個註冊表。

0

這是一個典型的counting semaphore使用案例:

  • 初始化與1000
  • 您的旗語如果信號量是大於0讓新用戶開始填寫表格,降低信號,否則不要」噸。
  • 當用戶完成表單時,請增加信號量。

在這種情況下,你不必使用IPC semaphore(但你可以)。只實施一個自己的計數器。你的信號可能是一個簡單的數據庫查詢:

SELECT 1000 - count(*) FROM Registration WHERE state = "unfinished"; 
0

只要登錄人數小於你的最大,服務形式。在window.setInterval中爲服務器上的簡單服務調用ajax調用,該服務檢查表中相對於最大值的行數,並返回可評估爲true或false的值。將間隔設置爲5或10秒。如果服務以false響應,您可以通知用戶註冊已關閉。

我知道你說過你想讓用戶B完成,即使他的註冊失敗了,但這可能會導致惱火的用戶浪費更多時間填寫表單,因爲他可能會提前收到警告。