自动更改记录

时间:2012-05-20 09:11:21

标签: php mysql

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

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

我想做的是:

为过期日期添加另一个字段,当此日期发生时,将字段“active”自动更改为0.

我怎么能这样做?

4 个答案:

答案 0 :(得分:3)

我不会像你那样使用两个字段 - 因为在达到非禁止日期时,我不想依赖任务来更改active字段。


相反,我只会使用一个名为banned_until的日期时间字段;这个字段可以是:

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

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

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

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

答案 1 :(得分:2)

您要么使用cron脚本,要么在获取禁用用户时,应用where子句来检查禁令是否已过期

答案 2 :(得分:0)

创建一个php脚本,检查时间是否过期了。 SQL将是这样的:

UPDATE banned SET active=0 WHERE expire_date<=NOW()

将其另存为例如task.php

然后使用crontab -e

创建一个cron任务
*/10 * * * * php /path/to/your/taks/task.php

这将导致此脚本每10分钟执行一次并解除所有禁用的ppl。

-

还有其他方式,也许更好的方式,例如Pascal描述,但这个答案是出于你的想法。

答案 3 :(得分:0)

您可以将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代表有效

但无论用户登录,如果您想保持用户的活动状态,您都可以实现此using the 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系统变量确定是否在服务器上启用并运行事件调度程序。在处理MySQL事件之前,请阅读Event Scheduler Configuration上的完整说明。