我在访问者可以创建帐户的网站上工作,为此,他们必须在流程结束时确认他们的电子邮件地址。
在创建帐户之前,输入的值(如email,pass etcetc)会暂时保存在特殊表中。这意味着访问者有一个小时打开他们的电子邮件并点击链接,否则该行将被删除,以防止机器人和邪恶的“垃圾”或只是重叠的人。
我的想法是让用户清理混乱,这就是:当用户点击发送给他们的链接时,表中具有临时存储值的行被移动到成员的实际表中,另一个函数将清理“过时”的行,即超过一小时前插入的行。
这是我目前的代码:
$stmt3 = $dbc->prepare('DELETE FROM temp_storage WHERE time() - time > 3600');
$stmt3->execute();
(时间是存储插入行的时间的列)
但是这段代码显然不起作用。我知道我可以使用SELECT FROM temp_storage做一个解决方法,然后检查该行是否已经插入很久了,但我想,为什么这样做是不可能的呢?
现在我的问题是,是,还是我做错了?
答案 0 :(得分:3)
TIME()
没有给你当前时间,它从时间戳中删除了“时间部分”。您正在寻找一个不同的时间函数,可能是UNIX_TIMESTAMP()
,如果这是您在表中存储时间戳的方式。
在此处查看MySQL日期和时间函数:http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html
答案 1 :(得分:1)
您用来获取当前时间的功能不正确。它不是time()
now()
。
如果您查看$pdo->errorInfo()
返回的内容,则会看到错误消息。
根据您对echo time()
的评论,我得到了您想要做的事情,但为了使其发挥作用,您应该写下以下内容:
$stmt3 = $dbc->prepare('DELETE FROM temp_storage WHERE '.time().' - time > 3600');
$stmt3->execute();
通过这样做,您可以使用PHP的time()
函数的返回值来构建一个字符串,然后将该字符串发送到MySQL以作为查询执行。
您必须了解PHP-realm和SQL-realm代码之间的区别:
PHP只构造文本字符串。它将各种单词拼凑成一个字母组成一个字符串。 PHP甚至不关心字符串是什么。
PHP永远不会查看该字符串并说“#34;嘿,这是一些很好的SQL查询,就在这里"。
它能做的是将你编写的文本发送到SQL服务器;如果是一个核心SQL语言语句,sql server将尝试执行文本,就像一样。
如果遇到错误,它会将它们报告回PHP,否则会将结果返回给PHP。在任何情况下,SQL语句都是 strings ,它们在实际发送到服务器之前就会被组合。
"遮断"一个字符串并将另一个字符串连接到它,例如"me"."&"."you"
,只是在将字符串发送到SQL服务器之前构建字符串的过程的一部分。
答案 2 :(得分:1)
试试这个:
$stmt3 = $dbc->prepare('DELETE FROM temp_storage WHERE UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(time) > 3600');
答案 3 :(得分:0)
我假设entry_dt列是datetime
列。
where CURRENT_TIMESTAMP - interval 1 HOUR > entry_dt
您应该避免使用与sql函数和关键字相同的列命名
REF http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html