1

以下のフィールドを使用して、ユーザーのサインイン情報を保存します。

user_id、login_date、login_time、status

サインインを試行するたびに、true または false ステータスを使用してレコードがデータベースに挿入されます。過去 3 分間にログインに 3 回失敗したユーザーをロックしたい。したがって、現在の時刻を使用して、テーブルの最後の 3 つのレコードとの差を分形式で計算する必要があります。

私の質問は次のとおりです
。1-今回の計算を行うのに適しているのはどれですか? PHPまたはMySQL?
2-あなたの提案に応じて、どの機能が適していますか?

ありがとうございました。

4

4 に答える 4

1

次のクエリは、条件に従ってすべての User_Id を返します。

select user_id from t 
where login_date= CURDATE() 
      and login_time>TIMESTAMPADD(MINUTE,-3,CURTIME())
      and status = 'f'
group by user_id 
having count(*)>3
于 2012-12-05T09:17:34.297 に答える
0

別の使用法。私があなたの場合、最後に失敗したログインの日付と時刻をデータベースに記録します。これにより、データベースから最後に失敗したログイン時刻と、データベースからユーザーデータを取得できます。

PHPまたはMySQLで比較を行っても問題ありません。

ただし、MySQL サーバーと Web サーバーは同じタイムゾーンを持ち、時刻を同期する必要があることに注意してください。そうしないと、正確な結果が得られません。

于 2012-12-05T09:09:37.890 に答える
0

他にも多くのことを行う必要があることを考慮して、私はphpを使用すると言います。ユーザーがログインしようとしたときに、ユーザーの最後の 3 つのレコードを取得できます。

SELECT login_date, login_time, status FROM table WHERE user_id=$id ORDER BY login_DATE DESC LIMIT 3

次に、PHPでチェックを行うことができます。失敗した場合でも、ユーザーがロックされていることをユーザーに通知し、ユーザー (他のテーブル?) をロックして、ログインに対して false を返す必要があります。

PHPでは、次のようなチェックを行うことができます

  • 返されたツリーの試行はありますか (少ないほどロックはありません)
  • 最後に取得したレコードは 3 分未満ですか? (それ以外はロックなし)
  • すべてのツリーの戻り値を偽の試行にする (それ以外の場合はロックなし)
于 2012-12-05T09:10:04.757 に答える
0
  1. MySQL は PHP よりもはるかに高速であるため、計算には常により優れたソリューションだと思います。
  2. タイムスタンプを使用する場合、単純に time_x - time_y を実行して差を秒で取得すると、合計計算は (time_x - time_y) / 60 になり、クエリは次のようになります。

    SELECT user_id, login_date, login_time, status, ((login_time-NOW()) / 60) as differenceColomn FROM usertable

于 2012-12-05T09:10:47.790 に答える