INF.03-06-26.01-SGStyczeń 2026 · 51 kroków · ok. 87 min · 39 kryteriów z klucza
Rozwiązanie krok po kroku: Portal diagnostyki chorób (Wersja podstawowa)
Rozwiązanie buduje portal do diagnostyki online: baza choroby (choroby, objawy i tabela pośrednicząca choroby_objawy dla relacji n..m) i cztery zapytania - warunek z sortowaniem, prosty SELECT, złączenie przez tabelę pośredniczącą i grupowanie z COUNT po dwóch złączeniach - potem grafika z napisem przyciętym do liter, strona zdrowie.php z nagłówkiem, menu, dwiema sekcjami i stopką, style w styl.css (obraz pozycjonowany absolutnie i rozmiary czcionek ustawiane pseudoklasą :nth-child) oraz trzy skrypty PHP: lista chorób zakaźnych, lista rozwijana wszystkich chorób i objawy choroby wybranej w formularzu.
Kroki idą zdanie po zdaniu za treścią arkusza - przy każdym jest polecenie z arkusza, a kod pokazuje dokładnie te linie, które je spełniają. Skrypty są najpierw pisane najprościej, funkcjami z tabeli 1 arkusza (mysqli_query, mysqli_fetch_row, isset), a na końcu zostają przerobione na wersję z prawdziwych projektów: liczba zamiast surowego tekstu z formularza, zapytanie przygotowane, zapamiętany wybór na liście, komunikat dla choroby bez objawów i htmlspecialchars.
To jest wersja podstawowa. W zakładce „Nowoczesny kod (grid, PDO)” jest drugi sposób rozwiązania tego samego arkusza: układ na siatce CSS, kolory w zmiennych i PHP na PDO z walidacją identyfikatora i zapytaniami przygotowanymi od pierwszej linii - obie wersje są zgodne z kluczem.
Baza pochodzi z prawdziwego archiwum pliki9-1 (załącznik do arkusza, hasło w treści zadania). Zrzuty wyników zapytań są odtworzone z tej bazy - na egzaminie robisz je sam, z całego ekranu. Podgląd strony od kroków z PHP to wynik prawdziwego uruchomienia kodu z danego kroku w PHP 8.2 na bazie z arkusza; po wysłaniu formularza pokazuje objawy COVID-19, jak na ilustracji 6.
Jak liczą się punkty. Klucz ma 39 kryteriów (R.1.1 - R.5.9), każde za 1 punkt. Próg zdania części praktycznej to 75%, czyli 30 punktów - można stracić 9 kryteriów i nadal zdać. Przy każdym kroku jest napisane, które kryteria spełnia; egzaminator ocenia spełnienie kryteriów z klucza, nie zgodność z tym kodem.
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 39 kryteriów (pkt)
Krok 1: Baza danych choroby
ok. 2 min
Polecenie z arkusza
Utwórz bazę danych o nazwie choroby, z zestawem polskich znaków (np. utf8_polish_ci)
Rozpakuj pliki9-1.7z z pulpitu (hasło *ZdroWia!!! - z gwiazdką na początku i trzema wykrzyknikami) i załóż folder z numerem zdającego. W phpMyAdmin: Nowa, nazwa choroby, porównywanie utf8_polish_ci. Porównywanie wybrane przy bazie dziedziczą tabele zakładane później bez własnego ustawienia; tabele z choroby.sql mają je zapisane w definicji (COLLATE=utf8_polish_ci), więc sortują po polsku i bez względu na wielkość liter - „COVID-19” stanie między „angina” i „grypa”.
Typowe błędy
Nazwa bazy musi brzmieć dokładnie choroby - skrypty łączą się z bazą po nazwie, więc literówka zabiera też punkty za skrypty (R.5.1).
Krok 2: Import tabel z pliku choroby.sql
ok. 2 min
Polecenie z arkusza
Z rozpakowanego archiwum zaimportuj tabele z pliku choroby.sql do utworzonej bazy
Zaznacz bazę choroby, potem Import → choroby.sql → Wykonaj. Powstają trzy tabele z ilustracji 1: choroby (pole zakazna z literą T albo N), objawy i choroby_objawy, która łączy jedne z drugimi - jedna choroba ma wiele objawów, ten sam objaw występuje w wielu chorobach (relacja n..m).
Krok 3: Zrzut ekranu import.png
Kryteria:
R.1.1 Wykonany import tabel do bazy danych choroby - plik import.png
ok. 2 min
Polecenie z arkusza
Wykonaj zrzut ekranu po imporcie. Zapisz zrzut w formacie PNG pod nazwą 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
Print Screen, wklejasz do edytora grafiki i zapisujesz jako import.png. Na zrzucie widać komunikat o udanym imporcie i trzy tabele w drzewku bazy.
Typowe błędy
Wykadrowany zrzut albo zrzut bez paska zadań nie jest oceniany (uwaga w kluczu przy R.1).
Krok 4: Zapytanie 1: choroby zakaźne alfabetycznie
Kryteria: ,
R.1.2 W pliku kwerendy.txt zapisane co najmniej jedno zapytanie SQL, wynikające z treści zadania
R.1.3 Wykonane zapytanie 1 wybierające jedynie nazwy chorób zakaźnych, posortowane rosnąco według nazwy. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT nazwa FROM choroby WHERE zakazna = 'T' ORDER BY nazwa; oraz na zrzucie widocznych jest dokładnie 7 rekordów z danymi: angina, COVID-19, grypa, odra, ospa, różyczka, świnka
ok. 2 min
Polecenie z arkusza
Zapytanie 1: wybierające jedynie nazwy chorób zakaźnych, posortowane rosnąco według nazwy
SELECT nazwa - jedno pole,
FROM choroby - jedna tabela,
WHERE zakazna = 'T' - choroby zakaźne; litera w apostrofach, bo pole jest tekstowe,
ORDER BY nazwa - rosnąco, czyli domyślnie (ASC można dopisać).
Wynik: siedem wierszy - angina, COVID-19, grypa, odra, ospa, różyczka, świnka. Zapytanie zapisujesz w kwerendy.txt, zrzut jako kw1.png (cały ekran z paskiem zadań).
Typowe błędy
Kolejność z klucza daje każde porównywanie bez rozróżniania wielkości liter (_ci: polskie, unicode, general) - sprawdzone na tej bazie. Tylko porównywanie binarne (utf8_bin) stawia „COVID-19” przed „angina”, bo wielkie litery mają mniejsze kody niż małe. Tabele z choroby.sql niosą własne utf8_polish_ci, więc ten błąd zdarzy się tylko przy ręcznej zmianie porównywania kolumny.
kwerendy.txtTekstnowy plik
-- Zapytanie 1SELECT nazwa FROM choroby WHERE zakazna = 'T' ORDER BY nazwa;
Podgląd strony po tym kroku
Krok 5: Zapytanie 2: identyfikatory i nazwy chorób
Kryteria:
R.1.4 Wykonane zapytanie 2 wybierające jedynie identyfikatory i nazwy dla wszystkich chorób. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT id, nazwa FROM choroby; oraz na zrzucie widocznych jest dokładnie 16 rekordów, id od 1 do 16
ok. 1 min
Polecenie z arkusza
Zapytanie 2: wybierające jedynie identyfikatory i nazwy dla wszystkich chorób
Dwie kolumny, bez warunku: 16 wierszy o identyfikatorach 1 - 16, od anginy do choroby Kawasaki (w bazie zapisanej jako „Kavasaki”). Skrypt 2 zrobi z nich opcje listy rozwijanej. Zrzut: kw2.png.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT nazwa FROM choroby WHERE zakazna = 'T' ORDER BY nazwa;-- Zapytanie 2SELECT id, nazwa FROM choroby;
Podgląd strony po tym kroku
Krok 6: Zapytanie 3: objawy choroby o id 5
Kryteria:
R.1.5 Wykonane zapytanie 3 wybierające jedynie nazwy objawów dla choroby o id 5. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT nazwa FROM objawy JOIN choroby_objawy ON id = id_objawy WHERE id_choroby = 5; oraz na zrzucie widocznych jest dokładnie 6 rekordów: ból głowy, gorączka, mdłości, rozwolnienie, wymioty, drgawki
ok. 3 min
Polecenie z arkusza
Zapytanie 3: wybierające jedynie nazwy objawów dla choroby o id 5. Należy posłużyć się relacją
SELECT objawy.nazwa - nazwa objawu; obie tabele z nazwami mają pole nazwa, więc dopisujesz tabelę,
FROM objawy JOIN choroby_objawy - łączysz objawy z tabelą pośredniczącą,
ON objawy.id = choroby_objawy.id_objawy - relacja: identyfikator objawu w obu tabelach,
WHERE choroby_objawy.id_choroby = 5 - tylko wiersze choroby 5 (jelitówka).
Tabeli choroby nie potrzebujesz - identyfikator choroby jest już w tabeli pośredniczącej. Wynik: sześć objawów - ból głowy, gorączka, mdłości, rozwolnienie, wymioty, drgawki. Zrzut: kw3.png.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT nazwa FROM choroby WHERE zakazna = 'T' ORDER BY nazwa;-- Zapytanie 2SELECT id, nazwa FROM choroby;-- Zapytanie 3SELECT objawy.nazwa FROM objawy JOIN choroby_objawy ON objawy.id = choroby_objawy.id_objawy WHERE choroby_objawy.id_choroby = 5;
Podgląd strony po tym kroku
Krok 7: Zapytanie 4: liczba objawów chorób zakaźnych
Kryteria:
R.1.6 Wykonane zapytanie 4 wybierające jedynie nazwy chorób oraz wyliczoną dla nich liczbę objawów zgrupowanych dla każdej choroby zakaźnej. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT choroby.nazwa, COUNT(objawy.id) FROM choroby JOIN choroby_objawy ON choroby.id = id_choroby JOIN objawy ON objawy.id = id_objawy WHERE zakazna = 'T' GROUP by choroby.nazwa; (lub porównanie kluczy po WHERE) oraz na zrzucie widocznych jest 7 rekordów z danymi: angina 9, COVID-19 11, grypa 8, odra 4, ospa 6, różyczka 7, świnka 6
ok. 3 min
Polecenie z arkusza
Zapytanie 4: wybierające jedynie nazwy chorób oraz wyliczoną dla nich liczbę objawów zgrupowane dla każdej choroby zakaźnej. Należy posłużyć się relacją n..m.
SELECT choroby.nazwa, COUNT(objawy.id) - nazwa choroby i liczba objawów,
FROM choroby JOIN choroby_objawy ON choroby.id = choroby_objawy.id_choroby - pierwsza połowa relacji n..m,
JOIN objawy ON objawy.id = choroby_objawy.id_objawy - druga połowa: od tabeli pośredniczącej do objawów,
WHERE choroby.zakazna = 'T' - tylko choroby zakaźne,
GROUP BY choroby.nazwa - jeden wiersz na chorobę; COUNT liczy wiersze w każdej grupie.
Wynik: siedem wierszy - angina 9, COVID-19 11, grypa 8, odra 4, ospa 6, różyczka 7, świnka 6, dokładnie jak w kluczu. Zrzut: kw4.png.
Typowe błędy
Bez warunku WHERE wynik ma 14 wierszy (wszystkie choroby, które mają objawy) zamiast 7 - klucz wymaga samych chorób zakaźnych.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT nazwa FROM choroby WHERE zakazna = 'T' ORDER BY nazwa;-- Zapytanie 2SELECT id, nazwa FROM choroby;-- Zapytanie 3SELECT objawy.nazwa FROM objawy JOIN choroby_objawy ON objawy.id = choroby_objawy.id_objawy WHERE choroby_objawy.id_choroby = 5;-- Zapytanie 4SELECT choroby.nazwa, COUNT(objawy.id) FROM choroby JOIN choroby_objawy ON choroby.id = choroby_objawy.id_choroby JOIN objawy ON objawy.id = choroby_objawy.id_objawy WHERE choroby.zakazna = 'T' GROUP BY choroby.nazwa;
Podgląd strony po tym kroku
Etap 2: Grafika i strona HTML
Kroki 8-29 · po tym etapie masz 18 z 39 kryteriów (pkt)
Krok 8: Grafika zdrowia.png: napis na przezroczystym tle
ok. 4 min
Polecenie z arkusza
Wykonaj grafikę zdrowia.png o cechach: Wysokość 100 px. Tło przeźroczyste. Zawartością jest tekst ZDROWIA zapisany wielkimi literami, dowolną czcionką bezszeryfową
W GIMP-ie: Plik → Nowy, w opcjach zaawansowanych Wypełnienie: Przezroczystość. Narzędziem Tekst piszesz ZDROWIA krojem bezszeryfowym (tu DejaVu Sans, może być Arial albo Verdana) dużym rozmiarem, np. 200 px - łatwiej potem przyciąć. Zapisz przez Plik → Wyeksportuj jako w formacie PNG, bo JPEG nie ma przezroczystości.
Podgląd strony po tym kroku
Krok 9: Grafika zdrowia.png: przycięcie do napisu i wysokość 100 px
Kryteria:
R.2.1 Grafika zdrowia.png ma wysokość dokładnie 100 px, tło przezroczyste oraz napis wielkimi literami ZDROWIA. Napis wypełnia w pionie całą grafikę, dopuszcza się przycięcie tuż przy napisie lub lekkie podcięcie liter tak, że zniekształci to np. literę o (kilka pikseli)
ok. 3 min
Polecenie z arkusza
Tekst ma wysokość 100 px i wypełnia w pionie całą grafikę. W poziomie należy przyciąć grafikę do szerokości napisu. Szerokość ta będzie uzależniona od rodzaju dobranej czcionki.
Obraz → Przytnij do zawartości obcina przezroczyste pasy dookoła liter - napis dotyka wszystkich czterech krawędzi. Potem Obraz → Skaluj obraz z zamkniętym łańcuchem: wysokość 100 px, szerokość wyjdzie sama. W tym rozwiązaniu 641 × 100 px; litera O wystaje odrobinę ponad Z i D (tak rysuje się okrągłe litery), więc to ona wyznacza górę i dół grafiki.
Typowe błędy
Skalowanie przed przycięciem daje grafikę wysoką na 100 px, ale z pustymi pasami nad i pod napisem - wtedy tekst nie wypełnia grafiki w pionie i kryterium R.2.1 przepada.
Składa się ze strony o nazwie zdrowie.php. Zapisana w języku HTML5
Deklaracja <!DOCTYPE html> i szkielet strony. Rozszerzenie .php, bo dojdą skrypty; na egzaminie plik leży w htdocs XAMPP-a i otwierasz go przez http://localhost/....
Krok 15: Bloki: nagłówek, menu, główny z dwiema sekcjami, stopka
Kryteria:
R.2.4 W sekcji body zdefiniowany jest podział na bloki za pomocą semantycznych znaczników HTML5: header, nav, main->section+section, footer (dopuszcza się zastosowanie bloków pomocniczych)
ok. 2 min
Polecenie z arkusza
Podział strony na bloki zrealizowany za pomocą semantycznych znaczników bloków języka HTML5 tak, aby po uruchomieniu w przeglądarce układ bloków na stronie był zgodny z ilustracją 4
Klucz wymaga wprost header, nav, main z dwoma section w środku i footer (R.2.4). Sekcje różnią się kolorem tła, więc dajesz im identyfikatory left i right - po nich je rozróżnisz w CSS. Obok siebie ustawisz je później w stylach.
R.3.3 Kliknięcie każdego odnośnika otwiera stronę w nowym oknie: Szpitale - https://szpitale.pl/, Przychodnie - https://www.przychodnie.pl/, NFZ - https://www.nfz.gov.pl/ (adresy stron z www lub bez)
ok. 1 min
Polecenie z arkusza
Wszystkie odnośniki otwierają się w nowym oknie przeglądarki
Atrybut target="_blank" w każdym z trzech odnośników - klucz sprawdza kliknięciem wszystkie trzy (R.3.3). Linki w podglądzie są zablokowane, więc sprawdzasz to w przeglądarce na egzaminie.
Typowe błędy
Wystarczy, że jeden odnośnik otwiera się w tej samej karcie, i kryterium R.3.3 przepada w całości.
Lista numerowana (uporządkowana) wypełniona skryptem 1
Lista numerowana to <ol> (ordered list); <ul> dałby kropki zamiast numerów. Elementy <li> wypisze Skrypt 1 - zostawiasz miejsce między znacznikami. Pusta lista nic nie pokazuje, więc w podglądzie widać na razie sam nagłówek.
R.3.4 Formularz wysyła dane metodą POST do tego samego pliku (poprawne również bez atrybutu action)
ok. 1 min
Polecenie z arkusza
Formularz wysyłający dane metodą bezpieczną do tego samego pliku
method="post" - „metoda bezpieczna” w rozumieniu arkusza: dane jadą w treści żądania, a nie w adresie, więc nie zostają w historii przeglądarki. (W specyfikacji HTTP „bezpieczna” znaczy co innego - metodę, która niczego nie zmienia na serwerze, czyli GET - ale klucz R.3.4 rozstrzyga: POST.) Atrybut action pomijasz: formularz bez niego wysyła dane do bieżącej strony, czyli do zdrowie.php (klucz uznaje oba zapisy).
R.2.9 W bloku sekcji prawej znajduje się blok (np. div, section)
ok. 1 min
Polecenie z arkusza
Blok w którym umieszczony jest efekt działania skryptu 3
Zwykły <div> pod formularzem, z identyfikatorem symptoms do stylów. Blok stoi w HTML-u zawsze - przed wysłaniem formularza jest pusty (na ilustracji 3 widać samą kropkowaną ramkę), a po wysłaniu wypełni go Skrypt 3.
R.2.5 W bloku nagłówkowym znajduje się <h1>: „Informacja o chorobach w Polsce”, w bloku sekcji lewej <h2>: „Choroby zakaźne", w bloku sekcji prawej <h2>: „Objawy chorób” oraz <p> z numerem zdającego w stopce
ok. 1 min
Polecenie z arkusza
Zawartość stopki: paragraf o treści „Stronę opracował: ”, dalej wstawiony numer zdającego
Akapit w <footer>. Na egzaminie po dwukropku wpisujesz swój numer zdającego (PESEL) - tutaj stoi imię i nazwisko autora rozwiązania. Z tym krokiem są już wszystkie nagłówki z klucza: <h1>, dwa <h2> i akapit w stopce.
Kroki 30-39 · po tym etapie masz 29 z 39 kryteriów (pkt)
Krok 30: Plik styl.css: krój czcionki
Kryteria:
R.4.1 domyślnie dla wszystkich selektorów (*): krój czcionki "Trebuchet MS", sans-serif (dozwolona tylko taka kolejność)
ok. 1 min
Polecenie z arkusza
Domyślnie dla wszystkich selektorów: krój czcionki Trebuchet MS, w przypadku braku sans-serif
Selektor *. Nazwę kroju ze spacją bierzesz w cudzysłów: "Trebuchet MS", a na końcu rodzina zapasowa sans-serif - klucz sprawdza właśnie tę kolejność.
styl.cssCSSnowy plik
* {font-family: "Trebuchet MS", sans-serif;}
Podgląd strony po tym kroku (zdrowie.php)
Krok 31: Nagłówek, menu i stopka
Kryteria:
R.4.5 wyrównanie tekstu do prawej strony: blok nagłówkowy, nawigacyjny i stopka
ok. 1 min
Polecenie z arkusza
Wspólne dla bloku nagłówkowego, nawigacyjnego i stopki: kolor tła #FF8F00, marginesy wewnętrzne 10 px, wyrównanie tekstu do prawej strony
Jedna reguła dla trzech selektorów po przecinku. Marginesy wewnętrzne to padding, a text-align: right dosuwa do prawej nagłówek, odnośniki i podpis w stopce, jak na ilustracji 3.
Dodatkowo kolor tła dla bloku sekcji lewej to #FFF8E1, dla bloku sekcji prawej to #FFECB3
Tu przydają się identyfikatory: #left i #right. Selektor identyfikatora jest mocniejszy niż selektor znacznika, ale wspólnych właściwości i tak nie nadpisuje - dokłada tylko tło.
R.3.1 Układ bloków po uruchomieniu strony w przeglądarce jest zgodny z ilustracją 4 w arkuszu egzaminacyjnym (prawidłowo zastosowano właściwości CSS decydujące o układzie bloków na stronie, np. float i clear albo display flex albo grid albo position)
ok. 2 min
Polecenie z arkusza
Podział strony na bloki zrealizowany za pomocą semantycznych znaczników bloków języka HTML5 tak, aby po uruchomieniu w przeglądarce układ bloków na stronie był zgodny z ilustracją 4
Arkusz nie mówi, jak postawić sekcje obok siebie - wybierasz display: flex na <main>. Dzieci kontenera flex stają w rzędzie, a 50% + 50% daje całą szerokość. Przy float trzeba by pamiętać o clear: both dla stopki, inaczej wjechałaby pod pływające sekcje; flex nie wypuszcza dzieci poza kontener, więc stopka sama zostaje pod spodem (R.3.1).
Typowe błędy
Bloki, które na siebie zachodzą (sprawdzane w inspektorze), zabierają punkt za układ, nawet gdy strona „na oko” wygląda dobrze.
R.4.2 kolor tła: blok nagłówkowy, nawigacyjny, stopka - #FF8F00, blok sekcji lewej - #FFF8E1, blok sekcji prawej - #FFECB3, kolor czcionki: selektora a - #FFECB3
R.4.3 dla odnośnika rozmiar czcionki 180%, bez podkreślenia (text-decoration:none)
ok. 2 min
Polecenie z arkusza
Dla selektora odnośnika: kolor czcionki #FFECB3, jedynie margines zewnętrzny lewy 70 px, czcionka o rozmiarze 180%, bez podkreślenia
„Jedynie margines zewnętrzny lewy” to margin-left, nie margin - pozostałe marginesy zostają domyślne. Selektor znacznika a, zgodnie z uwagą arkusza. Ta reguła zamyka kryterium kolorów (R.4.2): tła bloków masz już ustawione, brakowało koloru czcionki odnośników.
R.4.10 gdy kursor znajdzie się na odnośniku jego kolor czcionki zmienia się na biały i dodawane jest podkreślenie
ok. 1 min
Polecenie z arkusza
Gdy kursor znajdzie się na odnośniku jego kolor czcionki zmienia się na biały i dodawane jest podkreślenie
Pseudoklasa :hover zmienia dwie rzeczy naraz: kolor i podkreślenie (underline przywraca to, co wyłączono w poprzedniej regule). Na ilustracji 3 kursor stoi na „Przychodnie”.
R.4.8 dla selektora img styl position: absolute; left: 100px; top: 500px; oraz obraz jest zawsze na wierzchu (np. z-index)
ok. 2 min
Polecenie z arkusza
Dla selektora obrazu: zawsze na wierzchu, pozycjonowanie na stronie - przesunięcie względem rodzica: 100 px od lewej krawędzi i 500 px od góry, element ten jest usuwany z normalnego przepływu dokumentu
Tabela 3 arkusza mówi wprost: przesunięcie względem rodzica z usunięciem z przepływu to position: absolute, a przesunięcie wyznaczają left i top. Obraz nie zajmuje już miejsca pod stopką, tylko leży nad sekcją lewą i stopką, jak na ilustracji 3. „Zawsze na wierzchu” zapewnia z-index większy od zera - element pozycjonowany z dodatnim z-index przykrywa zwykłe bloki.
Typowe błędy
position: fixed też usuwa element z przepływu, ale liczy przesunięcie od okna przeglądarki i obraz nie przewija się ze stroną - to nie jest „względem rodzica”.
R.4.6 marginesy wewnętrzne (padding) : blok nagłówkowy, nawigacyjny i stopka - 10px, blok ze skryptem 3 - 30px, marginesy zewnętrzne (margin) : blok ze skryptem 3 - 50px 180px 0 50px, dla odnośnika margin-left: 70px
R.4.7 dla bloku ze skryptem 3: obramowanie 1px dotted black
ok. 2 min
Polecenie z arkusza
Dla bloku, w którym umieszczony jest skrypt 3: obramowanie linią kropkowaną o szerokości 1 px i kolorze czarnym, marginesy wewnętrzne 30 px, marginesy zewnętrzne: góra 50 px, prawy 180 px, dół 0, lewy 50 px
Skrót border: 1px dotted black. Cztery wartości w margin idą zgodnie z ruchem wskazówek zegara: góra, prawy, dół, lewy - stąd 50px 180px 0 50px. Pusty blok ma i tak 60 px wysokości (dwa razy padding), dlatego na ilustracji 3 widać prostokąt, zanim cokolwiek wyślesz. Ta reguła zamyka kryterium marginesów (R.4.6).
Rozmiar czcionki dla selektorów span: drugiego 120%, czwartego 240%, piątego 150%, siódmego 160%, dziewiątego 130%, dziesiątego 190%. Należy wykonać za pomocą przeznaczonej do tego pseudoklasy
Pseudoklasa :nth-child(n) (tabela 2 arkusza) wybiera element, który jest n-tym dzieckiem swojego rodzica. Rodzicem wszystkich <span> będzie blok #symptoms, a Skrypt 3 nie wypisze w nim nic poza spanami - dlatego drugi span to drugie dziecko. Sześć reguł, po jednej na numer. Objawów jeszcze nie ma; efekt zobaczysz po Skrypcie 3: „ból gardła” większy, „bóle stawów” największe.
Typowe błędy
Gdyby przed spanami stał w bloku inny element (np. nagłówek), numeracja przesunęłaby się o jeden - nth-child liczy wszystkie dzieci, nie tylko spany.
Kroki 40-47 · po tym etapie masz 39 z 39 kryteriów (pkt)
Krok 40: Połączenie z bazą i zamknięcie na końcu
Kryteria: ,
R.5.1 Skrypt realizuje połączenie z serwerem bazy danych i wybór bazy choroby
R.5.2 Ostatnią operacją na bazie jest jej zamknięcie
ok. 2 min
Polecenie z arkusza
Łączą się z serwerem bazodanowym na localhost, użytkownik root bez hasła, baza danych o nazwie choroby. Na końcu działania skrypt zamyka połączenie z serwerem
Pierwszy skrypt na stronie stoi w liście <ol>, więc tam otwierasz połączenie: mysqli_connect z czterema argumentami łączy się z serwerem i od razu wybiera bazę. Uchwyt w zmiennej $connection posłuży wszystkim trzem skryptom. Ostatni blok PHP, w bloku symptoms, na razie tylko zamyka połączenie - Skrypt 3 dopiszesz nad tą linią, żeby zamknięcie zostało ostatnią operacją na bazie (R.5.1, R.5.2). Od tego kroku podgląd to wynik prawdziwego uruchomienia strony.
R.5.3 Przynajmniej jeden skrypt zawiera instrukcję wysyłającą do bazy danych zapytanie
ok. 1 min
Polecenie z arkusza
Skrypt 1: Wysyła do bazy danych zapytanie 1
Treść zapytania w zmiennej $query, mysqli_query wysyła ją do bazy, a w $result zostaje wynik do odczytania wiersz po wierszu. Apostrofy wokół T mieszczą się w napisie PHP w cudzysłowach bez żadnego ukośnika.
zdrowie.phpPHPzmienione: 2 linie
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Wykaz chorób</title> <linkrel="stylesheet"href="styl.css"></head><body> <header> <h1>Informacja o chorobach w Polsce</h1> </header> <nav> <ahref="https://szpitale.pl/"target="_blank">Szpitale</a> <ahref="https://www.przychodnie.pl/"target="_blank">Przychodnie</a> <ahref="https://www.nfz.gov.pl/"target="_blank">NFZ</a> </nav> <main> <sectionid="left"> <h2>Choroby zakaźne</h2> <ol><?php$connection = mysqli_connect("localhost", "root", "", "choroby");$query = "SELECT nazwa FROM choroby WHERE zakazna = 'T' ORDER BY nazwa;";$result = mysqli_query($connection, $query);?> </ol> </section> <sectionid="right"> <h2>Objawy chorób</h2> <formmethod="post"> <selectname="disease"> </select> <buttontype="submit">Sprawdź</button> </form> <divid="symptoms"><?php mysqli_close($connection);?> </div> </section> </main> <footer> <p>Stronę opracował: Bartosz Bryniarski</p> </footer> <imgsrc="zdrowia.png"alt="Życzymy zdrowia!"></body></html>
R.2.7 W bloku sekcji lewej umieszczona jedna lista numerowana z przynajmniej jednym elementem, zastosowane znaczniki <ol>, <li> (w skrypcie lub HTML)
R.5.4 Skrypt 1 wyświetla z każdego zwróconego zapytaniem 1 rekordu element <li>
ok. 2 min
Polecenie z arkusza
W każdym elemencie listy umieszcza zwrócone zapytaniem pole rekordu
mysqli_fetch_row oddaje kolejny wiersz jako tablicę ($row[0] - jedyne pole, nazwa), a po ostatnim zwraca null i pętla while się kończy. Każda nazwa trafia do osobnego <li>, a numery 1 - 7 dopisuje sama przeglądarka, bo lista to <ol>. Podgląd pokazuje siedem chorób jak na ilustracji 3.
zdrowie.phpPHPzmienione: 3 linie
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Wykaz chorób</title> <linkrel="stylesheet"href="styl.css"></head><body> <header> <h1>Informacja o chorobach w Polsce</h1> </header> <nav> <ahref="https://szpitale.pl/"target="_blank">Szpitale</a> <ahref="https://www.przychodnie.pl/"target="_blank">Przychodnie</a> <ahref="https://www.nfz.gov.pl/"target="_blank">NFZ</a> </nav> <main> <sectionid="left"> <h2>Choroby zakaźne</h2> <ol><?php$connection = mysqli_connect("localhost", "root", "", "choroby");$query = "SELECT nazwa FROM choroby WHERE zakazna = 'T' ORDER BY nazwa;";$result = mysqli_query($connection, $query);while ($row = mysqli_fetch_row($result)) {echo"<li>$row[0]</li>"; }?> </ol> </section> <sectionid="right"> <h2>Objawy chorób</h2> <formmethod="post"> <selectname="disease"> </select> <buttontype="submit">Sprawdź</button> </form> <divid="symptoms"><?php mysqli_close($connection);?> </div> </section> </main> <footer> <p>Stronę opracował: Bartosz Bryniarski</p> </footer> <imgsrc="zdrowia.png"alt="Życzymy zdrowia!"></body></html>
Podgląd strony po tym kroku (zdrowie.php)
Krok 43: Skrypt 2: zapytanie 2
ok. 1 min
Polecenie z arkusza
Skrypt 2: Wysyła do bazy danych zapytanie 2
Skrypt 2 piszesz wewnątrz<select> - to, co wypisze, stanie się opcjami listy. Zmiennych $query i $result używasz ponownie: wynik Skryptu 1 został już wypisany.
zdrowie.phpPHPzmienione: 4 linie
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Wykaz chorób</title> <linkrel="stylesheet"href="styl.css"></head><body> <header> <h1>Informacja o chorobach w Polsce</h1> </header> <nav> <ahref="https://szpitale.pl/"target="_blank">Szpitale</a> <ahref="https://www.przychodnie.pl/"target="_blank">Przychodnie</a> <ahref="https://www.nfz.gov.pl/"target="_blank">NFZ</a> </nav> <main> <sectionid="left"> <h2>Choroby zakaźne</h2> <ol><?php$connection = mysqli_connect("localhost", "root", "", "choroby");$query = "SELECT nazwa FROM choroby WHERE zakazna = 'T' ORDER BY nazwa;";$result = mysqli_query($connection, $query);while ($row = mysqli_fetch_row($result)) {echo"<li>$row[0]</li>"; }?> </ol> </section> <sectionid="right"> <h2>Objawy chorób</h2> <formmethod="post"> <selectname="disease"><?php$query = "SELECT id, nazwa FROM choroby;";$result = mysqli_query($connection, $query);?> </select> <buttontype="submit">Sprawdź</button> </form> <divid="symptoms"><?php mysqli_close($connection);?> </div> </section> </main> <footer> <p>Stronę opracował: Bartosz Bryniarski</p> </footer> <imgsrc="zdrowia.png"alt="Życzymy zdrowia!"></body></html>
Podgląd strony po tym kroku (zdrowie.php)
Krok 44: Skrypt 2: opcje z identyfikatorem w value
Kryteria:
R.5.5 Skrypt 2 wyświetla z każdego zwróconego zapytaniem 2 rekordu opcję listy rozwijanej, tak że identyfikator jest przypisany atrybutowi value, a nazwa - treści opcji
ok. 2 min
Polecenie z arkusza
Każdym zwróconym rekordem wypełnia opcje listy w ten sposób, że identyfikator jest przypisany do atrybutu wartości opcji, a nazwa jest treścią opcji
Widać nazwę choroby, a formularz wyśle value, czyli identyfikator - tego potrzebuje zapytanie 3. Cudzysłowy atrybutu wewnątrz napisu PHP poprzedzasz ukośnikiem \". Rozwiń listę w podglądzie: 16 chorób w kolejności identyfikatorów, od anginy do „Kavasaki”, jak na ilustracji 5.
zdrowie.phpPHPzmienione: 3 linie
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Wykaz chorób</title> <linkrel="stylesheet"href="styl.css"></head><body> <header> <h1>Informacja o chorobach w Polsce</h1> </header> <nav> <ahref="https://szpitale.pl/"target="_blank">Szpitale</a> <ahref="https://www.przychodnie.pl/"target="_blank">Przychodnie</a> <ahref="https://www.nfz.gov.pl/"target="_blank">NFZ</a> </nav> <main> <sectionid="left"> <h2>Choroby zakaźne</h2> <ol><?php$connection = mysqli_connect("localhost", "root", "", "choroby");$query = "SELECT nazwa FROM choroby WHERE zakazna = 'T' ORDER BY nazwa;";$result = mysqli_query($connection, $query);while ($row = mysqli_fetch_row($result)) {echo"<li>$row[0]</li>"; }?> </ol> </section> <sectionid="right"> <h2>Objawy chorób</h2> <formmethod="post"> <selectname="disease"><?php$query = "SELECT id, nazwa FROM choroby;";$result = mysqli_query($connection, $query);while ($row = mysqli_fetch_row($result)) {echo"<option value=\"$row[0]\">$row[1]</option>"; }?> </select> <buttontype="submit">Sprawdź</button> </form> <divid="symptoms"><?php mysqli_close($connection);?> </div> </section> </main> <footer> <p>Stronę opracował: Bartosz Bryniarski</p> </footer> <imgsrc="zdrowia.png"alt="Życzymy zdrowia!"></body></html>
Podgląd strony po tym kroku (zdrowie.php)
Krok 45: Skrypt 3: tylko po wysłaniu formularza
ok. 1 min
Polecenie z arkusza
Skrypt 3, wykonywany tylko wtedy, gdy formularz wysłał dane (ilustracja 6)
Przy zwykłym wejściu na stronę tablica $_POST jest pusta, po kliknięciu „Sprawdź” ma klucz disease (nazwa listy). Warunek isset to sprawdza. Zamknięcie połączenia stoi pod blokiem if, poza nim - wykona się zawsze, także bez wysłania formularza, i nadal jako ostatnia operacja na bazie.
zdrowie.phpPHPzmienione: 2 linie
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Wykaz chorób</title> <linkrel="stylesheet"href="styl.css"></head><body> <header> <h1>Informacja o chorobach w Polsce</h1> </header> <nav> <ahref="https://szpitale.pl/"target="_blank">Szpitale</a> <ahref="https://www.przychodnie.pl/"target="_blank">Przychodnie</a> <ahref="https://www.nfz.gov.pl/"target="_blank">NFZ</a> </nav> <main> <sectionid="left"> <h2>Choroby zakaźne</h2> <ol><?php$connection = mysqli_connect("localhost", "root", "", "choroby");$query = "SELECT nazwa FROM choroby WHERE zakazna = 'T' ORDER BY nazwa;";$result = mysqli_query($connection, $query);while ($row = mysqli_fetch_row($result)) {echo"<li>$row[0]</li>"; }?> </ol> </section> <sectionid="right"> <h2>Objawy chorób</h2> <formmethod="post"> <selectname="disease"><?php$query = "SELECT id, nazwa FROM choroby;";$result = mysqli_query($connection, $query);while ($row = mysqli_fetch_row($result)) {echo"<option value=\"$row[0]\">$row[1]</option>"; }?> </select> <buttontype="submit">Sprawdź</button> </form> <divid="symptoms"><?phpif (isset($_POST["disease"])) { } mysqli_close($connection);?> </div> </section> </main> <footer> <p>Stronę opracował: Bartosz Bryniarski</p> </footer> <imgsrc="zdrowia.png"alt="Życzymy zdrowia!"></body></html>
Krok 46: Skrypt 3: zapytanie 3 z identyfikatorem z formularza
Kryteria: ,
R.5.6 Skrypt 3 zawiera instrukcję sprawdzającą czy dane z formularza zostały wysłane oraz instrukcję pobierającą dane z tablicy globalnej odpowiadającej zastosowanej metodzie formularza ($_POST, $_GET, $_REQUEST)
R.5.7 Skrypt 3 wysyła zmodyfikowane zapytanie 3 tak, że w warunku podany jest identyfikator wysłany przez formularz
ok. 2 min
Polecenie z arkusza
Wysyła do bazy danych zmodyfikowane zapytanie 3 w ten sposób, że w warunku podany jest identyfikator wysłany przez formularz
Wartość listy czeka w $_POST["disease"] - przepisujesz ją do zmiennej $disease i wstawiasz do zapytania 3 w miejsce 5. Identyfikator to liczba, więc w SQL bez apostrofów. Od tego kroku podgląd pokazuje stronę po wysłaniu formularza z wybranym COVID-19 (identyfikator 15) - blok jest jeszcze pusty, bo wyniku nie wypisujesz.
zdrowie.phpPHPzmienione: 3 linie
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Wykaz chorób</title> <linkrel="stylesheet"href="styl.css"></head><body> <header> <h1>Informacja o chorobach w Polsce</h1> </header> <nav> <ahref="https://szpitale.pl/"target="_blank">Szpitale</a> <ahref="https://www.przychodnie.pl/"target="_blank">Przychodnie</a> <ahref="https://www.nfz.gov.pl/"target="_blank">NFZ</a> </nav> <main> <sectionid="left"> <h2>Choroby zakaźne</h2> <ol><?php$connection = mysqli_connect("localhost", "root", "", "choroby");$query = "SELECT nazwa FROM choroby WHERE zakazna = 'T' ORDER BY nazwa;";$result = mysqli_query($connection, $query);while ($row = mysqli_fetch_row($result)) {echo"<li>$row[0]</li>"; }?> </ol> </section> <sectionid="right"> <h2>Objawy chorób</h2> <formmethod="post"> <selectname="disease"><?php$query = "SELECT id, nazwa FROM choroby;";$result = mysqli_query($connection, $query);while ($row = mysqli_fetch_row($result)) {echo"<option value=\"$row[0]\">$row[1]</option>"; }?> </select> <buttontype="submit">Sprawdź</button> </form> <divid="symptoms"><?phpif (isset($_POST["disease"])) {$disease = $_POST["disease"];$query = "SELECT objawy.nazwa FROM objawy JOIN choroby_objawy ON objawy.id = choroby_objawy.id_objawy WHERE choroby_objawy.id_choroby = $disease;";$result = mysqli_query($connection, $query); } mysqli_close($connection);?> </div> </section> </main> <footer> <p>Stronę opracował: Bartosz Bryniarski</p> </footer> <imgsrc="zdrowia.png"alt="Życzymy zdrowia!"></body></html>
R.5.8 Skrypt 3 wyświetla w znaczniku <span> każdy zwrócony zapytaniem objaw choroby np. <span> $wiersz[0] </span>
R.5.9 W skryptach zastosowana przynajmniej jedna zmienna oraz nazwy wszystkich zmiennych są w języku polskim lub angielskim i odzwierciedlają cel zastosowania
ok. 2 min
Polecenie z arkusza
Każdy zwrócony zapytaniem objaw choroby zapisuje w znaczniku span w ten sposób, że przed i po objawie jest spacja
Spacje stoją wewnątrz napisu, przed i po $row[0]: "<span> $row[0] </span>". Spany są elementami liniowymi i bez nich objawy zlepiłyby się w jeden wyraz („ból głowyból gardła”). Teraz działają reguły :nth-child z CSS: w podglądzie jest 11 objawów COVID-19, a „bóle stawów” (czwarty span) są największe, jak na ilustracji 6. W skryptach są już zmienne $connection, $query, $result, $row i $disease - nazwy po angielsku mówią, do czego służą (R.5.9).
zdrowie.phpPHPzmienione: 3 linie
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Wykaz chorób</title> <linkrel="stylesheet"href="styl.css"></head><body> <header> <h1>Informacja o chorobach w Polsce</h1> </header> <nav> <ahref="https://szpitale.pl/"target="_blank">Szpitale</a> <ahref="https://www.przychodnie.pl/"target="_blank">Przychodnie</a> <ahref="https://www.nfz.gov.pl/"target="_blank">NFZ</a> </nav> <main> <sectionid="left"> <h2>Choroby zakaźne</h2> <ol><?php$connection = mysqli_connect("localhost", "root", "", "choroby");$query = "SELECT nazwa FROM choroby WHERE zakazna = 'T' ORDER BY nazwa;";$result = mysqli_query($connection, $query);while ($row = mysqli_fetch_row($result)) {echo"<li>$row[0]</li>"; }?> </ol> </section> <sectionid="right"> <h2>Objawy chorób</h2> <formmethod="post"> <selectname="disease"><?php$query = "SELECT id, nazwa FROM choroby;";$result = mysqli_query($connection, $query);while ($row = mysqli_fetch_row($result)) {echo"<option value=\"$row[0]\">$row[1]</option>"; }?> </select> <buttontype="submit">Sprawdź</button> </form> <divid="symptoms"><?phpif (isset($_POST["disease"])) {$disease = $_POST["disease"];$query = "SELECT objawy.nazwa FROM objawy JOIN choroby_objawy ON objawy.id = choroby_objawy.id_objawy WHERE choroby_objawy.id_choroby = $disease;";$result = mysqli_query($connection, $query);while ($row = mysqli_fetch_row($result)) {echo"<span> $row[0] </span>"; } } mysqli_close($connection);?> </div> </section> </main> <footer> <p>Stronę opracował: Bartosz Bryniarski</p> </footer> <imgsrc="zdrowia.png"alt="Życzymy zdrowia!"></body></html>
Podgląd strony po tym kroku (zdrowie.php)
Etap 5: Dobre praktyki (poza kluczem)
Kroki 48-50 · po tym etapie masz 39 z 39 kryteriów (pkt)
Krok 48: Identyfikator z formularza: liczba i zapytanie przygotowane
ok. 4 min
Polecenie z arkusza
Wysyła do bazy danych zmodyfikowane zapytanie 3 w ten sposób, że w warunku podany jest identyfikator wysłany przez formularz
Lista podsuwa tylko identyfikatory 1 - 16, ale żądanie POST można wysłać z dowolną treścią. Sprawdzone na tej bazie: wartość 5 OR 1=1 zamienia warunek wersji egzaminacyjnej w „zawsze prawdę” i blok wypisuje 74 objawy - wszystkie powiązania z tabeli pośredniczącej. Rzutowanie (int) robi z wartości liczbę (zostaje 5), a zapytanie przygotowane (mysqli_prepare, znak ?, mysqli_stmt_bind_param z typem "i") w ogóle nie skleja SQL z danymi. Wynik odbiera mysqli_stmt_get_result, więc pętla z mysqli_fetch_row zostaje bez zmian. Stara wersja zostaje w komentarzu. Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.
zdrowie.phpPHPzmienione: 10 linii
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Wykaz chorób</title> <linkrel="stylesheet"href="styl.css"></head><body> <header> <h1>Informacja o chorobach w Polsce</h1> </header> <nav> <ahref="https://szpitale.pl/"target="_blank">Szpitale</a> <ahref="https://www.przychodnie.pl/"target="_blank">Przychodnie</a> <ahref="https://www.nfz.gov.pl/"target="_blank">NFZ</a> </nav> <main> <sectionid="left"> <h2>Choroby zakaźne</h2> <ol><?php$connection = mysqli_connect("localhost", "root", "", "choroby");$query = "SELECT nazwa FROM choroby WHERE zakazna = 'T' ORDER BY nazwa;";$result = mysqli_query($connection, $query);while ($row = mysqli_fetch_row($result)) {echo"<li>$row[0]</li>"; }?> </ol> </section> <sectionid="right"> <h2>Objawy chorób</h2> <formmethod="post"> <selectname="disease"><?php$query = "SELECT id, nazwa FROM choroby;";$result = mysqli_query($connection, $query);while ($row = mysqli_fetch_row($result)) {echo"<option value=\"$row[0]\">$row[1]</option>"; }?> </select> <buttontype="submit">Sprawdź</button> </form> <divid="symptoms"><?phpif (isset($_POST["disease"])) {$disease = (int) $_POST["disease"];$statement = mysqli_prepare($connection, "SELECT objawy.nazwa FROM objawy JOIN choroby_objawy ON objawy.id = choroby_objawy.id_objawy WHERE choroby_objawy.id_choroby = ?"); mysqli_stmt_bind_param($statement, "i", $disease); mysqli_stmt_execute($statement);$result = mysqli_stmt_get_result($statement);while ($row = mysqli_fetch_row($result)) {echo"<span> $row[0] </span>"; } } mysqli_close($connection);/* Wersja z egzaminu: $disease = $_POST["disease"]; $query = "SELECT objawy.nazwa FROM objawy JOIN choroby_objawy ON objawy.id = choroby_objawy.id_objawy WHERE choroby_objawy.id_choroby = $disease;"; $result = mysqli_query($connection, $query); */?> </div> </section> </main> <footer> <p>Stronę opracował: Bartosz Bryniarski</p> </footer> <imgsrc="zdrowia.png"alt="Życzymy zdrowia!"></body></html>
Każdym zwróconym rekordem wypełnia opcje listy w ten sposób, że identyfikator jest przypisany do atrybutu wartości opcji, a nazwa jest treścią opcji
W wersji z egzaminu po kliknięciu „Sprawdź” strona ładuje się od nowa i lista wraca do pierwszej pozycji: pod nią stoją objawy COVID-19, a na liście „angina” - użytkownik nie wie, czego dotyczy wynik. Na ilustracji 6 lista pokazuje „COVID-19”; żeby tak było naprawdę, opcja z identyfikatorem równym wysłanemu dostaje atrybut selected. Przy okazji mysqli_fetch_assoc (pola po nazwach kolumn) i htmlspecialchars dla nazwy z bazy. Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.
zdrowie.phpPHPzmienione: 5 linii
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Wykaz chorób</title> <linkrel="stylesheet"href="styl.css"></head><body> <header> <h1>Informacja o chorobach w Polsce</h1> </header> <nav> <ahref="https://szpitale.pl/"target="_blank">Szpitale</a> <ahref="https://www.przychodnie.pl/"target="_blank">Przychodnie</a> <ahref="https://www.nfz.gov.pl/"target="_blank">NFZ</a> </nav> <main> <sectionid="left"> <h2>Choroby zakaźne</h2> <ol><?php$connection = mysqli_connect("localhost", "root", "", "choroby");$query = "SELECT nazwa FROM choroby WHERE zakazna = 'T' ORDER BY nazwa;";$result = mysqli_query($connection, $query);while ($row = mysqli_fetch_row($result)) {echo"<li>$row[0]</li>"; }?> </ol> </section> <sectionid="right"> <h2>Objawy chorób</h2> <formmethod="post"> <selectname="disease"><?php$query = "SELECT id, nazwa FROM choroby;";$result = mysqli_query($connection, $query);$chosen = (int) ($_POST["disease"] ?? 0);while ($diseaseRow = mysqli_fetch_assoc($result)) {$selected = ($diseaseRow["id"] == $chosen) ? " selected" : "";echo"<option value=\"" . $diseaseRow["id"] . "\"$selected>" . htmlspecialchars($diseaseRow["nazwa"]) . "</option>"; }// while ($row = mysqli_fetch_row($result)) { echo "<option value=\"$row[0]\">$row[1]</option>"; }?> </select> <buttontype="submit">Sprawdź</button> </form> <divid="symptoms"><?phpif (isset($_POST["disease"])) {$disease = (int) $_POST["disease"];$statement = mysqli_prepare($connection, "SELECT objawy.nazwa FROM objawy JOIN choroby_objawy ON objawy.id = choroby_objawy.id_objawy WHERE choroby_objawy.id_choroby = ?"); mysqli_stmt_bind_param($statement, "i", $disease); mysqli_stmt_execute($statement);$result = mysqli_stmt_get_result($statement);while ($row = mysqli_fetch_row($result)) {echo"<span> $row[0] </span>"; } } mysqli_close($connection);/* Wersja z egzaminu: $disease = $_POST["disease"]; $query = "SELECT objawy.nazwa FROM objawy JOIN choroby_objawy ON objawy.id = choroby_objawy.id_objawy WHERE choroby_objawy.id_choroby = $disease;"; $result = mysqli_query($connection, $query); */?> </div> </section> </main> <footer> <p>Stronę opracował: Bartosz Bryniarski</p> </footer> <imgsrc="zdrowia.png"alt="Życzymy zdrowia!"></body></html>
Podgląd strony po tym kroku (zdrowie.php)
Krok 50: Komunikat dla choroby bez objawów
ok. 2 min
Polecenie z arkusza
Każdy zwrócony zapytaniem objaw choroby zapisuje w znaczniku span w ten sposób, że przed i po objawie jest spacja
Baza z arkusza ma dwie choroby bez ani jednego objawu: nosówkę (13) i „Kavasaki” (16). Wersja z egzaminu zostawia wtedy pusty kropkowany prostokąt i nie wiadomo, czy strona zadziałała. mysqli_num_rows (też z tabeli 1 arkusza) mówi, ile wierszy zwróciło zapytanie - przy zerze wypisujesz komunikat. Akapit stoi tylko wtedy, gdy spanów nie ma, więc numeracja :nth-child się nie przesuwa. Podgląd pokazuje stan po wybraniu nosówki. Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.
zdrowie.phpPHPzmienione: 4 linie
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Wykaz chorób</title> <linkrel="stylesheet"href="styl.css"></head><body> <header> <h1>Informacja o chorobach w Polsce</h1> </header> <nav> <ahref="https://szpitale.pl/"target="_blank">Szpitale</a> <ahref="https://www.przychodnie.pl/"target="_blank">Przychodnie</a> <ahref="https://www.nfz.gov.pl/"target="_blank">NFZ</a> </nav> <main> <sectionid="left"> <h2>Choroby zakaźne</h2> <ol><?php$connection = mysqli_connect("localhost", "root", "", "choroby");$query = "SELECT nazwa FROM choroby WHERE zakazna = 'T' ORDER BY nazwa;";$result = mysqli_query($connection, $query);while ($row = mysqli_fetch_row($result)) {echo"<li>$row[0]</li>"; }?> </ol> </section> <sectionid="right"> <h2>Objawy chorób</h2> <formmethod="post"> <selectname="disease"><?php$query = "SELECT id, nazwa FROM choroby;";$result = mysqli_query($connection, $query);$chosen = (int) ($_POST["disease"] ?? 0);while ($diseaseRow = mysqli_fetch_assoc($result)) {$selected = ($diseaseRow["id"] == $chosen) ? " selected" : "";echo"<option value=\"" . $diseaseRow["id"] . "\"$selected>" . htmlspecialchars($diseaseRow["nazwa"]) . "</option>"; }// while ($row = mysqli_fetch_row($result)) { echo "<option value=\"$row[0]\">$row[1]</option>"; }?> </select> <buttontype="submit">Sprawdź</button> </form> <divid="symptoms"><?phpif (isset($_POST["disease"])) {$disease = (int) $_POST["disease"];$statement = mysqli_prepare($connection, "SELECT objawy.nazwa FROM objawy JOIN choroby_objawy ON objawy.id = choroby_objawy.id_objawy WHERE choroby_objawy.id_choroby = ?"); mysqli_stmt_bind_param($statement, "i", $disease); mysqli_stmt_execute($statement);$result = mysqli_stmt_get_result($statement);if (mysqli_num_rows($result) == 0) {echo"<p>W bazie nie ma objawów tej choroby.</p>"; }while ($row = mysqli_fetch_row($result)) {echo"<span> " . htmlspecialchars($row[0]) . " </span>"; } } mysqli_close($connection);/* Wersja z egzaminu: $disease = $_POST["disease"]; $query = "SELECT objawy.nazwa FROM objawy JOIN choroby_objawy ON objawy.id = choroby_objawy.id_objawy WHERE choroby_objawy.id_choroby = $disease;"; $result = mysqli_query($connection, $query); */?> </div> </section> </main> <footer> <p>Stronę opracował: Bartosz Bryniarski</p> </footer> <imgsrc="zdrowia.png"alt="Życzymy zdrowia!"></body></html>
Podgląd strony po tym kroku (zdrowie.php)
Etap 6: Oddanie pracy
Krok 51 · po tym etapie masz 39 z 39 kryteriów (pkt)
Krok 51: 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 weryfikowana była poprawność działania witryny. Umieść go w folderze z numerem zdającego. Nagraj płytę z rezultatami pracy.
W przeglądarka.txt wpisujesz nazwę przeglądarki, w której sprawdzasz stronę.
W folderze z numerem zdającego: import.png, kw1.png - kw4.png, kwerendy.txt, przeglądarka.txt, styl.css, zdrowia.png, zdrowie.php. 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.