5

PHP / MySQLを使用すると、ユーザーは毎日メンバーアカウントに単一の整数ポイントを付与されます。ポイントを付与する必要があるかどうかを判断するために使用するデータは、作成日(タイムスタンプ)と最終ログイン(UNIX時間)のmysqlフィールドです。

これらのポイントを付与する手順は、ユーザーがログインしたときに決定されます。私の質問は、最後のログインから何日が経過したかを判断する最も効率的な方法は何ですか?次に、ユーザーが毎日ログインしている場合、24時間が経過してポイントが付与されるかどうかを判断するにはどうすればよいですか?過去の日数は、与えられたポイント(1日あたり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'");
    }
}

マークアップはさておき、私のコードが近視眼的であることは明らかです。ユーザーが1日に1回ログインすると、ポイントは獲得できません。したがって、[作成日]フィールドを使用して、これを行うための正しい方法を決定する必要があります。今日は頭を包むことができません、何か提案はありますか?ありがとう。

4

2 に答える 2

3

別のフィールドを使用して、ポイントをユーザーのアカウントに追加した日付を保持します。これが今日ではなかった場合は、ポイント(または複数)を追加してフィールドを更新します。

于 2010-09-03T19:10:49.883 に答える
3

これは、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
于 2010-09-03T19:12:51.257 に答える