INF.03-01-26.01-SGStyczeń 2026 · 42 kroki · ok. 76 min · 34 kryteria z klucza
Rozwiązanie krok po kroku: Portal konfiguracji samochodów (Wersja podstawowa)
Rozwiązanie buduje serwis konfiguracji samochodów: baza samochody z dwiema tabelami (pojazdy i kolory z dopłatą) i cztery zapytania (ORDER BY z LIMIT, AVG i MAX z aliasami, złączenie tabel, losowanie przez ORDER BY RAND()), strona index.php z nagłówkiem, paskiem nawigacji i trzema sekcjami obok siebie oraz style w styl.css z łączonymi obramowaniami tabel i podświetleniem wiersza pod kursorem. Dwa skrypty PHP: tabela aut z ceną całkowitą liczoną w PHP (cena plus dopłata za kolor) oraz tabela ze scalonymi komórkami (colspan, rowspan), w którą skrypt wpisuje dwa wylosowane auta po obu stronach zdjęcia.
Kroki idą zdanie po zdaniu za treścią arkusza - każdy ma polecenie z arkusza, a kod pokazuje dokładnie te linie, które je spełniają. Kod PHP jest najpierw pisany funkcjami z tabeli 1 arkusza (proceduralne mysqli), a na końcu powtórzony kod zostaje zamieniony na funkcję i dochodzi escapowanie danych.
Baza i grafiki pochodzą z prawdziwego archiwum pliki1 (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. Zapytanie 4 losuje, więc w podglądzie stoją dwa auta z ilustracji 2 (BM beta za 94000 i za 77000).
To jest wersja podstawowa. W zakładce „Nowoczesny kod (grid, PDO)” jest drugi sposób rozwiązania tego samego arkusza: sekcje na siatce CSS i PHP na PDO z danymi pobranymi przed HTML-em, htmlspecialchars i obsługą awarii bazy od pierwszej linii - obie wersje są zgodne z kluczem.
Jak liczą się punkty. Klucz ma 34 kryteria (R.1.1 - R.5.8), każde za 1 punkt. Próg zdania części praktycznej to 75%, czyli 26 punktów - można stracić 8 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 34 kryteriów (pkt)
Krok 1: Baza danych samochody
ok. 2 min
Polecenie z arkusza
Utwórz bazę danych o nazwie samochody, z zestawem polskich znaków (np. utf8_polish_ci).
Najpierw rozpakuj pliki1.7z z pulpitu (hasło S@mocHody^ z treści zadania): baza.sql i trzy grafiki. W phpMyAdmin: Nowa, nazwa samochody, metoda porównywania utf8_polish_ci.
Typowe błędy
Nazwa bazy musi być dokładnie samochody - skrypt łączy się z bazą po nazwie (R.5.1).
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.
Przy zaznaczonej bazie samochody: Import → baza.sql → Wykonaj. Powstają dwie tabele z ilustracji 1: pojazdy (62 auta: marka, model, cena, kolor) i kolory (8 kolorów z dopłatą - metaliki kosztują 1000 zł więcej). Kolumna pojazdy.kolor to klucz obcy wskazujący kolory.id.
Krok 3: Zrzut ekranu import.jpg
Kryteria:
R.1.1 Wykonany import tabeli do bazy danych samochody - plik import.jpg
ok. 2 min
Polecenie z arkusza
Wykonaj zrzut ekranu po imporcie. Zapisz zrzut w formacie JPEG 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, zapis jako import.jpg - import w JPEG, zrzuty zapytań w PNG. Na zrzucie komunikat o udanym imporcie albo dwie tabele w bazie.
Typowe błędy
Wykadrowany zrzut albo zły format to strata punktu R.1.1.
Krok 4: Zapytanie 1: 15 najdroższych aut marki BM
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 pierwsze 15 rekordów, jedynie pola: marka, model, cena dla pojazdów, których marka to BM posortowane malejąco według ceny. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT marka, model, cena FROM pojazdy WHERE marka = "BM" ORDER BY cena DESC LIMIT 15; oraz na zrzucie jest dokładnie 15 rekordów zawierających jedynie pola marka, model, cena. Ceny od 94000 do 84000
ok. 2 min
Polecenie z arkusza
Zapytanie 1: wybierające pierwsze 15 rekordów, jedynie pola: marka, model, cena dla pojazdów, których marka to BM posortowane malejąco według ceny.
Kolejność klauzul jest stała: SELECT → FROM → WHERE → ORDER BY → LIMIT.
WHERE marka = "BM" - tylko ta marka,
ORDER BY cena DESC - malejąco (DESC; rosnąco to domyślne ASC),
LIMIT 15 - pierwsze 15 wierszy po posortowaniu, czyli 15 najdroższych.
Wynik: 15 wierszy z cenami od 94000 do 84000 - jak w kluczu. Zapytanie do kwerendy.txt, zrzut kw1.png.
Typowe błędy
LIMIT przed ORDER BY to błąd składni. Bez DESC dostaniesz 15 najtańszych.
kwerendy.txtTekstnowy plik
-- Zapytanie 1SELECT marka, model, cena FROM pojazdy WHERE marka = "BM" ORDER BY cena DESC LIMIT 15;
Podgląd strony po tym kroku
Krok 5: Zapytanie 2: średnia i najwyższa cena modelu meta
Kryteria:
R.1.4 Wykonane zapytanie 2 liczące średnią cenę pojazdów oraz wybierające najdroższy pojazd dla modelu „meta”. Nazwy kolumn (aliasy) : „Średnia cena”, „Maksymalna cena”. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT AVG(cena) AS "Średnia cena", MAX(cena) AS "Maksymalna cena" FROM pojazdy WHERE model = "meta"; (AS nieobowiązkowe, w aliasie dopuszczalne literówki) oraz na zrzucie widoczne są wartości: 92071.4286 oraz 98000 (dowolne zaokrąglenie)
ok. 2 min
Polecenie z arkusza
Zapytanie 2: liczące średnią cenę pojazdów oraz wybierające najdroższy pojazd dla modelu „meta”. Nazwy kolumn (aliasy) odpowiednio: „Średnia cena”, „Maksymalna cena”.
Dwie funkcje agregujące w jednym zapytaniu: AVG(cena) (średnia) i MAX(cena) (najwyższa), obie liczone z wierszy spełniających WHERE model = "meta". Aliasy mają spacje i polskie litery, więc biorą cudzysłów. Wynik: jeden wiersz - 92071.4286 i 98000, jak w kluczu. Zrzut: kw2.png.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT marka, model, cena FROM pojazdy WHERE marka = "BM" ORDER BY cena DESC LIMIT 15;-- Zapytanie 2SELECT AVG(cena) AS "Średnia cena", MAX(cena) AS "Maksymalna cena" FROM pojazdy WHERE model = "meta";
Podgląd strony po tym kroku
Krok 6: Zapytanie 3: auta modelu alfa z kolorem i dopłatą
Kryteria:
R.1.5 Wykonane zapytanie 3 wybierające z tabeli pojazdy jedynie pola: marka, model, cena oraz odpowiadające im z tabeli kolory pola: nazwa, doplata dla modelu „alfa”. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT marka, model, cena, nazwa, doplata FROM pojazdy INNER JOIN kolory ON kolor = kolory.id WHERE model = "alfa"; (możliwe też samo JOIN lub porównanie kluczy po WHERE) oraz na zrzucie widocznych jest dokładnie 6 wierszy, nazwy kolorów: zielony, czarny, czarny, zielony metalik, czerwony metalik, czarny metalik
ok. 3 min
Polecenie z arkusza
Zapytanie 3: wybierające z tabeli pojazdy jedynie pola: marka, model, cena oraz odpowiadające im z tabeli kolory pola: nazwa, doplata dla modelu „alfa”. Należy posłużyć się relacją.
SELECT marka, model, cena, nazwa, doplata - trzy kolumny z pojazdy, dwie z kolory.
FROM pojazdy JOIN kolory ON kolor = kolory.id - relacja: kolumna kolor auta wskazuje id koloru. id jest w obu tabelach, więc piszesz kolory.id.
WHERE model = "alfa".
Wynik: 6 wierszy z kolorami zielony, czarny, czarny, zielony metalik, czerwony metalik, czarny metalik - jak w kluczu. Zrzut: kw3.png. To zapytanie wyśle skrypt 1, który doda dopłatę do ceny.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT marka, model, cena FROM pojazdy WHERE marka = "BM" ORDER BY cena DESC LIMIT 15;-- Zapytanie 2SELECT AVG(cena) AS "Średnia cena", MAX(cena) AS "Maksymalna cena" FROM pojazdy WHERE model = "meta";-- Zapytanie 3SELECT marka, model, cena, nazwa, doplata FROM pojazdy JOIN kolory ON kolor = kolory.id WHERE model = "alfa";
Podgląd strony po tym kroku
Krok 7: Zapytanie 4: dwa losowe auta
Kryteria:
R.1.6 Wykonane zapytanie 4 losujące dwa dowolne rekordy z tabeli pojazdy i wybierające jedynie markę, model i cenę. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT marka, model, cena FROM pojazdy ORDER BY RAND() LIMIT 2; oraz na zrzucie są dokładnie 2 losowe wiersze z polami marka, model, cena
ok. 2 min
Polecenie z arkusza
Zapytanie 4: losujące dwa dowolne rekordy z tabeli pojazdy i wybierające jedynie markę, model i cenę.
ORDER BY RAND() sortuje wiersze według liczby losowej - przy każdym wykonaniu kolejność jest inna - a LIMIT 2 zostawia dwa pierwsze. Wynik zmienia się za każdym uruchomieniem; na zrzucie kw4.png mają być dokładnie 2 wiersze. To zapytanie wyśle skrypt 2. kwerendy.txt ma komplet.
Typowe błędy
RAND() jest funkcją MySQL - w innych bazach nazywa się inaczej (SQLite: RANDOM()). Na egzaminie jest MySQL/MariaDB.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT marka, model, cena FROM pojazdy WHERE marka = "BM" ORDER BY cena DESC LIMIT 15;-- Zapytanie 2SELECT AVG(cena) AS "Średnia cena", MAX(cena) AS "Maksymalna cena" FROM pojazdy WHERE model = "meta";-- Zapytanie 3SELECT marka, model, cena, nazwa, doplata FROM pojazdy JOIN kolory ON kolor = kolory.id WHERE model = "alfa";-- Zapytanie 4SELECT marka, model, cena FROM pojazdy ORDER BY RAND() LIMIT 2;
Podgląd strony po tym kroku
Etap 2: Strona HTML
Kroki 8-21 · po tym etapie masz 15 z 34 kryteriów (pkt)
Krok 8: Plik index.php w HTML5
Kryteria:
R.2.1 W pliku index.php znajduje się deklaracja HTML5 <!DOCTYPE HTML> i deklaracja języka zawartości witryny: polski np. <html lang="pl">
ok. 2 min
Polecenie z arkusza
Cechy witryny: Składa się ze strony o nazwie index.php. Zapisana w języku HTML5.
Grafiki a1.jpg, a2.jpg i a3.png z archiwum kopiujesz do folderu zdającego - arkusz nie wymaga ich obróbki. W edytorze tworzysz index.php: <!DOCTYPE html> i szkielet <html>, <head>, <body>.
R.2.3 W sekcji body zdefiniowany jest podział na bloki za pomocą semantycznych znaczników HTML5: header, nav, main->section+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ą 3. Zawartość bloku głównego: blok sekcji lewej, środkowej i prawej.
Ilustracja 3: nagłówek, pasek nawigacji, blok główny z trzema sekcjami obok siebie, stopka - czyli <header>, <nav>, <main> z trzema <section>, <footer> (klucz R.2.3).
Sekcje dostają identyfikatoryleft, middle, right (po angielsku - arkusz dopuszcza oba języki): część stylów dotyczy „jedynie” obrazów z sekcji środkowej i „jedynie” wierszy tabeli z sekcji lewej, a CSS musi umieć te sekcje rozróżnić.
R.2.4 W bloku nagłówkowym znajduje się <h1>: „Serwis konfiguracji samochodów”, w bloku nawigacyjnym <h2>: „Samochody”, „Konfigurator” i „Kontakt”, w bloku sekcji prawej <h3> „111 222 444” oraz w stopce <p> z numerem zdającego
ok. 1 min
Polecenie z arkusza
Zawartość bloku nagłówkowego: nagłówek pierwszego stopnia o treści „Serwis konfiguracji samochodów”.
Krok 15: Blok nawigacyjny: trzy nagłówki drugiego stopnia
Kryteria:
R.2.4 W bloku nagłówkowym znajduje się <h1>: „Serwis konfiguracji samochodów”, w bloku nawigacyjnym <h2>: „Samochody”, „Konfigurator” i „Kontakt”, w bloku sekcji prawej <h3> „111 222 444” oraz w stopce <p> z numerem zdającego
ok. 1 min
Polecenie z arkusza
Zawartość bloku nawigacyjnego: trzy nagłówki drugiego stopnia o treści: „Samochody”, „Konfigurator”, „Kontakt”.
Trzy <h2> jeden pod drugim w kodzie. Na stronie staną obok siebie dopiero po stylach (display: inline-block - w kroku CSS); na razie są w trzech liniach.
R.2.6 W bloku sekcji lewej umieszczono tabelę z czterema kolumnami oraz w bloku sekcji środkowej - z trzema kolumnami (w skrypcie lub HTML) , zastosowane znaczniki <table>, <tr>, <td>
ok. 1 min
Polecenie z arkusza
Zawartość bloku sekcji lewej: tabela z czterema kolumnami, wypełniona skryptem 1.
Pusty <table> - wiersze z czterema kolumnami wypisze skrypt 1. Nagłówków kolumn ilustracja 2 nie pokazuje, więc ich nie dodajesz.
Krok 17: Sekcja środkowa: tabela z wierszem nagłówkowym
Kryteria: ,
R.2.7 Tabela w bloku sekcji środkowej ma w pierwszym wierszu scalone kolumny 1 i 2; w co najmniej jednym wierszu z obrazem są scalone wszystkie kolumny. W co najmniej jednej komórce z ceną są scalone dwa wiersze
R.2.8 Pierwszy wiersz tabeli z bloku sekcji środkowej zawiera komórki nagłówkowe „Konfiguracja”, „Cena”, zastosowane znaczniki <tr> i <th>
ok. 3 min
Polecenie z arkusza
Zawartość bloku sekcji środkowej: Tabela z trzema kolumnami i siedmioma wierszami, niektóre komórki są scalone zgodnie z ilustracją 2. W pierwszym wierszu tabeli komórki nagłówkowe: „Konfiguracja”, „Cena”.
Tabela ma 3 kolumny, ale w pierwszym wierszu są tylko dwie komórki - „Konfiguracja” zajmuje dwie kolumny. Scalenie w poziomie to atrybut colspan="2". Komórki nagłówkowe to <th> (pogrubione i wyśrodkowane), nie <td> (klucz R.2.7, R.2.8).
Siedem wierszy powstanie tak: 1 - nagłówek, 2 - obraz, 3 i 4 - pierwsze auto ze skryptu 2, 5 - obraz, 6 i 7 - drugie auto.
Krok 18: Drugi wiersz: obraz a1.jpg na całą szerokość
Kryteria: ,
R.2.5 Na stronie umieszczono grafiki z tekstem alternatywnym: a1.jpg "Konfiguracja 1", a2.jpg "Konfiguracja 2" oraz a3.png "Samochód"
R.2.7 Tabela w bloku sekcji środkowej ma w pierwszym wierszu scalone kolumny 1 i 2; w co najmniej jednym wierszu z obrazem są scalone wszystkie kolumny. W co najmniej jednej komórce z ceną są scalone dwa wiersze
ok. 2 min
Polecenie z arkusza
W drugim wierszu tabeli obraz a1.jpg z tekstem alternatywnym „Konfiguracja 1”.
Obraz zajmuje cały wiersz, więc jedna komórka scalona na trzy kolumny: colspan="3". Obraz ma 300 px szerokości i na razie wystaje poza sekcję - zmniejszy go reguła CSS dla obrazów sekcji środkowej.
R.2.4 W bloku nagłówkowym znajduje się <h1>: „Serwis konfiguracji samochodów”, w bloku nawigacyjnym <h2>: „Samochody”, „Konfigurator” i „Kontakt”, w bloku sekcji prawej <h3> „111 222 444” oraz w stopce <p> z numerem zdającego
R.2.5 Na stronie umieszczono grafiki z tekstem alternatywnym: a1.jpg "Konfiguracja 1", a2.jpg "Konfiguracja 2" oraz a3.png "Samochód"
ok. 1 min
Polecenie z arkusza
Zawartość bloku sekcji prawej: Nagłówek trzeciego stopnia o treści „111 222 444”. Obraz a3.png z tekstem alternatywnym „Samochód”.
<h3> z numerem telefonu i obraz kabrioletu. Ten obraz nie dostanie stylu „jedynie dla obrazów z bloku środkowego” - zostaje w naturalnym rozmiarze, jak na ilustracji 2.
R.2.4 W bloku nagłówkowym znajduje się <h1>: „Serwis konfiguracji samochodów”, w bloku nawigacyjnym <h2>: „Samochody”, „Konfigurator” i „Kontakt”, w bloku sekcji prawej <h3> „111 222 444” oraz w stopce <p> z numerem zdającego
ok. 1 min
Polecenie z arkusza
Zawartość stopki: paragraf o treści: „Stronę wykonał: ”, dalej wstawiony numer zdającego.
Paragraf w <footer>. Na egzaminie po dwukropku wpisujesz swój numer zdającego (PESEL) - tu stoi autor rozwiązania.
Kroki 22-31 · po tym etapie masz 26 z 34 kryteriów (pkt)
Krok 22: Plik styl.css: wyrównanie i krój czcionki
Kryteria:
R.4.1 domyślne formatowanie selektorów (*): wyrównanie tekstu do środka, krój czcionki - Helvetica, sans-serif (dozwolona tylko taka kolejność)
ok. 1 min
Polecenie z arkusza
Domyślnie dla wszystkich selektorów: wyrównanie tekstu do środka, krój czcionki Helvetica, w przypadku braku, sans-serif.
Selektor * - wszystkie elementy. font-family: Helvetica, sans-serif - Helvetica, a gdy jej brak (na Windows zwykle brak), dowolny krój bezszeryfowy. Klucz R.4.1 wymaga dokładnie tej kolejności.
Wspólne dla bloków nagłówkowego, nawigacyjnego i stopki: biały kolor czcionki, marginesy wewnętrzne 2 px.
Trzy selektory po przecinku - jedna reguła. Kolor tekstu to color, marginesy wewnętrzne padding. Biały tekst na razie znika na białym tle - kolory tła w następnym kroku.
Krok 25: Wszystkie sekcje: tło, wymiary, przewijanie
Kryteria: , , ,
R.4.2 kolor tła: blok nagłówkowy, stopka - DarkGreen, blok nawigacyjny - ForestGreen, bloki wszystkich sekcji - LightGreen
R.4.4 wysokość: wszystkie bloki sekcji - 550px szerokość: wszystkie bloki sekcji - 33.3% (width lub grid-template-columns lub flex) , selektor table - 90%, selektor h2 - 33%
R.4.5 paski przewijania: wszystkie bloki sekcji - auto (overflow)
Dla wszystkich bloków sekcji: kolor tła LightGreen, szerokość 33.3%, wysokość 550 px, jedynie górny margines wewnętrzny 10 px, paski przewijania widoczne jedynie w przypadku przepełnienia bloku.
Selektor section obejmuje trzy sekcje. 33.3% z kropką - CSS nie zna przecinka dziesiętnego. „Jedynie górny” margines wewnętrzny to padding-top. overflow: auto pokaże pasek przewijania tylko w sekcji, której treść nie mieści się w 550 px (środkowa z dwoma zdjęciami - ilustracja 2). Sekcje są jeszcze jedna pod drugą - układ ustawisz na końcu.
Krok 26: Nagłówki drugiego stopnia: liniowo-blokowe
Kryteria: ,
R.4.4 wysokość: wszystkie bloki sekcji - 550px szerokość: wszystkie bloki sekcji - 33.3% (width lub grid-template-columns lub flex) , selektor table - 90%, selektor h2 - 33%
R.4.8 styl dla nagłówka drugiego stopnia: właściwość display: inline-block
ok. 1 min
Polecenie z arkusza
Dla selektora nagłówka drugiego stopnia: szerokość 33%, sposób wyświetlania elementu liniowo-blokowy.
Nagłówek jest domyślnie blokowy - zajmuje całą linię. display: inline-block (tabela 2 arkusza) sprawia, że stoi w linii jak tekst, a mimo to przyjmuje szerokość - trzy nagłówki po 33% mieszczą się obok siebie. Arkusz każe stylować przez selektor znacznika h2, nie klasę ani identyfikator.
Krok 28: Tabela: szerokość i połączone obramowania
Kryteria: ,
R.4.4 wysokość: wszystkie bloki sekcji - 550px szerokość: wszystkie bloki sekcji - 33.3% (width lub grid-template-columns lub flex) , selektor table - 90%, selektor h2 - 33%
R.4.7 obramowanie: dla tabeli, selektorów td i th - 1px solid DarkGreen obramowanie połączone (collapse) - tabela
ok. 1 min
Polecenie z arkusza
Dodatkowo dla selektora tabeli: szerokość 90%, linie obramowania połączone.
border-collapse: collapse łączy ramki sąsiednich komórek w jedną linię - znikają podwójne obramowania i odstępy między komórkami, tabela wygląda jak siatka z ilustracji 2.
R.4.9 styl jedynie dla obrazów z bloku sekcji środkowej: szerokość - 95%, zaokrąglenie rogów - 8px (border-radius)
ok. 1 min
Polecenie z arkusza
Jedynie dla obrazów z bloku środkowego: szerokość 95%, zaokrąglenie rogów 8 px.
Selektor potomka: #middle img - obrazy wewnątrz elementu o identyfikatorze middle. Obraz w sekcji prawej się nie zmienia, i o to chodzi w słowie „jedynie” (R.4.9). Szerokość 95% liczy się od komórki tabeli, więc zdjęcia mieszczą się w kolumnie.
R.4.10 styl jedynie dla wierszy tabeli z bloku lewego: gdy kursor znajdzie się na wierszu jego kolor tła zmienia się na ForestGreen. Styl nie działa na tabeli z bloku sekcji środkowej
ok. 1 min
Polecenie z arkusza
Jedynie dla wierszy tabeli z bloku lewego: gdy kursor znajdzie się na wierszu tabeli jego kolor tła zmienia się na ForestGreen (jak na ilustracji 2).
#left tr:hover - wiersz (tr) w sekcji lewej, w stanie „kursor nad elementem”. Tabela środkowa nie reaguje, bo leży poza #left (klucz R.4.10 sprawdza też to). Wierszy jeszcze nie ma - wypisze je skrypt 1.
R.3.1 Układ bloków po uruchomieniu strony w przeglądarce jest zgodny z ilustracją 3 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ą 3.
Trzy sekcje po 33,3% mają stanąć obok siebie: float: left w regule section ustawia je kolejno od lewej (razem 99,9% szerokości). Stopka dostaje clear: both - schodzi pod sekcje, zamiast wsunąć się pod nie. Sekcje nie mają poziomych marginesów ani paddingu, więc szerokości się sumują dokładnie (R.3.1).
Typowe błędy
Poziomy padding w sekcjach (np. padding: 10px zamiast padding-top) dodaje się do 33,3% i trzecia sekcja spada pod pierwszą.
Kroki 32-39 · po tym etapie masz 34 z 34 kryteriów (pkt)
Krok 32: Połączenie z bazą danych
Kryteria: ,
R.5.1 Skrypt realizuje połączenie z serwerem bazy danych i wybór bazy samochody
R.5.8 W skryptach zastosowana przynajmniej jedna zmienna oraz nazwy wszystkich zmiennych są w języku polskim lub angielskim i odzwierciedlają cel zastosowania
ok. 3 min
Polecenie z arkusza
Wymagania dotyczące skryptów: Napisane w języku PHP. Łączą się z serwerem bazodanowym na localhost, użytkownik root bez hasła, baza danych o nazwie samochody.
Kod PHP wykonuje serwer, zanim strona trafi do przeglądarki. Połączenie otwierasz raz, zaraz po <body>, w zmiennej $connection - korzystają z niego oba skrypty. mysqli_connect z tabeli 1: serwer, użytkownik, hasło (puste), nazwa bazy.
Od tego kroku podgląd to wynik działania strony po stronie serwera.
Typowe błędy
Nazwa bazy to czwarty argument - mysqli_connect('localhost', 'root', 'samochody') podaje ją jako hasło.
R.5.3 Skrypty zawierają instrukcję wysyłającą do bazy danych zapytanie 3 lub zapytanie 4
ok. 2 min
Polecenie z arkusza
Skrypt 1: Wysyła do bazy danych zapytanie 3.
Skrypt 1 stoi wewnątrz <table> sekcji lewej - wypisze tam wiersze. Wynik zapytania 3 zapisujesz w $cars. Zapytanie zawiera cudzysłowy, więc napis PHP bierzesz w apostrofy.
R.5.5 Skrypt 1 wykorzystuje pętlę, której liczba powtórzeń równa jest liczbie rekordów zwróconych zapytaniem
R.2.6 W bloku sekcji lewej umieszczono tabelę z czterema kolumnami oraz w bloku sekcji środkowej - z trzema kolumnami (w skrypcie lub HTML) , zastosowane znaczniki <table>, <tr>, <td>
ok. 3 min
Polecenie z arkusza
W wierszach tabeli wyświetlane są kolejne rekordy zgodnie z ilustracją 2.
Pętla while z mysqli_fetch_row wykonuje się tyle razy, ile wierszy zwróciło zapytanie - sześć (klucz R.5.5). Każdy wiersz to <tr> z komórkami: marka $row[0], model $row[1] i nazwa koloru $row[3] - kolejność kolumn z SELECT: marka, model, cena, nazwa, doplata. Na razie trzy kolumny, czwartą policzysz. Najedź kursorem na wiersz: podświetla się na ForestGreen.
Kolejność wierszy wybiera serwer, bo zapytanie nie ma ORDER BY. Podgląd pokazuje kolejność z ilustracji 2, a MariaDB z XAMPP-a (sprawdzone) oddaje wiersze w kolejności identyfikatorów aut - „zielony metalik” stoi wtedy trzeci, nie czwarty. Klucz kolejności nie ocenia.
Krok 35: Skrypt 1: cena całkowita w czwartej kolumnie
Kryteria: ,
R.5.4 Skrypt 1 oblicza dla każdego rekordu cenę całkowitą jako sumę ceny i dopłaty za kolor zwróconych zapytaniem
R.5.6 Skrypt 1 wyświetla w wierszach tabeli markę, model, nazwę koloru zwrócone zapytaniem i obliczoną cenę całkowitą
ok. 2 min
Polecenie z arkusza
W czwartej kolumnie tabeli wyświetlana jest cena całkowita, która jest sumą ceny z tabeli pojazdy oraz dopłaty z tabeli kolory.
W pętli liczysz $totalPrice = $row[2] + $row[4] - cena plus dopłata. mysqli_fetch_row oddaje liczby z bazy jako napisy ("72000", "1000.00"), ale operator + w PHP zamienia je na liczby i dodaje: wynik 73000. Czwarta komórka wiersza pokazuje sumę - zielony metalik za 72000 kosztuje razem 73000, jak na ilustracji 2 (klucz R.5.4, R.5.6).
Typowe błędy
Kropka zamiast plusa ($row[2] . $row[4]) skleja napisy: „720001000.00”. W PHP kropka to łączenie tekstu, plus to dodawanie.
R.5.3 Skrypty zawierają instrukcję wysyłającą do bazy danych zapytanie 3 lub zapytanie 4
ok. 3 min
Polecenie z arkusza
Skrypt 2: Wysyła do bazy danych zapytanie 4.
Skrypt 2 jest przecięty wierszem z obrazem a2.jpg: pierwsze auto ma trafić w wiersze 3-4 (nad obrazem), drugie w 6-7 (pod nim). Dlatego pierwszą część skryptu wstawiasz zaraz po wierszu z a1.jpg: wysyła zapytanie 4 (wynik w $random) i od razu pobiera pierwszy wiersz do $car. Pętla nie jest potrzebna - wiadomo, że rekordy są dwa, i każdy idzie w inne miejsce tabeli.
R.5.7 Skrypt 2 wyświetla dwa zwrócone z bazy rekordy: markę, model i cenę
R.2.7 Tabela w bloku sekcji środkowej ma w pierwszym wierszu scalone kolumny 1 i 2; w co najmniej jednym wierszu z obrazem są scalone wszystkie kolumny. W co najmniej jednej komórce z ceną są scalone dwa wiersze
ok. 3 min
Polecenie z arkusza
Wyświetla pierwszy rekord w tabeli w wierszach 3 i 4.
Dwa wiersze: w pierwszym „Marka”, marka i cena scalona na dwa wiersze - rowspan="2" (scalanie w pionie, jak na ilustracji 2); w drugim „Model” i model, już bez trzeciej komórki, bo jej miejsce zajmuje cena z wiersza wyżej. Cudzysłów wokół 2 w napisie PHP poprzedzasz ukośnikiem: rowspan=\"2\". W podglądzie pierwsze z dwóch aut z ilustracji 2.
Typowe błędy
Trzecia komórka także w wierszu z modelem rozjeżdża tabelę - przy rowspan="2" drugi wiersz ma o jedną komórkę mniej.
R.5.7 Skrypt 2 wyświetla dwa zwrócone z bazy rekordy: markę, model i cenę
ok. 2 min
Polecenie z arkusza
Drugi rekord w wierszach 6 i 7.
Druga część skryptu stoi pod wierszem z a2.jpg. Kolejne mysqli_fetch_row($random) oddaje następny wiersz wyniku - drugie wylosowane auto - i wypisujesz je tymi samymi dwiema liniami. Tabela ma teraz komplet siedmiu wierszy.
Kroki 40-41 · po tym etapie masz 34 z 34 kryteriów (pkt)
Krok 40: Funkcja printCar zamiast dwóch kopii wypisywania
ok. 3 min
Polecenie z arkusza
Wyświetla pierwszy rekord w tabeli w wierszach 3 i 4; drugi rekord w wierszach 6 i 7.
Dwa auta wypisywały te same dwie linie echo. Przenieś je do funkcji printCar($car) - zdefiniowanej raz, w bloku z połączeniem na początku pliku - i w obu miejscach tabeli wywołaj printCar(mysqli_fetch_row($random)). Poprawka wyglądu wiersza (np. „zł” przy cenie) zmienia teraz jedno miejsce. Podgląd bez zmian.
Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.
W wierszach tabeli wyświetlane są kolejne rekordy zgodnie z ilustracją 2.
Nazwy kolorów, marek i modeli ktoś wpisał do bazy - napis z <script> wykonałby się u każdego, kto otworzy stronę (XSS). htmlspecialchars() zamienia <, >, ", & na encje, więc tekst zawsze zostaje tekstem. W funkcji array_map stosuje ją do całego wiersza naraz. Escapujesz przy wypisywaniu, nie przy zapisie. Podgląd bez zmian.
Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.
Krok 42 · po tym etapie masz 34 z 34 kryteriów (pkt)
Krok 42: 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: a1.jpg, a2.jpg, a3.png, import.jpg, index.php, kw1.png, kw2.png, kw3.png, kw4.png, kwerendy.txt, przeglądarka.txt, styl.css, ewentualnie inne przygotowane pliki.
W przeglądarka.txt wpisujesz nazwę przeglądarki, w której sprawdzasz stronę przez http://localhost/….
Sprawdź listę plików z arkusza, 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.