【问题标题】:delete whole row after x mins in mysql db and PHP在 mysql db 和 PHP 中的 x 分钟后删除整行
【发布时间】:2020-04-06 18:19:40
【问题描述】:

我正在尝试设置一个 sql 数据库,用户必须在其中确认他们的电子邮件地址。我想知道是否有一种方法可以自动删除 sql db 中尝试注册(提交他们的信息)但在 x 分钟后没有确认他们的电子邮件地址的用户。

我编写的脚本将他们的信息直接插入数据库,然后在用户确认后将数据库上的一列更新为“活动”,所以一旦他们激活,我就不会插入数据,但在使用之前“NON_ACTIVE”状态。然后当他们确认他们的电子邮件地址时,该状态将变为“活动”。

因此,如果用户提交了他们的信息,但未能确认他们的电子邮件地址,他们的详细信息仍在数据库中。我需要在他们提交信息的 x 分钟后自动删除状态为“NON_ACTIVE”的行的东西。我在数据库中有另一列,其中包含确切的提交时间和日期。

有什么想法吗?

【问题讨论】:

  • 无法自动执行此操作。您需要 cronjob/scheduler 帮助进行修剪

标签: php mysql


【解决方案1】:

SQL 是DELETE FROM users WHERE (now() - mailsent) > (120*60) AND state = "NON_ACTIVE",其中users 是表名,mailsent 是邮件发送的时间戳,120 是您希望超时的分钟数。

您可以通过 cronjob 在 linux 系统上使用 cron -e someUser 运行此命令并输入以下行

* * * * * mysql myDatabase < 'DELETE FROM users WHERE (now() - mailsent) > (120*60) AND state = "NON_ACTIVE"'

这将每分钟运行一次命令。请注意,您的 someUser 必须能够在没有密码的情况下访问 mysql-database,例如将密码输入$HOME/.my.cnf

【讨论】:

  • 您不仅限于以 root 身份运行 cronjobs,让 db 的 cronjobs 以非特权用户身份运行甚至可能是一个好主意。 mysql 用户也是如此,最好为这种本地受信任的作业创建用户。
  • 嘿,谢谢你的回答。我会在哪里放置该代码?我是 SQL DB 的新手,奇怪的是希望有一种方法可以使用 php 来做到这一点。我不会打扰 cronjob,因为我没有使用 linux 系统。我有 MySQL WorkBench 设置(如果需要)。我猜代码需要进入“触发器”字段?谢谢老哥!
  • 在windows机器上,还可以在Start &gt; Programs &gt; Accessories &gt; System Tools &gt; Scheduled Tasks下添加定时作业。将上面的 mysql-query 保存在文件 \path\to\example.sql 中,并添加一个带有 mysql.exe 的新计划任务(通常在 c:\Program Files\Mysql\5.0 中的某个位置)和参数 '-e "\path\to\example.sql -D myDatabase"。安排每分钟运行的作业,您将拥有与 cronjob 相同的作业。欢迎您(给我声誉;))!
  • @Nav“麻烦”?您需要一些工具来定期运行该代码,如果您使用的是 Windows,则应该寻找其他一些任务调度程序 - 对于任何类型的服务器设置来说,它都是非常重要的基础设施。
  • 问题是,我在共享主机 (GoDaddy) 上,所以我认为我不能做那样的事情。我搞砸了吗?谢谢(我给了你代表 btw xD)
【解决方案2】:

我会写一个类似于@Lars 的声明:

DELETE
FROM users
WHERE (mailsent < NOW() - INTERVAL @x MINUTE)
  AND (state = 'NON_ACTIVE')

但您不需要为此设置 cron 作业或触发器。只需将它放在您的用户访问的 PHP 页面之一(可能是登录或注册页面?)。它甚至可以设置为不是每次都运行,而是说,如果您不介意某些记录在几秒钟或几分钟后被删除,则每百次登录一次。

【讨论】:

  • 嘿,谢谢你的回答。只是一个简单的问题.. 您在哪里写了“邮件发送”,那将是存储用户提交信息的日期和时间的列?并且“@x”应该替换为用户必须确认的分钟数?谢谢!
【解决方案3】:

将行的创建时间存储在新列中。

是否有另一个脚本(由 cron 调用?)或您的其他站点代码的一部分定期删除表中 Status="NON_ACTIVE" 的任何/所有行,这些行是在 X 分钟前创建的。

Psudeo-sql: 从 UserTable 中删除 Where (status="NON_ACTIVE" And (Minutes(now()-createdate))>30);

尝试删除同一记录的两个作业可能是竞争条件,但还不错。

【讨论】:

  • 太棒了!我已经在不同的行中有日期和时间信息。但该列称为“date_reg”。该列将在您刚刚提供的代码中定义在哪里?谢谢!
  • 另外,这个脚本将如何自动运行?看起来我必须运行一些东西?
  • 使用类似 cron 的东西,就像 @Lars 描述的那样。
【解决方案4】:

根本不需要使用数据库。只需向用户询问他们的电子邮件,发送验证链接并在点击此链接后开始注册。

【讨论】:

  • 这可行,但可能会让一些用户望而却步。如果他们只是看到他们期望需要分配更多信息的东西的电子邮件地址字段,那么这是一个不好的印象。看起来我只是想要他们的电子邮件......不过谢谢你的回答。
【解决方案5】:

使用mysql事件怎么样?

https://dev.mysql.com/doc/refman/5.1/en/events.html

CREATE EVENT delete_event
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
ON COMPLETION PRESERVE

DO BEGIN
      DELETE messages WHERE date < DATE_SUB(NOW(), INTERVAL 7 DAY);
END;

我找到了here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多