#php #mysql
#php #mysql
Вопрос:
мне нужно перечислить общий архив статей по годам и месяцам следующим образом :
Вывод (мне нужно):
2014
January(31)
February(28)
March(0)
April(130)
May(450)
June(0)
July(0)
August(0)
September(0)
October(520)
November(20)
December(31)
PHP:
$sql = "SELECT title, YEAR(FROM_UNIXTIME(timestamp)) AS YEAR,
MONTHNAME(FROM_UNIXTIME(timestamp)) AS MONTH,
COUNT(*) AS TOTAL
FROM article GROUP BY YEAR, MONTH ORDER BY YEAR DESC, MONTH ";
$newsdata = DB->fetch($sql);
$currentYear = null;
foreach($newsdata AS $news){
if ($currentYear != $news['YEAR']){
echo '<ul>'.$news['YEAR'].'</ul>';
$currentYear = $news['YEAR'];
}
echo '<li>'.$news['MONTH'].' '.$news['TOTAL'].'</li>';
}
Мой код работал, но печатался только месяц, если статья была опубликована в этом месяце.
Вывод:
2014
January(31)
February(28)
April(130)
May(450)
October(520)
November(20)
December(31)
Мне нужно перечислить весь месяц и распечатать общую статью за каждый месяц. если месяц не опубликовал статью, распечатайте (0)
за этот месяц.
как я могу решить свою проблему? мой код / способ верен ?!
Комментарии:
1. Просто есть массив месяцев
2. @Strawberry: что ты имеешь в виду?
3. Смотрите Ответ Джоша ниже
Ответ №1:
Ваш запрос к базе данных не вернет строку за месяц, в которой нет статей. Он ничего не знает о месяцах. Поэтому вам нужно обработать это в коде, имея массив всех месяцев и просматривая его. Альтернативой было бы изменить вашу схему, создать другую таблицу со всеми 12 месяцами и присоединиться к ней. Но я думаю, что вам проще сделать следующее:
$months = array( "January", "February", ... );
Затем вы можете сделать следующее в своем выводе вместо этого:
// Index article counts by month and year for easy lookup
$indexedNewsData = array();
foreach ($newsdata as $news) {
$indexedNewsData[$news['YEAR']][$news['MONTH']] = $news['TOTAL'];
}
// Then print output
foreach($newsdata AS $news){
if ($currentYear != $news['YEAR']){
echo '<ul>'.$news['YEAR'].'</ul>';
$currentYear = $news['YEAR'];
} else {
// Continue here otherwise we will print each year's data 12x
continue;
}
foreach ($months as $month) {
$total = intval($indexedNewsData[$news['YEAR']][$month]);
echo '<li>'.$month.' '.$total.'</li>';
}
}
Комментарии:
1.Я вижу эту ошибку для каждого месяца:
Notice: Undefined index: February in
Notice: Undefined index: January in
…..2. Вы уверены, что сначала установили массив $months?