Czego się nauczysz?
- Obsługi formularzy z polami daty i czasu
- Walidacji danych czasowych w PHP
- Obliczania sum i średnich z danych
- Filtrowania rekordów po datach
- Tworzenia prostych raportów i statystyk
Stworzysz Rejestr treningów - aplikację umożliwiającą zapisywanie aktywności sportowych wraz z informacjami o typie treningu, czasie trwania i dacie. System pozwala śledzić postępy, przeglądać historię treningów oraz generować podsumowania. To praktyczne narzędzie dla osób dbających o regularną aktywność fizyczną.
Czego się nauczysz?
W prawdziwej pracy...
Aplikacje do śledzenia aktywności (fitness trackery, aplikacje sportowe) to jeden z najpopularniejszych typów aplikacji mobilnych i webowych. Umiejętność projektowania systemów z czasem, datami i statystykami jest fundamentem dla każdego programisty tworzącego aplikacje lifestyle’owe, HR-owe (śledzenie czasu pracy) czy projektowe (time tracking).
Formularz dodawania treningu Użytkownik podaje datę treningu, typ aktywności (np. bieganie, siłownia, rower, pływanie), czas trwania w minutach oraz opcjonalnie notatkę.
Walidacja danych System sprawdza poprawność wprowadzonych danych - czy data nie jest z przyszłości, czy czas jest liczbą dodatnią, czy typ treningu jest wybrany.
Zapis do pliku JSON Każdy trening jest zapisywany do pliku JSON z unikalnym ID i znacznikiem czasu dodania.
Lista treningów Użytkownik może przeglądać wszystkie swoje treningi w formie tabeli lub listy, posortowane od najnowszego.
Przykładowa struktura pliku JSON:
{ "trainings": [ { "id": 1, "date": "2026-02-10", "type": "bieganie", "duration": 45, "notes": "Bieg w parku, dobra pogoda", "created_at": "2026-02-10 18:30:00" }, { "id": 2, "date": "2026-02-12", "type": "siłownia", "duration": 60, "notes": "Trening górnych partii", "created_at": "2026-02-12 20:15:00" }, { "id": 3, "date": "2026-02-14", "type": "rower", "duration": 90, "notes": "", "created_at": "2026-02-14 10:00:00" } ]}Wymagane funkcje:
Przykładowy scenariusz:
Ocena: 3.0Użytkownik wchodzi na stronę i widzi formularz. Wybiera datę “2026-02-15”, typ “bieganie”, wpisuje 30 minut i dodaje notatkę “Poranny bieg”. Po kliknięciu “Dodaj trening” widzi komunikat sukcesu. Na liście pojawia się nowy wpis, a na dole suma: “Łączny czas treningów: 2h 45min”.
Wszystko z wariantu A, plus:
Przykładowy scenariusz:
Ocena: 4.0-5.0Użytkownik wybiera filtr “ostatni tydzień” i widzi tylko treningi z tego okresu. Pod listą wyświetla się podsumowanie: “Ten tydzień: 4 treningi, 3h 15min, średnio 49min/trening”. Widzi też rozkład: “Bieganie: 2, Siłownia: 1, Rower: 1”.
Wszystko z wariantu B, plus:
Przykładowy scenariusz:
Ocena: 5.0-6.0Użytkownik widzi wykres słupkowy pokazujący czas treningów w ostatnich 7 dniach. Pod wykresem pasek postępu: “Cel tygodniowy: 5h | Zrealizowano: 3h 15min (65%)”. Może kliknąć na trening i edytować go lub usunąć. Widzi też porównanie: “vs poprzedni tydzień: +45min (+30%)”.
Walidacja daty (nie z przyszłości):
$date = $_POST['date'];$today = date('Y-m-d');
if ($date > $today) { $errors[] = "Data nie może być z przyszłości";}Walidacja czasu treningu:
$duration = filter_var($_POST['duration'], FILTER_VALIDATE_INT);
if ($duration === false || $duration <= 0) { $errors[] = "Czas treningu musi być liczbą dodatnią";}
if ($duration > 480) { // max 8 godzin $errors[] = "Czas treningu nie może przekraczać 8 godzin";}Obliczanie sumy czasu:
function calculateTotalTime(array $trainings): int { $total = 0; foreach ($trainings as $training) { $total += $training['duration']; } return $total;}
// Formatowanie czasufunction formatDuration(int $minutes): string { $hours = floor($minutes / 60); $mins = $minutes % 60;
if ($hours > 0) { return "{$hours}h {$mins}min"; } return "{$mins}min";}Filtrowanie po zakresie dat:
function filterByDateRange(array $trainings, string $from, string $to): array { return array_filter($trainings, function($t) use ($from, $to) { return $t['date'] >= $from && $t['date'] <= $to; });}
// Ostatni tydzień$weekAgo = date('Y-m-d', strtotime('-7 days'));$today = date('Y-m-d');$thisWeek = filterByDateRange($trainings, $weekAgo, $today);Grupowanie po typie treningu:
function countByType(array $trainings): array { $counts = []; foreach ($trainings as $t) { $type = $t['type']; $counts[$type] = ($counts[$type] ?? 0) + 1; } return $counts;}Wykorzystaj lekcje!
Cotygodniowe spotkania podczas lekcji to idealny moment, by:
Pracuj iteracyjnie - lepiej mieć działający wariant A niż niedokończony C!