Przejdź do głównej zawartości

Rejestr treningów

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?

  • 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

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).

  1. 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ę.

  2. 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.

  3. Zapis do pliku JSON Każdy trening jest zapisywany do pliku JSON z unikalnym ID i znacznikiem czasu dodania.

  4. 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:

  • Formularz z polami: data, typ treningu (select), czas w minutach, notatka
  • Walidacja danych w PHP (wymagane pola, czas > 0)
  • Zapis treningu do pliku JSON
  • Lista wszystkich treningów (tabela)
  • Suma czasu wszystkich treningów
  • Prosty interfejs CSS

Przykładowy scenariusz:

Uż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”.

Ocena: 3.0

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 czasu
function 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:

  • Pokazać postępy - nawet małe kroki się liczą
  • Wyjaśnić wątpliwości - pytaj, nie zgaduj
  • Skonsultować rozwiązania - feedback pomoże Ci się rozwijać

Pracuj iteracyjnie - lepiej mieć działający wariant A niż niedokończony C!