Предоставляйте пользователю одно очко каждый день - PullRequest
5 голосов
/ 03 сентября 2010

Используя 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'");
    }
}

Помимо разметки, очевидно, что мой код близорук. Если пользователь входит в систему один раз в день, он не получает очко. Поэтому я должен определить правильный метод для этого, используя также поле Creation Date . Я просто не могу обернуть голову сегодня, какие-нибудь предложения? Спасибо.

Ответы [ 2 ]

3 голосов
/ 03 сентября 2010

Это лучше подходит для базы данных, чем для 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.
3 голосов
/ 03 сентября 2010

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

...