积分系统每日限额

时间:2012-02-16 16:18:13

标签: php javascript mysql timestamp points

请帮助我:

场景:  构建一个系统(Backend:Mysql,scripting lang:Javascript / PHP)  用户执行某些操作以获得某些点的位置。让我们说1动作= 1分。

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

请建议我这样做的有效方法。我的数据库很简约,只有用户详细信息,分数。

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

4 个答案:

答案 0 :(得分: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分。如果要在多个时区使用您的系统,您需要小心,因为在这种情况下,“今天”对不同的人来说意味着不同的事情。例如,它可能是伦敦的星期二凌晨2点(即更改的那天),但它仍然是旧金山的星期一下午6点(即当天没有变化)

答案 1 :(得分:0)

我不知道这是否是最有效的方式,但您可以在数据库中为每个用户创建一个字段,以跟踪他们当天获得的积分数。因此,当他们在你的例子中达到5分时,他们就不再获得了。

然后,您可以拥有一个cron作业或其他东西,在指定的时间将所有用户重置为0,例如午夜。

答案 2 :(得分:0)

有一个名为Points的表,有四个字段: 用户 点 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

答案 3 :(得分:0)

我个人会这样做与MysticXG类似,但触发跟踪限制。我之所以使用cron作业,是因为它集中了点的重置并确保它不会给数据库带来负担,只需每天执行“UPDATE users SET limit = 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;