在我正在开发的网站上,我正在为禁止和取消禁止用户制作一个系统。
在我的数据库中,我有一个表“禁止”,其中包含有关禁止的字段(用户 ID、活动、创建日期、原因 ecc)。
我想做的是:
为过期日期添加另一个字段,当此日期出现时,将字段“活动”自动更改为 0。
我怎么能这样做?
我不会像您那样使用两个字段——因为我不想在active
达到取消禁令日期时依赖一项任务来更改该字段。
相反,我只会使用一个名为 like 的日期时间字段banned_until
;该字段将:
NULL
用户未被禁止时,然后,当用户尝试做某事(登录、发布、...)时,我会检查:
NULL
,在这种情况下用户不会被禁止在第二种情况下,您甚至可以将该字段重置为NULL
,因为已达到取消禁止日期。
它要么使用 cron 脚本,要么在获得被禁止的用户时,应用 where 子句来检查禁令是否已过期
您可以比较expiry_date
valuecurrent_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
活动。
但是不管用户是否登录,如果你想保持用户的活动状态,你可以使用 Event Scheduler来实现。
以下示例为您提供了实施一个想法。
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 事件之前阅读完整的注释
创建一个 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 描述的,但这个答案是为了你的想法。