INF.03-09-25.01-SGStyczeń 2025 · 30 kroków · ok. 73 min · 40 kryteriów z klucza
Rozwiązanie krok po kroku: Portal zdobywców gór (Nowoczesny kod (grid, PDO))
To drugi sposób rozwiązania tego samego arkusza. Wynik jest ten sam - baza zdobywcy z czterema zapytaniami, logo i strona zdobywcy.php, która dopisuje do bazy osobę z formularza i wypisuje członków koła w tabeli - i tak samo spełnia każde kryterium klucza. Inna jest droga:
siatka CSS: bloki lewy i prawy we wspólnym kontenerze z kolumnami 30% 70% w grid-template-columns (klucz R.4.4 przyjmuje je wprost) zamiast float: left i clear: both; blok lewy to <aside>, prawy - <main>,
PHP na PDO nad HTML-em: najpierw zapis z formularza (Skrypt 2), potem odczyt listy (Skrypt 1), połączenie zamknięte, zanim zacznie się strona,
bezpieczny zapis: zapytanie przygotowane, sprawdzenie e-maila po stronie serwera, funkcja tylko z listy dozwolonych, nazwisko z apostrofem (O'Neill) zapisuje się bez błędu,
przekierowanie po zapisie (wzorzec POST/Redirect/GET) od pierwszej wersji: odświeżenie strony nie dopisuje osoby drugi raz, a po zapisie pojawia się potwierdzenie,
formularz pamięta wpisane dane, gdy czegoś brakuje, a lista funkcji powstaje z tej samej stałej, której używa sprawdzenie.
Na końcu krótkie porównanie z wersją podstawową (zakładka obok). Baza i logo pochodzą z prawdziwego archiwum pliki4, zapytania zostały wykonane na tej bazie w MariaDB z XAMPP-a, a 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 to 75%, czyli 30 punktów. Przy każdym kroku jest napisane, które kryteria spełnia.
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
ok. 2 min
Polecenie z arkusza
Utwórz bazę danych o nazwie zdobywcy, z zestawem polskich znaków (np. utf8_unicode_ci).
Archiwum pliki4.7z rozpakuj hasłem $ZdobyWcy& do folderu z numerem zdającego: baza.sql i logo.jpg. W phpMyAdmin Nowa → zdobywcy, porównywanie utf8_unicode_ci, albo:
CREATE DATABASE zdobywcy CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Typowe błędy
Nazwa bazy musi być dokładnie zdobywcy - skrypty łączą się z nią po nazwie (R.5.2).
Krok 2: Import tabel z pliku baza.sql
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, osoba_id, data_zdobycia).
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.
Cały ekran z paskiem zadań, 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 działa na wynik już posortowany, więc stoi na końcu. Wynik zaczyna się od Rysów (2499 m). Zapytania zapisuj w kwerendy.txt, zrzut jako kw1.png.
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.
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.
INSERT z listą kolumn: (gora_id, osoba_id, data_zdobycia) - klucz główny pominięty, więc baza nada go sama (AUTO_INCREMENT, tu id 12). Lista kolumn sprawia, że zapytanie nie zależy od kolejności kolumn w tabeli i nie przestanie działać, gdy ktoś dopisze do niej nową kolumnę - wersja VALUES (NULL, 182, 4, …) musiałaby wtedy dostać kolejną wartość. Klucz przyjmuje obie formy.
Do osiągnięcia wpisujesz identyfikatory, nie nazwy - nazwę góry i osoby baza zna z pozostałych tabel. Zrzut: kw3.png (tu: wstawiony rekord złączony z nazwą góry i osobą).
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: cztery kolumny i cztery napisy w apostrofach, klucz nada baza (id 16). Zrzut: kw4.png. To zapytanie - z parametrami zamiast stałych - wyśle Skrypt 2.
Kroki 8-17 · 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.
Grafika jest taka sama w obu wersjach. W GIMP-ie:
Warstwa → Przezroczystość → Dodaj kanał alfa, 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,
Tekst: „ZDOBYWCY GÓR” w dwóch wierszach, czcionka szeryfowa (np. Times New Roman Bold), kolor zielony, 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),
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”.
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. Zadeklarowany polski język zawartości witryny. Jawnie zastosowany właściwy standard kodowania polskich znaków.
Szkielet od razu z lang="pl" i <meta charset="UTF-8"> jako pierwszym elementem <head> (R.2.3). Bez kodu PHP podgląd pokazuje plik 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.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
Tytuł strony „ZDOBYWCY GÓR” widoczny na karcie przeglądarki. Arkusz stylów w pliku o nazwie styles.css prawidłowo połączony z kodem strony.
<title> (R.2.3) i <link> do styles.css - z „s” na końcu (R.3.2) - oraz viewport dla telefonów.
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. 2 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.
Znaczniki dobrane do treści bloków (R.2.4):
<header>, <nav> i <footer> - jak w każdym arkuszu,
<aside> - blok lewy z logo i listą to treść poboczna, uzupełnienie strony,
<main> - blok prawy z formularzem i tabelą to główna treść, po którą przychodzi użytkownik,
<div class="columns"> - kontener bez znaczenia, tylko po to, żeby bloki lewy i prawy miały wspólnego rodzica, w którym CSS ustawi dwie kolumny (klucz dopuszcza dodatkowe div).
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). aria-label mówi czytnikowi ekranu, czego dotyczy ta nawigacja. 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 z tekstem alternatywnym, <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 - 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",
etykiety powiązane z polami przez for/id, nazwy name to klucze w $_POST,
type="email" (R.3.6) i required - przeglądarka sprawdzi pola przed wysłaniem; serwer i tak sprawdzi je drugi raz, bo żądanie da się wysłać z pominięciem formularza,
lista funkcji <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 18-22 · po tym etapie masz 31 z 40 kryteriów (pkt)
Krok 18: Plik styles.css: zmienne, 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.
Kolory bloków z arkusza w zmiennych CSS o nazwach mówiących, co to za barwa. Potem selektory znaczników body, ul i li - uwaga arkusza wymaga ich wprost (R.4.1, R.4.7). Punktor kwadrat to square, a elementy listy stoją przy lewej krawędzi, choć cała strona jest wyśrodkowana.
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). Tu gap z siatki byłby naturalniejszy, ale klucz R.4.8 ocenia właśnie word-spacing.
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 )
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. 3 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.
Kontener .columns staje się siatką o dwóch kolumnach: grid-template-columns: 30% 70% to szerokości bloku lewego i prawego naraz - klucz R.4.4 przyjmuje je zapisane właśnie tu. Bloki stają obok siebie bez float, a stopka pod nimi bez clear, bo siatka nie wyjmuje elementów z przepływu (R.3.1).
Wysokość 650 px dla obu bloków, tło lewego ze zmiennej (R.4.2, R.4.4), overflow: auto dla prawego - pasek tylko przy długiej tabeli (R.4.5).
Typowe błędy
width: 30% i width: 70% dopisane do bloków w siatce 30% 70% zwężają je do 9% i 49% strony - procent szerokości elementu siatki liczy się od jego kolumny.
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.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ę. Dla selektora obrazu: szerokość 90%.
„Wszystkie komórki” to th i td (R.4.9). Marginesy tabeli w jednym skróciemargin: 20px auto 0 - kolejno: góra 20 px, boki auto (wyśrodkowanie), dół 0 - zamiast dwóch linii, w których kolejność decyduje o wyniku (R.4.6). Obraz 90% szerokości bloku (R.4.4).
Typowe błędy
Dwie osobne linie w złej kolejności (margin-top: 20px; przed margin: auto;) - skrót nadpisze górny margines na auto, czyli 0.
Kroki 23-28 · po tym etapie masz 40 z 40 kryteriów (pkt)
Krok 23: Połączenie PDO na górze pliku
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
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
Napisane w języku PHP. Należy stosować znaczące nazewnictwo zmiennych i funkcji w języku polskim lub angielskim. Łą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 będą stały przed<!DOCTYPE html>, w jednym bloku z jednym połączeniem: najpierw zapis z formularza, potem odczyt listy - dzięki tej kolejności nowa osoba od razu jest w tabeli.
R.5.4 Skrypt 1 zawiera instrukcję wysyłającą do bazy danych zapytanie 2
ok. 1 min
Polecenie z arkusza
Skrypt 1: wysyła do bazy danych zapytanie 2.
$pdo->query(...) wysyła zapytanie 2, a ->fetchAll() odbiera 15 osób do tablicy $members (R.5.4). Zwykłe query wystarcza - w tym zapytaniu nie ma danych od użytkownika.
R.2.8 W bloku prawym umieszczona tabela o 4 kolumnach (w skrypcie lub HTML) zastosowane znaczniki <table>, <tr>, <td>
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
W każdym wierszu tabeli, w odpowiednich komórkach, wyświetlane są zwrócone zapytaniem kolejne wiersze z bazy.
W <tbody> pętla foreach ($members as $member): i wiersz z czterema komórkami - wartości po nazwach kolumn, każda przez e(); e-mail od użytkownika może zawierać znaki, które przeglądarka wzięłaby za HTML. Podgląd: 15 członków koła (R.2.8, 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)
ok. 5 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.
Skrypt 2 stoi przed Skryptem 1 w tym samym bloku try:
field('surname') - mała funkcja, która czyta pole z $_POST (tablicy, której szuka klucz R.5.7), daje pusty napis, gdy pola nie ma, i obcina spacje; spreparowane żądanie z tablicą zamiast tekstu też kończy się pustym napisem, a nie błędem,
filter_var(..., FILTER_VALIDATE_EMAIL) - poprawny adres albo false; type="email" sprawdza tylko przeglądarka,
funkcja musi być jedną z ROLES - stałej z pięcioma funkcjami z arkusza (in_array z true porównuje też typ),
dopiero gdy wszystko się zgadza, zapytanie przygotowane: zapytanie 4 z parametrami :surname, :name, :role, :email, a wartości osobno w execute (R.5.6, R.5.7).
Sprawdzone: dane z arkusza dopisują Miłosza (id 16), nazwisko O'Neill zapisuje się poprawnie (w wersji podstawowej apostrof kończy się błędem SQL), a zły e-mail, funkcja spoza listy i same spacje nie dopisują niczego. Podgląd: stan po wysłaniu formularza z danymi M., Miłosz, uczestnik.
exit - header tylko ustawia nagłówek i nie zatrzymuje skryptu; bez exit PHP wykonywałby dalszy kod.
Odświeżenie strony (F5) powtarza teraz GET, a nie wysłanie formularza - sprawdzone: po zapisie i dwóch odświeżeniach Miłosz jest w tabeli raz (w wersji podstawowej F5 dopisuje go drugi raz). Na stronie z ?added=1 pod akapitem stoi potwierdzenie z role="status", które czytnik ekranu przeczyta sam. Wszystko to dzieje się przed pierwszym znakiem HTML-u - header po wypisaniu czegokolwiek kończy się ostrzeżeniem „headers already sent”.
Krok 28: Formularz pamięta dane, lista funkcji z jednej stałej
ok. 4 min
Polecenie z arkusza
Pole listy rozwijanej poprzedzone etykietą „Funkcja: ”, o elementach: „uczestnik”, „przewodnik”, „zaopatrzeniowiec”, „organizator”, „ratownik”.
Gdy czegoś brakuje, zapis się nie odbywa, a formularz wraca z komunikatem „Uzupełnij nazwisko, imię i poprawny adres e-mail.” i z wpisanymi danymi - tablica $form trzyma wartości pól, a szablon wstawia je w value (przez e()) i zaznacza wybraną funkcję atrybutem selected. Sprawdzone: przy adresie m.milosz@ w polach zostają „M.”, „Miłosz”, a na liście „ratownik”.
Opcje listy powstają teraz pętlą z tej samej stałej ROLES, którą sprawdza Skrypt 2 - dopisanie szóstej funkcji to jedna zmiana w jednym miejscu, a lista i sprawdzenie nie mogą się rozjechać. Nazwy funkcji nadal widać w kodzie strony (R.2.10). Awaria bazy daje komunikat w tym samym miejscu, bez nazwy bazy i kodu błędu. Podgląd: strona po zapisie i przekierowaniu.
Krok 29 · po tym etapie masz 40 z 40 kryteriów (pkt)
Krok 29: Co jest inaczej i którą wersję wybrać na egzaminie
ok. 2 min
Obie wersje dają komplet 40 punktów. Różnice:
wersja podstawowa
wersja nowoczesna
układ
float: left w sekcjach + clear: both
<div class="columns"> z siatką 30% 70%
znaczniki
dwie <section>
<aside> (logo, lista) i <main> (formularz, tabela)
baza
mysqli w dwóch blokach PHP rozrzuconych po HTML-u
PDO w jednym bloku nad HTML-em, połączenie zamknięte przed stroną
zapis
!empty i dane wklejone w zapytanie
field() z $_POST, filter_var, ROLES, zapytanie przygotowane
po zapisie
F5 dopisuje drugi raz (w dobrych praktykach PRG)
przekierowanie 303 i potwierdzenie od początku
zły e-mail, apostrof
zapis bez sprawdzenia, apostrof to błąd SQL
komunikat, formularz z danymi, apostrof zapisany
Na egzaminie wersja podstawowa jest krótsza i stawia Skrypt 2 tam, gdzie widać go w treści strony. Nowoczesna to sposób, w jaki pisze się formularze w prawdziwych serwisach - z jednym zastrzeżeniem: header() działa tylko przed pierwszym znakiem HTML-u, więc kto przeniesie logikę na górę pliku, musi uważać, żeby nad <?php nie została choćby pusta linia.
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. Umieść go w folderze z numerem zdającego. Nagraj płytę z rezultatami pracy. W folderze z numerem zdającego, powinny znajdować się pliki: import.png, kw1.png, kw2.png, kw3.png, kw4.png, kwerendy.txt, logo.png, styles.css, zdobywcy.php, przeglądarka.txt oraz ewentualnie inne przygotowane pliki.
W przeglądarka.txt wpisz nazwę przeglądarki. Zrzuty kw1.png - kw4.png muszą leżeć obok strony - prowadzą do nich odnośniki w nawigacji (R.3.3). Nagraj płytę i sprawdź jej odczyt.
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.