INF.03-09-25.01-SGStyczeń 2025 · 30 kroków · ok. 67 min · 40 kryteriów z klucza
Rozwiązanie krok po kroku: Portal zdobywców gór (Wersja podstawowa)
Rozwiązanie buduje portal koła zdobywców gór polskich: baza zdobywcy z górami, osobami i osiągnięciami oraz cztery zapytania - sortowanie malejące z limitem, wybór kolumn i dwa wstawienia rekordówINSERT z kluczem nadawanym automatycznie, potem logo z przezroczystym tłem i napisem na mapie, strona zdobywcy.php z nawigacją do zrzutów, formularzem zapisu do koła i tabelą członków oraz style w styles.css. Dwa skrypty PHP: jeden dopisuje do bazy osobę z formularza, drugi wypisuje wszystkie osoby w tabeli.
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 (mysqli_query, mysqli_fetch_row), a na końcu zostają przerobione na wersję z prawdziwych projektów: zapytanie przygotowane, sprawdzenie e-maila i funkcji oraz przekierowanie po zapisie, które chroni przed podwójnym dopisaniem przy odświeżeniu strony.
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 i PHP na PDO z zapytaniem przygotowanym, walidacją i przekierowaniem po zapisie od pierwszej linii - obie wersje są zgodne z kluczem.
Baza i logo pochodzą z prawdziwego archiwum pliki4 (załącznik do arkusza, hasło w treści zadania). Zapytania i zrzuty są policzone na MariaDB 10.4 - tej samej, która jest w XAMPP. Podgląd strony to wynik prawdziwego uruchomienia kodu z danego kroku w PHP 8.2, na świeżo zaimportowanej bazie; od kroku z zapisem - po wysłaniu formularza z danymi M., Miłosz, uczestnik, jak w ostatnim wierszu tabeli na ilustracji 2.
Jak liczą się punkty. Klucz ma 40 kryteriów (R.1.1 - R.5.8), każde za 1 punkt. Próg zdania części praktycznej to 75%, czyli 30 punktów - można stracić 10 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 40 kryteriów (pkt)
Krok 1: Baza danych zdobywcy
Kryteria:
R.1.1 Wykonany import tabeli do bazy danych zdobywcy , co jest udokumentowane w pliku import.png
ok. 2 min
Polecenie z arkusza
Utwórz bazę danych o nazwie zdobywcy, z zestawem polskich znaków (np. utf8_unicode_ci).
Rozpakuj pliki4.7z z pulpitu (hasło $ZdobyWcy&) do folderu z numerem zdającego: baza.sql i logo.jpg. W phpMyAdmin: Nowa, nazwa zdobywcy, porównywanie np. utf8_unicode_ci.
Krok 2: Import tabel z pliku baza.sql
Kryteria:
R.1.1 Wykonany import tabeli do bazy danych zdobywcy , co jest udokumentowane w pliku import.png
ok. 2 min
Polecenie z arkusza
Z rozpakowanego archiwum zaimportuj tabele z pliku baza.sql do utworzonej bazy.
Import → baza.sql. Trzy tabele z ilustracji 1: gory (309 szczytów z pasmem i wysokością), osoby (15 członków koła) i osiagniecia (kto i kiedy zdobył który szczyt - pola gora_id i osoba_id).
Krok 3: Zrzut ekranu import.png
Kryteria:
R.1.1 Wykonany import tabeli do bazy danych zdobywcy , co jest udokumentowane w pliku 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 i zapis jako import.png.
Typowe błędy
Wykadrowany zrzut albo zrzut bez paska zadań nie jest oceniany (uwaga w kluczu przy R.1).
R.1.2 Zapisany plik kwerendy.txt zawierający co najmniej jedno zapytanie SQL, wynikające z treści zadania
R.1.3 Wykonane zapytanie 1 wybierające jedynie pasmo, nazwę góry i jej wysokość z tabeli gory i wyświetlające pierwszych 10 rekordów posortowanych malejąco według wysokości. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT pasmo, nazwa_gory, wysokosc FROM gory ORDER BY wysokosc DESC LIMIT 10; oraz wynik działania zapytania jest udokumentowany zrzutem, na którym widocznych jest dokładnie 10 rekordów zawierających jedynie pola pasmo, nazwa_gory, wysokosc
ok. 2 min
Polecenie z arkusza
Zapytanie 1: wybierające jedynie pasmo, nazwę góry i jej wysokość z tabeli gory i wyświetlające pierwszych 10 rekordów posortowanych malejąco według wysokości.
ORDER BY wysokosc DESC - malejąco, od najwyższego; LIMIT 10 - dziesięć pierwszych wierszy po sortowaniu. Wynik zaczyna się od Rysów (2499 m) i Mięguszowieckiego Szczytu. Zapytanie do kwerendy.txt, zrzut kw1.png.
kwerendy.txtTekstnowy plik
-- Zapytanie 1SELECT pasmo, nazwa_gory, wysokosc FROM gory ORDER BY wysokosc DESC LIMIT 10;
Podgląd strony po tym kroku
Krok 5: Zapytanie 2: członkowie koła
Kryteria:
R.1.4 Wykonane zapytanie 2 wybierające jedynie nazwisko, imię, funkcję i email z tabeli osoby . W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT nazwisko, imie, funkcja, email FROM osoby; oraz wynik działania zapytania jest udokumentowany zrzutem, na którym widocznych jest 15 rekordów lub więcej (zależnie od wywołania zapytania 4) zawierających jedynie pola nazwisko, imie, funkcja, email
ok. 1 min
Polecenie z arkusza
Zapytanie 2: wybierające jedynie nazwisko, imię, funkcję i email z tabeli osoby.
Cztery kolumny, bez klucza id_osoby. Wynik: 15 osób (16, jeśli wcześniej wykonano zapytanie 4 - klucz to uwzględnia). Zrzut: kw2.png. To zapytanie wypełni tabelę na stronie.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT pasmo, nazwa_gory, wysokosc FROM gory ORDER BY wysokosc DESC LIMIT 10;-- Zapytanie 2SELECT nazwisko, imie, funkcja, email FROM osoby;
Podgląd strony po tym kroku
Krok 6: Zapytanie 3: nowe osiągnięcie
Kryteria:
R.1.5 Wykonane zapytanie 3 wstawiające osiągnięcie w postaci zdobycia góry „Łysica - Skała Agaty” przez uczestnika B. Urszula w dniu 2024-06-08. W pliku z kwerendami lub na zrzucie istnieje zapis np.: INSERT INTO osiagniecia VALUES (NULL, 182, 4, "2024-06-08"); (lub inne formy zapytania, wartość klucza pominięta lub NULL) oraz wynik działania zapytania jest udokumentowany zrzutem, na którym widoczny jest komunikat potwierdzający wykonanie zapytania lub tabela z dodanym rekordem
ok. 2 min
Polecenie z arkusza
Zapytanie 3: wstawiające osiągnięcie w postaci zdobycia góry „Łysica - Skała Agaty” (id=182) przez uczestnika B. Urszula (id=4) w dniu 2024-06-08, klucz główny uzyskiwany automatycznie.
Wartości w kolejności kolumn tabeli osiagniecia: klucz NULL (nada go baza), gora_id = 182, osoba_id = 4, data. Do osiągnięcia wpisujesz identyfikatory, nie nazwy - nazwę góry i osoby baza zna z pozostałych tabel. Nowy rekord dostaje id 12. Zrzut: kw3.png (tu: wstawiony rekord złączony z nazwą góry i osobą, żeby było widać, że to właściwe dane).
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT pasmo, nazwa_gory, wysokosc FROM gory ORDER BY wysokosc DESC LIMIT 10;-- Zapytanie 2SELECT nazwisko, imie, funkcja, email FROM osoby;-- Zapytanie 3INSERT INTO osiagniecia VALUES (NULL, 182, 4, "2024-06-08");
Podgląd strony po tym kroku
Krok 7: Zapytanie 4: nowa osoba
Kryteria:
R.1.6 Wykonane zapytanie 4 wstawiające nową osobę o danych: klucz główny uzyskiwany automatycznie, M., Miłosz, uczestnik, [email protected] do tabeli osoby. W pliku z kwerendami lub na zrzucie istnieje zapis np.: INSERT INTO osoby VALUES (NULL, 'M.', 'Miłosz', 'uczestnik', '[email protected]'); (lub inne formy zapytania, wartość klucza pominięta lub NULL) oraz wynik działania zapytania jest udokumentowany zrzutem, na którym widoczny jest komunikat potwierdzający wykonanie zapytania lub tabela z dodanym rekordem
ok. 2 min
Polecenie z arkusza
Zapytanie 4: wstawiające nową osobę: M., Miłosz, uczestnik, [email protected] do tabeli osoby, klucz główny uzyskiwany automatycznie.
To samo dla tabeli osoby: NULL w miejscu klucza i cztery napisy w apostrofach. Nowa osoba dostaje id 16. Zrzut: kw4.png. To zapytanie - z danymi z formularza zamiast stałych - wyśle Skrypt 2.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT pasmo, nazwa_gory, wysokosc FROM gory ORDER BY wysokosc DESC LIMIT 10;-- Zapytanie 2SELECT nazwisko, imie, funkcja, email FROM osoby;-- Zapytanie 3INSERT INTO osiagniecia VALUES (NULL, 182, 4, "2024-06-08");-- Zapytanie 4INSERT INTO osoby VALUES (NULL, 'M.', 'Miłosz', 'uczestnik', '[email protected]');
Podgląd strony po tym kroku
Etap 2: Grafika i strona HTML
Kroki 8-19 · po tym etapie masz 20 z 40 kryteriów (pkt)
Krok 8: Logo: przezroczyste tło, napis, 600 px
Kryteria: ,
R.2.1 Grafika logo.png ma przezroczyste tło oraz jest przeskalowana do szerokości 600 px, odpowiadająca temu wysokość to 500 px (± 5 px)
R.2.2 Grafika zawiera tekst o treści „ZDOBYWCY GÓR” zapisany czcionką szeryfową w kolorze zielonym. Tekst nie wychodzi poza obszar mapy
ok. 6 min
Polecenie z arkusza
Cechy grafiki: Nazwa pliku logo.png, grafika wykonana na podstawie pliku logo.jpg. Tło przezroczyste. Umieszczony na środku mapy tekst o treści „ZDOBYWCY GÓR” zapisany czcionką szeryfową, w kolorze zielonym. Tekst nie może wychodzić poza obszar mapy. Przeskalowana z zachowaniem proporcji do szerokości 600 px.
W GIMP-ie:
Warstwa → Przezroczystość → Dodaj kanał alfa, narzędzie Różdżka (zaznaczanie ciągłe) na białym tle i Delete - różdżka zaznacza tylko biel połączoną z klikniętym miejscem, więc śnieg na szczytach zostaje,
narzędzie Tekst: „ZDOBYWCY GÓR” w dwóch wierszach, czcionka szeryfowa (np. Times New Roman Bold), kolor zielony; tekst ustawiasz na środku zwoju mapy, w całości na mapie,
Obraz → Skaluj obraz: szerokość 600 z zamkniętym łańcuchem - wysokość wychodzi 500 px (583 × 600 / 700), jak w kluczu,
Eksportuj jakologo.png (R.2.1, R.2.2).
Typowe błędy
Kolor na alfę z białym zamienia też śnieg na szczytach w przezroczystość - na tle strony góry zrobią się „dziurawe”.
Podgląd strony po tym kroku
Krok 9: Plik zdobywcy.php w HTML5
Kryteria:
R.2.3 Witryna internetowa zapisana w pliku zdobywcy.php oraz jest zapisany jawnie standard kodowania polskich znaków, deklaracja HTML5 <!DOCTYPE HTML>, jest zadeklarowany język witryny: polski np. <html lang="pl"> oraz nadany tytuł stronie "ZDOBYWCY GÓR”. Strona zawiera sekcje head i body
ok. 1 min
Polecenie z arkusza
Cechy witryny: Składa się ze strony o nazwie zdobywcy.php. Zapisana w języku HTML5.
Jedna strona, zdobywcy.php. Bez PHP podgląd pokazuje ją wprost.
R.2.3 Witryna internetowa zapisana w pliku zdobywcy.php oraz jest zapisany jawnie standard kodowania polskich znaków, deklaracja HTML5 <!DOCTYPE HTML>, jest zadeklarowany język witryny: polski np. <html lang="pl"> oraz nadany tytuł stronie "ZDOBYWCY GÓR”. Strona zawiera sekcje head i body
R.2.3 Witryna internetowa zapisana w pliku zdobywcy.php oraz jest zapisany jawnie standard kodowania polskich znaków, deklaracja HTML5 <!DOCTYPE HTML>, jest zadeklarowany język witryny: polski np. <html lang="pl"> oraz nadany tytuł stronie "ZDOBYWCY GÓR”. Strona zawiera sekcje head i body
ok. 1 min
Polecenie z arkusza
Jawnie zastosowany właściwy standard kodowania polskich znaków. Tytuł strony „ZDOBYWCY GÓR” widoczny na karcie przeglądarki.
R.3.2 Strona zawiera działające połączenie z zewnętrznym arkuszem stylów o nazwie styles.css formatowanie CSS pochodzi jedynie z tego arkusza. Uwaga: kryterium to nie jest spełnione również, gdy zdający źle przypisał co najmniej jeden selektor do bloku (np. kropka zamiast #)
ok. 1 min
Polecenie z arkusza
Arkusz stylów w pliku o nazwie styles.css prawidłowo połączony z kodem strony.
Uwaga na nazwę: styles.css - z „s” na końcu.
Typowe błędy
style.css albo styl.css (jak w innych arkuszach) odcina wszystkie style.
R.2.4 Zdefiniowany układ strony dzielący ją na bloki: nagłówkowy, nawigacji, lewy, prawy i stopki przy pomocy semantycznych znaczników sekcji języka HTML5 zgodnie z ich znaczeniem, w tym do części nagłówkowej - header, do stopki - footer. Dopuszcza się dodatkowe użycie bloków div lub section
ok. 1 min
Polecenie z arkusza
Podział strony na blok nagłówkowy, poniżej blok nawigacji, poniżej obok siebie bloki lewy i prawy, na dole blok stopki. Podział zrealizowany za pomocą semantycznych znaczników sekcji języka HTML5 tak, aby po uruchomieniu w przeglądarce wygląd układu bloków był zgodny z ilustracją 2.
<header>, <nav>, dwie <section> (left, right) i <footer> (R.2.4).
R.2.5 Umieszczony w bloku nagłówkowym nagłówek <h1>: „Klub zdobywców gór polskich”, w bloku lewym <h3>: „razem z nami:", w bloku prawym <h2>: „Dołącz do naszego zespołu!” oraz przynajmniej jeden paragraf
ok. 1 min
Polecenie z arkusza
Zawartość bloku nagłówkowego: nagłówek pierwszego stopnia o treści: „Klub zdobywców gór polskich”.
R.3.3 Utworzone 4 odnośniki nazwane: kwerenda1, kwerenda2, kwerenda3, kwerenda4. Po wybraniu przynajmniej jednego odnośnika otwiera/pobiera się plik graficzny
ok. 2 min
Polecenie z arkusza
Zawartość bloku nawigacji: odnośniki do plików zawierających zrzuty ekranu wykonanych kwerend z treścią: kwerenda1, kwerenda2, kwerenda3, kwerenda4.
Odnośnik może prowadzić do dowolnego pliku, także obrazu - kliknięcie otworzy zrzut w przeglądarce. Zrzuty kw1.png - kw4.png leżą w tym samym folderze, więc wystarczy sama nazwa (R.3.3). W podglądzie kliknięcia są zablokowane.
R.2.5 Umieszczony w bloku nagłówkowym nagłówek <h1>: „Klub zdobywców gór polskich”, w bloku lewym <h3>: „razem z nami:", w bloku prawym <h2>: „Dołącz do naszego zespołu!” oraz przynajmniej jeden paragraf
R.2.6 W bloku lewym umieszczona grafika z logiem z tekstem alternatywnym "logo zdobywcy"
R.2.7 W bloku lewym umieszczona jedna lista punktowana z pięcioma elementami, zastosowane znaczniki <ul>, <li>
ok. 2 min
Polecenie z arkusza
Zawartość bloku lewego: Grafika logo.png z tekstem alternatywnym o treści: „logo zdobywcy”. Nagłówek trzeciego stopnia o treści: „razem z nami:”. Lista punktowana (nieuporządkowana) zawierająca elementy: „wyjazdy”, „szkolenia”, „rekreacja”, „wypoczynek”, „wyzwania”.
Obraz, <h3> i <ul> z pięcioma <li> (R.2.5, R.2.6, R.2.7).
R.2.5 Umieszczony w bloku nagłówkowym nagłówek <h1>: „Klub zdobywców gór polskich”, w bloku lewym <h3>: „razem z nami:", w bloku prawym <h2>: „Dołącz do naszego zespołu!” oraz przynajmniej jeden paragraf
R.2.10 W bloku prawym umieszczony formularz z trzema polami edycyjnymi, polem listy rozwijalnej i przyciskiem oraz przynajmniej z jednym polem powiązana etykieta <label>
R.3.4 Formularz wysyła dane metodą POST do tego samego pliku (poprawne również bez atrybutu action)
R.3.5 Przycisk realizuje funkcję wysłania danych z formularza (input lub button z typem submit lub button bez typu)
R.3.6 Pole do wpisywania adresu email jest typu email np. <input type="email">
ok. 4 min
Polecenie z arkusza
Zawartość bloku prawego: Nagłówek drugiego stopnia o treści: „Dołącz do naszego zespołu!”. Paragraf zawierający tekst „Wpisz swoje dane do formularza:”. Formularz wysyłający dane do tego samego pliku metodą bezpieczną, zawierający: pole edycyjne poprzedzone etykietą „Nazwisko: ”, pole edycyjne poprzedzone etykietą „Imię: ”, pole listy rozwijanej poprzedzone etykietą „Funkcja: ”, o elementach: „uczestnik”, „przewodnik”, „zaopatrzeniowiec”, „organizator”, „ratownik”, pole edycyjne przeznaczone do wpisywania adresu email, poprzedzone etykietą „Email: ”, przycisk „Dodaj” wysyłający dane z formularza do skryptu 2.
method="post" bez action - dane wracają do zdobywcy.php (R.3.4); „metoda bezpieczna” w rozumieniu arkusza to POST (tak ocenia klucz R.3.4) - dane idą w treści żądania, a nie w adresie strony. W specyfikacji HTTP „bezpieczne” są co prawda metody, które niczego nie zmieniają na serwerze (GET i HEAD), ale punkt daje method="post",
trzy pola tekstowe z etykietami powiązanymi przez for/id; nazwy name (surname, name, role, email) to klucze, pod którymi Skrypt 2 znajdzie dane w $_POST,
type="email" - przeglądarka sprawdzi format adresu przed wysłaniem (R.3.6),
lista funkcji to <select> z pięcioma opcjami; przycisk type="submit" (R.3.5).
R.2.5 Umieszczony w bloku nagłówkowym nagłówek <h1>: „Klub zdobywców gór polskich”, w bloku lewym <h3>: „razem z nami:", w bloku prawym <h2>: „Dołącz do naszego zespołu!” oraz przynajmniej jeden paragraf
ok. 1 min
Polecenie z arkusza
Zawartość stopki: paragraf „Stronę wykonał: ”, dalej wstawiony numer zdającego.
Na egzaminie po dwukropku wpisujesz swój numer zdającego (PESEL).
Kroki 20-25 · po tym etapie masz 31 z 40 kryteriów (pkt)
Krok 20: Plik styles.css: ciało strony i lista
Kryteria: ,
R.4.1 Ustawione dla selektora body: kolor tła # DDEEDD, krój czcionki Tahoma, wyrównanie tekstu do środka
R.4.7 Ustawione dla selektora ul typ punktora kwadrat oraz dla selektora li wyrównanie tekstu do lewej
ok. 2 min
Polecenie z arkusza
Dla selektora ciała strony: kolor tła #DDEEDD, krój czcionki Tahoma, wyrównanie tekstu do środka. Dla selektora listy punktowanej: typ punktora kwadrat. Dla selektora elementu listy: wyrównanie tekstu do lewej.
Punktor kwadrat to square. Strona jest wyśrodkowana, ale elementy listy - jak na ilustracji 2 - przy lewej krawędzi (R.4.1, R.4.7).
styles.cssCSSnowy plik
body {background-color: #DDEEDD;font-family: Tahoma;text-align: center;}ul {list-style-type: square;}li {text-align: left;}
R.4.3 Ustawiony kolor czcionki: biały dla bloku nagłówkowego i stopki oraz #009900 dla selektora a
R.4.6 Ustawione marginesy wewnętrzne (padding) dla bloku nagłówkowego, nawigacji i stopki 10px oraz ustawione dla tabeli margin-top: 20px; lub margin: auto;
R.4.10 Ustawiony rozmiar czcionki 120% dla bloku nagłówkowego i stopki
ok. 2 min
Polecenie z arkusza
Wspólne dla bloku nagłówkowego i stopki: biały kolor czcionki, rozmiar czcionki 120%, marginesy wewnętrzne 10 px. Dodatkowo dla bloku nagłówkowego: kolor tła #409FFF. Dodatkowo dla stopki: kolor tła #A0A0A0.
Wspólne cechy w jednej regule, kolory tła osobno (R.4.2, R.4.3, R.4.6, R.4.10).
R.4.3 Ustawiony kolor czcionki: biały dla bloku nagłówkowego i stopki oraz #009900 dla selektora a
R.4.6 Ustawione marginesy wewnętrzne (padding) dla bloku nagłówkowego, nawigacji i stopki 10px oraz ustawione dla tabeli margin-top: 20px; lub margin: auto;
R.4.8 Ustawione dla bloku nawigacji odstępy między wyrazami 30px
ok. 2 min
Polecenie z arkusza
Dla bloku nawigacji: kolor tła #FFFFFF, odstępy między wyrazami 30 px, marginesy wewnętrzne 10 px. Dla selektora odnośnika: kolor czcionki #009900.
word-spacing powiększa odstęp między wyrazami - każdy odnośnik to jedno słowo, więc rozsuwają się o 30 px (R.4.2, R.4.3, R.4.6, R.4.8).
R.4.4 Ustawiona wysokość bloku lewego i prawego 650px oraz szerokość bloku lewego 30%, bloku prawego 70% (width lub grid-template-columns lub flex), selektora img 90%
R.4.5 Ustawione paski przewijania na wartość auto dla bloku prawego
ok. 2 min
Polecenie z arkusza
Dla bloku lewego: kolor tła #E4C0A8, szerokość 30%, wysokość 650 px. Dla bloku prawego: szerokość 70%, wysokość 650 px, paski przewijania widoczne tylko gdy tekst nie mieści się w bloku. Dla selektora obrazu: szerokość 90%.
overflow: auto - pasek tylko przy dłuższej treści (R.4.2, R.4.4, R.4.5).
R.4.6 Ustawione marginesy wewnętrzne (padding) dla bloku nagłówkowego, nawigacji i stopki 10px oraz ustawione dla tabeli margin-top: 20px; lub margin: auto;
R.4.9 Ustawione dla tabeli i komórek tabeli obramowanie 1px solid black
ok. 2 min
Polecenie z arkusza
Wspólne dla tabeli i wszystkich komórek tabeli: obramowanie ciągłe koloru czarnego o grubości 1 px. Dodatkowo dla tabeli: margines zewnętrzny górny 20 px, marginesy zewnętrzne automatycznie wyliczane przez przeglądarkę.
„Wszystkich komórek” - th i td. margin: auto wyśrodkowuje tabelę, a następna linia margin-top: 20px nadpisuje tylko margines górny - kolejność ma znaczenie (R.4.6, R.4.9).
Typowe błędy
Odwrotna kolejność (margin-top: 20px; przed margin: auto;) - skrót margin nadpisze górny margines na auto, czyli 0.
R.3.1 Układ bloków po uruchomieniu strony w przeglądarce jest zgodny z ilustracją 2 w arkuszu egzaminacyjnym (prawidłowo zastosowane właściwości CSS decydujące o układzie strony, np. float i clear albo display flex albo grid albo position )
ok. 1 min
Polecenie z arkusza
Poniżej obok siebie bloki lewy i prawy, na dole blok stopki. Podział zrealizowany tak, aby po uruchomieniu w przeglądarce wygląd układu bloków był zgodny z ilustracją 2.
float: left dla sekcji, clear: both dla stopki (R.3.1).
Kroki 26-28 · po tym etapie masz 40 z 40 kryteriów (pkt)
Krok 26: Połączenie przed tabelą, zamknięcie w tabeli
Kryteria: , ,
R.5.1 Skrypt jest napisany w języku PHP i zawiera przynajmniej jedną zgodną z treścią zadania instrukcję
R.5.2 Skrypt realizuje połączenie z serwerem bazy danych i wybór bazy zdobywcy
R.5.3 Ostatnią operacją na bazie jest jej zamknięcie
ok. 3 min
Polecenie z arkusza
Łączą się z serwerem bazodanowym na localhost, użytkownik root bez hasła, baza danych o nazwie zdobywcy. Na końcu jest zamykane połączenie z serwerem.
Oba skrypty stoją w bloku prawym. Połączenie otwierasz w bloku PHP pod formularzem, bo tam stanie Skrypt 2 - dopisanie osoby musi się wykonać przed wypisaniem tabeli, żeby nowa osoba była od razu w tabeli. Zamknięcie (mysqli_close) stawiasz w bloku PHP wewnątrz tabeli, gdzie stanie Skrypt 1 - to ostatnia operacja na bazie (R.5.1, R.5.2, R.5.3). Zmienna $connection z pierwszego bloku jest dostępna w drugim - to ten sam plik PHP.
R.2.8 W bloku prawym umieszczona tabela o 4 kolumnach (w skrypcie lub HTML) zastosowane znaczniki <table>, <tr>, <td>
R.5.4 Skrypt 1 zawiera instrukcję wysyłającą do bazy danych zapytanie 2
R.5.5 Skrypt 1 wyświetla w wierszach tabeli dane zwrócone zapytaniem, dane są wpisane do odpowiednich pól tabeli
ok. 3 min
Polecenie z arkusza
Skrypt 1: wysyła do bazy danych zapytanie 2. W każdym wierszu tabeli, w odpowiednich komórkach, wyświetlane są zwrócone zapytaniem kolejne wiersze z bazy.
Zapytanie 2, pętla while z mysqli_fetch_row i dla każdej osoby wiersz <tr> z czterema komórkami w kolejności kolumn z SELECT. Podgląd: 15 członków koła (R.2.8, R.5.4, R.5.5).
R.5.6 Skrypt 2 wysyła do bazy danych zmodyfikowane zapytanie 4, w ten sposób, że dane do zapytania są pobrane z formularza (sprawdzić w phpMyAdmin )
R.5.7 Skrypt 2 zawiera instrukcję pobierającą dane z tablicy globalnej odpowiadającej zastosowanej metodzie formularza ($_POST, $_GET, $_REQUEST) oraz jest zabezpieczony na wypadek braku danych w formularzu (wystarczy, że jest sprawdzone dla jednego pola)
R.5.8 W skryptach zastosowana przynajmniej jedna zmienna lub funkcja oraz nazwy wszystkich funkcji i zmiennych są w języku polskim lub angielskim i odzwierciedlają cel zastosowania
ok. 4 min
Polecenie z arkusza
Skrypt 2 wysyła do bazy danych zmodyfikowane zapytanie 4, w ten sposób, że dane do zapytania są pobrane z formularza. Zapytanie jest wysyłane tylko wtedy, gdy podano dane w formularzu.
!empty dla nazwiska, imienia i e-maila - przy pierwszym wejściu na stronę i przy pustych polach nic się nie dopisuje (klucz: „zabezpieczony na wypadek braku danych”, wystarczy jedno pole) (R.5.7). Wartości z $_POST wstawiasz do zapytania 4 zamiast stałych. INSERT niczego nie zwraca do wypisania, więc wynik mysqli_query nie jest potrzebny. Podgląd pokazuje stan po wysłaniu formularza z danymi M., Miłosz, uczestnik - nowy, szesnasty wiersz na końcu tabeli, jak na ilustracji 2 (R.5.6, R.5.8).
Typowe błędy
Skrypt 2 postawiony pod tabelą dopisze osobę dopiero po wypisaniu tabeli - nowy wiersz pojawi się dopiero przy następnym wejściu na stronę.
Nazwisko z apostrofem (np. O'Neill) zamyka napis w zapytaniu: 'O'Neill' to dla bazy błąd składni SQL i w PHP 8 strona kończy się błędem krytycznym mysqli_sql_exception - osoba się nie dopisuje. Na egzaminie wystarczy wersja z klucza; poprawny sposób (zapytanie przygotowane) jest w etapie „Dobre praktyki”.
Krok 29 · po tym etapie masz 40 z 40 kryteriów (pkt)
Krok 29: Zapytanie przygotowane, walidacja i przekierowanie po zapisie
ok. 6 min
Polecenie z arkusza
Zapytanie jest wysyłane tylko wtedy, gdy podano dane w formularzu.
Dwa realne problemy wersji z egzaminu, sprawdzone przy uruchamianiu:
Odświeżenie dopisuje drugi raz. Po wysłaniu formularza przeglądarka pamięta żądanie POST; F5 (i potwierdzenie „wyślij ponownie”) wykonuje je jeszcze raz - w tabeli pojawiło się 2 × Miłosz. Rozwiązanie to wzorzec POST/Redirect/GET: zapis na samym początku pliku, a po nim header("Location: zdobywcy.php") i exit - przeglądarka pobiera stronę ponownie zwykłym GET, a odświeżenie już niczego nie dopisuje. header musi stać przed jakimkolwiek wypisanym znakiem, dlatego Skrypt 2 przenosisz nad <!DOCTYPE html>.
Dane z formularza prosto w zapytaniu (SQL injection, jak w innych arkuszach). Teraz: zapytanie przygotowane z czterema ?, filter_var(..., FILTER_VALIDATE_EMAIL) - type="email" działa tylko w przeglądarce, funkcja tylko z listy dozwolonych (in_array), trim i htmlspecialchars przy wypisywaniu.
Podgląd pokazuje stronę po przekierowaniu - Miłosz jest w tabeli raz. Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.
Krok 30 · po tym etapie masz 40 z 40 kryteriów (pkt)
Krok 30: Plik przeglądarka.txt i nagranie płyty
ok. 5 min
Polecenie z arkusza
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. Nagraj płytę z rezultatami pracy.
W przeglądarka.txt wpisujesz nazwę przeglądarki.
W folderze: zdobywcy.php, styles.css, kwerendy.txt, import.png, kw1.png - kw4.png (do nich prowadzą odnośniki w nawigacji), logo.png i przeglądarka.txt. 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.