Serwis używa plików cookies do analizy ruchu i poprawy działania. Szczegóły
E.14-01-25.06-SGCzerwiec 2025 · 39 kroków · ok. 75 min · 36 kryteriów z klucza
Rozwiązanie krok po kroku: Atlas zwierząt z wyborem gromady (Nowoczesny kod (flex, PDO))
To drugi sposób rozwiązania tego samego arkusza. Wynik jest ten sam - baza baza z czterema zapytaniami i strona index.php z atlasem zwierząt - i tak samo spełnia każde kryterium klucza. Inna jest droga:
flexbox zamiast float: trzy bloki główne stoją we wspólnym znaczniku <main> z display: flex, a stopka nie potrzebuje clear. Szerokości 30%, 40% i 30% zostają na blokach, bo tam klucz je ocenia,
zmienne CSS dla kolorów z arkusza, etykieta <label for> przy polu numerycznym i zdjęcie, które nie wychodzi poza swój blok,
PHP na PDO na górze pliku index.php, przed HTML-em - w blokach środkowym i prawym zostaje tylko wypisanie gotowych danych,
filter_input przyjmuje wyłącznie liczbę całkowitą od 1 do 5, nazwy gromad są w tablicy zamiast w pięciu if, a zapytanie 1 idzie jako zapytanie przygotowane,
wpisany numer wraca do pola po wysłaniu formularza, a numer spoza zakresu dostaje komunikat zamiast pustego bloku.
To arkusz E.14 z sesji czerwiec 2025 - kwalifikacji formuły 2012, którą zastąpiła INF.03. Baza i zdjęcie pochodzą z oryginalnego archiwum CKE z sesji styczeń 2019 (załącznik na stronie arkusza), zapytania są policzone na MariaDB 10.4, a podgląd od kroków z PHP to wynik prawdziwego uruchomienia kodu w PHP 8.2 (klucz każe sprawdzać w XAMPP 8.1.2 - użyte konstrukcje działają w obu wersjach).
Jak liczą się punkty. Klucz ma 36 kryteriów (R.1.1 - R.5.8), każde za 1 punkt. Próg zdania części praktycznej to 75%, czyli 27 punktów. Przy każdym kroku jest napisane, które kryteria spełnia; klucz przyjmuje zarówno mysqli, jak i PDO.
Suwak i strzałki obok niego - albo ←→ na klawiaturze - przechodzą krok po kroku; wyjaśnienie, pliki i podgląd zmieniają się razem z krokiem.
Lista „Etap” przenosi od razu do wybranego etapu.
„Rozwiązuję samodzielnie” chowa rozwiązanie kroku - najpierw własna próba, potem odsłonięcie.
„Tryb prezentacji” pokazuje same kroki, bez menu strony - na rzutnik.
Etap 1: Baza danych
Kroki 1-7 · po tym etapie masz 6 z 36 kryteriów (pkt)
Krok 1: Folder zdającego i archiwum z materiałami
ok. 2 min
Polecenie z arkusza
Na pulpicie znajdziesz archiwum ZIP o nazwie materialy-03.zip zabezpieczone hasłem: G@tuneK Archiwum należy rozpakować. Na pulpicie konta Egzamin utwórz folder. Jako nazwy folderu użyj swojego numeru PESEL. Rozpakowane pliki umieść w tym folderze. Po skończonej pracy wyniki zapisz w tym folderze.
Folder na pulpicie nazwany numerem PESEL (w tym rozwiązaniu w jego miejscu stoi Bartosz Bryniarski), do niego archiwum materialy-03.zip rozpakowane 7-Zipem z hasłem G@tuneK. W środku: baza2.sql i zwierzeta.jpg. Do tego folderu trafiają wszystkie rezultaty pracy.
Krok 2: XAMPP i pusta baza o nazwie baza
ok. 2 min
Polecenie z arkusza
Uruchom usługi MySQL i Apache za pomocą XAMPP Control Panel. Za pomocą narzędzia phpMyAdmin wykonaj podane operacje na bazie danych: Utwórz nową bazę danych o nazwie baza
Start przy Apache i MySQL, potem http://localhost/phpmyadmin, Nowa, nazwa baza, porównywanie utf8mb4_polish_ci - pełny zestaw znaków Unicode i polska kolejność sortowania.
Krok 3: Import pliku baza2.sql i zrzut import.png
Kryteria:
R.1.1 Wykonano import tabel do bazy danych baza , czynność udokumentowano plikiem o nazwie import w formacie PNG
ok. 3 min
Polecenie z arkusza
Do bazy zaimportuj tabele z pliku baza2.sql z rozpakowanego archiwum Wykonaj zrzut ekranu po imporcie. Zrzut zapisz w folderze z numerem PESEL, w formacie PNG i nazwij import. Nie kadruj zrzutu. Powinien on obejmować cały ekran monitora, z widocznym paskiem zadań. Na zrzucie powinny być widoczne elementy wskazujące na poprawnie wykonany import tabel
Baza baza, karta Import, plik baza2.sql, Wykonaj. Plik tworzy kilka tabel; zadanie korzysta z trzech z obrazu 1: zwierzeta (9 wierszy), gromady (1 ryby … 5 ssaki) i odzywianie. Pola Gromady_id i Odzywianie_id to klucze obce. Zrzut całego ekranu z komunikatem o sukcesie i listą tabel: import.png.
Typowe błędy
Ten zrzut jest w PNG, zrzuty kwerend - w JPG. Zrzut wykadrowany albo bez paska zadań nie jest oceniany.
Podgląd strony po tym kroku
Krok 4: Zapytanie 1: gatunki i występowanie ryb
Kryteria: ,
R.1.2 Zapisano plik kwerendy.txt z zapytaniami SQL
R.1.3 Utworzono zapytanie 1 wybierające jedynie pola gatunek i wystepowanie z tabeli Zwierzeta jedynie dla ryb. W pliku z kwerendami istnieje zapis np.: SELECT gatunek, wystepowanie FROM zwierzeta WHERE Gromady_id = 1; lub wynik działania udokumentowano zrzutem, na którym widoczne są dokładnie 2 rekordy dla suma i jesiotra, wyświetlone jedynie kolumny gatunek, wystepowanie
ok. 3 min
Polecenie z arkusza
Zapisz i wykonaj zapytania SQL działające na bazie danych. Zapytania zapisz w pliku kwerendy.txt, w folderze z numerem PESEL. Wykonaj zrzuty ekranu przedstawiające wyniki działania kwerend. Zrzuty zapisz w formacie JPG i nadaj im nazwy kw1, kw2, kw3, kw4. Zrzuty powinny obejmować cały ekran monitora z widocznym paskiem zadań. Zapytanie 1: wybierające jedynie pola gatunek i wystepowanie z tabeli Zwierzeta jedynie dla ryb
Każda klauzula w osobnej linii - przy dłuższych zapytaniach łatwiej wtedy znaleźć błąd. Ryby to gromada 1, więc warunek idzie po kluczu obcym Gromady_id. Wynik: 2 wiersze, Sum pospolity, Eurazja i Jesiotr zachodni, Europa. Zapytanie trafia do kwerendy.txt, zrzut - do kw1.jpg. Skrypt użyje go z parametrem w miejscu 1.
Krok 5: Zapytanie 2: zwierzęta z nazwą gromady (relacja)
Kryteria:
R.1.4 Utworzono zapytanie 2 wybierające jedynie pola id i gatunek z tabeli Zwierzeta oraz odpowiadające im pole nazwa z tabeli Gromady. W pliku z kwerendami istnieje zapis np.: SELECT zwierzeta.id, gatunek, nazwa FROM zwierzeta JOIN gromady ON zwierzeta.Gromady_id = gromady.id; możliwe również INNER JOIN (lub porównanie kluczy po WHERE)lub wynik działania udokumentowano zrzutem, na którym widoczne jest dokładnie 9 rekordów o id= 1 - 9, jedynie pola id, gatunek, nazwa
ok. 3 min
Polecenie z arkusza
Zapytanie 2: wybierające jedynie pola id i gatunek z tabeli Zwierzeta oraz odpowiadające im pole nazwa z tabeli Gromady. Należy posłużyć się relacją.
JOIN … ON zwierzeta.Gromady_id = gromady.id - relacja: klucz obcy zwierzęcia równa się kluczowi głównemu gromady. Kolumnę id mają obie tabele, więc trzeba wskazać zwierzeta.id. Wynik: 9 wierszy, od 1, Sum pospolity, ryby do 9, Dingo australijski, ssaki. Zrzut: kw2.jpg.
kwerendy.txtTekstzmienione: 5 linii
-- Zapytanie 1SELECT gatunek, wystepowanieFROM zwierzetaWHERE Gromady_id = 1;-- Zapytanie 2SELECT zwierzeta.id, gatunek, nazwaFROM zwierzetaJOIN gromady ON zwierzeta.Gromady_id = gromady.id;
Podgląd strony po tym kroku
Krok 6: Zapytanie 3: liczba ssaków
Kryteria:
R.1.5 Utworzono zapytanie 3 zliczające liczbę rekordów w tabeli Zwierzeta jedynie dla ssaków. W pliku z kwerendami istnieje zapis np.: SELECT COUNT(*) FROM zwierzeta WHERE Gromady_id = 5; lub wynik działania udokumentowano zrzutem, na którym widoczny jest wynik działania kwerendy - wartość 4
ok. 2 min
Polecenie z arkusza
Zapytanie 3: zliczające liczbę rekordów w tabeli Zwierzeta jedynie dla ssaków
COUNT(*) liczy wiersze spełniające warunek Gromady_id = 5. Alias AS liczba_ssakow nadaje kolumnie wyniku czytelną nazwę zamiast COUNT(*) - klucz go nie wymaga, ale nie przeszkadza. Wynik: 4. Zrzut: kw3.jpg.
kwerendy.txtTekstzmienione: 5 linii
-- Zapytanie 1SELECT gatunek, wystepowanieFROM zwierzetaWHERE Gromady_id = 1;-- Zapytanie 2SELECT zwierzeta.id, gatunek, nazwaFROM zwierzetaJOIN gromady ON zwierzeta.Gromady_id = gromady.id;-- Zapytanie 3SELECT COUNT(*) AS liczba_ssakowFROM zwierzetaWHERE Gromady_id = 5;
Podgląd strony po tym kroku
Krok 7: Zapytanie 4: użytkownik KatarzynaNowak
Kryteria:
R.1.6 Utworzono zapytanie 4 tworzące użytkownika KatarzynaNowak o haśle K4tNow. W pliku z kwerendami istnieje zapis np.: CREATE USER 'KatarzynaNowak'@'localhost' IDENTIFIED BY 'K4tNow'; (lub 'KatarzynaNowak'@'%') lub wynik działania udokumentowano zrzutem, na którym widoczna jest kwerenda i komunikat "MySQL zwrócił pusty wynik...". Nie uznajemy automatycznego utworzenia konta
ok. 2 min
Polecenie z arkusza
Zapytanie 4: tworzące użytkownika KatarzynaNowak o haśle K4tNow
CREATE USER z hostem 'localhost' - konto może łączyć się tylko z tego komputera, co jest bezpieczniejsze niż '%' (dowolny host), które klucz też przyjmuje. Komunikat „MySQL zwrócił pusty wynik” to sukces. Zrzut: kw4.jpg. Nowe konto nie ma jeszcze żadnych uprawnień - do tego służy osobne polecenie GRANT, którego arkusz nie wymaga.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT gatunek, wystepowanieFROM zwierzetaWHERE Gromady_id = 1;-- Zapytanie 2SELECT zwierzeta.id, gatunek, nazwaFROM zwierzetaJOIN gromady ON zwierzeta.Gromady_id = gromady.id;-- Zapytanie 3SELECT COUNT(*) AS liczba_ssakowFROM zwierzetaWHERE Gromady_id = 5;-- Zapytanie 4CREATE USER 'KatarzynaNowak'@'localhost' IDENTIFIED BY 'K4tNow';
Podgląd strony po tym kroku
Etap 2: Strona HTML
Kroki 8-22 · po tym etapie masz 19 z 36 kryteriów (pkt)
Krok 8: Plik index.php
ok. 2 min
Polecenie z arkusza
Składa się ze strony o nazwie index.php
Szkielet HTML5 w pliku index.php. Rozszerzenie .php, bo na górze pliku stanie skrypt; dopóki nie ma w nim PHP, serwer odda go jak zwykły HTML.
R.2.2 Nadano tytuł strony: "Dane o zwierzętach”, jest on widoczny na karcie przeglądarki
ok. 1 min
Polecenie z arkusza
Tytuł strony widoczny na karcie przeglądarki: „Dane o zwierzętach”
<title>Dane o zwierzętach</title> (R.2.2). Obok znacznik viewport - telefon pokaże stronę w swojej szerokości, zamiast udawać szeroki ekran. Klucz go nie ocenia; w nowej stronie dopisuje się go z nawyku.
index.phpPHPzmienione: 2 linie
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width, initial-scale=1"> <title>Dane o zwierzętach</title></head><body></body></html>
Podgląd strony po tym kroku (index.php)
Krok 11: Podpięcie arkusza stylów styl3.css
Kryteria:
R.3.6 Strona zawiera działające połączenie z zewnętrznym arkuszem stylów o nazwie styl3.css , formatowanie pochodzi jedynie od CSS
ok. 1 min
Polecenie z arkusza
Arkusz stylów w pliku o nazwie styl3.css prawidłowo połączony z kodem strony
<link rel="stylesheet" href="styl3.css"> (R.3.6). Całe formatowanie pochodzi z tego pliku - w znacznikach nie ma atrybutów style.
index.phpPHPzmienione: 1 linia
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width, initial-scale=1"> <title>Dane o zwierzętach</title> <linkrel="stylesheet"href="styl3.css"></head><body></body></html>
Podgląd strony po tym kroku (index.php)
Krok 12: Bloki: baner, formularz, trzy główne i stopka
Kryteria:
R.2.3 Wygląd strony zdefiniowano dzieląc ją na bloki: baner, blok formularza, trzy bloki główne: lewy, środkowy i prawy, blok stopki. Zastosowano znaczniki sekcji
ok. 2 min
Polecenie z arkusza
Podział strony na bloki: na górze baner, poniżej blok formularza, poniżej trzy bloki główne: lewy, środkowy i prawy, na dole blok stopki. Podział zrealizowany za pomocą znaczników sekcji tak, aby po uruchomieniu w przeglądarce wygląd układu bloków był zgodny z obrazem 2
Baner <header>, blok formularza <section id="form-block">, stopka <footer>, a trzy bloki główne - sekcje left, middle i right - stoją we wspólnym <main> (R.2.3). To główna treść strony (czytnik ekranu pozwala do niej przeskoczyć) i zarazem pojemnik, który CSS zamieni w jeden rząd bloków. Blok formularza zostaje poza <main> - zajmuje całą szerokość.
Krok 17: Etykieta „Wybierz gromadę: ” i pole numeryczne
ok. 2 min
Polecenie z arkusza
Tekst „Wybierz gromadę: ” Pole edycyjne typu numerycznego
Tekst z arkusza staje się etykietą<label for="gromada">, związaną z polem o id="gromada": kliknięcie napisu ustawia kursor w polu, a czytnik ekranu odczyta „Wybierz gromadę” przy wejściu w pole.
type="number" - pole numeryczne ze strzałkami (R.3.3 sprawdzi typ),
name="gromada" - klucz, pod którym wartość trafi do PHP,
min="1" i max="5" - strzałki nie wyjdą poza numery z listy, a przeglądarka podpowie zakres. To tylko wygoda: dane da się wysłać z pominięciem formularza, więc zakres sprawdzi też skrypt.
R.2.6 Umieszczono formularz z polem do wprowadzania danych oraz przyciskiem opisanym "Wyświetl"
R.3.3 Pole jest typu number oraz przycisk jest typu submit
ok. 1 min
Polecenie z arkusza
Przycisk wysyłający dane o nazwie „Wyświetl”
<button type="submit">Wyświetl</button> - napis jest treścią znacznika, typ submit wysyła formularz. Pole i przycisk dają komplet formularza (R.2.6, R.3.3).
Krok 19: Blok lewy: zdjęcie z tekstem alternatywnym
Kryteria:
R.2.7 Umieszczono obraz zwierzeta.jpg oraz ma on tekst alternatywny "dzikie zwierzeta"
ok. 1 min
Polecenie z arkusza
Zawartość bloku głównego – lewego: obraz zwierzeta.jpg z wypakowanego archiwum, z tekstem alternatywnym „dzikie zwierzęta”
src i alt z arkusza (R.2.7). Atrybutów width i height tu nie ma - całe formatowanie ma pochodzić z arkusza stylów, a rozmiar zdjęcia w bloku ustali CSS.
Krok 21: Stopka: odnośnik otwierany w nowej karcie
Kryteria: ,
R.3.4 Na stronie znajduje się odnośnik o treści "Poznaj inne strony o zwierzętach", jego kliknięcie inicjuje próbę otwarcia strony "atlas-zwierzat.pl" (poprawne z http://; https:// lub bez protokołu)
R.3.5 Odnośnik jest otwierany w osobnym oknie / zakładce przeglądarki
ok. 1 min
Polecenie z arkusza
Zawartość stopki: Odnośnik o treści „Poznaj inne strony o zwierzętach” prowadzący do strony „atlas-zwierzat.pl”, odnośnik otwiera stronę w osobnej karcie
Adres z protokołem https:// (R.3.4) i target="_blank" - nowa karta (R.3.5). Do tego rel="noopener": otwarta strona nie dostaje dostępu do karty z atlasem (przez window.opener mogłaby ją np. przekierować na fałszywą stronę). Nowe przeglądarki robią to już same, ale atrybut jawnie mówi, że tak ma być.
R.2.8 W stopce zapisano tekst "autor Atlasu zwierząt: " oraz wstawiono numer zdającego
ok. 1 min
Polecenie z arkusza
Napis o treści „autor Atlasu zwierząt: ”, dalej wstawiony numer PESEL zdającego
Na egzaminie po dwukropku wpisujesz swój numer PESEL; w tym rozwiązaniu stoi tam imię i nazwisko autora, Bartosz Bryniarski (R.2.8).
index.phpPHPzmienione: 1 linia
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width, initial-scale=1"> <title>Dane o zwierzętach</title> <linkrel="stylesheet"href="styl3.css"></head><body> <header> <h1>ATLAS ZWIERZĄT</h1> </header> <sectionid="form-block"> <h2>Gromady:</h2> <ol> <li>Ryby</li> <li>Płazy</li> <li>Gady</li> <li>Ptaki</li> <li>Ssaki</li> </ol> <formmethod="post"> <labelfor="gromada">Wybierz gromadę: </label> <inputtype="number"id="gromada"name="gromada"min="1"max="5"> <buttontype="submit">Wyświetl</button> </form> </section> <main> <sectionid="left"> <imgsrc="zwierzeta.jpg"alt="dzikie zwierzęta"> </section> <sectionid="middle"> </section> <sectionid="right"> <h2>Wszystkie zwierzęta w bazie</h2> </section> </main> <footer> <ahref="https://atlas-zwierzat.pl"target="_blank"rel="noopener">Poznaj inne strony o zwierzętach</a> autor Atlasu zwierząt: Bartosz Bryniarski </footer></body></html>
Podgląd strony po tym kroku (index.php)
Etap 3: Styl CSS
Kroki 23-30 · po tym etapie masz 28 z 36 kryteriów (pkt)
Krok 23: Plik styl3.css: kolory jako zmienne i krój Garamond
Kryteria:
R.4.1 Ustawiono krój czcionki dla całej strony na Garamond (dla body lub html lub *)
ok. 2 min
Polecenie z arkusza
Cechy formatowania CSS działające na stronie: Domyślne dla całej strony: krój czcionki Garamond
Na początku pliku zmienne CSS w :root: kolory z arkusza dostają nazwy, a reguły dalej używają var(--banner). Baner i stopka mają ten sam kolor, trzy bloki główne - drugi wspólny; zmiana odcienia to wtedy jedna linia.
Krój Garamond na selektorze * (R.4.1) - obejmuje też pole i przycisk, które nie dziedziczą kroju po body. Wydanie klucza z czerwca 2023 wymaga wprost tego selektora, inne przyjmują też body i html.
Wspólne dla bloku głównego lewego oraz prawego: kolor tła LightSalmon, wysokość 300 px, szerokość 30%
Jedna reguła na dwa selektory. Szerokość zostaje na blokach, bo klucz (R.4.5) ocenia szerokość bloków - w <main> z flexboxem procenty liczą się od szerokości <main>, czyli całej strony.
R.4.2 Ustawiono kolor tła RosyBrown dla bloku banera i stopki oraz DarkSalmon dla bloku formularza oraz LightSalmon dla trzech bloków głównych
R.4.3 Ustawiono biały kolor czcionki dla banera i stopki
R.4.6 Ustawiono wyrównanie tekstu do środka dla bloku banera, formularza i stopki
R.4.7 Ustawiono marginesy wewnętrzne (padding) 10px dla banera oraz 40px dla bloku formularza oraz 30px dla stopki
ok. 1 min
Polecenie z arkusza
Dla stopki: kolor tła RosyBrown, biały kolor czcionki, wyrównanie tekstu do środka, marginesy wewnętrzne 30 px
Ta sama zmienna co w banerze. Kolory tła wszystkich bloków (R.4.2), biały tekst (R.4.3), wyśrodkowanie (R.4.6) i marginesy wewnętrzne 10, 40 i 30 px (R.4.7) są gotowe. Odnośnik zachowuje kolor przeglądarki - jak na obrazie 2.
R.3.1 Wygląd układu bloków na stronie po uruchomieniu w przeglądarce jest w pełni zgodny z obrazem 2 w arkuszu egzaminacyjnym
ok. 3 min
Polecenie z arkusza
Podział strony na bloki: na górze baner, poniżej blok formularza, poniżej trzy bloki główne: lewy, środkowy i prawy, na dole blok stopki. Podział zrealizowany za pomocą znaczników sekcji tak, aby po uruchomieniu w przeglądarce wygląd układu bloków był zgodny z obrazem 2
display: flex na <main> ustawia trzy sekcje w jednym rzędzie, w kolejności z HTML-a, z szerokościami 30%, 40% i 30% z ich własnych reguł. Baner, blok formularza i stopka stoją poza <main>, więc zajmują całą szerokość - bez float i bez clear (R.3.1).
Druga reguła dotyczy zdjęcia: ma 400 px szerokości, a blok lewy przy oknie węższym niż ok. 1350 px ma mniej. max-width: 100% zmniejsza wtedy zdjęcie do szerokości bloku (proporcje zostają, bo wysokość nie jest ustawiona). W wersji podstawowej zdjęcie chowało się pod blokiem środkowym. Arkusz tej reguły nie wymaga - przy szerokim oknie zdjęcie ma swoje 400 px i wygląda jak na obrazie 2.
Typowe błędy
Bez max-width zdjęcie, jako najszersza zawartość bloku, potrafi poszerzyć blok lewy we flexboxie (element flex nie zwęża się poniżej szerokości swojej zawartości) - suma szerokości przekroczy 100% i pojawi się poziomy pasek przewijania.
Kroki 31-37 · po tym etapie masz 36 z 36 kryteriów (pkt)
Krok 31: Skrypt na górze pliku i połączenie z bazą
Kryteria: ,
R.5.1 Skrypt napisano w języku PHP
R.5.2 Skrypt realizuje połączenie z serwerem bazy danych i wybór bazy baza
ok. 4 min
Polecenie z arkusza
Napisany w języku PHP Skrypt łączy się z serwerem bazodanowym na localhost, użytkownik root bez hasła, baza danych o nazwie baza
Skrypt stoi na samej górze index.php, przed <!DOCTYPE html>: najpierw pobiera dane z bazy, a HTML niżej je tylko wypisuje (R.5.1). W bloku środkowym pojawia się na razie jedno: komunikat, gdy połączenie się nie uda.
e() - krótka funkcja z htmlspecialchars: każdy tekst z bazy i z formularza wypisany na stronie ma znaki <, >, & i cudzysłowy zamienione na encje, więc nie stanie się kodem strony,
new PDO(...) - serwer localhost, baza baza i kodowanie w jednym napisie, potem użytkownik root i puste hasło (R.5.2),
ERRMODE_EXCEPTION - każdy błąd bazy rzuca wyjątek; FETCH_ASSOC - wiersze przychodzą jako tablice z nazwami kolumn ($animal['gatunek'] zamiast $row[0]),
try / catch - gdy baza nie działa, użytkownik dostaje zwykłe zdanie, a nie komunikat PHP z danymi serwera.
Połączenie z nazwą bazy stoi w pliku strony, bo tam klucz je sprawdza, jeśli strona się nie uruchomi (uwaga przy R.5). Od tego kroku podgląd to wynik prawdziwego uruchomienia strony.
index.phpPHPzmienione: 20 linii
<?phpfunctione(string $text): string{returnhtmlspecialchars($text, ENT_QUOTES, 'UTF-8');}$error = null;try {$pdo = new PDO('mysql:host=localhost;dbname=baza;charset=utf8mb4', 'root', '', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]);} catch (PDOException $exception) {$error = 'Nie udało się połączyć z bazą danych, spróbuj ponownie za chwilę.';}?><!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width, initial-scale=1"> <title>Dane o zwierzętach</title> <linkrel="stylesheet"href="styl3.css"></head><body> <header> <h1>ATLAS ZWIERZĄT</h1> </header> <sectionid="form-block"> <h2>Gromady:</h2> <ol> <li>Ryby</li> <li>Płazy</li> <li>Gady</li> <li>Ptaki</li> <li>Ssaki</li> </ol> <formmethod="post"> <labelfor="gromada">Wybierz gromadę: </label> <inputtype="number"id="gromada"name="gromada"min="1"max="5"> <buttontype="submit">Wyświetl</button> </form> </section> <main> <sectionid="left"> <imgsrc="zwierzeta.jpg"alt="dzikie zwierzęta"> </section> <sectionid="middle"><?phpif ($error !== null): ?> <p><?= e($error) ?></p><?phpendif; ?> </section> <sectionid="right"> <h2>Wszystkie zwierzęta w bazie</h2> </section> </main> <footer> <ahref="https://atlas-zwierzat.pl"target="_blank"rel="noopener">Poznaj inne strony o zwierzętach</a> autor Atlasu zwierząt: Bartosz Bryniarski </footer></body></html>
Podgląd strony po tym kroku (index.php)
Krok 32: Skrypt nr 1: numer gromady z pola edycyjnego
ok. 3 min
Polecenie z arkusza
Zawartość bloku głównego – środkowego: efekt wykonania skryptu nr 1 Działanie skryptu nr 1: Skrypt pobiera dane z pola edycyjnego
filter_input(INPUT_POST, 'gromada', FILTER_VALIDATE_INT, ...) odczytuje pole z formularza i od razu je sprawdza. Wynik ma trzy możliwe wartości:
liczba całkowita od 1 do 5 (min_range, max_range) - poprawny numer gromady,
false - pole wysłano, ale to nie jest liczba z zakresu (7, pusty napis, 0 OR 1=1),
null - formularza nie wysłano, czyli pierwsze wejście na stronę.
Obok dwie puste tablice, $animals i $allAnimals - wypełnią je zapytania. Ustawione przed try, istnieją także wtedy, gdy połączenie się nie uda, więc pętle w HTML-u nie zgłoszą ostrzeżenia o nieznanej zmiennej.
Dla false blok środkowy pokazuje komunikat „Wpisz numer gromady od 1 do 5.” - w wersji podstawowej numer spoza zakresu dawał po prostu pusty blok. Pole formularza dostało value: po wysłaniu wraca do niego wpisany numer (tylko poprawny - is_int). Podgląd: formularz wysłany z wartością 7.
index.phpPHPzmienione: 9 linii
<?phpfunctione(string $text): string{returnhtmlspecialchars($text, ENT_QUOTES, 'UTF-8');}$error = null;$animals = [];$allAnimals = [];$classId = filter_input(INPUT_POST, 'gromada', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1, 'max_range' => 5],]);try {$pdo = new PDO('mysql:host=localhost;dbname=baza;charset=utf8mb4', 'root', '', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]);} catch (PDOException $exception) {$error = 'Nie udało się połączyć z bazą danych, spróbuj ponownie za chwilę.';}?><!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width, initial-scale=1"> <title>Dane o zwierzętach</title> <linkrel="stylesheet"href="styl3.css"></head><body> <header> <h1>ATLAS ZWIERZĄT</h1> </header> <sectionid="form-block"> <h2>Gromady:</h2> <ol> <li>Ryby</li> <li>Płazy</li> <li>Gady</li> <li>Ptaki</li> <li>Ssaki</li> </ol> <formmethod="post"> <labelfor="gromada">Wybierz gromadę: </label> <inputtype="number"id="gromada"name="gromada"min="1"max="5"value="<?= is_int($classId) ? $classId : ''?>"> <buttontype="submit">Wyświetl</button> </form> </section> <main> <sectionid="left"> <imgsrc="zwierzeta.jpg"alt="dzikie zwierzęta"> </section> <sectionid="middle"><?phpif ($error !== null): ?> <p><?= e($error) ?></p><?phpendif; ?><?phpif ($classId === false): ?> <p>Wpisz numer gromady od 1 do 5.</p><?phpendif; ?> </section> <sectionid="right"> <h2>Wszystkie zwierzęta w bazie</h2> </section> </main> <footer> <ahref="https://atlas-zwierzat.pl"target="_blank"rel="noopener">Poznaj inne strony o zwierzętach</a> autor Atlasu zwierząt: Bartosz Bryniarski </footer></body></html>
Podgląd strony po tym kroku (index.php)
Krok 33: Skrypt nr 1: nagłówek z nazwą gromady
Kryteria:
R.5.5 Skrypt wypisuje w tekst zależny od podanej wartości w polu. Jeśli podano 1 – „RYBY”, 2 – „PŁAZY”, 3 – „GADY”, 4 – „PTAKI”, 5 – „SSAKI”
ok. 3 min
Polecenie z arkusza
W zależności od wartości pola wypisuje w nagłówku drugiego stopnia: dla wartości 1 – „RYBY”, 2 – „PŁAZY”, 3 – „GADY”, 4 – „PTAKI”, 5 – „SSAKI”
Pięć par „numer - napis” to dane, nie logika - dlatego stoją w stałej tablicy CLASS_NAMES na górze pliku, a nagłówek to jedna linia: <h2><?= CLASS_NAMES[$classId] ?></h2> (R.5.5). Zamiast pięciu gałęzi if / elseif wystarczy odczyt z tablicy po kluczu; filter_input gwarantuje, że klucz istnieje. Zapis <?= … ?> to skrót od <?php echo … ?>.
Podgląd: wartość 4 - nagłówek PTAKI, a w polu zostaje 4, jak na obrazie 2.
index.phpPHPzmienione: 5 linii
<?phpconst CLASS_NAMES = [1 => 'RYBY', 2 => 'PŁAZY', 3 => 'GADY', 4 => 'PTAKI', 5 => 'SSAKI'];functione(string $text): string{returnhtmlspecialchars($text, ENT_QUOTES, 'UTF-8');}$error = null;$animals = [];$allAnimals = [];$classId = filter_input(INPUT_POST, 'gromada', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1, 'max_range' => 5],]);try {$pdo = new PDO('mysql:host=localhost;dbname=baza;charset=utf8mb4', 'root', '', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]);} catch (PDOException $exception) {$error = 'Nie udało się połączyć z bazą danych, spróbuj ponownie za chwilę.';}?><!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width, initial-scale=1"> <title>Dane o zwierzętach</title> <linkrel="stylesheet"href="styl3.css"></head><body> <header> <h1>ATLAS ZWIERZĄT</h1> </header> <sectionid="form-block"> <h2>Gromady:</h2> <ol> <li>Ryby</li> <li>Płazy</li> <li>Gady</li> <li>Ptaki</li> <li>Ssaki</li> </ol> <formmethod="post"> <labelfor="gromada">Wybierz gromadę: </label> <inputtype="number"id="gromada"name="gromada"min="1"max="5"value="<?= is_int($classId) ? $classId : ''?>"> <buttontype="submit">Wyświetl</button> </form> </section> <main> <sectionid="left"> <imgsrc="zwierzeta.jpg"alt="dzikie zwierzęta"> </section> <sectionid="middle"><?phpif ($error !== null): ?> <p><?= e($error) ?></p><?phpendif; ?><?phpif ($classId === false): ?> <p>Wpisz numer gromady od 1 do 5.</p><?phpendif; ?><?phpif (is_int($classId)): ?> <h2><?= CLASS_NAMES[$classId] ?></h2><?phpendif; ?> </section> <sectionid="right"> <h2>Wszystkie zwierzęta w bazie</h2> </section> </main> <footer> <ahref="https://atlas-zwierzat.pl"target="_blank"rel="noopener">Poznaj inne strony o zwierzętach</a> autor Atlasu zwierząt: Bartosz Bryniarski </footer></body></html>
Podgląd strony po tym kroku (index.php)
Krok 34: Skrypt nr 1: zapytanie 1 jako zapytanie przygotowane
Kryteria:
R.5.4 Skrypt nr 1 wysyła do bazy zmodyfikowane zapytanie nr 1, w ten sposób, że w sekcji warunku sprawdzana gromada jest zgodna z wartością w polu formularza. Jeśli w polu wpisana jest wartość 1 – zapytanie dotyczy ryb, wartość 2 – zapytanie dotyczy płazów itd.
ok. 3 min
Polecenie z arkusza
Wysyła do bazy zmodyfikowane zapytanie nr 1, w ten sposób, że w sekcji warunku sprawdzana gromada jest zgodna z wartością pobraną z pola edycyjnego. Jeśli w polu wpisana jest wartość 1 – zapytanie dotyczy ryb, wartość 2 – zapytanie dotyczy płazów itd.
Zapytanie 1, w którym liczbę w warunku zastępuje parametr :classId (R.5.4):
$pdo->prepare(...) - baza dostaje samą treść zapytania,
$statement->execute(['classId' => $classId]) - osobno przychodzi numer gromady,
fetchAll() - od razu wszystkie wiersze wyniku jako tablica, bez pętli while.
Zapytanie wysyła się tylko dla poprawnego numeru (is_int). Dane z formularza nigdy nie staną się częścią kodu SQL - w wersji podstawowej wartość 0 OR 1=1 wypisywała wszystkie zwierzęta, a tutaj odpada już na filter_input, a nawet gdyby przeszła, poszłaby do bazy jako wartość, nie jako kod. Podgląd wygląda jak w poprzednim kroku: wiersze są pobrane, ale jeszcze nie wypisane.
index.phpPHPzmienione: 6 linii
<?phpconst CLASS_NAMES = [1 => 'RYBY', 2 => 'PŁAZY', 3 => 'GADY', 4 => 'PTAKI', 5 => 'SSAKI'];functione(string $text): string{returnhtmlspecialchars($text, ENT_QUOTES, 'UTF-8');}$error = null;$animals = [];$allAnimals = [];$classId = filter_input(INPUT_POST, 'gromada', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1, 'max_range' => 5],]);try {$pdo = new PDO('mysql:host=localhost;dbname=baza;charset=utf8mb4', 'root', '', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]);if (is_int($classId)) {$statement = $pdo->prepare('SELECT gatunek, wystepowanie FROM zwierzeta WHERE Gromady_id = :classId;');$statement->execute(['classId' => $classId]);$animals = $statement->fetchAll(); }} catch (PDOException $exception) {$error = 'Nie udało się połączyć z bazą danych, spróbuj ponownie za chwilę.';}?><!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width, initial-scale=1"> <title>Dane o zwierzętach</title> <linkrel="stylesheet"href="styl3.css"></head><body> <header> <h1>ATLAS ZWIERZĄT</h1> </header> <sectionid="form-block"> <h2>Gromady:</h2> <ol> <li>Ryby</li> <li>Płazy</li> <li>Gady</li> <li>Ptaki</li> <li>Ssaki</li> </ol> <formmethod="post"> <labelfor="gromada">Wybierz gromadę: </label> <inputtype="number"id="gromada"name="gromada"min="1"max="5"value="<?= is_int($classId) ? $classId : ''?>"> <buttontype="submit">Wyświetl</button> </form> </section> <main> <sectionid="left"> <imgsrc="zwierzeta.jpg"alt="dzikie zwierzęta"> </section> <sectionid="middle"><?phpif ($error !== null): ?> <p><?= e($error) ?></p><?phpendif; ?><?phpif ($classId === false): ?> <p>Wpisz numer gromady od 1 do 5.</p><?phpendif; ?><?phpif (is_int($classId)): ?> <h2><?= CLASS_NAMES[$classId] ?></h2><?phpendif; ?> </section> <sectionid="right"> <h2>Wszystkie zwierzęta w bazie</h2> </section> </main> <footer> <ahref="https://atlas-zwierzat.pl"target="_blank"rel="noopener">Poznaj inne strony o zwierzętach</a> autor Atlasu zwierząt: Bartosz Bryniarski </footer></body></html>
Krok 35: Skrypt nr 1: gatunek i występowanie w osobnych wierszach
Kryteria:
R.5.6 Skrypt nr 1 wypisuje zwrócone zapytaniem pola gatunek i występowanie w osobnych wierszach
ok. 3 min
Polecenie z arkusza
Wartości zwrócone zapytaniem są wypisywane w osobnych wierszach, w formacie „<gatunek>, <występowanie>”
Pętla foreach po gotowej tablicy $animals - każdy element to jeden wiersz z kluczami z nazw kolumn. Format z arkusza: gatunek, przecinek, spacja, występowanie i <br> (R.5.6). Tekst z bazy idzie przez e().
Pętla stoi w HTML-u w składni alternatywnej (foreach (...): … endforeach;) - przy przeplataniu PHP z HTML-em łatwiej ją czytać niż klamry. Podgląd: Wrona siwa, Europa, Puszczyk zwyczajny, Eurazja, Sroka zwyczajna, Eurazja - jak na obrazie 2.
Krok 36: Skrypt nr 2: zapytanie 2 i lista wszystkich zwierząt
Kryteria: ,
R.5.7 Skrypt nr 2 wysyła do bazy zapytanie 2
R.5.8 Skrypt nr 2 wypisuje w kolejnych wierszach pola id, gatunek, nazwa zwrócone zapytaniem
ok. 3 min
Polecenie z arkusza
Zawartość bloku głównego – prawego: Efekt wykonania skryptu nr 2 Działanie skryptu nr 2: Skrypt wysyła do bazy zapytanie numer 2 W kolejnych wierszach wypisywane są rekordy w formacie: „<id>. <gatunek>, <nazwa gromady>”
Zapytanie 2 bez zmian (R.5.7) - nie ma w nim danych od użytkownika, więc wystarczy zwykłe $pdo->query(...) i fetchAll(). Wysyła się zawsze, także przed wysłaniem formularza.
W bloku prawym druga pętla foreach: numer, kropka, spacja, gatunek, przecinek, nazwa gromady (R.5.8). id to liczba z bazy, więc nie potrzebuje e(). Pusta tablica $allAnimals ustawiona na początku skryptu sprawia, że po nieudanym połączeniu pętla po prostu nic nie wypisze. Podgląd: dziewięć zwierząt, od 1. Sum pospolity, ryby do 9. Dingo australijski, ssaki.
index.phpPHPzmienione: 7 linii
<?phpconst CLASS_NAMES = [1 => 'RYBY', 2 => 'PŁAZY', 3 => 'GADY', 4 => 'PTAKI', 5 => 'SSAKI'];functione(string $text): string{returnhtmlspecialchars($text, ENT_QUOTES, 'UTF-8');}$error = null;$animals = [];$allAnimals = [];$classId = filter_input(INPUT_POST, 'gromada', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1, 'max_range' => 5],]);try {$pdo = new PDO('mysql:host=localhost;dbname=baza;charset=utf8mb4', 'root', '', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]);if (is_int($classId)) {$statement = $pdo->prepare('SELECT gatunek, wystepowanie FROM zwierzeta WHERE Gromady_id = :classId;');$statement->execute(['classId' => $classId]);$animals = $statement->fetchAll(); }$allAnimals = $pdo->query('SELECT zwierzeta.id, gatunek, nazwa FROM zwierzeta JOIN gromady ON zwierzeta.Gromady_id = gromady.id;' )->fetchAll();} catch (PDOException $exception) {$error = 'Nie udało się połączyć z bazą danych, spróbuj ponownie za chwilę.';}?><!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width, initial-scale=1"> <title>Dane o zwierzętach</title> <linkrel="stylesheet"href="styl3.css"></head><body> <header> <h1>ATLAS ZWIERZĄT</h1> </header> <sectionid="form-block"> <h2>Gromady:</h2> <ol> <li>Ryby</li> <li>Płazy</li> <li>Gady</li> <li>Ptaki</li> <li>Ssaki</li> </ol> <formmethod="post"> <labelfor="gromada">Wybierz gromadę: </label> <inputtype="number"id="gromada"name="gromada"min="1"max="5"value="<?= is_int($classId) ? $classId : ''?>"> <buttontype="submit">Wyświetl</button> </form> </section> <main> <sectionid="left"> <imgsrc="zwierzeta.jpg"alt="dzikie zwierzęta"> </section> <sectionid="middle"><?phpif ($error !== null): ?> <p><?= e($error) ?></p><?phpendif; ?><?phpif ($classId === false): ?> <p>Wpisz numer gromady od 1 do 5.</p><?phpendif; ?><?phpif (is_int($classId)): ?> <h2><?= CLASS_NAMES[$classId] ?></h2><?phpforeach ($animalsas$animal): ?><?= e($animal['gatunek']) ?>, <?= e($animal['wystepowanie']) ?><br><?phpendforeach; ?><?phpendif; ?> </section> <sectionid="right"> <h2>Wszystkie zwierzęta w bazie</h2><?phpforeach ($allAnimalsas$animal): ?><?= $animal['id'] ?>. <?= e($animal['gatunek']) ?>, <?= e($animal['nazwa']) ?><br><?phpendforeach; ?> </section> </main> <footer> <ahref="https://atlas-zwierzat.pl"target="_blank"rel="noopener">Poznaj inne strony o zwierzętach</a> autor Atlasu zwierząt: Bartosz Bryniarski </footer></body></html>
Podgląd strony po tym kroku (index.php)
Krok 37: Zamknięcie połączenia z bazą
Kryteria:
R.5.3 Po wykonaniu operacji na bazie zastosowano funkcję zamknięcia bazy
ok. 2 min
Polecenie z arkusza
Na końcu działania skrypt zamyka połączenie z serwerem bazodanowym
PDO nie ma funkcji close - połączenie zamyka się, gdy znika ostatnie odwołanie do obiektu. Dlatego $statement = null i $pdo = null (R.5.3).
Stoją w bloku finally, który wykonuje się zawsze po try - po udanych zapytaniach i po wyjątku. Oba skrypty pobrały już dane do tablic, więc połączenie zamyka się, zanim przeglądarka dostanie choć linię HTML-a. W wersji podstawowej mysqli_close musiało stać za skryptem nr 2 w bloku prawym; tutaj miejsce zamknięcia nie zależy od układu strony.
index.phpPHPzmienione: 3 linie
<?phpconst CLASS_NAMES = [1 => 'RYBY', 2 => 'PŁAZY', 3 => 'GADY', 4 => 'PTAKI', 5 => 'SSAKI'];functione(string $text): string{returnhtmlspecialchars($text, ENT_QUOTES, 'UTF-8');}$error = null;$animals = [];$allAnimals = [];$classId = filter_input(INPUT_POST, 'gromada', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1, 'max_range' => 5],]);try {$pdo = new PDO('mysql:host=localhost;dbname=baza;charset=utf8mb4', 'root', '', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]);if (is_int($classId)) {$statement = $pdo->prepare('SELECT gatunek, wystepowanie FROM zwierzeta WHERE Gromady_id = :classId;');$statement->execute(['classId' => $classId]);$animals = $statement->fetchAll(); }$allAnimals = $pdo->query('SELECT zwierzeta.id, gatunek, nazwa FROM zwierzeta JOIN gromady ON zwierzeta.Gromady_id = gromady.id;' )->fetchAll();} catch (PDOException $exception) {$error = 'Nie udało się połączyć z bazą danych, spróbuj ponownie za chwilę.';} finally {$statement = null;$pdo = null; // zamknięcie połączenia - ostatnia operacja na bazie}?><!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width, initial-scale=1"> <title>Dane o zwierzętach</title> <linkrel="stylesheet"href="styl3.css"></head><body> <header> <h1>ATLAS ZWIERZĄT</h1> </header> <sectionid="form-block"> <h2>Gromady:</h2> <ol> <li>Ryby</li> <li>Płazy</li> <li>Gady</li> <li>Ptaki</li> <li>Ssaki</li> </ol> <formmethod="post"> <labelfor="gromada">Wybierz gromadę: </label> <inputtype="number"id="gromada"name="gromada"min="1"max="5"value="<?= is_int($classId) ? $classId : ''?>"> <buttontype="submit">Wyświetl</button> </form> </section> <main> <sectionid="left"> <imgsrc="zwierzeta.jpg"alt="dzikie zwierzęta"> </section> <sectionid="middle"><?phpif ($error !== null): ?> <p><?= e($error) ?></p><?phpendif; ?><?phpif ($classId === false): ?> <p>Wpisz numer gromady od 1 do 5.</p><?phpendif; ?><?phpif (is_int($classId)): ?> <h2><?= CLASS_NAMES[$classId] ?></h2><?phpforeach ($animalsas$animal): ?><?= e($animal['gatunek']) ?>, <?= e($animal['wystepowanie']) ?><br><?phpendforeach; ?><?phpendif; ?> </section> <sectionid="right"> <h2>Wszystkie zwierzęta w bazie</h2><?phpforeach ($allAnimalsas$animal): ?><?= $animal['id'] ?>. <?= e($animal['gatunek']) ?>, <?= e($animal['nazwa']) ?><br><?phpendforeach; ?> </section> </main> <footer> <ahref="https://atlas-zwierzat.pl"target="_blank"rel="noopener">Poznaj inne strony o zwierzętach</a> autor Atlasu zwierząt: Bartosz Bryniarski </footer></body></html>
Krok 38 · po tym etapie masz 36 z 36 kryteriów (pkt)
Krok 38: Co jest inaczej i którą wersję wybrać na egzaminie
ok. 3 min
Obie wersje dają komplet 36 punktów. Różnice:
wersja podstawowa
wersja nowoczesna
układ
float: left sekcji, float: none bloku formularza, clear stopki
trzy bloki w <main> z display: flex
kolory
wpisane w każdej regule
zmienne w :root
zdjęcie
400 px, przy węższym oknie wchodzi pod blok środkowy
max-width: 100% - zawsze w bloku
formularz
tekst, pole, przycisk input
label for, min/max, numer wraca do pola, button
biblioteka
mysqli (tabela 1 arkusza)
PDO z wyjątkami i try / catch
gdzie jest skrypt
w blokach środkowym i prawym
na górze pliku, w blokach tylko pętle wypisujące
wartość z pola
$_POST wprost do zapytania
filter_input z zakresem 1-5 i zapytanie przygotowane
nazwa gromady
pięć gałęzi if / elseif
stała tablica CLASS_NAMES
wiersze wyniku
while + mysqli_fetch_row, $row[0]
fetchAll + foreach, $animal['gatunek']
zamknięcie bazy
mysqli_close po skrypcie nr 2
$pdo = null w finally
numer spoza 1-5
pusty blok (albo wszystkie zwierzęta po wstrzyknięciu)
komunikat „Wpisz numer gromady od 1 do 5.”
W większym serwisie dane logowania do bazy trzyma się w osobnym pliku poza katalogiem strony, a nazwę gromady pobiera z tabeli gromady zamiast z tablicy w kodzie. Tutaj klucz sprawdza połączenie w kodzie strony, a napisy wielkimi literami z polskimi znakami (PŁAZY) nie są zapisane w bazie - tabela ma plazy.
Na egzaminie wersja podstawowa trzyma się funkcji z tabeli 1 i łatwiej ją napisać bez dokumentacji. Nowoczesna jest odporna na wstrzyknięcie SQL i błędne dane od pierwszej linii - a klucz przyjmuje obie.
Krok 39 · po tym etapie masz 36 z 36 kryteriów (pkt)
Krok 39: Plik przeglądarka.txt i nagranie płyty
ok. 5 min
Polecenie z arkusza
UWAGA: po zakończeniu pracy utwórz plik tekstowy o nazwie przeglądarka.txt. Zapisz w nim nazwę przeglądarki internetowej, w której weryfikowałeś poprawność działania witryny. Umieść go w folderze z numerem PESEL.
W przeglądarka.txt nazwa przeglądarki, w której sprawdzana była strona przez http://localhost/…. W folderze z numerem zdającego: import.png, index.php, kw1.jpg - kw4.jpg, kwerendy.txt, przeglądarka.txt, styl3.css i zwierzeta.jpg. Nagraj płytę, sprawdź jej odczyt i opisz ją numerem zdającego.
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
To jedno z możliwych rozwiązań. Egzaminator ocenia spełnienie kryteriów z klucza odpowiedzi, a nie zgodność z tym kodem - inna, poprawna droga też daje punkty.
Autor rozwiązania: Bartosz Bryniarski. Licencja CC BY-NC 4.0 - kopiowanie i przeróbki do celów niekomercyjnych, z podaniem autora i źródła (link do tej strony) (zasady wykorzystania). Treść arkusza i klucza oceniania pochodzi z CKE.