[PHP] Kalendarz ze świętami - błąd przy powtarzaniu dat

Witam. Napisałem prosty kalendarz w PHP, który pełni funkcję wyświetlania na czerwono dni pobranych z bazy danych. Pojawił się problem, kiedy chciałem przerobić kod w ten sposób aby wprowadzone święta chrześcijańskie nie musiały być wprowadzane co rok tylko raz. Efekt jest taki, że kiedy ustawiam następny rok na kalendarzu to pobiera wszystkie rekordy i wyświetla je na czerwono w kalendarzu, a w przypadku obecnego roku ta funkcjonalność nie działa. Pomoże ktoś w rozwikłaniu problemu?

 

KOD:

<?PHP function rysujKalendarz($dzien, $miesiac, $rok) { require_once("polaczenie.php"); $dniwmiesiacu = date("t", mktime(0,0,0,$miesiac, 1, $rok)); $zapytanie = "SELECT `data` FROM `kalendarz` WHERE ((`data`>=DATE('$rok-$miesiac-$dzien')) OR (co_rok=1)) ORDER BY `data` ASC"; $wynik = mysql_query($zapytanie); $ile_znalezionych = mysql_num_rows($wynik); for ($i=0; $i<$ile_znalezionych; $i++) { $wiersz = mysql_fetch_assoc($wynik); $daty[] = $wiersz['data']; $wartCo_rok[] = $wiersz['co_rok']; } $year = $rok; $monthNum = $miesiac; $daysofmonth = date("t", mktime(0,0,0,$monthNum, 1, $year)); $dayofweek = date("w"); $dayofmonth = date("j"); $firstdayofmonth = date("w", mktime(0,0,0,$monthNum, 1, $year)); if($dayofweek == 0) $dayofweek = 7; if($firstdayofmonth == 0) $firstdayofmonth = 7; switch($monthNum){ case 1 : $monthName = "STYCZEN"; break; case 2 : $monthName = "LUTY"; break; case 3 : $monthName = "MARZEC"; break; case 4 : $monthName = "KWIECIEN"; break; case 5 : $monthName = "MAJ"; break; case 6 : $monthName = "CZERWIEC"; break; case 7 : $monthName = "LIPIEC"; break; case 8 : $monthName = "SIERPIEN"; break; case 9 : $monthName = "WRZESIEN"; break; case 10 : $monthName = "PAZDZIERNIK"; break; case 11 : $monthName = "LISTOPAD"; break; case 12 : $monthName = "GRUDZIEN"; break; } echo(""); echo(""); ?> <? $j = $daysofmonth + $firstdayofmonth - 1; $k=0; $q=explode("-", $daty[$k]); $CurrentDay = $q[2]; $CurrentMonth = $q[1]; $CurrentYear = $q[0]; $CurrentCo_rok = $wartCo_rok[$k];

for($i=0; $i<$j; $i++){
if($i < $firstdayofmonth - 1){
echo("

");
continue;
}
if(($i % 7) == 0)
echo("");

if((($i - $firstdayofmonth + 2) == $CurrentDay) && ($CurrentMonth == $monthNum)) {
$color = “#FF0020”;
if($k++ < $ile_znalezionych) {
$q = explode("-", $daty[$k]);
$CurrentDay = $q[2];
$CurrentMonth = $q[1];
$CurrentYear = $q[0];
$CurrentCo_rok = $wartCo_rok[$k];
}
}
else {
if(($i%7)==6)
$color = “#FF0020”;
else
$color = “#00A030”;
if(($i - $firstdayofmonth + 2)<$dzien)
$color = “#336666”;
}

echo("<TD align=“center”>");
echo("<span style=“color:$color; font-size: 12px; font-family: Verdana,Helvetica,sans-serif;”>");
echo($i - $firstdayofmonth + 2);
echo("");
}
echo("

"); echo(""); echo($monthName." ".$year); echo(""); echo("
Pn Wt Sr Cz Pt So Nd
");
}
?>

Umieszczanie takich rzeczy w bazie danych, to nieporozumienie. Święta ruchome są wyliczalne: http://users.camk.edu.pl/smolec/pl_holidays_alg.html

A jak inaczej mogę zrobić święta stałe?

Pisanie tego do bazy to bez sens jeśli chcesz obsługiwać tylko święta w Polsce, będzie ich może przy dobrych porywach ~20. Robisz sobie tablicę, gdzie przechowujesz liczby, te liczby to numer dnia, licząc od pierwszego stycznia, kiedy wypada święto. czyli np. 2 luty lutego to będzie 33 (31+2). Następnie przy generowaniu kalendarza sprawdzasz czy jesteś na i-tym obrocie pętli jeśli tak, to na czerwono wypisujesz datę, jeśli nie to nie. Na co sobie komplikować życie?

Dzięki wielkie za pomoc :slight_smile: