如何使用基于计算的条件执行PDO查询

时间:2012-08-16 16:26:02

标签: php pdo

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

在创建帐户之前,输入的值(如email,pass etcetc)会暂时保存在特殊表中。这意味着访问者有一个小时打开他们的电子邮件并点击链接,否则该行将被删除,以防止机器人和邪恶的“垃圾”或只是重叠的人。

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

这是我目前的代码:

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

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

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

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

4 个答案:

答案 0 :(得分:3)

MySQL中的

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

相关问题