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


(niesuszek) #1

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("");
}
?>


(kostek135) #2

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


(niesuszek) #3

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


(kostek135) #4

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?


(niesuszek) #5

Dzięki wielkie za pomoc :slight_smile: