2012-02-16 40 views
-1

請幫我看看這個:記分制度漲停

場景: 建立一個系統(後端:Mysql的,腳本郎鹹平:使用Javascript/PHP) 當用戶爲了獲得一些積分執行某些動作。假設1個動作= 1分。

我的問題:現在我想限制用戶每天獲得atmax 5點。平均值在24小時之間用戶可以執行任意次數的這些操作,但點數增量將在達到「5」後最高。

請給我一個有效的方法。我的數據庫是簡約的,只有用戶的詳細信息,點。

現在我需要添加一個時間戳列。沒問題,但問題我該如何選擇更新時間和時間。非常困惑:(

回答

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分。如果您的系統要在多個時區使用,您需要小心,因爲在這種情況下,「今天」對不同的人意味着不同的事情。例如,它可能是星期二上午02時在倫敦(即天更換),但它仍然在舊金山週一下午6點(即當天沒有改變)

0

我不知道這是否是最有效的方式,但是您可以在每個用戶的數據庫中有一個字段,用於跟蹤他們當天獲得的點數。在你的例子中達到5分,那麼他們就不會得到了。

然後,你可以有一個cron作業或其他東西,在指定的時間將其重置爲0,比如說在午夜時間,例如

+0

是的,這正是我想這樣做,但在運行cron作業的這種感覺就像一個額外的不必要的伯頓。我確定必須有一個更簡單的方法。很多網站實現了預定義數量的失敗請求後登錄表單被阻止一段時間的系統。我相信同樣的邏輯可以在這裏達到我的目的。 – 2012-02-16 16:25:38

+0

嗯......好吧,我想另一種方法是在你的數據庫中添加你的時間戳和點計數器。然後,如果您希望在午夜重置,您的代碼可以檢查它是否是新的一天。在此之前,它會自動重置該計數器,然後重新遞增。 – MysticXG 2012-02-16 16:28:43

0

有一個表叫點有四個領域: 用戶 點 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 
0

我會親自做這類似於然而與觸發器跟蹤限制MysticXG。我使用cron作業的原因是,它集中了重置點,並確保它不會給數據庫帶來負擔,因爲每天只需執行「更新用戶SET限制= 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;