私が開発しているウェブサイトでは、ユーザーを禁止および禁止解除するためのシステムを作成しています。
私のデータベースには、禁止に関するフィールド(userID、アクティブ、作成日、理由ecc)を含む「禁止」テーブルがあります。
私がしたいことは:
有効期限の別のフィールドを追加し、この日付が発生すると、フィールド「アクティブ」を自動的に0に変更します。
どうすればそれができますか?
active
禁止解除日に達したときにフィールドを元に戻すタスクに依存したくないので、私はあなたのように2つのフィールドを使用しません。
banned_until
代わりに、 ;
のように呼ばれる1つの日時フィールドのみを使用します。このフィールドは次のいずれかになります。
NULL
が禁止されていないときである、次に、ユーザーが何か(ログイン、投稿、...)を実行しようとすると、次のことを確認します。
NULL
。この場合、ユーザーは禁止されません。NULL
2番目のケースでは、禁止解除日に達したため、フィールドをにリセットすることもできます。
cronスクリプトを使用するか、禁止されたユーザーを取得するときに、where句を適用して、禁止が期限切れになっているかどうかを確認します。
有効期限が過ぎているかどうかを確認するphpスクリプトを作成します。SQLは次のようになります。
UPDATE banned SET active=0 WHERE expire_date<=NOW()
たとえば、それを保存しますtask.php
次に、でcronタスクを作成しますcrontab -e
*/10 * * * * php /path/to/your/taks/task.php
これにより、このスクリプトが10分ごとに実行され、禁止されているすべてのpplの禁止が解除されます。
-
他の方法、おそらくPascalが説明したようなより良い方法がありますが、この答えはあなたの考えのためです。
expiry_date
値をと比較しcurrent_date
て、ユーザーがログイン時にアクティブであるかどうかを確認できます。
SELECT
( DATE_FORMAT( expiry_date_field, '%Y-%m-%d' )
<
DATE_FORMAT( CURRENT_DATE, '%Y-%m-%d' )
) AS isActive
FROM
banned
WHERE
user_id=?;
0
返されたものは、非アクティブな1
ステータスおよびアクティブであることを表します。
ただし、ユーザーのログインに関係なく、ユーザーのアクティブステータスを維持する場合は、イベントスケジューラを使用してこれを実現できます。
次の例は、1つを実装する際のアイデアを示しています。
drop event if exists event_user_bans_scheduling;
delimiter //
create event if not exists event_user_bans_scheduling
-- on schedule every 86400 second starts 00:00:00
-- at timestamp( adddate( current_date, 1 ),'00:00:00' )
on schedule every 1 day starts timestamp( current_date + 1, '00:00:01' )
comment 'Scheduler to update active status of users'
do
UPDATE my_app_db.banned
SET ACTIVE=0
WHERE
date_format( expiry_date_field,'%Y-%m-%d' ) = date_format( CURRENT_DATE, '%Y-%m-%d' );
;
//
delimiter ;
注:
グローバルevent_scheduler
システム変数は、イベントスケジューラが有効でサーバー上で実行されているかどうかを決定します。Event Scheduler Configuration
MySQLイベントに取り組む前に、に関する完全なメモをお読みください