Я только начал с 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 '. $get_year . '</dt>'; echo '<dd><a href="archives.php?month='. $get_month .'">Entries from '. $this_month . ' </a>(' . $entries . ')</dd>'; echo '</dl>'; }
ОК. Тогда результат в браузере выглядит примерно так:
Теперь мой вопрос: как я могу возобновить все месяцы в году? Как это:
Я боюсь создать 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 '. $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 '. $this_month . ' </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 '. $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 '. $this_month . ' </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 '. $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 '. $this_month . ' </a>(' . $entries . ')</dd>'; } echo '</dl>'; }