Список событий дневника, сгруппированных по дням в PHP / MySQL

Я пытаюсь перечислить события дневника в PHP из базы данных MySQL, но сгруппированы по дням. Я объясню.

Это скриншот того, что у меня есть до сих пор:

введите описание изображения здесь

Как вы можете видеть, есть два дневниковых события на 23 октября 2012 года и показаны две иконки календаря / представления / что угодно. Я на самом деле хочу, чтобы он показывал один значок календаря слева, но перечислял все события этого дня справа, до следующего дня – как показано в моем впечатлении от идиотов ниже:

введите описание изображения здесь

Это код, который я только что написал, может кто-нибудь, пожалуйста, указать мне в правильном направлении:

$SQL = "SELECT entry_id, entry_title, entry_body, entry_date, entry_day, entry_month, entry_year "; $SQL .= "FROM pages_diary WHERE entry_month = :this_month AND entry_year = :this_year "; $SQL .= "ORDER BY entry_date DESC;"; // PDO stuff if ($STH->rowCount() > 0) { while($row = $STH->fetch()): $this_db_month_word = mktime(0, 0, 0, $row['entry_month']); $this_db_month_word = strftime("%b", $this_db_month_word); echo '<div class="diary_events_item" id="diary_events_item_'.$row['entry_id'].'">'; echo '<div class="diary_events_item_left">'; echo '<div class="calendar_wrap">'; echo '<div class="calendar_wrap_top">'; echo $this_db_month_word; echo '</div>'; echo '<div class="calendar_wrap_bottom">'; echo str_pad($row['entry_day'],2,'0',STR_PAD_LEFT);; echo '</div>'; echo '</div>'; echo '</div>'; echo '<div class="diary_events_item_right">'; echo '<strong>'.htmlspecialchars($row['entry_title']).'</strong><br>'; echo '<p>'.htmlspecialchars($row['entry_body']).'</p>'; echo '</div>'; echo '<div class="clear"></div>'; echo '</div>'; endwhile; } else { echo '<p>There are no diary entries logged for <strong>'.$this_month_word.' '.$this_year.'</strong>.</p>'; } 

Не глядя на точный код (хотя это было бы неплохо), просто объяснение сделало бы, я уверен, что смогу это исправить.

ИСПРАВЛЕНИЕ

В конце цикла WHILE я добавил:

 $last_db_day = $row['entry_day']; 

Затем заверните элемент календаря в:

 if ($last_db_day != $row['entry_day']) { echo '<div class="calendar_wrap_top">'; echo $this_db_month_word; echo '</div>'; echo '<div class="calendar_wrap_bottom">'; echo str_pad($row['entry_day'],2,'0',STR_PAD_LEFT);; echo '</div>'; } 

Когда вы зацикливаете свой набор результатов из базы данных, следите за последней entry_date которую вы видели, и entry_date только новый значок календаря, если текущая запись относится к другой дате.

Обычно я делаю это следующим образом:

 if ($STH->execute()) { // output headers $row = $STH->fetch(); while ($row) { $current_date = $row['entry_date']; // output $current_date initialisation do { // output event $row } while ($row = $STH->fetch() and $row['entry_date'] == $current_date); // output $current_date termination } // output footers } 

Хотя я бы пошел наоборот и встраивал PHP в HTML, а не наоборот, вот что я сделал бы с помощью вашего кода:

 $SQL = "SELECT entry_id, entry_title, entry_body, entry_date, entry_day, entry_month, entry_year "; $SQL .= "FROM pages_diary WHERE entry_month = :this_month AND entry_year = :this_year "; $SQL .= "ORDER BY entry_date DESC;"; // PDO stuff if ($STH->rowCount() > 0) { $loopDay = ''; while($row = $STH->fetch()): if ($row['entry_day'] != $loopDay) { $loopDay = $row['entry_day']; $changed = true; } $this_db_month_word = mktime(0, 0, 0, $row['entry_month']); $this_db_month_word = strftime("%b", $this_db_month_word); echo '<div class="diary_events_item" id="diary_events_item_'.$row['entry_id'].'">'; echo '<div class="diary_events_item_left">'; if ($changed) { echo '<div class="calendar_wrap">'; echo '<div class="calendar_wrap_top">'; echo $this_db_month_word; echo '</div>'; echo '<div class="calendar_wrap_bottom">'; echo str_pad($row['entry_day'],2,'0',STR_PAD_LEFT);; echo '</div>'; echo '</div>'; } else { echo '&nbsp;'; } echo '</div>'; echo '<div class="diary_events_item_right">'; echo '<strong>'.htmlspecialchars($row['entry_title']).'</strong><br>'; echo '<p>'.htmlspecialchars($row['entry_body']).'</p>'; echo '</div>'; echo '<div class="clear"></div>'; echo '</div>'; $changed = false; endwhile; } else { echo '<p>There are no diary entries logged for <strong>'.$this_month_word.' '.$this_year.'</strong>.</p>'; }