2012-02-16 4 views
-1

пожалуйста, помогите мне с этим:Очки система ежедневно Лимит

Сценарий: построение системы (Backend: 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 баллов за любой календарный день. Вы должны быть осторожны, хотя если ваша система будет использоваться из нескольких часовых поясов, потому что в этом случае «сегодня» означает разные вещи для разных людей. Например, это может быть вторник 2 утра в Лондоне (т.е. день изменились), но это все-таки понедельник 6 вечера в Сан-Франциско (т.е. день не изменилась)

0

Я не знаю, является ли это наиболее эффективным способом, но вы можете иметь поле в своей базе данных для каждого пользователя, которое отслеживает, сколько очков они набрали в тот день. достигните 5 баллов в вашем примере, тогда они больше не получатся.

Тогда у вас может быть задание cron или что-то еще, что сбрасывает его до 0 для всех пользователей в указанное время, например, в полночь.

+0

Да, это именно то, что я думал, что делать, но работают на хроны рабочих мест для этого чувствует себя ненужный дополнительный бурдон. Я уверен, что должен быть более простой способ. многие веб-сайты внедряют систему, в которой форма входа в систему блокируется на некоторое время после предопределенного количества неудавшихся запросов. я считаю, что такая же логика может служить моей цели здесь. –

+0

Хм ... ну, я думаю, альтернативным методом было бы иметь вашу метку времени и счетчик точек в вашей базе данных. Затем, если вы хотите, чтобы его сбросили в полночь, например, ваш код может проверить, не является ли он новым днем. В этот момент он автоматически сбросит этот счетчик, прежде чем увеличивать его заново. – MysticXG

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, заключается в том, что он централизует сброс точек и гарантирует, что он не будет обременять базу данных обработкой, что легко можно сделать, просто выполняя «UPDATE users SET limit = 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 

Просто FYI вот полный запрос для создания триггера

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; 
Смежные вопросы