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-2115:20:07」(記事のタイムスタンプより24時間以上)であるため、このコードを実行すると、2013-03-20のために取得すべきではありませんが、引き続き記事を取得します。 01:01:26(記事128のタイムスタンプ)<2013-03-20 15:20:07(現在-1日)。また、phpmyadminを介してコードを実行し、同じ結果が得られます。

何が間違っているのかわかりません。データベースの他のテーブルで日付フィールドを試してみましたが、それでも機能しませんでした。

どうもありがとう。

4

3 に答える 3

4

それが機能しない理由は、列名を一重引用符で囲んでいるためです。その効果は、列名を文字列に変更することです。したがって、日付を文字列リテラルの日付と比較します。その周りの一重引用符を削除すると、機能します。

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

sは識別子用であるのに対し、文字列リテラル用であるsingle quotesことを忘れないでください。double quotesbacktick

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

最善の解決策は、データベースのタイムストアを秒に変換してからクエリを使用することです

例:date('H:i:s');

秒に変換=>変数=(3600 * date('H')+ 60 * date('i')+ date('s'));

今秒で何かをする

于 2013-03-21T13:36:01.147 に答える