2011-01-21 6 views
0

私は24時間この作業をしようとしましたが、今は近くにいるように感じます!複数のループでSQLのデータを表示するときに問題が発生する

私は日付(カラム:データム)を取得したいと思います。これは、私に与え

<?php 

$sql = "SELECT datum FROM gigs GROUP BY DATE_FORMAT(datum, '%Y') ORDER BY datum DESC"; 
$result = mysql_query($sql); 

while($r = mysql_fetch_array($result)) { 

    $date = $r['datum']; 
    $date_new = new DateTime($date); 
    $year = $date_new->format('Y'); 
    $month = $date_new->format('M'); 
    $day = $date_new->format('d'); 

    $sql2 = "SELECT * FROM gigs WHERE DATE_FORMAT(datum, '%Y') = $year ORDER BY datum ASC"; 
    $result2 = mysql_query($sql2); 

    echo "<tr height=20px><td></td><td align=center><b>".$year."</b></td></tr>"; 

    echo "<tr><td><b>".$month."</b></td></tr>"; 

    while($r2 = mysql_fetch_array($result2)) { 

    $date2 = $r2['datum']; 
    $date_new2 = new DateTime($date2); 
    $year2 = $date_new2->format('Y'); 
    $month2 = $date_new2->format('M'); 
    $day2 = $date_new2->format('j'); 

//echo "<b>Month: ".$month."</b>"; 
//echo "<b>Month2: ".$month2."</b>"; 

    if($month != $month2) { 
    echo "<tr><td>&nbsp;</td></tr><tr><td><b>".$month2."</b></td></tr>"; 
    } 

    $month = $month2; 

    echo "<tr class=giglist><td>".$day2."</td><td>".$r2['plats']."</td></tr>"; 



    } 
    echo "</td></tr>"; 
} 

?> 

2011 
Jan 
1. Location 
2. Location 
3. Location 
... 

Feb 
1. Location 
2. Location 
3. Location 
... 
... 
Dec 
1. Location 
2. Location 
3. Location 
... 

2010 
Dec 

Jan 
1. Location 
2. Location 
3. Location 
... 
Feb 
1. Location 
2. Location 
3. Location 
... 
... 
Dec 
1. Location 
2. Location 
3. Location 
... 

Iを:私のコードは次のように見えるのMySQLからと場所(plats列) "2010"の下に書かれた余分な12月を望んではいけません...

誰かが助けてくれることを願っています。

答えて

1

あなたのコードは非常に複雑であり、1つのだけのクエリで、

<?php 
$sql = 'SELECT 
      *, 
      DATE_FORMAT(datum, "%Y") "year", 
      DATE_FORMAT(datum, "%M") "month", 
      DATE_FORMAT(datum, "%e") "day" 
     FROM gigs 
     ORDER BY year DESC, month DESC, day ASC'; 

$year = null; 
$month = null; 
$stmt = mysql_query($sql); 
while($row = mysql_fetch_array($result)) { 
    if ($year != $result['year']) { 
     // Year changed 
     $year = $result['year']; 
     echo "<tr height=20px><td></td><td align=center><b>".$year."</b></td></tr>"; 
    } 
    if ($month != $result['month']) { 
     // Month changed 
     $month = $result['month']; 
     echo "<tr><td>&nbsp;</td></tr><tr><td><b>".$month."</b></td></tr>"; 
    } 
    echo "<tr class=giglist><td>".$result['day']."</td><td>".$row['plats']."</td></tr>"; 
} 
+0

これは元のコードよりもはるかによく見えますが、元のコードの意図が正しく理解されていれば、間違った順序で印刷されます。あなたは、年の降順でそれを昇順にする必要があります。 – kastermester

+0

あなたは絶対に正しいです。私はクエリを修正します –

+0

うわー、はるかに良いコード!私はそのような日付とSQLコード内の1列以上の "順序"を分割することが可能であるかどうかはわかりませんでした...今すぐ取得します...まだコードはテストされていませんが$ stmtを$ resultとし、ループの$ result-variablesを$ row rightとすべきでしょうか?ありがとう! – Robin

0

まずは、どうぞよろしくお願いします。私は本当に分離の心配の原理を使用することをお勧めします!テンプレートシステムを使用します(例: Smarty、http://www.smarty.net/とデータベース抽象化レイヤを使用します。その後、あなたのコードはもっと柔軟になり、読みやすくなります。そして、あなたはこの質問をする必要はなく、たくさんの時間を節約できます。

これは、あなたがこれを試すことができると言った(私はそれをテストしなかった..);

<?php 

$sql = "SELECT datum FROM gigs GROUP BY DATE_FORMAT(datum, '%Y') ORDER BY datum DESC"; 
$result = mysql_query($sql); 

while($r = mysql_fetch_array($result)) 
{ 
    $date = $r['datum']; 
    $date_new = new DateTime($date); 
    $year = $date_new->format('Y'); 
    $month = $date_new->format('M'); 
    $day = $date_new->format('d'); 

    $sql2 = "SELECT * FROM gigs WHERE DATE_FORMAT(datum, '%Y') = $year ORDER BY datum ASC"; 
    $result2 = mysql_query($sql2); 

    echo "<tr height=20px><td></td><td align=center><b>".$year."</b></td></tr>"; 
    $first_month_printed = false; 

    while($r2 = mysql_fetch_array($result2)) 
    { 
     $date2 = $r2['datum']; 
     $date_new2 = new DateTime($date2); 
     $year2 = $date_new2->format('Y'); 
     $month2 = $date_new2->format('M'); 
     $day2 = $date_new2->format('j'); 

     if($month != $month2) { 
      echo "<tr><td>&nbsp;</td></tr><tr><td><b>".$month2."</b></td></tr>"; 
     } else if (!$first_month_printed) 
      echo "<tr><td>&nbsp;</td></tr><tr><td><b>".$month2."</b></td></tr>"; 
      $first_month_printed = true; 
     } 

     $month = $month2; 
     echo "<tr class=giglist><td>".$day2."</td><td>".$r2['plats']."</td></tr>"; 
    } 

    echo "</td></tr>"; 
} 

?> 
+0

ありがとうございました。このコードを見ることを行うことができます!私はXavierのコードに固執すると思う。なぜなら、それはより効果的だからである(より少ないcharの)! – Robin

関連する問題