5

使用 PHP/mySQL,用户每天被授予一个指向其成员帐户的整数点。我将用于确定是否应授予积分的数据是这些 mysql 字段:创建日期(时间戳)和上次登录(UNIX 时间)。

授予这些积分的程序是在用户登录时确定的。我的问题是,确定自上次登录以来已经过去了多少天的最有效方法是什么?其次,如果用户每天都登录,我如何确定是否已经过了 24 小时,是否要授予积分?过去的天数等于给定的分数(每天 1)。

目前我正在使用这段代码:

/*
** Updates Points based on days since last visit
*/
static function UpdatePoints($username)
{
    $getlog = System::$mySQL->Select("lastLog, creation FROM users WHERE username='$username'");
    $log = System::$mySQL->Fetch($getlog);

    $offset = (TIME() - $log['lastLog']) / 86400;  // 24hrs
    $lastlog = round($offset); // in days

    if($lastlog > 0)
    {
        System::$mySQL->Update("users SET points=points+".$lastlog." WHERE username='$username'");
    }
}

除了标记,很明显我的代码是短视的。如果用户每天登录一次,他们不会获得积分。因此,我还必须使用“创建日期”字段来确定这样做的正确方法。我今天实在想不通,有什么建议吗?谢谢。

4

2 回答 2

3

当您将点添加到用户帐户时,请使用单独的字段来保留日期。如果这不是今天发生的 - 添加一个(或几个)点并更新一个字段。

于 2010-09-03T19:10:49.883 回答
3

这比 PHP 更适合数据库。添加一个users_points具有唯一索引的表(user_id,login_date)。样本数据:

 user_id | login_date
====================== 
 19746   | 2010-09-02
 19746   | 2010-09-03

然后在每次登录时,标记用户已在该日期登录(如果该行已经存在,索引将防止重复):

INSERT IGNORE INTO `users_points` (`user_id`,`login_date`) VALUES (19746,CURDATE())

并获得点数:

SELECT COUNT(*) FROM `users_points` WHERE `user_id` = 19746

这也很好,你有一个用户登录的天数列表,以防你改变标准并想要重新计票。

user_id 是 a INT, login_date 是 a DATE,有一个可用的索引,所以 insert 和 select 都应该很快,即使有大量用户,表也会相对较小。

如果您坚持将用户分数存储在某个地方(或者您可能希望将其与其他用户数据一起检索),您可以在登录时执行此操作:

  • 跑过insert ignore
  • 跑过select count
  • 将结果保存在 table 的列中users
于 2010-09-03T19:12:51.257 回答