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


How to execute a PDO query with a condition based on calculation

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

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

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

这是我当前的代码:

$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