从Mysql数据库中自动删除

问题描述 投票:0回答:1

我目前正在尝试创建“重置密码”令牌。当我网站上的某个人想要重置密码时生成的令牌。目前,创建令牌后,我将其保存在我的数据库中。我想让令牌存在于数据库中仅24小时,然后自动删除自己,但我不知道如何做到这一点。任何帮助,将不胜感激。

我通过创建一串随机字符非常简单地生成令牌。然后我将忘记密码的令牌和电子邮件保存在DB中,如下所示

'INSERT INTO reset_token (token, email) VALUES ("'.token.'", "'.email.'")'
php mysql codeigniter
1个回答
2
投票

Edit

这可以使用Event Scheduler完成。您需要使用CREATE EVENT语法创建事件。

要删除条目,您可以执行以下操作:

public function schedule_delete($table, $column, $value, $hours = 24) {
    $sql = "CREATE EVENT `delete_{$table}_{$column}_$value` 
                ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL $hours HOUR
                DO DELETE FROM `$table` WHERE `$column` = '$value'";
    $db->query($sql);
}

请注意,名称必须是唯一的。这意味着delete_{$table}_{$column}_$value必须是唯一的,否则你会得到一个错误。

要使MySQL事件起作用,事件调度程序必须为ON。您可以使用以下查询将其打开:

SET GLOBAL event_scheduler = ON;

当您说“自动删除”时,您需要“自动删除”它。

如果由于您在共享托管服务器上而无法启用调度程序而您没有足够的权限,则可以通过检查其时间戳来手动删除条目。

所以代码中的某个地方需要执行删除操作的查询。要删除过期的条目,您需要知道它们是否已过期。为此,您需要将timestamp与令牌一起存储。

现在放置它的位置取决于您想要删除过期条目的频率。在OP的情况下,它可以在代码行之前完成,其中检查令牌的有效性。即,如果有一个函数validate_token,它将查看该令牌是否存在于数据库中并且是有效的,您可以将它放在该函数的开头。

function validate_token($token) {
    $expiry = time() - 60*60*24;
    // perform query to delete all tokens that have a timestamp less than $expiry

    // Now run the query to check if the token exists in the database. 
    // You have only valid tokens left!
}
© www.soinside.com 2019 - 2024. All rights reserved.