我在一个访问者可以创建帐户的网站上工作,为此,他们必须在流程结束时确认他们的电子邮件地址。
在创建帐户之前,输入的值(如电子邮件,通行证等)将暂时保存在一个特殊的表中。这意味着访问者有一个小时的时间打开他们的电子邮件并点击链接,否则该行将被删除,以防止机器人和邪恶或只是懒惰的人的"垃圾"。
我的想法是让用户清理混乱,这就是方法:当用户点击发送给他们的链接时,表中具有临时存储值的行将移动到成员的实际表中,另一个函数将清理"过时"的行,即一个多小时前插入的行。
这是我当前的代码:
$stmt3 = $dbc->prepare('DELETE FROM temp_storage WHERE time() - time > 3600');
$stmt3->execute();
(时间是存储插入行时间的列)
但是,此代码显然不起作用。我知道我可以使用 SELECT FROM temp_storage 做一个解决方法,然后检查该行是否插入得太久了,但我想,为什么不可能这样做?
现在我的问题是,是这样,还是我做错了?
MySQL中的TIME()
不会给你当前时间,它会从时间戳中剥离"时间部分"。您正在寻找一个不同的时间函数,可能UNIX_TIMESTAMP()
这是否是您将时间戳存储在表中的方式。
在此处查看 MySQL 日期和时间函数:http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html
您用于获取当前时间的函数不正确。这不是time()
而是now()
.
如果您检查$pdo->errorInfo()
返回的内容,则会看到一条错误消息。
根据您对echo time()
的评论,我得到了您想做的事情,但为了使它起作用,您应该写以下内容:
$stmt3 = $dbc->prepare('DELETE FROM temp_storage WHERE '.time().' - time > 3600');
$stmt3->execute();
通过这样做,您可以使用PHP的time()
函数的返回值来构建一个字符串,然后将其发送到MySQL作为查询执行。
你必须了解PHP领域和SQL领域代码之间的区别:
PHP 只构造文本字符串。它将各种单词拼凑在一起,组成一个字符串。PHP 甚至不关心该字符串的用途。
PHP 永远不会查看该字符串并说"嘿,这是一些很好的 SQL 查询"。
它可以做的是将你撰写的文本发送到SQL服务器;SQL服务器将尝试执行文本,就好像是一个完整的SQL语言语句一样。
如果它遇到错误,它会将它们报告回 PHP,如果没有,它会将结果返回给 PHP。在任何情况下,SQL语句都是字符串,它们在实际发送到服务器之前被组合在一起。
"中断"一个字符串并将另一个字符串连接到它(如"me"."&"."you"
)只是在将字符串发送到 SQL Server 之前构建字符串的过程的一部分。
试试这个:
$stmt3 = $dbc->prepare('DELETE FROM temp_storage WHERE UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(time) > 3600');
我假设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