1

我有一个网站,我想在其中显示过去 24 小时发布的文章。我认为这很容易,但我无法理解我做错了什么。

让我们从头开始,在 mysql 中我有这张表:

id | editor | article | date
-----------------------------
128|   8    |  ....   | 2013-03-20 01:01:26
129|   8    |  ....   | 2013-03-20 01:03:24

日期字段是 TIMESTAMP。

现在在php中我有这个代码:

$date = date('Y-m-d H:i:s', strtotime('-1 day')); //24 hours ago
$articles = mysql_query("SELECT * FROM articles WHERE editor=8 AND 'date' > '".$date."' ORDER BY id DESC");

如果我现在运行此代码,因为我的本地时间戳是“2013-03-21 15:20:07”(比文章时间戳多 24 小时)我仍然会收到文章,尽管我不应该因为 2013-03-20 01:01:26(第 128 条时间戳)< 2013-03-20 15:20:07(现在 - 1 天)。我还通过 phpmyadmin 运行代码,结果相同。

我看不出我做错了什么,我尝试尝试使用我的数据库中具有日期字段的其他表,但我仍然无法让它工作。

非常感谢。

4

3 回答 3

4

它不起作用的原因是因为您用单引号将列名括起来。它的效果是将列名更改为字符串,因此您将日期与字符串文字date进行比较。删除它周围的单引号,它将起作用。

$articles = mysql_query("SELECT * FROM articles WHERE editor=8 AND date > '".$date."' ORDER BY id DESC");

请记住,single quotesasdouble quotes用于字符串文字,而backticks 用于标识符。

作为旁注,SQL Injection如果变量的值(s)来自外部,则查询很容易受到攻击。请看下面的文章,了解如何预防。通过使用PreparedStatements,您可以摆脱在值周围使用单引号。

于 2013-03-21T13:28:34.753 回答
0

我知道问题已经回答并解决了,但我只想说下一句话:

你为什么不让 mysql 做数学,它更短更容易阅读:)?

SELECT * FROM articles WHERE editor=8 AND 'date' > DATE_ADD(NOW(), INTERVAL -1 DAY) ORDER BY id DESC ;
于 2013-03-22T10:49:12.057 回答
-1

最好的解决方案是将数据库中的时间存储转换为秒,然后使用您的查询

例如:日期('H:i:s');

转换为秒 => 变量=(3600* date('H') + 60*date('i') + date('s'));

现在用几秒钟做任何事情

于 2013-03-21T13:36:01.147 回答