2011-04-30 47 views
2

我正在构建一个即时赢得比赛抽奖活动。基本上在一小时内随机选择的一分钟内,下一个提交细节的用户应该被选为赢家。PHP/MySQL即时赢取程序 - 如何确保只有一个赢家被选中?

我遇到的问题是,如果MySQL正在运行多个连接,那么我该如何阻止两个或三个赢家被误操作?我可以限制连接吗,或者让PHP等待所有当前的MySQL连接关闭?

回答

3
+0

这看起来很有趣!如果我锁定一个表并且脚本由于某种原因而死亡,那么表将保持锁定状态,还是mysql连接的结尾也会再次解锁所有表? – koosa 2011-04-30 06:13:54

+0

谢谢,这是完美的。喜欢学习这样的东西:) – koosa 2011-04-30 06:21:11

+0

如果客户端会话连接终止,无论是正常还是异常,服务器都会隐式释放会话持有的所有表锁(事务性和非事务性)。你需要注意的是,当表被锁定时,你不会运行一个很长的进程,因为取决于锁的类型,它会阻止对其他查询的访问 – bumperbox 2011-04-30 20:35:36

0

使用时,你的更新,你要更新的并发检查您的WHERE子句中字段的初始值。这样,只有第一个被执行的将会经过,因为之后它将不再匹配WHERE子句。您可以通过使用mysql_affected_rows()函数来确定哪些用户已经完成,哪些成功更新将返回1,其他用户则返回0

+0

你好,我想我明白你的意思,但你能写一点点SQL来给我看,只是为了确定吗? – koosa 2011-04-30 06:10:04

+0

我们真的想要推广使用mysql_ *库吗? – 2011-04-30 06:22:27

0

在用户详细信息表中使用时间戳字段“registertime”。插入数据时,使用NOW()函数插入注册表字段。

当您选择一个随机分钟时,将其转换为unix时间。

获奖者是:SELECT * FROM用户表WHERE registertime> - 您的随机分钟的标记 - ORDER BY registertime LIMIT 1

+0

您好, 这是我正在做的事情,但我需要向用户表明他们是他们提交表格时的赢家,所以如果我有2个并发连接,他们都会看到赢家的消息,这是我想避免的。 – koosa 2011-04-30 06:11:25

+0

也许你可以使用microtime()来获得毫秒,而不是NOW()。 – AndrewR 2011-04-30 06:17:42

+0

如果您有一个查询在目标时间之后仅返回第一个条目,则我认为并发会话不成问题。 – AndrewR 2011-04-30 06:18:22

0

保持一个小的状态表的地方,记录了先前的平局小时。如果新记录的插入时间在不同的小时,请检查他们是否是赢家。

如果他们是,你用这个新的“赢家”绘制小时更新状态表,这将阻止任何更多的小时抽奖。但是,如果偶然的话,没有人在任何特定时间内真正“赢得”平局会发生什么?你保证赢得注册的最后一个人,或者根本没有赢家?