Предоставляйте пользователю одно очко каждый день
Используя PHP/mySQL, пользователю ежедневно присваивается одно целое число для их учетной записи. Данные, которые я буду использовать, чтобы определить, должна ли быть предоставлена точка, представляют собой следующие поля mysql: Дата создания (метка времени) и Последний вход в систему (ВРЕМЯ 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'");
}
}
Помимо разметки, очевидно, что мой код близорук. Если пользователь входит в систему один раз в день, он не получает очко. Поэтому я должен определить правильный метод для этого, используя поле " Дата создания". Я просто не могу обернуть голову сегодня, какие-нибудь предложения? Благодарю.
2 ответа
Это лучше подходит для базы данных, чем для 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
- сохранить результат в столбце таблицы
users
,
Используйте отдельное поле, чтобы сохранить дату, когда вы добавили точку в учетную запись пользователя. Если это произошло не сегодня - добавьте точку (или несколько) и обновите поле.