2012-02-16 15 views
-1

请帮我看看这个:记分制度涨停

场景: 建立一个系统(后端:Mysql的,脚本郎咸平:使用Javascript/PHP) 当用户为了获得一些积分执行某些动作。假设1个动作= 1分。

我的问题:现在我想限制用户每天获得atmax 5点。平均值在24小时之间用户可以执行任意次数的这些操作,但点数增量将在达到“5”后最高。

请给我一个有效的方法。我的数据库是简约的,只有用户的详细信息,点。

现在我需要添加一个时间戳列。没问题,但问题我该如何选择更新时间和时间。非常困惑:(

回答

1

你可以实现这一点的方法之一是跟踪总积分,给定日期的点数以及最后一点更新的时间戳。然后你的逻辑看起来像这样:

if the action is performed, which may cause a point award 
    if last_point_timestamp < today then 
     increment total points 
     set today's points to 1 
     set last_point_timestamp to current date/time 
    elseif today's points below 5 
     increment total points 
     increment today's points 
     set last_point_timestamp to current date/time 
    else 
     maximum number of points for today is reached - no more points 
    end if 
end if 

从本质上讲,它在任何日历日都不会超过5分。如果您的系统要在多个时区使用,您需要小心,因为在这种情况下,“今天”对不同的人意味着不同的事情。例如,它可能是星期二上午02时在伦敦(即天更换),但它仍然在旧金山周一下午6点(即当天没有改变)

0

我不知道这是否是最有效的方式,但是您可以在每个用户的数据库中有一个字段,用于跟踪他们当天获得的点数。在你的例子中达到5分,那么他们就不会得到了。

然后,你可以有一个cron作业或其他东西,在指定的时间将其重置为0,比如说在午夜时间,例如

+0

是的,这正是我想这样做,但在运行cron作业的这种感觉就像一个额外的不必要的伯顿。我确定必须有一个更简单的方法。很多网站实现了预定义数量的失败请求后登录表单被阻止一段时间的系统。我相信同样的逻辑可以在这里达到我的目的。 – 2012-02-16 16:25:38

+0

嗯......好吧,我想另一种方法是在你的数据库中添加你的时间戳和点计数器。然后,如果您希望在午夜重置,您的代码可以检查它是否是新的一天。在此之前,它会自动重置该计数器,然后重新递增。 – MysticXG 2012-02-16 16:28:43

0

有一个表叫点有四个领域: 用户 点 todays_points last_point

补充一点:

SELECT * FROM points WHERE 'user' == $user" 

if(last_point < older than today) 
    resetPoints($user); 
    addPoint($user); 

elseif(todays_points < 5) 
    addPoint($user) 



function resetPoints($user) 
    UPDATE todays_points to zero; 

function addPoint($user) 
    ADD one to total points 
    ADD one to todays points 
    UPDATE last_point to current times 
0

我会亲自做这类似于然而与触发器跟踪限制MysticXG。我使用cron作业的原因是,它集中了重置点,并确保它不会给数据库带来负担,因为每天只需执行“更新用户SET限制= 5”即可轻松完成处理。对于这个例子中,我创建了字段的表

user  INT UNSIGNED AI PK 
points  INT UNSIGNED 
dailyLimit TINYINT UNSIGNED DEFAULT 5 

我再添加了一个触发器具有以下逻辑更新之前解雇

IF NEW.points > OLD.points THEN 
    IF NEW.points - OLD.points > OLD.dailyLimit THEN 
    SET NEW.points = OLD.points + OLD.dailyLimit; 
    END IF; 
    SET NEW.dailyLimit = OLD.dailyLimit + OLD.points - NEW.points; 
END IF 

这意味着,如果一个用户百分点,这将最多增加到他们当天剩余的积分数量。如果他们超过了这个限制,那么他们就会增加剩余的点数。如果他们的积分减少,那么它们的极限不受影响(不确定这是否是可取与否)

然后重新设置限制,所有你需要做的是在一个设定点,每天运行一个脚本,执行此查询

UPDATE users SET dailyLimit = 5 

仅供参考下面是完整的查询创建触发器

CREATE TRIGGER `checkLimit` BEFORE UPDATE ON `points` FOR EACH ROW 
IF NEW.points > OLD.points THEN 
    IF NEW.points - OLD.points > OLD.dailyLimit THEN 
    SET NEW.points = OLD.points + OLD.dailyLimit; 
    END IF; 
    SET NEW.dailyLimit = OLD.dailyLimit + OLD.points - NEW.points; 
END IF;