使用PHP/mySQL,用户每天都可以获得一个指向其成员帐户的整数点。我将使用这些数据来确定是否应该授予一个点:创建日期(时间戳)和 Login (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'");
}
}撇开标记不说,很明显,我的代码是短视的。如果用户每天登录一次,他们就得不到一分。因此,我还必须使用创建日期字段来确定正确的方法。我今天没法把头绕着,有什么建议吗?谢谢。
发布于 2010-09-03 19:12:51
这比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是一个INT,login_date是一个DATE,有一个可用的索引,所以插入和选择都应该是快速的,即使有大量的用户,表也会相对较小。
如果您坚持将用户评分存储在某个地方(或者您可能希望与其他用户数据一起检索它),您可以在登录时这样做:
运行insert ignore
select count
select count
users.列中的结果
发布于 2010-09-03 19:10:49
使用单独的字段来保存将点添加到用户帐户时的日期。如果今天没有发生这种情况--添加一个点(或几个)并更新一个字段。
https://stackoverflow.com/questions/3638780
复制相似问题