首页 > 解决方案 > mysql触发器或事件在一段时间(60秒)后执行更新

问题描述

PHP我用和创建了登录网页MySQL。当登录失败时,MySQL数据库将记录该尝试。每 60 秒尝试将重置为零。3 次尝试后,网页将不允许我登录该用户名。

我有 2MySQL张桌子叫

userdb(用户名、密码和尝试)

loginA(用户和登录尝试)

userdb如果我无法登录,我设法记录了尝试的次数。ForloginAttempt用于使触发器变userdb回尝试归零。我设法导致尝试重置为零,但不是 60 秒。它立即发生。如果我添加了 do sleep (60),它将在网页上冻结 60 秒。我想知道有什么方法可以在 60 秒后激活触发器而不在网页上加载 60 秒?

MYSQL代码

CREATE TRIGGER login_condition
AFTER UPDATE ON loginA FOR EACH ROW
BEGIN
 DO SLEEP(40);
 UPDATE userdb set attempts = 0 where username=new.username; 
END

PHP 代码(这个用来激活触发器)

$query = "UPDATE loginA SET date='$date' WHERE username='$user'";
                storeData($conn,$query);

我希望此触发器在 60 秒后激活并影响网页加载。

标签: phpmysql

解决方案


将最后一次尝试的时间放在loginA表中。

使用事件调度程序每隔几分钟执行一次查询,而不是触发器。如果自上次尝试以来已超过 60 秒,则查询可以将尝试重置为 0。

CREATE EVENT reset_login
ON SCHEDULE EVERY 1 MINUTE
DO
    UPDATE userdb AS u
    JOIN loginA AS l ON u.username = l.username
    SET u.attempts = 0
    WHERE u.attempts > 0 AND l.last_attempt < DATE_SUB(NOW(), INTERVAL 1 MINUTE);

推荐阅读