Skip to content

Zadania

Strona schroniska „Łapka” prawie działa. W dwóch plikach jest 8 błędów. Każdy z nich ktoś z Was kiedyś zrobił.

  1. Rozpakuj schronisko-starter-7.zip do folderu nazwisko_imie_blok7 w htdocs: małe litery, bez polskich znaków.
  2. Popraw błędy w index.php i styl.css. Niczego nie dopisuj od zera, popraw to, co jest.
  3. Przy każdej poprawce dopisz komentarz // BŁĄD 1: … (w CSS /* BŁĄD 1: … */): co było źle i jak to zauważyłeś.
Element Poprawnie
Wygląd arkusz stylów styl.css działa w całości; wiersze psów w wieku 10 lat i więcej mają tło
Linki „Wszystkie”, „Małe”, „Duże” każdy jest klikalny; „Małe” pokazuje tylko małe psy, „Duże” tylko duże, „Wszystkie” wszystkie
Wejście na stronę bez żadnego ostrzeżenia PHP
<tfoot> liczba psów widocznych w tabeli
Formularz imię niepuste, wiek liczba całkowita od 0 do 20, rozmiar z listy
Złe dane pies nie trafia do tabeli, nad formularzem widać komunikat
Dobre dane psa widać w tabeli
  • Wejście bez parametrów → 6 psów, dwa wiersze z tłem.
  • „Duże” → 4 psy, „Małe” → 2.
  • Burek, 0 lat, mały → 7 psów, bez komunikatu. To samo dla 20 lat.
  • Puste imię, wiek 21, abc, -1 → 6 psów i komunikat.
  • Najpierw F12: konsola, zakładka Sieć (czy arkusz stylów się wczytał?) i Elements.
  • Ostrzeżenie PHP podaje numer linii. Zacznij od niej.
  • Zanim coś zmienisz, przewidź, co się zmieni na stronie. Potem sprawdź.

Folder nazwisko_imie_blok7 z index.php i styl.css.

Zwykle dostajesz treść i piszesz kod. Teraz odwrotnie: masz gotowy kod, napisz do niego treść.

  1. Rozpakuj kino-7.zip i uruchom stronę. Pobaw się formularzem.
  2. Przeczytaj kod i napisz treść zadania, którego rozwiązaniem jest ten plik. Pisz tak, jak wygląda arkusz egzaminacyjny: co jest w formularzu, co robi skrypt, jakie są komunikaty.
  3. Treść ma być na tyle dokładna, żeby ktoś, kto kodu nie widział, napisał stronę liczącą dokładnie te same kwoty.

Weź swoją treść i dwa zestawy biletów. Policz kwotę z samej treści, potem w przeglądarce. Wynik ma się zgadzać.

Plik nazwisko_imie_kino_blok7.txt.

Dziś rozwiązujesz prawdziwy arkusz INF.03 z czerwca 2026 (zadanie 02, „Wodospady”) w 150 minut. Nie ma punktów ani oceny. Wynik dostajesz osobno dla każdej części arkusza.

  1. Pobierz pliki2.zip od razu na początku i rozpakuj. W środku są baza baza2.sql, zdjęcia i arkusz arkusz.pdf. To zwykły zip, więc hasło z arkusza pomiń.
  2. Utwórz folder nazwisko_imie_blok5 zamiast folderu z numerem PESEL. W stopce strony wpisz imię i nazwisko zamiast numeru zdającego.
  3. Przeczytaj arkusz w 10 minut, potem pracuj 150 minut, bez AI i bez internetu. O pomoc możesz pytać prowadzącego i kolegów.

Folder nazwisko_imie_blok5 ze wszystkimi plikami z arkusza. Spakuj go zipem i wyślij na Teams, obie grupy tak samo.

Blok 4, zadanie A — dodaj okrążenie, ale bezpiecznie

Section titled “Blok 4, zadanie A — dodaj okrążenie, ale bezpiecznie”

Formularz z bloku 3 przyjmował wszystko. Dziś PHP najpierw sprawdza dane.

  1. Rozpakuj zawody-starter-4.zip do htdocs. Nazwij plik nazwisko_imie_blok4.php: małe litery, bez polskich znaków.
  2. Dopisz obsługę formularza w sekcji // ===== OBSŁUGA FORMULARZA =====. Sekcja zostaje nad liczeniem wyników.
  3. Obsługa działa tylko po wysłaniu formularza: $_SERVER['REQUEST_METHOD'] === 'POST'.
  4. Sprawdź każde pole. Każda reguła ma własny komunikat w $blad.
Pole Poprawne, gdy
zawodnik liczba całkowita, numer zawodnika z tablicy $zawodnicy
czas liczba całkowita od 60 do 900
kary liczba całkowita od 0 do 10

Zły wpis: okrążenie się nie dodaje, nad formularzem widać komunikat. Dobry wpis: okrążenie widać w tabeli, w liczniku elity i w <tfoot>.

  • Fijałek, 250 s, 0 kar → 12 okrążeń, 3 zawodników w elicie.
  • Czas abc, puste pole, 30, 1000 → 11 okrążeń i komunikat.
  • Kary -1, 11 → 11 okrążeń i komunikat.
  • Zawodnik 7 albo abc (zmień value opcji w F12) → 11 okrążeń i komunikat.

Usuń w F12 pole czasu i wyślij. Strona ma pokazać komunikat, a nie ostrzeżenie PHP.

  • Wszystko w $_POST jest napisem, także z pola type="number".
  • ctype_digit($tekst) sprawdza, czy napis to same cyfry. Odrzuca abc, puste pole, -1 i 2.5.
  • (int) niczego nie sprawdza: z "abc" robi 0. Najpierw ctype_digit, potem (int).
  • isset($zawodnicy[$nr]) mówi, czy jest taki zawodnik. isset($_POST['czas']) mówi, czy pole przyszło.

Plik nazwisko_imie_blok4.php. Przed wysłaniem odśwież stronę i wyślij raz dobre, raz złe okrążenie.

W zadaniu A okrążenie znika po odświeżeniu. Tu trafia do wspólnej bazy, więc zostaje i widzi je cała sala.

  1. Skopiuj plik z A jako nazwisko_imie_baza_blok4.php. Pracuj na kopii.
  2. Pod <?php wklej połączenie. Host i hasło są na tablicy.
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = mysqli_connect('HOST', 'zs1', 'HASŁO', 'zawody');
mysqli_set_charset($db, 'utf8mb4');
  1. Usuń tablicę $zawodnicy z kodu. Zbuduj ją z dwóch SELECT-ów, w tym samym kształcie co w A.
  2. Dobre okrążenie zapisz do bazy i od razu przekieruj. Do zapytania wstawiasz tylko liczby po walidacji i (int).
mysqli_query($db, "INSERT INTO okrazenia (zawodnik_id, czas, kary) VALUES ($nr, $czas, $kary)");
header('Location: ' . $_SERVER['PHP_SELF']);
exit;
Tabela Kolumny
zawodnicy id (0–4, jak numery w tablicy), nazwa
okrazenia id, zawodnik_id, czas, kary, dodano (wpisuje się samo)

Kolejność w pliku: połączenie → SELECT zawodników → obsługa formularza → SELECT okrążeń → liczenie → HTML.

  • Zanim ktoś doda okrążenie, strona wygląda jak w A. Inna liczba znaczy zły kształt tablicy.
  • Dodaj okrążenie i wciśnij F5. Ma być jedno nowe okrążenie, bez pytania przeglądarki.
  • Sąsiad widzi Twoje okrążenie u siebie. Liczby rosną też od okrążeń innych osób.

Pod tabelą 5 ostatnich okrążeń, od najnowszego: ORDER BY dodano DESC, id DESC LIMIT 5.

  • mysqli_fetch_assoc($wynik) w pętli while daje kolejne wiersze jako tablice.
  • W bazie kolumna to nazwa, w tablicy klucz to 'nazwisko'.
  • Liczby z bazy przychodzą jako napisy. Dodaj (int).
  • header działa, zanim strona coś wypisze. Przed <?php nie może być nawet spacji.

Plik nazwisko_imie_baza_blok4.php, bez punktów.

Zadanie ma dwa etapy. Najpierw piszesz funkcje z pustym ciałem, potem wycinasz z HTML-a kod, który się powtarza.

Starter: zawody-starter-3.zip, w środku index.php. Rozpakuj do htdocs i od razu zmień nazwę pliku na nazwisko_imie_blok3.php: małe litery, bez polskich znaków, na przykład kowalska_anna_blok3.php. Otwórz pod localhost/nazwisko_imie_blok3.php.

Strona działa od pierwszego otwarcia. Wszystkie czasy pokazują 0:00, a każdy zawodnik ma kategorię brak. Tak ma być na starcie. Twoja robota to sprawić, żeby tabela pokazywała prawdę.

Nowość w danych: okrążenie nie jest już samą liczbą sekund, tylko rekordem z dwoma kluczami: 'czas' i 'kary'. Jedna kara kosztuje 5 sekund. Wszystko, co tabela pokazuje, liczy się z czasem powiększonym o kary.

Na górze pliku, w sekcji // ===== FUNKCJE =====, stoją dwie funkcje bez ciała. Napisz je.

Funkcja Co dostaje Co ma zwrócić
czasZKarami($okrazenie) jedno okrążenie, czyli rekord ['czas' => 300, 'kary' => 2] liczbę sekund razem z karami, tutaj 310
najlepsze($okrazenia) listę okrążeń jednego zawodnika najkrótszy czas z karami, a dla pustej listy null

Kolumny zapalają się po kolei. Jeśli po napisaniu funkcji coś dalej pokazuje 0:00, ta funkcja nie zwraca jeszcze tego, co powinna.

Uwaga na Fijałka: nie ma ani jednego okrążenia. Dlatego najlepsze([]) musi zwrócić null. Kiedy spróbujesz wybrać najmniejszą wartość z pustej listy, PHP nie ostrzeże, tylko wywali całą stronę. Przeczytaj ten błąd, zanim zapytasz.

Etap 2: ten sam kod stoi w pliku dwa razy

Section titled “Etap 2: ten sam kod stoi w pliku dwa razy”

W HTML-u są dwa fragmenty napisane po dwa razy. Oba mają komentarz.

Komentarz Co ten kod robi Gdzie stoi dwa razy
POWTÓRKA A liczy średni czas z listy okrążeń raz dla jednego zawodnika w wierszu, raz dla wszystkich okrążeń zawodów w <tfoot>
POWTÓRKA B drabinka if, która z najlepszego czasu robi nazwę kategorii raz przy liczniku elity nad tabelą, raz w wierszu zawodnika

Wytnij każdy z nich do funkcji. Nazwy są ustalone: srednia i kategoria. Co ma być parametrem, decydujesz sam, i to jest tu cała robota. Porównaj oba wystąpienia: różnica między nimi jest parametrem.

Test robisz sam: strona po Twojej zmianie ma wyglądać dokładnie tak samo jak przed nią. Refactor zmienia kod, nie wynik. Jeśli po wycięciu funkcji zmieniła się w tabeli jakakolwiek liczba, coś poszło nie tak.

Kolejność, która boli najmniej: napisz pustą funkcję, przenieś do niej kod z jednego miejsca, sprawdź stronę, dopiero potem podmień drugie.

W pliku jest jeszcze trzecie powtórzenie, nieoznaczone. Robi dokładnie to samo, co jedna z Twoich gotowych funkcji. Znajdź je i zastąp wywołaniem.

  • Funkcje mieszkają na górze pliku, w sekcji // ===== FUNKCJE =====. Nie w środku tabeli.
  • Funkcja bierze dane przez parametr. Jeśli działa tylko dlatego, że zna nazwę zmiennej z zewnątrz, masz parametr za mało.
  • count($tablica), round($liczba), implode(', ', $tablica).
  • Danych ani HTML-a nie ruszasz. Zmieniasz tylko kod PHP, który je liczy.

Plik nazwisko_imie_blok3.php.

Nazwa jest częścią zadania, tak jak na egzaminie, gdzie arkusz mówi, jak ma się nazywać każdy plik. Zanim wyślesz, odśwież stronę i sprawdź, czy wstaje.

Zanim ruszysz, zrób kopię swojego pliku pod nazwą nazwisko_imie_formularz_blok3.php i pracuj na kopii. Plik z zadania A zostaje nietknięty.

Nad tabelą dochodzi formularz, którym dodasz zawodnikowi okrążenie.

Element Co ma być
<select name="zawodnik"> jedna opcja na zawodnika, value to jego numer w tablicy
<input name="czas"> czas okrążenia w sekundach, type="number", required
<input name="kary"> liczba kar, type="number", required, domyślnie 0
przycisk wysyła formularz

Formularz ma method="post". Po wysłaniu PHP czyta $_POST i dokłada nowe okrążenie do tablicy, zanim cokolwiek policzy. Jeśli dołożysz je za późno, tabela pokaże nowy czas, ale podsumowanie i licznik elity go nie zobaczą.

Potem odśwież stronę. Okrążenie zniknie. Tak ma być: skrypt startuje od zera przy każdym żądaniu, a dane siedzą w kodzie. O tym, jak sprawić, żeby zostało, jest następny blok.

Drugi formularz, tym razem method="get", z jedną listą: pokaż tylko wybraną kategorię. Wyślij go i spójrz na pasek adresu, a zobaczysz tam swój wybór. Po formularzu POST pasek nie pokazuje nic. To jest cała różnica między jednym a drugim.

Plik nazwisko_imie_formularz_blok3.php. Bez punktów — czytam go, żeby zobaczyć, czy formularze weszły.

Starter: bieg-starter.zip (w środku index.php). Rozpakuj do htdocs, od razu zmień nazwę pliku na nazwisko_imie_blok2.php (małe litery, bez polskich znaków, np. kowalska_anna_blok2.php) i otwórz pod localhost/nazwisko_imie_blok2.php.

W pliku jest gotowa tablica $zawodnicy (nazwisko + lista czasów ukończonych okrążeń, w sekundach) i szkielet tabeli HTML z nagłówkiem. Twoja robota to <tbody> i <tfoot>. Danych nie zmieniasz.

Dla każdego zawodnika jeden wiersz tabeli

Section titled “Dla każdego zawodnika jeden wiersz tabeli”
Kolumna Co ma być
Zawodnik nazwisko z tablicy
Okrążenia wszystkie czasy po przecinku, każdy w formacie m:ss (np. 312 → 5:12)
Najlepsze najkrótsze okrążenie, m:ss
Średnie średnia z okrążeń zaokrąglona do pełnych sekund, m:ss
Kategoria najlepsze okrążenie poniżej 5:00 → elita, poniżej 6:00 → zaawansowany, inaczej amator
Uwagi jeśli którekolwiek okrążenie trwało 7:00 lub dłużej → słabe okrążenie; jeśli wszystkie okrążenia mieszczą się w 15 sekundach od najlepszego → równe tempo

Wiersz dostaje klasę CSS równą kategorii (class="elita" itd.) — style już są w <style>.

Uwaga na Zielińskiego: nie ma ani jednego ukończonego okrążenia. Dla niego w wierszu ma być tekst brak ukończonych okrążeń i przechodzisz dalej. Jeśli to przeoczysz, PHP nie da ostrzeżenia, tylko wywali całą stronę błędem. Przeczytaj ten błąd, zanim zapytasz.

Ilu zawodników łącznie, ilu w kategorii elita, najlepsze okrążenie zawodów (najkrótsze ze wszystkich, m:ss) i ile okrążeń łącznie. Liczniki żyją poza pętlą i rosną w jej środku.

  • m:ss: minuty to floor($sekundy / 60), sekundy to $sekundy % 60, a str_pad($x, 2, '0', STR_PAD_LEFT) dokleja zero z przodu, żeby wyszło 5:05, nie 5:5.
  • min($tablica), count($tablica), implode(', ', $tablica), round($liczba).
  • Zestaw danych jest dobrany tak, że każdy zawodnik wpada w inną gałąź. Jeśli dwa wiersze wyglądają tak samo, coś jest nie tak.

Zanim ruszysz, zrób kopię pliku pod nazwą nazwisko_imie_funkcje_blok2.php i pracuj na kopii. Plik z pierwszej części zostaje nietknięty.

Dwa pliki: nazwisko_imie_blok2.php i nazwisko_imie_funkcje_blok2.php. Grupa 1: do swojego repo z bloku 1, push. Grupa 2: na Teams.

Nazwa jest częścią zadania, tak jak na egzaminie, gdzie arkusz mówi, jak ma się nazywać każdy plik. Skrypt sprawdzający szuka pierwszego pliku po tej nazwie; plik nazwany inaczej dostaje najwyżej 1, nawet jeśli działa.

Starter: pobierz o-mnie.html

Treść pliku jest już gotowa, ale kompletnie płaska — same linie tekstu, bez żadnych znaczników HTML. Zadanie: otaguj to (opis w Blok 1).