2010-09-03 60 views
5

使用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

如果您只是在某個固定的時間點(例如午夜)給予積分,可能會更容易些。對於那些在12:01註冊的人與在11:59 pm註冊但在幾個月成員資格之後註冊的人,每個人都有些不公平,但是在幾個月的會員資格之後,這種差別是一個舍入誤差。 – 2010-09-03 19:09:07

+3

永遠不要像你在這裏做的日期數學(也就是除以86400)。在任何一年,每天有一個23小時和一個25小時的日子。始終使用智能日期時間對象。否則就是在程序中編寫隱藏的錯誤。 – riwalk 2010-09-03 19:10:03

+0

@ Stargazer712感謝您的提示,我從來沒有考慮過這個。 – mrtwidget 2010-09-03 19:23:18

回答

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是INT,login_date是DATE,有一個可用的索引,所以insert和select都應該很快,並且即使對於大量的用戶,該表也會相對較小。

如果你堅持要具有存儲在某個地方的用戶評分(或者也許你想與其他用戶數據一起檢索它),你可以這樣做在登錄:

  • 運行insert ignore
  • 運行select count
  • 將結果保存在表users的列中。
+0

謝謝Piskvor!我認爲你的迴應改變了我的想法,即做所有這些計算,並堅持一張表。我一直很想用我已經擁有的東西,我從來沒有考慮過這個方向。如此簡單明瞭(現在),但非常有效。謝謝! – mrtwidget 2010-09-03 19:30:22

+0

@mrtwidget:不客氣。 – Piskvor 2010-09-03 19:35:15

+0

點數是一直被訪問的值。 每次需要時計算它就是浪費資源。計算必須在一個週期內執行一次,並且應該從DB中讀取值。 – 2010-09-03 20:31:49

3

使用單獨的字段來保留將點添加到用戶帳戶的日期。如果這不是今天發生 - 請添加一個或多個點並更新一個字段。