从Mysql数据库中自动删除

时间:2017-10-20 14:51:09

标签: php mysql codeigniter

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

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

'INSERT INTO reset_token (token, email) VALUES ("'.token.'", "'.email.'")'

1 个答案:

答案 0 :(得分:2)

修改

可以使用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!
}