使用PHP / mySQL,每天为用户授予一个到其成员帐户的整数点。我将用于确定是否应该授予一个点的数据是这些mysql字段:创建日期(时间戳)和上次登录(UNIX TIME)。
当用户登录时,确定授予这些积分的程序。我的问题是,确定自上次登录以来已经过了多少天的最有效方法是什么?其次,如果用户每天登录,我如何确定是否已经过了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'");
}
}
除了标记,很明显我的代码是短视的。如果用户每天登录一次,他们就无法获得积分。因此,我必须使用创建日期字段确定正确的方法。我今天无法绕过它,有什么建议吗?感谢。
答案 0 :(得分:3)
使用单独的字段保留将点添加到用户帐户的日期。如果今天没有发生这种情况 - 添加一个点(或几个)并更新一个字段。
答案 1 :(得分:3)
这比数据库更适合数据库。添加一个表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是INT
,login_date是DATE
,有一个可用的索引,因此插入和选择都应该很快,即使有大量用户,表格也会相对较小。
如果您坚持将用户分数存储在某个地方(或者您希望将其与其他用户数据一起检索),您可以在登录时执行此操作:
insert ignore
select count
users
。