在mysql db和PHP中删除x分钟后的整行

在mysql db和PHP中删除x分钟后的整行,php,mysql,Php,Mysql,我正在尝试设置一个sql数据库,用户必须确认他们的电子邮件地址。我想知道是否有一种方法可以自动删除sql db中尝试注册(提交其信息)但在x分钟后未确认其电子邮件地址的用户 我编写的脚本将他们的信息直接插入数据库,然后在用户确认后将数据库中的一列更新为“活动”,因此我不会在他们激活后插入数据,而是在激活前以“非活动”状态插入数据。然后,当他们确认他们的电子邮件地址时,该状态变为“活动” 因此,如果用户提交了他们的信息,但没有确认他们的电子邮件地址,他们的详细信息仍在数据库中。我需要的东西,将自动

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

我编写的脚本将他们的信息直接插入数据库,然后在用户确认后将数据库中的一列更新为“活动”,因此我不会在他们激活后插入数据,而是在激活前以“非活动”状态插入数据。然后,当他们确认他们的电子邮件地址时,该状态变为“活动”

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


有什么想法吗?

SQL将是
DELETE FROM users WHERE(now()-mailssent)>(120*60)和state=“NON_ACTIVE”
,其中users是表名,mailssent是发送邮件的时间戳,120是您想要的超时分钟数

您可以在linux系统上使用
cron-esomeuser
通过cronjob运行此命令,然后输入以下行

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

这将每分钟运行一次命令。请注意,您的someUser必须能够在不使用密码的情况下访问mysql数据库,例如,将密码放入

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

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

Psudeo sql:从UserTable中删除,其中(status=“NON_ACTIVE”和(Minutes(now()-createdate))>30)


两个作业试图删除同一条记录可能是一种竞争条件,但不是很糟糕。

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

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

DELETE
FROM users
WHERE (mailsent < NOW() - INTERVAL @x MINUTE)
  AND (state = 'NON_ACTIVE')
删除
来自用户
其中(mailssent

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

使用mysql事件怎么样

CREATE EVENT delete\u事件
按计划在当前时间戳+间隔1天
竣工保护区
一定要开始
删除日期

我发现它

无法自动执行此操作。您需要cronjob/scheduler帮助进行修剪。您不仅限于以root用户身份运行cronjobs,还可以让db的cronjobs作为非特权用户运行。mysql用户也是如此,最好为这种工作创建一个本地信任的用户。嘿,谢谢你的回答。我应该把代码放在哪里?我是SQL DB的新手,奇怪的是希望有一种方法可以使用php来实现。我不会为cronjob操心,因为我没有使用linux系统。我有MySQL工作台设置(如果需要的话)。我猜代码需要进入“触发器”字段?谢谢你,伙计!在windows计算机上,您还可以在
Start>Programs>Accessories>System Tools>scheduled Tasks
下添加计划作业。将上面的mysql查询保存在文件\path\to\example.sql中,并使用
mysql.exe
(通常在c:\Program Files\mysql\5.0中的某个位置)和参数“-e”\path\to\example.sql-D myDatabase添加新的计划任务。将作业安排为每分钟运行一次,您将拥有与cronjob相同的任务。欢迎你(给我名誉)@导航“麻烦”?你需要一些工具来定期运行这些代码,如果你在使用Windows,你应该寻找其他的任务调度器——它对于任何类型的服务器安装来说都是非常关键的基础设施。问题是,我在共享主机(GoDaddy)上,所以我认为我不能做类似的事情。我完蛋了吗?谢谢(我给了你代表btw xD)太棒了!我已经在另一行有了日期和时间信息。但该列称为“date_reg”。在您刚才提供的代码中,该列将在何处定义?谢谢此外,该脚本将如何自动运行?看起来像是我必须运行的东西?使用像cron这样的东西,比如@Lars描述的。这会起作用,但可能会让一些用户却步。如果他们只是看到一个电子邮件地址字段,而他们希望获得更多的信息,这会给他们留下不好的印象。看起来我只是想要他们的电子邮件。。。谢谢你的回答。嘿,谢谢你的回答。只是一个简单的问题。。在您写“mailsent”的地方,该栏将存储用户提交信息的日期和时间?而“@x”应该替换为用户需要确认的分钟数?谢谢
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;