簡體   English   中英

列出在PHP / MySQL中按天分組的日記事件

[英]Listing diary events grouped by days in PHP/MySQL

我正在嘗試從MySQL數據庫中列出PHP中的日記事件,但按天分組。 我會解釋一下。

這是我到目前為止的截圖:

在此輸入圖像描述

正如您所看到的,2012年10月23日有兩個日記活動,並顯示兩個日歷圖標/表示/無論什么。 我實際上希望它在左側顯示一個日歷圖標,但在右側列出所有那些日期事件,直到第二天 - 如下面的a̶r̶t̶i̶s̶t̶s̶idiots印象中所示:

在此輸入圖像描述

這是我剛剛寫的代碼,有人可以指出我正確的方向:

$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 ,如果當前記錄是針對不同的日期,則僅輸出新的日歷圖標。

我通常這樣做如下:

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>';
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM