Предоставляйте пользователю одно очко каждый день

Используя 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,

Используйте отдельное поле, чтобы сохранить дату, когда вы добавили точку в учетную запись пользователя. Если это произошло не сегодня - добавьте точку (или несколько) и обновите поле.

Другие вопросы по тегам