Показывать год только один раз в цикле архивов

Я только начал с PHP и mySQL, и я создаю какой-то блог. В свое время я думаю, что все идет хорошо – у меня есть некоторые проблемы с моим кодом архивов.

Я думаю, что решение будет довольно простым, но я настолько ослеплен, что просто не могу найти смысла сам.

Это мой фактический код, и все работает отлично, а также ссылки:

$sql = mysql_query ("SELECT YEAR(date) AS get_year, MONTH(date) AS get_month, COUNT(*) AS entries FROM blogdata GROUP BY get_month ORDER BY date ASC") or die('No response from database.'); while ($row = mysql_fetch_array($sql)) { $get_year = $row["get_year"]; $get_month = $row["get_month"]; $entries = $row["entries"]; // get month name $this_month = date( 'F', mktime(0, 0, 0, $row["get_month"]) ); echo '<dl>'; echo '<dt>Entries from &nbsp;'. $get_year . '</dt>'; echo '<dd><a href="archives.php?month='. $get_month .'">Entries from &nbsp;'. $this_month . '&nbsp;</a>(' . $entries . ')</dd>'; echo '</dl>'; } 

ОК. Тогда результат в браузере выглядит примерно так:

  • Записи с 2012 года
    1. Записи с Январь (2)
  • Записи с 2012 года
    1. Записи с Февраля (1)

Теперь мой вопрос: как я могу возобновить все месяцы в году? Как это:

  • Записи с 2012 года
    1. Записи с Январь (2)
    2. Записи с Февраля (1)

Я боюсь создать 12-месячный массив, возможно, не каждый месяц будут записи, и я не хочу показывать пустые месяцы.

Кто-нибудь может мне помочь? Благодаря!!

—————

Здесь я снова хочу показать окончательный (рабочий !!) результат вашей дружеской помощи:

По крайней мере, я использовал версию Сэма, потому что это было именно то, что я искал. Я действительно ценю другие ответы – особенно, потому что теперь у меня есть больше вещей, чтобы думать о следующих попытках.

Код Сэма работал просто потрясающе … Единственная проблема, с которой я столкнулся, заключалась в том, что после использования массива он печатал только «декабрь» в виде месяцев.

Поэтому я снова просмотрел код и после 2 часов поиска и попытки, я нашел проблему. Он был вложен в следующую строку:

 $this_month = date( 'F', mktime(0, 0, 0, $row['get_month']) ); 

Меняя его (это логично, но для меня, как для greenhorn, это немного меня):

 $this_month = date( 'F', mktime(0, 0, 0, $month['get_month']) ); 

Теперь все работает нормально. Как я и ожидал. Итак, это рабочий конечный код:

  $sql = mysql_query ("SELECT YEAR(date) AS get_year, MONTH(date) AS get_month, COUNT(*) AS entries FROM blogdata GROUP BY get_year, get_month ORDER BY date ASC") or die('No response from database.'); $entries = array(); while ($row = mysql_fetch_assoc($sql)) { $entries[$row['get_year']][] = $row; } foreach($entries as $year => $months) { echo '<dl>'; echo '<dt>Entries from &nbsp;'. $year . '</dt>'; foreach($months as $month) { $this_month = date( 'F', mktime(0, 0, 0, $month['get_month']) ); echo '<dd><a href="archives.php?month='. $month['get_month'] .'">Entries from &nbsp;'. $this_month . '&nbsp;</a>(' . $month['entries'] . ')</dd>'; } echo '</dl>'; } 

Спасибо всем!

Я считаю, что самый простой способ заключается в следующем:

 $entries = array(); while ($row = mysql_fetch_assoc($sql)) { $entries[$row['get_year']][] = $row; } foreach($entries as $year => $months) { echo '<dl>'; echo '<dt>Entries from &nbsp;'. $year . '</dt>'; echo '<dd>'; foreach($months as $month) {\ $this_month = date( 'F', mktime(0, 0, 0, $row["get_month"]) ); echo '<a href="archives.php?month='. $month['get_month'] .'">Entries from &nbsp;'. $this_month . '&nbsp;</a>(' . $month['entries'] . ')'; } echo '</dd></dl>'; } 

Эта разметка HTML не идеальна, но вы должны получить эту идею.

Прежде всего, измените свой запрос на группу по годам и месяцам, а не только на месяц:

 $query = "SELECT YEAR(date) AS get_year, MONTH(date) AS get_month, COUNT(*) AS entries FROM blogdata GROUP BY get_year, get_month ORDER BY date ASC" 

Я не помню старый mysql API, так что вот код с PDO (непроверенный, но должен работать после исправления потенциальных опечаток)

 $pdo = new PDO('mysql:host=localhost;dbname=db', 'user', 'password'); $stmt = $pdo->prepare($query); $stmt->execute(); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); //group results by year * $groupped = array(); foreach ($results as $record) { $groupped[$record['get_year']] = $record; } //print results echo "<dl>"; foreach ($groupped as $year => $monthsRecords) { echo "<dt>$year</dt>"; foreach ($monthsRecords as $record) { echo "<dd>{$record['get_month']} : {$record['entries']}</dd>"; } } echo "</dl>"; 

Вы также можете попытаться упростить код с помощью PDO :: FETCH_GROUP, как описано в методе detch fetchAll, но я никогда не пробовал этот, поэтому я не буду давать вам код.

попробуй это

 $start_year = date("Y")-10; $end_year = date("Y"); for ($i=$start_year;$i<$end_year;$i++){ $sql = mysql_query ("SELECT YEAR(date) AS get_year, MONTH(date) AS get_month, COUNT(*) AS entries FROM blogdata where YEAR(date) = $i GROUP BY get_month ORDER BY date ASC"); or die('No response from database.'); //execute your query here. get the $result = mysql_query($sql); echo '<dl>'; echo '<dt>Entries from &nbsp;'. $i . '</dt>'; while ($row = mysql_fetch_array($result )) { $get_year = $row["get_year"]; $get_month = $row["get_month"]; $entries = $row["entries"]; // get month name $this_month = date( 'F', mktime(0, 0, 0, $row["get_month"]) ); echo '<dd><a href="archives.php?month='. $get_month .'">Entries from &nbsp;'. $this_month . '&nbsp;</a>(' . $entries . ')</dd>'; } echo '</dl>'; }