Článek v rubrikách:

»PHP
»MySQL

Jak na svátky v PHP a MySQL?

Práce se svátky jednou potká snad každého programátora, na netu je tisíce návodů jak na to, ale na každém mi něco vadí. Kam ukládat databázi svátků, v jakém formátu a jak k nim přistupovat? Jak je zpracovávat? Co třeba všichni uživatelé kteří mají dnes svátek?


Zdrojový kód ke stažení tabulka-svatky.sql

Dosud jsem se této úloze vyhýbal nebo použil jakýkoli dostupný materiál z netu search svátky php.

Bohužel mne neuspokojil žádný nabízený návod, od způsobu uložení až po řešení přestupného roku apod.

1. Přestupný rok

Většina návodů to řeší příliš složitě různými přepočty, ale proč neukládat data ve formátu day(24.12), name(Adam), day(29.02), name (Horymír). Když je přestupný rok přistupujeme k datu 29.02 ne ke dni 61, kde je nutné přepočítat jestli je to 60 nebo 62 tento rok, no a když není přestupný rok, tak se ke dni 29.02 ani nedostaneme.

2. Více svátků v jeden den, stejný svátek ve více dní

Další věcí co mi vadí, je že tyto návody nerespektují dny jako 24.12 Adam a Eva, což z hlediska zpracování je nepřijatelné. Nebo jiný problém co svátek 22.02 Petr a jiný svátek 29.06 Petr a Pavel, Petr má totiž svátek 2x v roce. Tedy je potřeba ukládat data tak, aby obsahovali jednotný identifikátor svátku (ne Petr a Pavel) a aby bylo možné zapsat více svátků na ten samý den a více jmen na rozdílné dny.

Celá vygenerovaná databáze v kódování UTF-8, by pak měla vypadat nějak takto tabulka-svatku.sql. Ještě upozorňuji, že v ni nenajdete státní svátky, nový rok apod. pouze jména (jmeniny).

3. Ukládat do mysql nebo do pole (Array)

Jsem pro, aby byla použita databáze. Umožňuje to práci se svátky přímo v databázi bez aplikační vrstvy a hlavně umožní mi to například následující obrat:

  1. SELECT nd.*, u.* FROM users u JOIN namedays nd ON (u.name LIKE CONCAT(nd.name, ' %') AND nd.day='09.08');

Jedním dotazem jen na základě dne získáme všechny uživatele, kdo mají ten den svátek. Můžeme také jedním dotazem získat seznam a počty svátků všech uživatelů. Pokrývá to i zmíněné případy jako Adam a Eva apod.