INF.03-05-25.01-SGStyczeń 2025 · 37 kroków · ok. 72 min · 37 kryteriów z klucza
Rozwiązanie krok po kroku: Firma szkoleniowa (Wersja podstawowa)
Rozwiązanie buduje stronę firmy szkoleniowej: baza firma z trenerami, szkoleniami, słuchaczami i zapisami oraz cztery zapytania - sortowanie, złączenie tabel, grupowanie z liczeniem i zmiana nazwy kolumnyALTER TABLE ... CHANGE, potem baner z gradientem i fragmentem kodu w perspektywie, dwie strony - statyczna index.html i szkolenia.php, która wypisuje szkolenia z bazy i jednocześnie zapisuje je do pliku tekstowego harmonogram.txt - i style w style.css.
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_fetch_row, fopen i fwrite), a na końcu zostaje przerobiony na wersję z prawdziwych projektów: sprawdzenie otwarcia pliku, htmlspecialchars i zapis całego pliku jednym poleceniem.
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, w którym skrypt najpierw pobiera dane, a potem jednym poleceniem zapisuje plik i wypisuje akapity - obie wersje są zgodne z kluczem.
Baza i obraz z kodem pochodzą z prawdziwego archiwum pliki8 (załącznik do arkusza, hasło w treści zadania). Wyniki zapytań i zrzuty są policzone na MariaDB 10.4 - tej samej, która jest w XAMPP. Podgląd strony PHP to wynik prawdziwego uruchomienia kodu z danego kroku w PHP 8.2, a plik harmonogram.txt pokazany w krokach to dokładnie to, co zapisał skrypt.
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 firma
Kryteria:
R.1.1 Wykonany import tabel do bazy danych firma , co jest udokumentowane w pliku import w formacie JPEG
ok. 2 min
Polecenie z arkusza
Utwórz bazę danych o nazwie firma, z zestawem polskich znaków (np. utf8_unicode_ci).
Rozpakuj pliki8.7z z pulpitu (hasło SzkoL3Nia%) do folderu z numerem zdającego: firma.sql i obraz kod.jpg. W phpMyAdmin: Nowa, nazwa firma, porównywanie z polskimi znakami, np. utf8_unicode_ci.
Krok 2: Import tabel z pliku firma.sql
Kryteria:
R.1.1 Wykonany import tabel do bazy danych firma , co jest udokumentowane w pliku import w formacie JPEG
ok. 2 min
Polecenie z arkusza
Do utworzonej bazy zaimportuj tabele z pliku firma.sql z rozpakowanego archiwum.
Wybierz bazę firma, Import → firma.sql → Wykonaj. Cztery tabele z ilustracji 1 w relacjach jeden do wielu: trenerzy (6) → szkolenia (18, pole Id_trenera) → zapisy (pole Id_szkolenia) ← sluchacze (pole Id_klienta). Nazwy kolumn zaczynają się wielką literą (Data, Temat, Imie) - w zapytaniach piszesz je tak samo.
Krok 3: Zrzut ekranu import.jpg
Kryteria:
R.1.1 Wykonany import tabel do bazy danych firma , 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, wklejasz do edytora grafiki i zapisujesz 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: szkolenia według daty
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 jedynie daty i tematy szkoleń posortowane rosnąco według daty szkolenia. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT Data, Temat FROM szkolenia ORDER BY Data; (opcjonalnie ASC ) oraz wynik działania udokumentowany zrzutem informującym o wybraniu dokładnie 18 rekordów, pierwszym jest 2021-09-20 Podstawy języka C++; nie wszystkie rekordy muszą być widoczne
ok. 2 min
Polecenie z arkusza
Zapytanie 1: wybierające jedynie daty i tematy szkoleń posortowane rosnąco według daty szkolenia.
SELECT Data, Temat FROM szkolenia - dwie kolumny,
ORDER BY Data - rosnąco, czyli od najwcześniejszej daty; ASC jest domyślne.
Wynik: 18 wierszy, pierwszy 2021-09-20 „Podstawy języka C++” - jak w kluczu. phpMyAdmin pokazuje nad tabelą „Pokazano wiersze 0 - 17 (18 łącznie)” i ten napis klucz uznaje, nawet gdy nie wszystkie wiersze mieszczą się na ekranie. Zapytanie do kwerendy.txt, zrzut kw1.png. To samo zapytanie wyśle skrypt PHP.
kwerendy.txtTekstnowy plik
-- Zapytanie 1SELECT Data, Temat FROM szkolenia ORDER BY Data;
Podgląd strony po tym kroku
Krok 5: Zapytanie 2: szkolenia z trenerami
Kryteria:
R.1.4 Wykonane zapytanie 2 wybierające jedynie daty i tematy szkoleń oraz odpowiadające im nazwiska i imiona trenerów. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT Data, Temat, Nazwisko, Imie FROM szkolenia JOIN trenerzy ON trenerzy.Id = szkolenia.Id_trenera; (możliwe również INNER JOIN lub porównanie kluczy po WHERE ) oraz wynik działania udokumentowany zrzutem informującym o wybraniu dokładnie 18 rekordów; nie wszystkie rekordy muszą być widoczne
ok. 3 min
Polecenie z arkusza
Zapytanie 2: wybierające jedynie daty i tematy szkoleń oraz odpowiadające im nazwiska i imiona trenerów. Należy posłużyć się relacją.
FROM szkolenia JOIN trenerzy - złączenie,
ON trenerzy.Id = szkolenia.Id_trenera - klucz obcy szkolenia wskazuje trenera. Kolumna Id jest w obu tabelach, więc trzeba ją poprzedzić nazwą tabeli; USING tu nie zadziała, bo pola mają różne nazwy.
Wynik: 18 wierszy - każde szkolenie z jednym trenerem. Zrzut: kw2.png.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT Data, Temat FROM szkolenia ORDER BY Data;-- Zapytanie 2SELECT Data, Temat, Nazwisko, Imie FROM szkolenia JOIN trenerzy ON trenerzy.Id = szkolenia.Id_trenera;
Podgląd strony po tym kroku
Krok 6: Zapytanie 3: liczba szkoleń każdego trenera
Kryteria:
R.1.5 Wykonane zapytanie 3 wybierające dla każdego trenera jedynie jego imię i nazwisko oraz zliczające liczbę jego szkoleń. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT Imie, Nazwisko, COUNT(*) FROM trenerzy JOIN szkolenia ON trenerzy.Id = Id_trenera GROUP BY trenerzy.Id; (po GROUP BY też poprawne pole Nazwisko ) oraz wynik działania udokumentowany zrzutem, na którym znajdują się jedynie rekordy: Tomasz Duda 2, Mateusz Kossakowski 3, Sebastian Królik 3, Maria Przepiórkowska 5, Nikodem Ptak 3, Kinga Stopyra 2
ok. 3 min
Polecenie z arkusza
Zapytanie 3: wybierające dla każdego trenera jedynie jego imię i nazwisko oraz zliczające liczbę jego szkoleń. Należy posłużyć się relacją.
JOIN ... ON trenerzy.Id = Id_trenera - każde szkolenie przy swoim trenerze,
GROUP BY trenerzy.Id - wiersze jednego trenera zwijają się w jeden; grupujesz po kluczu, bo dwóch trenerów mogłoby mieć to samo nazwisko,
COUNT(*) - liczba wierszy w grupie, czyli szkoleń.
Wynik: sześciu trenerów - Duda 2, Kossakowski 3, Królik 3, Przepiórkowska 5, Ptak 3, Stopyra 2 - jak w kluczu. Zrzut: kw3.png.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT Data, Temat FROM szkolenia ORDER BY Data;-- Zapytanie 2SELECT Data, Temat, Nazwisko, Imie FROM szkolenia JOIN trenerzy ON trenerzy.Id = szkolenia.Id_trenera;-- Zapytanie 3SELECT Imie, Nazwisko, COUNT(*) FROM trenerzy JOIN szkolenia ON trenerzy.Id = Id_trenera GROUP BY trenerzy.Id;
Podgląd strony po tym kroku
Krok 7: Zapytanie 4: nowa nazwa kolumny
Kryteria:
R.1.6 Wykonane zapytanie 4 zmieniające w tabeli zapisy nazwę kolumny id_klienta na id_sluchacza. W pliku z kwerendami lub na zrzucie istnieje zapis np.: ALTER TABLE zapisy CHANGE COLUMN Id_klienta Id_sluchacza INT; oraz wynik działania udokumentowany zrzutem, na którym jest widoczny komunikat o pomyślnie wykonanej kwerendzie lub widoczna zmieniona struktura tabeli
ok. 3 min
Polecenie z arkusza
Zapytanie 4: zmieniające w tabeli zapisy nazwę kolumny Id_klienta na Id_sluchacza.
CHANGE COLUMN stara nowa typ zmienia nazwę kolumny, ale wymaga podania typu na nowo - przepisujesz go z budowy tabeli: INT(11) DEFAULT NULL, żeby kolumna nie zmieniła niczego poza nazwą. Krótsze RENAME COLUMN Id_klienta TO Id_sluchacza w XAMPP nie zadziała: XAMPP ma MariaDB 10.4, a to polecenie pojawiło się dopiero w 10.5 - sprawdzone, kończy się błędem składni 1064. Zrzut kw4.png: komunikat albo struktura tabeli z kolumną Id_sluchacza.
Typowe błędy
CHANGE COLUMN Id_klienta Id_sluchacza bez typu to błąd składni - typ jest w CHANGE obowiązkowy.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT Data, Temat FROM szkolenia ORDER BY Data;-- Zapytanie 2SELECT Data, Temat, Nazwisko, Imie FROM szkolenia JOIN trenerzy ON trenerzy.Id = szkolenia.Id_trenera;-- Zapytanie 3SELECT Imie, Nazwisko, COUNT(*) FROM trenerzy JOIN szkolenia ON trenerzy.Id = Id_trenera GROUP BY trenerzy.Id;-- Zapytanie 4ALTER TABLE zapisy CHANGE COLUMN Id_klienta Id_sluchacza INT(11) DEFAULT NULL;
Podgląd strony po tym kroku
Etap 2: Grafika i strony HTML
Kroki 8-19 · po tym etapie masz 18 z 37 kryteriów (pkt)
Krok 8: Baner: gradient, kod w perspektywie, napis
Kryteria: , ,
R.2.1 Utworzony plik o nazwie baner.jpg o szerokości 1000 px, wysokości 150 px i tle - gradiencie od koloru czarnego po lewej do białego po prawej stronie
R.2.2 Na grafice banera po lewej stronie jest widoczny fragment kodu, widać jedynie dwie sekcje case. Fragment jest transponowany tak, że widać perspektywę
R.2.3 Na grafice banera po prawej stronie jest umieszczony tekst o treści "Firma szkoleniowa" w czarnym kolorze
ok. 8 min
Polecenie z arkusza
Na potrzeby strony należy przygotować grafikę z banerem o nazwie baner.jpg i cechach: szerokość grafiki 1000 px, wysokość 150 px, tło baneru w formie gradientu od czarnego koloru z lewej do białego przy prawej krawędzi banera. Na pierwszym planie po lewej stronie umieszczona grafika z pliku kod.jpg. Grafika jest skalowana – widoczne dokładnie dwie sekcje case oraz jest transformowana jak na ilustracji 2, tworząc efekt perspektywy. Na pierwszym planie po prawej stronie umieszczony napis o treści „Firma szkoleniowa” w kolorze czarnym.
W GIMP-ie, warstwa po warstwie:
Plik → Nowy1000 × 150; narzędzie Gradient z kolorami czarny (pierwszy plan) i biały (tło), przeciągnięte od lewej do prawej krawędzi z wciśniętym Ctrl (prosta linia),
Plik → Otwórz jako warstwykod.jpg; zaznaczeniem prostokątnym wycinasz fragment z dokładnie dwiema sekcjamicase ('+' i '-', bez początku trzeciej) i skalujesz warstwę, żeby zmieściła się po lewej stronie,
narzędzie Perspektywa (Shift+P): przesuwasz prawe narożniki do środka - lewa krawędź zostaje wysoka, prawa się zwęża i kod „ucieka” w głąb, jak na ilustracji 2,
narzędzie Tekst: „Firma szkoleniowa”, kolor czarny, po prawej stronie,
Eksportuj jakobaner.jpg.
Klucz sprawdza wymiary, gradient, dwie sekcje case z perspektywą i czarny napis (R.2.1 - R.2.3).
Typowe błędy
Kadr z kawałkiem trzeciej sekcji (case '*') nie spełnia „dokładnie dwie sekcje case” (R.2.2).
Podgląd strony po tym kroku
Krok 9: Plik index.html w HTML5
Kryteria:
R.2.4 Witryna internetowa zapisana w plikach index.html i szkolenia.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. 2 min
Polecenie z arkusza
Składa się z dwóch stron o nazwach index.html i szkolenia.php. Cechy wspólne dla obu stron: Zapisane w języku HTML5.
Zbuduj index.html, a szkolenia.php powstanie z jej kopii - różnią się tylko blokiem głównym.
R.2.4 Witryna internetowa zapisana w plikach index.html i szkolenia.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.2.4 Witryna internetowa zapisana w plikach index.html i szkolenia.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.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 #)
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, menu, 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. Dopuszcza się dodatkowe użycie bloków div lub section
ok. 2 min
Polecenie z arkusza
Strona składa się z kontenera, a w nim podział na bloki: nagłówkowy, poniżej obok siebie menu i główny, na dole 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ą 2.
Kontener to <div id="container">, który obejmuje całą stronę - jego tło (pomarańczowe) prześwituje tam, gdzie bloki go nie zakrywają, np. w stopce. Wewnątrz bloki semantyczne: <header>, <nav> (menu), <main> i <footer> (R.2.6). Menu i blok główny ustawisz obok siebie w CSS.
R.2.9 W bloku menu umieszczona jedna lista punktowana z dwoma elementami, zastosowane znaczniki <ul> i <li>
R.3.2 Po kliknięciu na odnośnik "Szkolenia" otwiera się strona szkolenia.php
R.3.3 Po kliknięciu na odnośnik "Strona główna" otwiera się strona index.html
ok. 2 min
Polecenie z arkusza
Zawartość bloku menu: Lista punktowana (nieuporządkowana) z dwoma elementami: odnośnik do pliku index.html o treści „Strona główna” i odnośnik do pliku szkolenia.php o treści „Szkolenia”.
<ul> z dwoma <li>, w każdym odnośnik (R.2.9, R.3.2, R.3.3). Strona szkolenia.php działa tylko przez serwer (XAMPP) - przy otwarciu index.html z dysku kliknięcie pokaże kod PHP zamiast wyniku.
R.2.7 W stopce umieszczony <h2>: „Firma szkoleniowa, ul. Główna 1, 23-456 Warszawa” oraz paragraf z numerem zdającego. Na stronie głównej w bloku głównym umieszczony <h1>: „Zapraszamy do udziału w szkoleniach z branży IT” z dwoma łamaniami wiersza
ok. 1 min
Polecenie z arkusza
Zawartość bloku stopki: Nagłówek drugiego stopnia zawierający napis „Firma szkoleniowa, ul. Główna 1, 23-456 Warszawa”. Akapit (paragraf) zawierający napis „Autor: ”, dalej wstawiony numer zdającego.
<h2> i <p>. Na egzaminie po dwukropku wpisujesz swój numer zdającego (PESEL) - tutaj stoi imię i nazwisko autora rozwiązania.
R.2.7 W stopce umieszczony <h2>: „Firma szkoleniowa, ul. Główna 1, 23-456 Warszawa” oraz paragraf z numerem zdającego. Na stronie głównej w bloku głównym umieszczony <h1>: „Zapraszamy do udziału w szkoleniach z branży IT” z dwoma łamaniami wiersza
ok. 1 min
Polecenie z arkusza
Zawartość bloku głównego dla strony index.html: Nagłówek pierwszego stopnia o treści „Zapraszamy do udziału w szkoleniach z branży IT”. Łamanie wiersza po słowie „udziału” oraz po słowie „szkoleniach”.
Łamanie wiersza to znacznik <br> - dwa razy, dokładnie po wskazanych słowach (R.2.7).
R.4.2 Ustawiony kolor tła #FB8E02 dla kontenera całej strony oraz selektora li, #232323 dla bloku menu, #AEC6E6 dla bloku głównego
R.4.4 Ustawiona szerokość 20% dla bloku menu, 80% dla bloku głównego (width lub grid-template- columns lub flex ) oraz 100% dla obrazu, 95% dla elementu listy
R.4.5 Ustawiona wysokość 450px dla bloków menu i głównego
ok. 1 min
Polecenie z arkusza
Dla bloku menu: kolor tła #232323, szerokość 20%, wysokość 450 px.
R.4.2 Ustawiony kolor tła #FB8E02 dla kontenera całej strony oraz selektora li, #232323 dla bloku menu, #AEC6E6 dla bloku głównego
R.4.4 Ustawiona szerokość 20% dla bloku menu, 80% dla bloku głównego (width lub grid-template- columns lub flex ) oraz 100% dla obrazu, 95% dla elementu listy
R.4.5 Ustawiona wysokość 450px dla bloków menu i głównego
R.4.8 Ustawione dla bloku głównego paski przewijania na scroll
ok. 2 min
Polecenie z arkusza
Dla bloku głównego: kolor tła #AEC6E6, szerokość 80%, wysokość 450 px, paski przewijania zawsze widoczne.
„Zawsze widoczne” to overflow: scroll - paski są nawet przy krótkiej treści (auto pokazywałoby je tylko w razie potrzeby) (R.4.8). 20% + 80% = 100% - bez poziomych marginesów, żeby bloki zmieściły się obok siebie.
R.4.6 Ustawione marginesy wewnętrzne (padding) 2px dla stopki, 50px dla nagłówka stopnia pierwszego, 5px dla elementu listy, oraz margines zewnętrzny górny (margin-top) 10px dla elementu listy
R.4.7 Ustawione wyrównanie tekstu do prawej strony dla stopki
ok. 1 min
Polecenie z arkusza
Dla bloku stopki: marginesy wewnętrzne 2 px, wyrównanie tekstu do prawej strony.
Stopka nie ma własnego tła - widać pomarańczowy kontener.
R.4.4 Ustawiona szerokość 20% dla bloku menu, 80% dla bloku głównego (width lub grid-template- columns lub flex ) oraz 100% dla obrazu, 95% dla elementu listy
R.4.3 Ustawiony kolor czcionki Maroon dla selektora h1 oraz #232323 dla selektora a
R.4.6 Ustawione marginesy wewnętrzne (padding) 2px dla stopki, 50px dla nagłówka stopnia pierwszego, 5px dla elementu listy, oraz margines zewnętrzny górny (margin-top) 10px dla elementu listy
ok. 1 min
Polecenie z arkusza
Dla selektora nagłówka pierwszego stopnia: marginesy wewnętrzne 50 px, kolor czcionki Maroon.
R.4.2 Ustawiony kolor tła #FB8E02 dla kontenera całej strony oraz selektora li, #232323 dla bloku menu, #AEC6E6 dla bloku głównego
R.4.4 Ustawiona szerokość 20% dla bloku menu, 80% dla bloku głównego (width lub grid-template- columns lub flex ) oraz 100% dla obrazu, 95% dla elementu listy
R.4.6 Ustawione marginesy wewnętrzne (padding) 2px dla stopki, 50px dla nagłówka stopnia pierwszego, 5px dla elementu listy, oraz margines zewnętrzny górny (margin-top) 10px dla elementu listy
R.4.9 Ustawiony dla listy punktowanej brak symboli punktorów oraz dla odnośnika brak podkreślenia i rozmiar czcionki 110%
ok. 2 min
Polecenie z arkusza
Dla listy punktowanej: brak symboli punktorów. Dla selektora elementu listy: kolor tła #FB8E02, szerokość 95%, marginesy wewnętrzne 5 px, margines zewnętrzny – górny 10 px.
list-style-type: none usuwa punktory; elementy li stają się pomarańczowymi paskami jak na ilustracji 2 (R.4.2, R.4.4, R.4.6, R.4.9).
R.4.3 Ustawiony kolor czcionki Maroon dla selektora h1 oraz #232323 dla selektora a
R.4.9 Ustawiony dla listy punktowanej brak symboli punktorów oraz dla odnośnika brak podkreślenia i rozmiar czcionki 110%
R.4.10 Gdy kursor myszy znajdzie się na elemencie listy, jego tło zmienia się na #B36501
ok. 2 min
Polecenie z arkusza
Dla selektora odnośnika: brak podkreślenia, kolor czcionki #232323, rozmiar czcionki 110%. Gdy kursor myszy znajdzie się na elemencie listy, jego tło zmienia się na #B36501.
li:hover - pod kursorem ciemnieje cały pasek elementu listy, nie tylko napis (R.4.3, R.4.9, R.4.10).
R.3.1 Układ bloków na stronie po uruchomieniu w przeglądarce jest zgodny z ilustracją 2 w arkuszu egzaminacyjnym (prawidłowo zastosowano właściwości CSS decydujące o układzie strony, np. float i clear albo display flex albo grid albo position )
ok. 2 min
Polecenie z arkusza
Poniżej obok siebie menu i główny, na dole stopka. Podział zrealizowany tak, aby po uruchomieniu w przeglądarce wygląd układu bloków był zgodny z ilustracją 2.
float: left dla nav i main - obok siebie; clear: both dla stopki - pod nimi (R.3.1).
Kroki 30-35 · po tym etapie masz 37 z 37 kryteriów (pkt)
Krok 30: Połączenie z bazą firma
Kryteria: ,
R.5.1 Skrypt jest napisany w języku PHP w pliku szkolenia.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 firma
ok. 2 min
Polecenie z arkusza
Napisany w języku PHP, działa na stronie szkolenia.php. Łączy się z serwerem bazodanowym na localhost, użytkownik root bez hasła, baza danych o nazwie firma.
Skrypt piszesz w bloku głównym - to, co wypisze, stanie się jego treścią. mysqli_connect z czterema argumentami łączy się i wybiera bazę (R.5.1, R.5.2). Od tego kroku podgląd to wynik prawdziwego uruchomienia w PHP.
R.5.5 Zwrócone zapytaniem data i temat szkolenia są wyświetlane w kolejnych paragrafach w bloku głównym
ok. 2 min
Polecenie z arkusza
Zwrócone zapytaniem data i temat szkolenia są oddzielone spacją i wyświetlane jeden pod drugim w osobnych paragrafach w bloku głównym – ilustracja 3.
Pętla while z mysqli_fetch_row przechodzi po 18 wierszach; każdy wypisujesz w osobnym <p>, datę i temat oddzielone spacją. Akapity są blokowe, więc stoją jeden pod drugim. Podgląd: 18 szkoleń od 2021-09-20 „Podstawy języka C++”, a blok główny ma paski przewijania - jak na ilustracji 3 (R.5.5).
szkolenia.phpPHPzmienione: 3 linie
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Firma szkoleniowa</title> <linkrel="stylesheet"href="style.css"></head><body> <divid="container"> <header> <imgsrc="baner.jpg"alt="Szkolenia"> </header> <nav> <ul> <li><ahref="index.html">Strona główna</a></li> <li><ahref="szkolenia.php">Szkolenia</a></li> </ul> </nav> <main><?php$connection = mysqli_connect("localhost", "root", "", "firma");$query = "SELECT Data, Temat FROM szkolenia ORDER BY Data;";$result = mysqli_query($connection, $query);while ($row = mysqli_fetch_row($result)) {echo"<p>$row[0]$row[1]</p>"; }?> </main> <footer> <h2>Firma szkoleniowa, ul. Główna 1, 23-456 Warszawa</h2> <p>Autor: Bartosz Bryniarski</p> </footer> </div></body></html>
Podgląd strony po tym kroku (szkolenia.php)
Krok 33: Otwarcie pliku harmonogram.txt do zapisu
Kryteria:
R.5.6 Skrypt tworzy / otwiera do zapisu plik harmonogam.txt
ok. 2 min
Polecenie z arkusza
Dodatkowo zwrócone zapytaniem wiersze są zapisywane jako osobne linie w pliku tekstowym o nazwie harmonogram.txt.
fopen("harmonogram.txt", "w") otwiera plik do zapisu - tryb "w" (write) tworzy go, gdy nie istnieje, a istniejący czyści. Plik powstaje w tym samym folderze co skrypt. Uchwyt pliku trzymasz w $file (R.5.6). W kluczu nazwa ma literówkę („harmonogam.txt”) - piszesz tak, jak w treści arkusza.
szkolenia.phpPHPzmienione: 1 linia
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Firma szkoleniowa</title> <linkrel="stylesheet"href="style.css"></head><body> <divid="container"> <header> <imgsrc="baner.jpg"alt="Szkolenia"> </header> <nav> <ul> <li><ahref="index.html">Strona główna</a></li> <li><ahref="szkolenia.php">Szkolenia</a></li> </ul> </nav> <main><?php$connection = mysqli_connect("localhost", "root", "", "firma");$query = "SELECT Data, Temat FROM szkolenia ORDER BY Data;";$result = mysqli_query($connection, $query);$file = fopen("harmonogram.txt", "w");while ($row = mysqli_fetch_row($result)) {echo"<p>$row[0]$row[1]</p>"; }?> </main> <footer> <h2>Firma szkoleniowa, ul. Główna 1, 23-456 Warszawa</h2> <p>Autor: Bartosz Bryniarski</p> </footer> </div></body></html>
R.5.7 Zwrócone zapytaniem rekordy danych są zapisywane jako osobne linie w utworzonym pliku. Należy sprawdzić działanie na pliku
ok. 2 min
Polecenie z arkusza
Dodatkowo zwrócone zapytaniem wiersze są zapisywane jako osobne linie w pliku tekstowym o nazwie harmonogram.txt.
W tej samej pętli fwrite dopisuje do pliku datę i temat, zakończone znakiem nowej linii "\n" - bez niego wszystkie szkolenia skleiłyby się w jedną linię. Obok kodu widać plik harmonogram.txt dokładnie taki, jaki zapisał skrypt przy uruchomieniu: 18 linii (R.5.7).
harmonogram.txtTekstnowy plik
2021-09-20 Podstawy języka C++2021-09-30 Photoshop dla zaawansowanych2021-10-01 Podstawy języka Python2021-10-02 Systemy operacyjne2021-10-07 Aplikacje Webowe2021-10-15 Python dla zaawansowanych2021-10-21 Techologia druku 3D2021-10-22 PHP - poziom podstawowy2021-11-10 Animacje komputerowe2021-11-15 Administracja systemem Linux2021-11-21 PHP - poziom średniozaawansowany2021-11-28 HTML i CSS dla zaawansowanych2021-11-30 Programowanie obiektowe w C++2021-12-06 Windows Serwer - usługi2021-12-07 PHP - poziom zaawansowany2021-12-10 C++ dla zaawansowanych2021-12-15 Obsługa drukarek 3D2021-12-16 Obsługa programu GIMP
szkolenia.phpPHPzmienione: 1 linia
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Firma szkoleniowa</title> <linkrel="stylesheet"href="style.css"></head><body> <divid="container"> <header> <imgsrc="baner.jpg"alt="Szkolenia"> </header> <nav> <ul> <li><ahref="index.html">Strona główna</a></li> <li><ahref="szkolenia.php">Szkolenia</a></li> </ul> </nav> <main><?php$connection = mysqli_connect("localhost", "root", "", "firma");$query = "SELECT Data, Temat FROM szkolenia ORDER BY Data;";$result = mysqli_query($connection, $query);$file = fopen("harmonogram.txt", "w");while ($row = mysqli_fetch_row($result)) {echo"<p>$row[0]$row[1]</p>";fwrite($file, "$row[0]$row[1]\n"); }?> </main> <footer> <h2>Firma szkoleniowa, ul. Główna 1, 23-456 Warszawa</h2> <p>Autor: Bartosz Bryniarski</p> </footer> </div></body></html>
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. 1 min
Polecenie z arkusza
Na końcu działania skrypt zamyka połączenie z serwerem.
fclose zamyka plik (zapisuje bufor na dysk), a mysqli_close jako ostatnia operacja zamyka połączenie z bazą (R.5.3). Zmienne nazwane po angielsku mówią, co przechowują (R.5.8).
harmonogram.txtTekstzmienione: 0 linii
2021-09-20 Podstawy języka C++2021-09-30 Photoshop dla zaawansowanych2021-10-01 Podstawy języka Python2021-10-02 Systemy operacyjne2021-10-07 Aplikacje Webowe2021-10-15 Python dla zaawansowanych2021-10-21 Techologia druku 3D2021-10-22 PHP - poziom podstawowy2021-11-10 Animacje komputerowe2021-11-15 Administracja systemem Linux2021-11-21 PHP - poziom średniozaawansowany2021-11-28 HTML i CSS dla zaawansowanych2021-11-30 Programowanie obiektowe w C++2021-12-06 Windows Serwer - usługi2021-12-07 PHP - poziom zaawansowany2021-12-10 C++ dla zaawansowanych2021-12-15 Obsługa drukarek 3D2021-12-16 Obsługa programu GIMP
szkolenia.phpPHPzmienione: 2 linie
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Firma szkoleniowa</title> <linkrel="stylesheet"href="style.css"></head><body> <divid="container"> <header> <imgsrc="baner.jpg"alt="Szkolenia"> </header> <nav> <ul> <li><ahref="index.html">Strona główna</a></li> <li><ahref="szkolenia.php">Szkolenia</a></li> </ul> </nav> <main><?php$connection = mysqli_connect("localhost", "root", "", "firma");$query = "SELECT Data, Temat FROM szkolenia ORDER BY Data;";$result = mysqli_query($connection, $query);$file = fopen("harmonogram.txt", "w");while ($row = mysqli_fetch_row($result)) {echo"<p>$row[0]$row[1]</p>";fwrite($file, "$row[0]$row[1]\n"); }fclose($file); mysqli_close($connection);?> </main> <footer> <h2>Firma szkoleniowa, ul. Główna 1, 23-456 Warszawa</h2> <p>Autor: Bartosz Bryniarski</p> </footer> </div></body></html>
Krok 36 · po tym etapie masz 37 z 37 kryteriów (pkt)
Krok 36: Zapis pliku jednym poleceniem i sprawdzenie błędu
ok. 4 min
Polecenie z arkusza
Dodatkowo zwrócone zapytaniem wiersze są zapisywane jako osobne linie w pliku tekstowym o nazwie harmonogram.txt.
Wersja z egzaminu nie sprawdza, czy plik dało się otworzyć - przy braku uprawnień do folderu fopen zwraca false, a każde fwrite kończy się ostrzeżeniem. Poprawki:
linie zbierasz w tablicy $lines, a file_put_contents zapisuje cały plik jednym poleceniem (sam otwiera i zamyka plik); wynik false oznacza błąd - wtedy komunikat na stronie,
PHP_EOL - znak końca linii właściwy dla systemu serwera,
mysqli_fetch_assoc - pola po nazwach ($training["Temat"]),
htmlspecialchars przy wypisywaniu danych z bazy.
Plik i strona wychodzą takie same jak wcześniej. Wersja z egzaminu zostaje w komentarzu. Na egzaminie wystarczy wersja wcześniejsza - klucz sprawdza fopen/zapis linii i tego nie wymaga.
harmonogram.txtTekstzmienione: 0 linii
2021-09-20 Podstawy języka C++2021-09-30 Photoshop dla zaawansowanych2021-10-01 Podstawy języka Python2021-10-02 Systemy operacyjne2021-10-07 Aplikacje Webowe2021-10-15 Python dla zaawansowanych2021-10-21 Techologia druku 3D2021-10-22 PHP - poziom podstawowy2021-11-10 Animacje komputerowe2021-11-15 Administracja systemem Linux2021-11-21 PHP - poziom średniozaawansowany2021-11-28 HTML i CSS dla zaawansowanych2021-11-30 Programowanie obiektowe w C++2021-12-06 Windows Serwer - usługi2021-12-07 PHP - poziom zaawansowany2021-12-10 C++ dla zaawansowanych2021-12-15 Obsługa drukarek 3D2021-12-16 Obsługa programu GIMP
szkolenia.phpPHPzmienione: 15 linii
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Firma szkoleniowa</title> <linkrel="stylesheet"href="style.css"></head><body> <divid="container"> <header> <imgsrc="baner.jpg"alt="Szkolenia"> </header> <nav> <ul> <li><ahref="index.html">Strona główna</a></li> <li><ahref="szkolenia.php">Szkolenia</a></li> </ul> </nav> <main><?php$connection = mysqli_connect("localhost", "root", "", "firma");$result = mysqli_query($connection, "SELECT Data, Temat FROM szkolenia ORDER BY Data;");$lines = [];while ($training = mysqli_fetch_assoc($result)) {$line = $training["Data"] . "" . $training["Temat"];echo"<p>" . htmlspecialchars($line) . "</p>";$lines[] = $line; }if (file_put_contents("harmonogram.txt", implode(PHP_EOL, $lines) . PHP_EOL) === false) {echo"<p>Nie udało się zapisać pliku harmonogram.txt.</p>"; } mysqli_close($connection);/* Wersja z egzaminu: $query = "SELECT Data, Temat FROM szkolenia ORDER BY Data;"; $result = mysqli_query($connection, $query); $file = fopen("harmonogram.txt", "w"); while ($row = mysqli_fetch_row($result)) { echo "<p>$row[0] $row[1]</p>"; fwrite($file, "$row[0] $row[1]\n"); } fclose($file); mysqli_close($connection); */?> </main> <footer> <h2>Firma szkoleniowa, ul. Główna 1, 23-456 Warszawa</h2> <p>Autor: Bartosz Bryniarski</p> </footer> </div></body></html>
Krok 37 · po tym etapie masz 37 z 37 kryteriów (pkt)
Krok 37: 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.
Przed nagraniem otwierasz szkolenia.php przez http://localhost/..., żeby skrypt utworzył harmonogram.txt - egzaminator sprawdza ten plik (R.5.7). W folderze: baner.jpg, import.jpg, index.html, kw1.png - kw4.png, kwerendy.txt, przeglądarka.txt, style.css, szkolenia.php i harmonogram.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.