【问题标题】:Auto delete from Mysql database从 Mysql 数据库中自动删除
【发布时间】:2017-10-20 14:51:08
【问题描述】:

我目前正在尝试创建“重置密码”令牌。当我网站上的某人想要重置他们的密码时生成的令牌。目前,一旦创建了令牌,我就把它保存在我的数据库中。我想让令牌在数据库中仅存在 24 小时,然后自动删除自己,但我不知道该怎么做。任何帮助将不胜感激。

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

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

【问题讨论】:

  • 您可以添加expiration_date 列。之后该令牌将自动失效(没有人可以使用它)但仍然在表中。
  • 创建活动
  • 太多可能的方法来做到这一点
  • 旁注:请使用准备好的语句。

标签: php mysql codeigniter


【解决方案1】:

编辑

这可以使用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 事件工作,事件调度程序必须打开。您可以使用以下查询将其打开:

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!
}

【讨论】:

  • 听说过 MySQL 的事件和事件调度器吗?没有?
  • @N.B.在回答这个问题后,我确实遇到了一段时间。适当地更新了答案。
  • 足够公平,足够的答案,你得到了我的支持。干杯!
猜你喜欢
  • 2017-07-13
  • 1970-01-01
  • 2019-03-18
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 2013-07-21
  • 2019-09-16
相关资源
最近更新 更多