0

我在一个访问者可以创建帐户的网站上工作,为此,他们必须在过程结束时确认他们的电子邮件地址。

在创建帐户之前,输入的值(例如电子邮件、通行证等)会临时保存在一个特殊的表中。这意味着访问者有一个小时的时间打开他们的电子邮件并单击链接,否则该行将被删除,以防止机器人和邪恶或只是过度懒惰的人的“垃圾”。

我的想法是让用户清理混乱,这就是如何:当用户单击发送给他们的链接时,表中具有临时存储值的行被移动到成员的实际表中,另一个函数将清理向上“过时”的行,即超过一小时前插入的行。

这是我当前的代码:

$stmt3 = $dbc->prepare('DELETE FROM temp_storage WHERE time() - time > 3600');
$stmt3->execute();

(时间是存储插入行的时间的列)

但是,此代码显然不起作用。我知道我可以用 SELECT FROM temp_storage 做一个解决方法,然后检查该行是否插入太久,但我想,为什么不可能这样做呢?

现在我的问题是,是这样,还是我做错了?

4

4 回答 4

3

TIME()在 MySQL 中不会给你当前时间,它会从时间戳中删除“时间部分”。您正在寻找不同的时间函数,UNIX_TIMESTAMP()如果这就是您在表中存储时间戳的方式。

在此处查看 MySQL 日期和时间函数:http: //dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

于 2012-08-16T16:30:23.747 回答
1

您用于获取当前时间的功能不正确。这不是time()now()

如果您检查$pdo->errorInfo()返回的内容,您将看到一条错误消息。

根据您对我的评论,echo time()我得到了您想要做的事情,但为了使其发挥作用,您应该编写以下内容:

$stmt3 = $dbc->prepare('DELETE FROM temp_storage WHERE '.time().' - time > 3600');
$stmt3->execute();

通过这样做,您将使用 PHPtime()函数的返回值来构建一个字符串,然后将其发送到 MySQL 以作为查询执行。

您必须了解 PHP-realm 和 SQL-realm 代码之间的区别:

PHP 只构造文本字符串。它将各种单词和字母拼凑在一起组成一个字符串。PHP 甚至不关心该字符串的用途。

PHP 永远无法查看该字符串并说“嘿,这是一些很好的 SQL 查询”。

它可以做的就是将您编写的文本发送到 SQL 服务器;sql server 将尝试执行文本,就好像是一个正确的 SQL 语言语句。

如果它遇到错误,它会将它们报告回 PHP,否则它会将结果返回给 PHP。在任何情况下,SQL 语句都是字符串,它们在实际发送到服务器之前就已经组合好了。

“中断”一个字符串并将另一个字符串连接到它,这"me"."&"."you"只是在将字符串发送到 SQL 服务器之前构建字符串的过程的一部分。

于 2012-08-16T16:31:28.200 回答
1

试试这个:

$stmt3 = $dbc->prepare('DELETE FROM temp_storage WHERE UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(time) > 3600');
于 2012-08-16T16:34:05.520 回答
0

我假设 entry_dt 列是一datetime列。

where CURRENT_TIMESTAMP - interval 1 HOUR > entry_dt

您应该避免将列命名为与 sql 函数和关键字相同

参考 http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

于 2012-08-16T16:33:22.073 回答