INF.03-08-25.01-SGStyczeń 2025 · 29 kroków · ok. 62 min · 37 kryteriów z klucza
Rozwiązanie krok po kroku: Mieszalnia farb (Wersja podstawowa)
Rozwiązanie buduje stronę mieszalni farb: baza mieszalnia z klientami i zamówieniami (kod koloru, pojemność, data odbioru) i cztery zapytania - zliczanie, złączenie z sortowaniem, to samo złączenie z zakresem dat oraz prosty warunek, potem baner złożony z tła i napisu, okrągły favicon wycięty z tekstury, strona index.php z formularzem dat i tabelą zamówień oraz style w style.css. Skrypt PHP wybiera zapytanie: bez dat pokazuje wszystkie zamówienia, z datami - tylko te z wybranego okresu, a komórce z kolorem nadaje tło według kodu z bazy.
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ą. Skrypt jest najpierw pisany najprościej (mysqli_query, mysqli_fetch_row), a na końcu zostaje przerobiony na wersję z prawdziwych projektów: zapytanie przygotowane, sprawdzenie dat i kodu koloru oraz htmlspecialchars.
To jest wersja podstawowa. W zakładce „Nowoczesny kod (PDO, walidacja dat)” jest drugi sposób rozwiązania tego samego arkusza: PHP na PDO z zapytaniem przygotowanym, sprawdzeniem dat i koloru od pierwszej linii oraz formularzem, który pamięta wybrane daty - obie wersje są zgodne z kluczem.
Baza i grafiki pochodzą z prawdziwego archiwum pliki7 (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: najpierw bez filtra (23 zamówienia), a od kroku z formularzem - po wybraniu dat od 2021-11-06 do 2021-11-10, jak na ilustracji 5.
Jak liczą się punkty. Klucz ma 37 kryteriów (R.1.1 - R.5.8), każde za 1 punkt. Próg zdania części praktycznej to 75%, czyli 28 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 37 kryteriów (pkt)
Krok 1: Baza danych mieszalnia
Kryteria:
R.1.1 Wykonany import tabel do bazy danych mieszalnia , co jest udokumentowane w pliku import w formacie JPEG
ok. 2 min
Polecenie z arkusza
Utwórz bazę danych o nazwie mieszalnia, z zestawem polskich znaków (np. utf8_unicode_ci).
Rozpakuj pliki7.7z z pulpitu (hasło Miesz@nie&F@rB) do folderu z numerem zdającego: mieszalnia.sql, tlo.jpg, nazwa.png i fav.jpg. W phpMyAdmin: Nowa, nazwa mieszalnia, porównywanie np. utf8_unicode_ci.
Krok 2: Import tabel z pliku mieszalnia.sql
Kryteria:
R.1.1 Wykonany import tabel do bazy danych mieszalnia , co jest udokumentowane w pliku import w formacie JPEG
ok. 2 min
Polecenie z arkusza
Do utworzonej bazy zaimportuj tabele z pliku mieszalnia.sql z rozpakowanego archiwum.
Import → mieszalnia.sql. Dwie tabele w relacji jeden do wielu: klienci (17) i zamowienia (23, pole id_klienta). Kod koloru zapisano bez znaku #, np. 1b69aa - dopiszesz go w skrypcie.
Krok 3: Zrzut ekranu import.jpg
Kryteria:
R.1.1 Wykonany import tabel do bazy danych mieszalnia , co jest udokumentowane w pliku import w formacie JPEG
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.
Typowe błędy
Wykadrowany zrzut albo zrzut bez paska zadań nie jest oceniany (uwaga w kluczu przy R.1).
Krok 4: Zapytanie 1: liczba klientów
Kryteria: ,
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 liczbę klientów mieszalni farb. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT COUNT(*) FROM klienci; oraz wynik działania udokumentowany zrzutem, na którym widoczna jest wartość 17
ok. 1 min
Polecenie z arkusza
Zapytanie 1: zliczające liczbę klientów mieszalni farb.
COUNT(*) liczy wszystkie wiersze tabeli. Wynik: 17. Zapytanie do kwerendy.txt, zrzut kw1.png.
kwerendy.txtTekstnowy plik
-- Zapytanie 1SELECT COUNT(*) FROM klienci;
Podgląd strony po tym kroku
Krok 5: Zapytanie 2: zamówienia z klientami według daty odbioru
Kryteria:
R.1.4 Wykonane zapytanie 2 wybierające jedynie nazwiska, imiona oraz odpowiadające im numery zamówień (pole id), kody kolorów, pojemności i daty odbioru posortowane rosnąco po dacie odbioru. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT nazwisko, imie, zamowienia.id, kod_koloru, pojemnosc, data_odbioru FROM klienci JOIN zamowienia ON klienci.id = id_klienta ORDER BY data_odbioru; (poprawne też z ASC, możliwe również INNER JOIN lub porównanie kluczy po WHERE ) oraz wynik działania udokumentowany zrzutem, na którym znajduje się komunikat o wybraniu 23 wierszy, jedynie pola nazwisko, imie, id, kod_koloru, pojemnosc, data_odbioru
ok. 3 min
Polecenie z arkusza
Zapytanie 2: wybierające jedynie nazwiska, imiona klientów oraz odpowiadające im numery zamówień (pole id), kody kolorów, pojemności i daty odbioru zamówień posortowane rosnąco po dacie odbioru. Należy posłużyć się relacją.
zamowienia.id - pole id jest w obu tabelach, więc z nazwą tabeli (numer zamówienia, nie klienta),
JOIN zamowienia ON klienci.id = id_klienta - relacja,
ORDER BY data_odbioru - rosnąco.
Wynik: 23 wiersze. Zrzut: kw2.png. To zapytanie wyśle skrypt, gdy formularz jest pusty.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT COUNT(*) FROM klienci;-- Zapytanie 2SELECT nazwisko, imie, zamowienia.id, kod_koloru, pojemnosc, data_odbioru FROM klienci JOIN zamowienia ON klienci.id = id_klienta ORDER BY data_odbioru;
Podgląd strony po tym kroku
Krok 6: Zapytanie 3: odbiory od 5 do 7 listopada
Kryteria:
R.1.5 Wykonane zapytanie 3 wybierające jedynie nazwiska, imiona oraz odpowiadające im numery zamówień (pole id), kody kolorów, pojemności i daty odbioru posortowane rosnąco po dacie odbioru, jedynie dla zamówień, w których data odbioru jest od 5 listopada do 7 listopada 2021 roku. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT nazwisko, imie, zamowienia.id, kod_koloru, pojemnosc, data_odbioru FROM klienci JOIN zamowienia ON klienci.id = id_klienta WHERE data_odbioru >= "2021-11-05" AND data_odbioru <= "2021-11-07" ORDER BY data_odbioru; (poprawne też z ASC, możliwe również INNER JOIN lub porównanie kluczy po WHERE ) oraz wynik działania udokumentowany zrzutem, na którym znajdują się dokładnie 2 rekordy, dla id = 7, 1
ok. 2 min
Polecenie z arkusza
Zapytanie 3: wybierające jedynie nazwiska, imiona klientów oraz odpowiadające im numery zamówień (pole id), kody kolorów, pojemności i daty odbioru zamówień posortowane rosnąco po dacie odbioru, jedynie dla zamówień, w których data odbioru jest od 5 listopada do 7 listopada 2021 roku. Należy posłużyć się relacją.
To samo co zapytanie 2 plus BETWEEN "2021-11-05" AND "2021-11-07" - zakres włącznie z obiema datami (równoważnie >= i <=). Wynik: dwa zamówienia, id 7 i 1. Zrzut: kw3.png. W skrypcie w miejscu dat staną wartości z formularza.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT COUNT(*) FROM klienci;-- Zapytanie 2SELECT nazwisko, imie, zamowienia.id, kod_koloru, pojemnosc, data_odbioru FROM klienci JOIN zamowienia ON klienci.id = id_klienta ORDER BY data_odbioru;-- Zapytanie 3SELECT nazwisko, imie, zamowienia.id, kod_koloru, pojemnosc, data_odbioru FROM klienci JOIN zamowienia ON klienci.id = id_klienta WHERE data_odbioru BETWEEN "2021-11-05" AND "2021-11-07" ORDER BY data_odbioru;
Podgląd strony po tym kroku
Krok 7: Zapytanie 4: klientki
Kryteria:
R.1.6 Wykonane zapytanie 4 wybierające jedynie imiona i nazwiska klientów mieszalni farb o płci kobieta. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT imie, nazwisko FROM klienci WHERE plec = "k"; oraz wynik działania udokumentowany zrzutem, na którym widocznych jest dokładnie 5 wierszy dla Joanny, Katarzyny, Karoliny, Wiktorii i Ilony
ok. 1 min
Polecenie z arkusza
Zapytanie 4: wybierające jedynie imiona i nazwiska kobiet, które są klientami mieszalni farb.
Płeć zapisano jedną literą w polu plec: "k". Wynik: Joanna, Katarzyna, Karolina, Wiktoria, Ilona. Zrzut: kw4.png.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT COUNT(*) FROM klienci;-- Zapytanie 2SELECT nazwisko, imie, zamowienia.id, kod_koloru, pojemnosc, data_odbioru FROM klienci JOIN zamowienia ON klienci.id = id_klienta ORDER BY data_odbioru;-- Zapytanie 3SELECT nazwisko, imie, zamowienia.id, kod_koloru, pojemnosc, data_odbioru FROM klienci JOIN zamowienia ON klienci.id = id_klienta WHERE data_odbioru BETWEEN "2021-11-05" AND "2021-11-07" ORDER BY data_odbioru;-- Zapytanie 4SELECT imie, nazwisko FROM klienci WHERE plec = "k";
Podgląd strony po tym kroku
Etap 2: Grafika i strona HTML
Kroki 8-19 · po tym etapie masz 20 z 37 kryteriów (pkt)
Krok 8: Baner: tło i napis
Kryteria: ,
R.2.1 Utworzone pliki graficzne baner.png o szerokości 1000 px i wysokości 270 px oraz fav.png o rozmiarze 64 px na 64 px
R.2.2 Cały obraz z banerem wypełnia tło z pliku tlo.jpg oraz na pierwszym planie osadzony jest napis pobrany z pliku nazwa.png . Napis widoczny jest w całości
ok. 5 min
Polecenie z arkusza
Na potrzeby strony należy przygotować grafikę z banerem o nazwie baner.png i cechach: grafika z pliku tlo.jpg, wypakowanego z archiwum, w całości stanowi tło banera. Szerokość banera 1000 px, wysokość 270 px. Zawartość pliku nazwa.png, wypakowanego z archiwum, stanowi pierwszy plan banera. Napis musi być widoczny w całości.
tlo.jpg (3840 × 1200) Obraz → Skaluj obraz do 1000 × 270 z rozpiętym łańcuchem - „w całości stanowi tło”, więc skalujesz cały obraz, a nie wycinasz fragment,
Plik → Otwórz jako warstwynazwa.png - napis na przezroczystym tle; skalujesz warstwę (Warstwa → Skaluj warstwę), żeby napis zajął prawie całą szerokość, i ustawiasz go tak, żeby był widoczny w całości,
Eksportuj jakobaner.png (R.2.1, R.2.2).
Typowe błędy
Kadrowanie tła do 1000 × 270 zamiast skalowania pokazuje tylko fragment tlo.jpg - klucz wymaga, żeby tło wypełniało cały obraz w całości.
Podgląd strony po tym kroku
Krok 9: Favicon: koło wycięte z tekstury
Kryteria: ,
R.2.1 Utworzone pliki graficzne baner.png o szerokości 1000 px i wysokości 270 px oraz fav.png o rozmiarze 64 px na 64 px
R.2.3 Plik z faviconem ma przezroczyste tło oraz znajduje się w nim kolorowe koło wycięte z pliku fav.jpg . Koło wypełnia cały obraz
ok. 4 min
Polecenie z arkusza
Na potrzeby strony należy przygotować favicon o nazwie fav.png i cechach: rozmiary 64 px na 64 px, tło przezroczyste, z grafiki fav.jpg należy wyciąć koło, i przygotować tak aby wypełniało cały obraz favicona.
fav.jpg ma 100 × 100. Dodaj kanał alfa, narzędzie Zaznaczenie eliptyczne od narożnika do narożnika z wciśniętym Shift (koło na cały obraz), Zaznaczenie → Odwróć i Delete - poza kołem zostaje przezroczystość. Potem Obraz → Skaluj obraz do 64 × 64 i Eksportuj jakofav.png (R.2.1, R.2.3).
Podgląd strony po tym kroku
Krok 10: Plik index.php w HTML5
Kryteria:
R.2.4 Witryna internetowa zapisana w pliku index.php oraz zapisany jawnie standard kodowania polskich znaków, deklaracja HTML5 <!DOCTYPE HTML>, zadeklarowany język witryny: polski np. <html lang="pl">. Strona zawiera sekcje head i body
ok. 1 min
Polecenie z arkusza
Cechy witryny: Składa się ze strony o nazwie index.php. Zapisana w języku HTML5.
Jedna strona, index.php. Bez PHP podgląd pokazuje ją wprost.
R.2.4 Witryna internetowa zapisana w pliku index.php oraz zapisany jawnie standard kodowania polskich znaków, deklaracja HTML5 <!DOCTYPE HTML>, zadeklarowany język witryny: polski np. <html lang="pl">. Strona zawiera sekcje head i body
ok. 1 min
Polecenie z arkusza
Jawnie zastosowany właściwy standard kodowania polskich znaków.
R.2.4 Witryna internetowa zapisana w pliku index.php oraz zapisany jawnie standard kodowania polskich znaków, deklaracja HTML5 <!DOCTYPE HTML>, zadeklarowany język witryny: polski np. <html lang="pl">. Strona zawiera sekcje head i body
R.3.4 Strona zawiera działające połączenie z zewnętrznym arkuszem stylów o nazwie style.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 #) (nie dotyczy stylu generowanego skryptem dla kolorów w tabeli)
ok. 1 min
Polecenie z arkusza
Arkusz stylów w pliku o nazwie style.css prawidłowo połączony z kodem strony.
R.2.6 Zdefiniowany układ strony, dzielący ją na bloki: nagłówkowy, formularza, główny 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 oraz dopuszcza się dodatkowe użycie bloków div lub section (dopuszcza się zamiast bloku formularza - formularz)
R.3.1 Układ bloków po uruchomieniu strony w przeglądarce jest zgodny z ilustracją 4 w arkuszu egzaminacyjnym
ok. 1 min
Polecenie z arkusza
Podział strony na znajdujące się jeden pod drugim bloki: nagłówkowy, formularz, główny, stopka. 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ą 4.
<header>, <section id="search"> na formularz, <main> i <footer>. Bloki stoją jeden pod drugim bez żadnego pozycjonowania (R.2.6, R.3.1).
R.2.8 Formularz zawiera dwa pola edycyjne i przycisk, zastosowany znacznik <form>
R.3.2 Formularz wysyła dane metodą POST do tego samego pliku (poprawne również bez atrybutu action)
R.3.3 Przycisk realizuje funkcję wysłania danych z formularza (input lub button z typem submit lub button bez typu ) oraz przynajmniej jedno pole edycyjne jest typu date
ok. 3 min
Polecenie z arkusza
Zawartość bloku formularza: Formularz wysyłający dane metodą bezpieczną do tego samego pliku, o elementach: Pole edycyjne przeznaczone do wybrania daty, poprzedzone etykietą: „Data odbioru od: ”. Pole edycyjne przeznaczone do wybrania daty, poprzedzone etykietą: „do: ”. Przycisk „Wyszukaj” wysyłający dane z formularza do skryptu.
method="post" bez action - dane wracają do tego samego pliku (R.3.2). „Metoda bezpieczna” w rozumieniu arkusza to POST (tak ocenia klucz R.3.2): 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". Pola type="date" z kalendarzem; przeglądarka wysyła datę w formacie RRRR-MM-DD, czyli dokładnie takim, jakiego potrzebuje SQL. Nazwy from i to - pod nimi daty trafią do $_POST (R.2.8, R.3.3).
R.2.9 W bloku głównym umieszczona tabela o 6 kolumnach, wierszu z komórkami nagłówkowymi oraz przynajmniej jednym wierszu z danymi (w skrypcie lub HTML ) zastosowane znaczniki <table>, <tr>, <th>, <td>
ok. 2 min
Polecenie z arkusza
Zawartość bloku głównego: Tabela o sześciu kolumnach. Pierwszy wiersz zawiera komórki nagłówkowe: „Nr zamówienia”, „Nazwisko”, „Imię”, „Kolor”, „Pojemność [ml]”, „Data odbioru”. Zawartość tabeli jest generowana skryptem.
Wiersz nagłówkowy wpisujesz w HTML-u; wiersze z danymi dopisze skrypt wewnątrz tej samej tabeli.
Kroki 20-22 · po tym etapie masz 29 z 37 kryteriów (pkt)
Krok 20: Plik style.css: ciało strony
Kryteria:
R.4.1 Ustawione dla ciała strony lub kontenera całej strony: krój czcionki Georgia, tekst wyśrodkowany, kolor tła LightSteelBlue
ok. 1 min
Polecenie z arkusza
Dla ciała strony: krój czcionki Georgia, tekst wyśrodkowany, kolor tła LightSteelBlue.
Jedna reguła body (R.4.1).
style.cssCSSnowy plik
body {font-family: Georgia;text-align: center;background-color: LightSteelBlue;}
Podgląd strony po tym kroku (index.php)
Krok 21: Formularz, blok główny i stopka
Kryteria: , , ,
R.4.2 Ustawiony kolor tła Orange dla stopki
R.4.4 Ustawiona wysokość 400px dla bloku głównego
R.4.5 Ustawione marginesy wewnętrzne (padding) 30px dla bloku głównego, 10px dla stopki oraz jedynie górny 20px dla bloku formularza lub formularza
R.4.7 Ustawiony dla bloku głównego pasek przewijania (overflow) na auto
ok. 2 min
Polecenie z arkusza
Dla bloku formularza: margines wewnętrzny górny 20 px. Dla bloku głównego: pasek przewijania pojawiający się tylko w przypadku, gdy treść nie mieści się w bloku, marginesy wewnętrzne 30 px, wysokość 400 px. Dla bloku stopki: kolor tła Orange, marginesy wewnętrzne 10 px.
padding-top - tylko górny margines; overflow: auto - pasek tylko przy dłuższej tabeli (23 zamówienia się nie zmieszczą) (R.4.2, R.4.4, R.4.5, R.4.7).
R.4.3 Ustawiona szerokość 80% dla selektora img oraz 70% dla selektora table
R.4.6 Ustawione marginesy zewnętrzne (margin) auto dla tabeli
R.4.8 Ustawione dla tabeli obramowanie 1px dotted Maroon
R.4.9 Gdy kursor znajdzie się na wierszu tabeli kolor tła zmienia się na SteelBlue, a kolor czcionki na biały
ok. 2 min
Polecenie z arkusza
Dla selektora obrazu: szerokość 80%. Dla selektora tabeli: szerokość 70%, marginesy zewnętrzne automatycznie wyliczane przez przeglądarkę, obramowana linią kropkowaną o szerokości 1 px i kolorze Maroon. Gdy kursor znajdzie się na wierszu tabeli kolor tła zmienia się na SteelBlue, a kolor czcionki na biały.
margin: auto wyśrodkowuje tabelę o szerokości 70%. tr:hover - pod kursorem zmienia się cały wiersz, jak przy zamówieniu Wiktorii na ilustracji 4 (R.4.3, R.4.6, R.4.8, R.4.9).
Kroki 23-27 · po tym etapie masz 37 z 37 kryteriów (pkt)
Krok 23: Połączenie z bazą mieszalnia i zamknięcie
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 mieszalnia
R.5.3 Ostatnią operacją na bazie jest jej zamknięcie
ok. 2 min
Polecenie z arkusza
Łączy się z serwerem bazodanowym na localhost, użytkownik root bez hasła, baza danych o nazwie mieszalnia. Na końcu skrypt zamyka połączenie z serwerem.
Skrypt piszesz wewnątrz tabeli, pod wierszem nagłówkowym - to, co wypisze, staną się kolejne wiersze. Połączenie na początku, mysqli_close na końcu (R.5.1, R.5.2, R.5.3). Od tego kroku podgląd to wynik prawdziwego uruchomienia w PHP.
R.2.9 W bloku głównym umieszczona tabela o 6 kolumnach, wierszu z komórkami nagłówkowymi oraz przynajmniej jednym wierszu z danymi (w skrypcie lub HTML ) zastosowane znaczniki <table>, <tr>, <th>, <td>
R.5.6 Skrypt w odpowiednich komórkach wierszy tabeli wyświetla wartości pobrane z bazy danych
ok. 3 min
Polecenie z arkusza
Poszczególne wiersze zwrócone zapytaniem są wyświetlane w odpowiednich kolumnach tabeli, w bloku głównym.
Kolejność kolumn tabeli (nr, nazwisko, imię, kolor, pojemność, data) różni się od kolejności w SELECT (nazwisko, imię, id…), więc pierwszą komórką jest $row[2] - numer zamówienia, potem $row[0] i $row[1]. Podgląd: 23 zamówienia od 2021-08-18 (R.2.9, R.5.6).
R.5.7 Ustawione dla komórek tabeli z kolumny z kolorem formatowanie koloru tła na podstawie kodu koloru wpisanego do bazy np. <td style='background-color: #$wiersz[3]'>. Kolory odpowiednio wyświetlają się na stronie internetowej
ok. 2 min
Polecenie z arkusza
Tło komórek w kolumnie z kolorem farby ustawiane jest zgodnie z kodem szesnastkowym koloru zapisanym dla tego wiersza w bazie.
Komórka koloru dostaje styl w atrybucie: style="background-color: #1b69aa". W bazie kod jest bez #, więc dopisujesz go przed zmienną. Cudzysłowy atrybutu w napisie PHP poprzedzasz ukośnikiem. Każdy wiersz pokazuje teraz próbkę swojej farby, jak na ilustracji 4 (R.5.7).
Typowe błędy
Bez # przed kodem (background-color: 1b69aa) przeglądarka odrzuca wartość i komórka zostaje bez koloru.
R.5.4 Skrypt zawiera instrukcję wysyłającą zapytanie 2 gdy nie wypełniono formularza. W przeciwnym wypadku zawiera instrukcję wysyłającą zmodyfikowane zapytanie 3, tak że w miejscu dat są wartości z formularza
R.5.5 Skrypt zawiera instrukcję pobierającą dane z tablicy globalnej odpowiadającej zastosowanej metodzie wysłania danych z formularza ($_POST, $_GET, $_REQUEST)
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
Gdy nie wypełniono formularza, wysyła zapytanie 2, w przeciwnym wypadku wysyła zmodyfikowane zapytanie 3, w ten sposób, że do zapytania pobierane są daty z formularza.
!empty sprawdza, czy pole istnieje i nie jest puste - po kliknięciu „Wyszukaj” bez dat pola przychodzą jako puste napisy i wtedy też zostaje zapytanie 2. Gdy obie daty są wpisane, odczytujesz je z $_POST i wstawiasz w zapytanie 3 zamiast stałych dat. Reszta skryptu (pętla, tło komórki) działa dla obu zapytań bez zmian. Podgląd pokazuje stan po wybraniu dat od 2021-11-06 do 2021-11-10: trzy zamówienia - jak na ilustracji 5 (R.5.4, R.5.5, R.5.8).
Typowe błędy
isset zamiast !empty przepuszcza puste daty: zapytanie z BETWEEN '' AND '' zwraca pustą tabelę zamiast wszystkich zamówień.
Krok 28 · po tym etapie masz 37 z 37 kryteriów (pkt)
Krok 28: Zapytanie przygotowane, sprawdzenie dat i koloru
ok. 5 min
Polecenie z arkusza
W przeciwnym wypadku wysyła zmodyfikowane zapytanie 3, w ten sposób, że do zapytania pobierane są daty z formularza.
Pole type="date" przyjmuje w przeglądarce tylko datę, ale żądanie da się wysłać z pominięciem formularza - z dowolnym tekstem w from i to, który w wersji z egzaminu trafia wprost do zapytania (to samo SQL injection co w wyszukiwarkach z innych arkuszy). Poprawki:
sprawdzenie dat: DateTime::createFromFormat("Y-m-d", ...) z porównaniem z powrotem - tylko poprawna, istniejąca data włącza filtr; inaczej wszystkie zamówienia,
zapytanie przygotowane z dwoma ? i typami "ss",
kod koloru wstawiany do atrybutu style przepuszczasz tylko, gdy to dokładnie sześć cyfr szesnastkowych - inaczej ktoś, kto zmieni dane w bazie, mógłby wstrzyknąć własny styl albo zamknąć atrybut,
mysqli_fetch_assoc, (int) dla liczb i htmlspecialchars dla tekstów.
Podgląd po zmianie wygląda tak samo (te same daty z formularza). Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.
Krok 29 · po tym etapie masz 37 z 37 kryteriów (pkt)
Krok 29: 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: index.php, style.css, kwerendy.txt, import.jpg, kw1.png - kw4.png, baner.png, fav.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.