2013-03-21 112 views
1

我有一個網站,我想顯示過去24小時內發佈的文章。我認爲這很容易,但我不明白我做錯了什麼。日期過濾在mysql中不起作用,php

讓我們從一開始啓動,在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年3月21日15點20分07秒」(比文章超過24小時時間戳)我仍然拿到文章,雖然我不應該因爲2013-03-20 01:01:26(文章128時間戳)< 2013-03-20 15:20:07(現在 - 1天)。我也通過phpmyadmin運行代碼和結果相同。

我看不出我做錯了什麼,我試着用我的數據庫的其他表格試驗有日期字段,我仍然無法讓它工作。

非常感謝。

+0

我將時間存儲爲秒(),使我能夠更自由和靈活地進行查詢。 – Suyash 2013-03-21 13:28:27

回答

4

它不工作的原因是因爲您正在用單引號包裝列名。它的作用是將列名更改爲字符串,因此您將日期與字符串文字的日期進行比較。刪除它周圍的單引號,它將起作用。

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

記住,single quotes以及double quotes是字符串常量,而backtick s爲標識符。

作爲旁註,如果變量的值(s)來自外部,則該查詢容易受到SQL Injection的影響。請看下面的文章,瞭解如何防止它。通過使用PreparedStatements你可以擺脫使用單引號圍繞值。

+0

+1不錯的答案。 – 2013-03-21 13:30:36

+0

你執行的最後一個查詢是什麼? – 2013-03-21 14:08:56

+0

不幸的是,刪除單引號不起作用。同時添加反引號而不是單引號不起作用。 奇怪的是,從phpmyadmin運行查詢仍然無法正常工作。 例如,下面的查詢: SELECT * FROM'coupons' WHERE'tipster_id' = 8,'date'> 2013年3月20日14時15分05秒 給出了這樣的錯誤「#1064 - 你有一個錯誤你的SQL語法;檢查對應於你的MySQL服務器版本的手冊,選擇正確的語法,以便在'14:15:05在第1行的極限0,30'附近使用。 此查詢: SELECT * FROM'coupons' WHERE'tipster_id' = 8 AND'date'>'2013-03-20 14:15:05' – Spahar 2013-03-21 14:10:50

-1

最好的解決方法是在轉換數據庫中的時間存儲器到秒,然後使用您的 查詢

例如:日期( 'H:I:S');

convert into seconds => variable =(3600 * date('H')+ 60 * date('i')+ date('s'));

現在做秒

+0

對不起,但我真的不明白。您建議我將數據庫行的日期字段轉換爲秒,然後查找哪些行(文章)在我想要的時間? 如果我明白你在說什麼,我需要先從數據庫中獲得例如最近的20篇文章,然後找出最近24小時內創建了哪些文章。正確? – Spahar 2013-03-21 14:15:29

0

我知道這個問題的答案和解決任何事情,但我只想說,接下來的事情:

爲什麼不要你讓MySQL的做數學題,這是短並容易閱讀:)?

SELECT * FROM articles WHERE editor=8 AND 'date' > DATE_ADD(NOW(), INTERVAL -1 DAY) ORDER BY id DESC ;