限制表单提交的数量(同时考虑多人提交)

时间:2014-01-11 03:24:29

标签: php mysql forms limit throttling

我使用PHP和MySQL接受表单注册。大多数对此问题的回答都假设只有一个人同时使用该应用程序。但是,任何人都可以一次填写表格。如何将注册人数量限制为给定数量(例如1000)?请考虑以下情况:

  1. 下午2:00 - 用户A访问表单。我的代码检查数据库,有999个条目。
  2. 下午2:01 - 用户B访问表单。我的代码检查数据库,有999个条目。 (用户A尚未提交表格)。
  3. 下午2:08 - 用户A提交表单。现在,有1000个条目。用户B仍在填写表格。
  4. 由于用户B已经开始填写表格(但尚未完成),我想让他/她完成。 编写应用程序的最佳方法是什么,以最大限度地降低发生此情况的可能性?

    谢谢。

3 个答案:

答案 0 :(得分:0)

可以使用数据库触发器轻松完成,然后插入表单数据,计算数据库中的注册表数量,如果达到限制,则返回受控错误。

唯一的问题是用户必须填写所有表格并提交。

在您的页面上,您只需检查它是否达到限制以阻止表单。在限制之前访问表单的人将被触发器阻止(如果多个用户同时访问)。

数据库触发器将一次提供一个注册表。

答案 1 :(得分:0)

这是一个经典的counting semaphore用例:

  • 使用1000初始化您的信号量。
  • 如果信号量大于0,则让新用户开始填写表单并减少信号量,否则不要。
  • 当用户完成表单时,请增加信号量。

在这种情况下,您不必使用IPC semaphore(但您可以)。只需实现自己的计数器。您的信号量可能是一个简单的数据库查询:

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

答案 2 :(得分:0)

只要注册人数少于最大数量,请提供表格。在window.setInterval中对服务器上的简单服务进行ajax调用,该服务检查表中相对于该最大值的行数,并返回可以计算为true或false的值。将间隔设置为5或10秒。如果服务以false响应,您可以通知用户注册已关闭。

我知道你说你想让用户B完成,即使他的注册失败,但这可能会导致一个烦躁的用户浪费更多的时间来填写表格,因为他可以早点被警告。