0

在我正在开发的网站上,我正在为禁止和取消禁止用户制作一个系统。

在我的数据库中,我有一个表“禁止”,其中包含有关禁止的字段(用户 ID、活动、创建日期、原因 ecc)。

我想做的是:

为过期日期添加另一个字段,当此日期出现时,将字段“活动”自动更改为 0。

我怎么能这样做?

4

4 回答 4

3

我不会像您那样使用两个字段——因为我不想在active达到取消禁令日期时依赖一项任务来更改该字段。


相反,我只会使用一个名为 like 的日期时间字段banned_until;该字段将:

  • NULL用户未被禁止时,
  • 或者包含用户被禁止的日期。

然后,当用户尝试做某事(登录、发布、...)时,我会检查:

  • 此字段是NULL,在这种情况下用户不会被禁止
  • 或者该字段中包含的日期是过去的日期,在该日期用户已被禁止,但不再是。

在第二种情况下,您甚至可以将该字段重置为NULL,因为已达到取消禁止日期。

于 2012-05-20T09:19:20.783 回答
2

它要么使用 cron 脚本,要么在获得被禁止的用户时,应用 where 子句来检查禁令是否已过期

于 2012-05-20T09:27:50.517 回答
0

您可以比较expiry_datevaluecurrent_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 事件之前阅读完整的注释

于 2012-05-20T11:03:46.273 回答
0

创建一个 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 描述的,但这个答案是为了你的想法。

于 2012-05-20T09:22:38.420 回答