2011-11-07 14 views
0

ユーザーがイベントを作成し、そのフォロワーがイベントページでイベントを表示できるイベントページに取り組んでいます。今年の日付と月別のグループを選択してください。

イベント日付が今年(2011年)以内のテーブルからすべてのイベントを選択すると、2011-03-30の場合はMarchヘッダーに表示されますが、2012-03-30の場合は表示されません来年までは全く表示されません。

全体的に、すべてのイベントをヘッダーの下に表示したいと思います。一月二月三月。

私のテーブル構造は、このようにある:私は(範囲を選択したい場合は、私のデータベースで

 
id        int(11) 
event_creator_user_id   int(11) 
event_creator_user_username varchar(255) 
event_creator_user_first_name varchar(255) 
event_creator_user_last_name varchar(255) 
event_name      varchar(255) 
event_date      date 
event_time      time 
event_brief_location   varchar(255) 
event_location_street   varchar(255) 
event_location_town   varchar(255) 
event_location_post_code  varchar(255) 
event_description    text 
event_create_date    datetime 
type       enum('a','b') 
+0

私はTreffynnonのアプローチはかなり良いと思います。また、 'DATE_FORMAT("%m "、event_date)'を使って月を選択することもできます(MySQLより速くPHPで実現したと思います。 – AaL

答えて

2

あなたは問題を複雑にしていると思います。これは、MySQL DATE_FORMAT functionを使用して現在の年のすべてのイベントを取得し、イベントを日付順に並べることで解決できます。

PHPでは、単純にループバックして、月が変更されたときに見出しを印刷できます。以下のコードはこれをより明確にするはずです。 PHPで

$conn = mysql_connect("localhost", "mysql_user", "mysql_password"); 
mysql_select_db("mydbname"); 

$SQL = " 
    SELECT *, 
      UNIX_TIMESTAMP(`event_date`) AS event_date_timestamp 
    FROM events 
    WHERE DATE_FORMAT(event_date, '%Y') = 2011 
     AND event_date > NOW() 
    ORDER BY event_date ASC"; 

$result = mysql_query($SQL); 

$current_month = ''; 
while ($event = mysql_fetch_assoc($result)) { 
    $month = date('m', $event['event_date_timestamp']); 
    if($current_month != $month) { 
     $current_month = $month; 
     echo '<h1>' . $current_month . '</h1>'; 
    } 
    echo '<p>' . $event['event_name'] . '</p>'; 
} 
+0

恩知らずには聞こえませんが、それは助けになりませんでした。 – Frank

+1

どうしてですか?もしあなたが私に知らせてくれたら、あなたの状況のた​​めにそれを改善することができます。 – Treffynnon

+0

私はPHPの初心者ですし、あなたのコード全体から混乱しています。警告:foreach()の引数が無効です – Frank

1

が、私は、1月1日1970年、この方法であるため、UNIXタイムスタンプとしてintとして秒数を日付を格納しますこのようちょうど3月)私はmktimeを使用することができます。

$query = mysql_query("SELECT * FROM `events` WHERE `date` > ".mktime(0,0,0,3,1,2011). " AND `date` < ".mktime(0,0,0,4,1,2011)); 

あなたは可能性がループヶ月を経て、このよう:

for($i=1; $i<=12; $i++){ 
    $query = mysql_query("SELECT * FROM `events` WHERE `date` > ".mktime(0,0,0,$i,1,2011). " AND `date` < ".mktime(0,0,0,$i+1,1,2011)); 
    $monthName = date("F",mktime(0,0,0,$i,1,2011)); // full name of the month; use "M" for short-name 
    // ... your code for printing the events here 
} 

データタイプがdateの場合は役に立ちますが、使用していません。

+1

また、 'ORDER BY \' date \ 'ASC'を使って、最初から最後までイベントを取得することができます。 – Tim

2

あなたは、関数を使用して、日付の年の部分を取得することができます。それをMySQLと仮定する:

SELECT 
    *, 
    MONTH(event_date) AS 'month' 
FROM events 
WHERE YEAR(event_date) = YEAR(CURDATE()) 
ORDER BY month ASC 
+0

私はMySQLの日付構造を使用していませんが、このようなコードを見た後、私はそれに入りたいです! – Tim

+0

これは素敵なショートカットです。私はより多くの機能をデモするためにそれをより冗長に保つことを選択しましたが、これは読むのがはるかに簡単です! – Treffynnon

+0

ちょうど警告ですが、それらの素敵な日付機能のようなほとんどの機能は、ベンダー/ DBMS固有です。悪い:あなたのSQL /コードは移植性がありません。良い:ネットワーク/トラフィックのオーバーヘッドが少なく(クライアント/サーバーがパラメータを渡す)、特にストアドプロシージャ/ビューで高速です。醜い:これらはサーバー設定(制御できないかもしれない)に依存しています。手動とサーバーの設定を常に確認してください。サーバーが異なるタイムゾーンで実行されている可能性があります。 日付/時刻の処理に関するもう1つのアドバイス:ISO形式とUTCタイムゾーンで日付/時刻を処理すると、多くの問題を解決できます。 – shimofuri

関連する問題