Przejdź do głównej treści
INF.03-04-24.01-SGStyczeń 2024 · 31 kroków · ok. 59 min · 33 kryteria z klucza

Rozwiązanie krok po kroku: Kalendarz z bazą danych (Wersja podstawowa)

Rozwiązanie buduje terminarz na lipiec: baza terminarz z jedną tabelą zadania i cztery zapytania - unikalne wartości z zakresu dat (DISTINCT, BETWEEN), filtr po miesiącu, wyszukiwanie po pierwszej literze (LIKE 'S%') i aktualizacja UPDATE, potem logo przeskalowane do 140 px, strona kalendarz.php z dwoma blokami banera i kalendarzem, w którym każdy dzień jest osobnym blokiem wygenerowanym przez PHP, style w styl6.css i pusta na razie strona sierpien.html. Dwa skrypty PHP: pierwszy wypisuje w banerze najbliższe zadania rozdzielone średnikami, drugi buduje bloki dni.

To jest wersja podstawowa. W zakładce „Nowoczesny kod (grid, PDO)” jest drugi sposób rozwiązania tego samego arkusza: zapytanie 2 po dacie i z sortowaniem, układ na siatce CSS, dane pobierane przez PDO na początku pliku, a w treści strony tylko wyświetlanie - obie wersje są zgodne z kluczem.

Kroki idą zdanie po zdaniu za treścią arkusza - przy każdym jest polecenie z arkusza, a kod pokazuje dokładnie te linie, które je spełniają. Skrypty są najpierw pisane najprościej (mysqli_query, mysqli_fetch_row), a na końcu zostają przerobione na wersję z prawdziwych projektów.

Baza i logo pochodzą z prawdziwego archiwum materialy4 (załącznik do arkusza, hasło w treści zadania). Zapytania i zrzuty są policzone na MariaDB 10.4 - tej samej, która jest w XAMPP. Podgląd strony to wynik prawdziwego uruchomienia kodu z danego kroku w PHP 8.2 - na bazie po zapytaniu 4, tak jak na obrazie 2 (18 lipca „Wycieczka nad morze”).

Jak liczą się punkty. Klucz ma 33 kryteria (R.1.1 - R.5.7), każde za 1 punkt. Próg zdania części praktycznej to 75%, czyli 25 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.

  1. Etap 1: Baza danych

    Kroki 1-7 · po tym etapie masz 6 z 33 kryteriów (pkt)

    Krok 1: Baza danych terminarz

    Kryteria:

    R.1.1 Wykonano import tabel do bazy danych terminarz czynność udokumentowano plikiem o nazwie import w formacie PNG

    ok. 2 min
    Polecenie z arkusza

    Utwórz bazę danych o nazwie terminarz.

    Rozpakuj materialy4.7z z pulpitu (hasło kaL(end)arz%) do folderu z numerem zdającego: baza.sql, logo1.png i logo2.png. W phpMyAdmin: Nowa, nazwa terminarz.

  2. Krok 2: Import tabeli z pliku baza.sql

    Kryteria:

    R.1.1 Wykonano import tabel do bazy danych terminarz czynność udokumentowano plikiem o nazwie import w formacie PNG

    ok. 2 min
    Polecenie z arkusza

    Do bazy terminarz zaimportuj tabele z pliku baza.sql z rozpakowanego archiwum.

    Import → baza.sql. Tabela zadania z obrazu 1: 63 dni (lipiec i sierpień 2020) z datą, wpisem (często pustym), nazwą miesiąca i rokiem.

  3. Krok 3: Zrzut ekranu import.png

    Kryteria:

    R.1.1 Wykonano import tabel do bazy danych terminarz czynność udokumentowano plikiem o nazwie import w formacie PNG

    ok. 2 min
    Polecenie z arkusza

    Wykonaj zrzut ekranu po imporcie. Zrzut zapisz w formacie PNG pod nazwą import. Nie kadruj zrzutu. Zrzut powinien obejmować cały ekran monitora, z widocznym paskiem zadań. Na zrzucie powinny być widoczne elementy wskazujące na poprawnie wykonany import tabel.

    Print Screen i zapis jako import.png. Uwaga: zrzuty zapytań mają być w JPEG (kw1.jpg - kw4.jpg), a zrzut importu - w PNG.

    Typowe błędy

    Wykadrowany zrzut albo zrzut bez paska zadań nie jest oceniany.

  4. Krok 4: Zapytanie 1: wpisy z pierwszego tygodnia lipca

    Kryteria: ,

    R.1.2 Zapisano plik kwerendy.txt zawierający co najmniej jedno zapytanie SQL, wynikające z treści zadania

    R.1.3 Wykonano zapytanie 1 wybierające jedynie niepowtarzające się wartości z pola wpis dla zadań z pierwszych 7 dni lipca oraz takich, gdzie pole wpis nie jest puste. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT DISTINCT wpis FROM zadania WHERE dataZadania <= '2020-07-07' AND wpis <> ''; (możliwe również wpis != '', dodatkowo AND dataZadania >= '2020-07-01') oraz wynik działania udokumentowano zrzutem ekranu, na którym są widoczne jedynie dwie dane: Projekt z programowania oraz Weterynarz - Brutus

    ok. 3 min
    Polecenie z arkusza

    Zapytanie 1: wybierające jedynie niepowtarzające się wartości z pola wpis dla zadań z pierwszych 7 dni lipca roku 2020 (od 1 do 7 lipca) oraz takich, gdzie pole wpis nie jest puste.

    Zapytanie czytasz klauzula po klauzuli:

    • SELECT DISTINCT wpis - „niepowtarzające się”: „Projekt z programowania” jest wpisany 1 i 2 lipca, a w wyniku ma wystąpić raz,
    • WHERE dataZadania BETWEEN '2020-07-01' AND '2020-07-07' - przedział z oboma końcami, czyli od 1 do 7 lipca włącznie,
    • AND wpis <> '' - pusty wpis to w tej tabeli pusty napis '', a <> znaczy „różny od”.

    Wynik: dwa wpisy - „Projekt z programowania” i „Weterynarz - Brutus”, jak w kluczu. Zapytanie do kwerendy.txt, zrzut kw1.jpg - z widocznym zapytaniem, bo arkusz tego wymaga. To zapytanie wyśle Skrypt 1.

    Typowe błędy

    Bez wpis <> '' w wyniku pojawi się też pusty wiersz - pięć pustych dni zlewa się przez DISTINCT w jeden.

    kwerendy.txt Tekst nowy plik
    -- Zapytanie 1
    SELECT DISTINCT wpis FROM zadania WHERE dataZadania BETWEEN '2020-07-01' AND '2020-07-07' AND wpis <> '';
    Podgląd strony po tym kroku
    Podgląd strony po kroku 4
  5. Krok 5: Zapytanie 2: zadania z lipca

    Kryteria:

    R.1.4 Wykonano zapytanie 2 wybierające jedynie pola dataZadania i wpis dla zadań z miesiąca lipca. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT dataZadania, wpis FROM zadania WHERE miesiac='lipiec'; (poprawne też dataZadania LIKE "____-07-__" lub użyto %) oraz wynik działania udokumentowano zrzutem, na którym widoczny jest w komunikacie zapis o liczbie rekordów "(31 ogółem...)", rekordy są jedynie z lipca, jedynie pola dataZadania i wpis. Zrzut nie musi zawierać wszystkich zwróconych zapytaniem wierszy

    ok. 2 min
    Polecenie z arkusza

    Zapytanie 2: wybierające jedynie pola dataZadania i wpis dla zadań z miesiąca lipca.

    • SELECT dataZadania, wpis - dwie kolumny,
    • WHERE miesiac = 'lipiec' - tabela ma osobne pole z nazwą miesiąca, więc najprościej filtrować po nim (działa też dataZadania LIKE '2020-07-%').

    Wynik: 31 wierszy, komunikat phpMyAdmin „(31 ogółem)”. Zrzut kw2.jpg nie musi mieścić wszystkich wierszy. To zapytanie wyśle Skrypt 2 - każdy wiersz stanie się blokiem kalendarza.

    kwerendy.txt Tekst zmienione: 3 linie
    -- Zapytanie 1
    SELECT DISTINCT wpis FROM zadania WHERE dataZadania BETWEEN '2020-07-01' AND '2020-07-07' AND wpis <> '';
    
    -- Zapytanie 2
    SELECT dataZadania, wpis FROM zadania WHERE miesiac = 'lipiec';
    Podgląd strony po tym kroku
    Podgląd strony po kroku 5
  6. Krok 6: Zapytanie 3: wpisy na literę S

    Kryteria:

    R.1.5 Wykonano zapytanie 3 wybierające jedynie pole miesiac i wpis dla wpisów zaczynających się na literę „S”. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT miesiac, wpis FROM zadania WHERE wpis LIKE "S%"; oraz wynik działania udokumentowano zrzutem, na którym widoczne jest jedynie: lipiec Szczepienie, sierpien Sopot, sierpien Sopot

    ok. 2 min
    Polecenie z arkusza

    Zapytanie 3: wybierające jedynie pole miesiac i wpis dla wpisów zaczynających się na literę „S”.

    • LIKE 'S%' - napis zaczynający się od „S”, a po nim cokolwiek (%).

    Wynik: trzy wiersze - lipiec „Szczepienie” i dwa razy sierpień „Sopot”, jak w kluczu. Zrzut kw3.jpg.

    Typowe błędy

    LIKE '%S%' szuka litery S w dowolnym miejscu - nie tylko na początku wpisu.

    kwerendy.txt Tekst zmienione: 3 linie
    -- Zapytanie 1
    SELECT DISTINCT wpis FROM zadania WHERE dataZadania BETWEEN '2020-07-01' AND '2020-07-07' AND wpis <> '';
    
    -- Zapytanie 2
    SELECT dataZadania, wpis FROM zadania WHERE miesiac = 'lipiec';
    
    -- Zapytanie 3
    SELECT miesiac, wpis FROM zadania WHERE wpis LIKE 'S%';
    Podgląd strony po tym kroku
    Podgląd strony po kroku 6
  7. Krok 7: Zapytanie 4: nowy wpis na 18 lipca

    Kryteria:

    R.1.6 Wykonano zapytanie 4 aktualizujące pole wpis dla zadania w dniu 2020-07-18, nowy wpis to „Wycieczka nad morze”. W pliku z kwerendami lub na zrzucie istnieje zapis np.: UPDATE zadania SET wpis='Wycieczka nad morze' WHERE dataZadania = '2020-07-18'; oraz wynik działania udokumentowano zrzutem, na którym widoczny jest komunikat o poprawnej aktualizacji lub tabela ze zaktualizowanym wpisem

    ok. 2 min
    Polecenie z arkusza

    Zapytanie 4: aktualizujące pole wpis dla zadania w dniu 2020-07-18, nowy wpis to „Wycieczka nad morze”.

    • UPDATE zadania SET wpis = 'Wycieczka nad morze' - nowa wartość pola,
    • WHERE dataZadania = '2020-07-18' - tylko w wierszu tego dnia; wcześniej był tam wpis „Wyjazd na wakacje!”.

    phpMyAdmin pokazuje „1 wiersz zmieniony”. Zrzut kw4.jpg. Od tej chwili kalendarz na stronie pokazuje 18 lipca nowy wpis.

    Typowe błędy

    UPDATE bez WHERE wpisuje „Wycieczka nad morze” we wszystkich 63 dniach.

    kwerendy.txt Tekst zmienione: 3 linie
    -- Zapytanie 1
    SELECT DISTINCT wpis FROM zadania WHERE dataZadania BETWEEN '2020-07-01' AND '2020-07-07' AND wpis <> '';
    
    -- Zapytanie 2
    SELECT dataZadania, wpis FROM zadania WHERE miesiac = 'lipiec';
    
    -- Zapytanie 3
    SELECT miesiac, wpis FROM zadania WHERE wpis LIKE 'S%';
    
    -- Zapytanie 4
    UPDATE zadania SET wpis = 'Wycieczka nad morze' WHERE dataZadania = '2020-07-18';
    Podgląd strony po tym kroku
    Podgląd strony po kroku 7
  8. Etap 2: Grafika i strona HTML

    Kroki 8-17 · po tym etapie masz 15 z 33 kryteriów (pkt)

    Krok 8: Logo: wysokość 140 px

    Kryteria:

    R.2.1 Plik logo1.png przeskalowano z zachowaniem proporcji do wysokości 140 px odpowiadająca temu szerokość wynosi 175 px (± 5 px)

    ok. 2 min
    Polecenie z arkusza

    Plik logo1.png, wypakowany z archiwum, należy przeskalować z zachowaniem proporcji tak, aby jego wysokość wynosiła dokładnie 140 px.

    W GIMP-ie: Obraz → Skaluj obraz, wysokość 140 z zamkniętym łańcuchem - szerokość wychodzi 175 px (350 × 140 / 280), jak w kluczu. Plik → Nadpisz logo1.png - plik zostaje PNG z przezroczystością.

    Podgląd strony po tym kroku
    Podgląd strony po kroku 8
  9. Krok 9: Plik kalendarz.php w HTML5

    Kryteria:

    R.2.2 Witrynę internetową zapisano w pliku kalendarz.php oraz zastosowano deklarację języka HTML5 <!DOCTYPE html>, zadeklarowano język witryny polski np. <html lang = "pl"> oraz zapisano jawnie właściwy standard kodowania polskich znaków

    ok. 1 min
    Polecenie z arkusza

    Cechy witryny: Składa się ze strony o nazwie kalendarz.php zapisanej w języku HTML 5.

    Jedna strona, kalendarz.php. Dopóki nie ma w niej kodu PHP, podgląd pokazuje ją wprost.

    kalendarz.php PHP nowy plik
    <!DOCTYPE html>
    <html>
    <head>
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (kalendarz.php)
  10. Krok 10: Język strony

    Kryteria:

    R.2.2 Witrynę internetową zapisano w pliku kalendarz.php oraz zastosowano deklarację języka HTML5 <!DOCTYPE html>, zadeklarowano język witryny polski np. <html lang = "pl"> oraz zapisano jawnie właściwy standard kodowania polskich znaków

    ok. 1 min
    Polecenie z arkusza

    Ustawiony język zawartości strony na polski.

    Atrybut lang="pl" w znaczniku <html>.

    kalendarz.php PHP zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (kalendarz.php)
  11. Krok 11: Kodowanie polskich znaków

    Kryteria:

    R.2.2 Witrynę internetową zapisano w pliku kalendarz.php oraz zastosowano deklarację języka HTML5 <!DOCTYPE html>, zadeklarowano język witryny polski np. <html lang = "pl"> oraz zapisano jawnie właściwy standard kodowania polskich znaków

    ok. 1 min
    Polecenie z arkusza

    Jawnie zastosowany właściwy standard kodowania polskich znaków.

    <meta charset="UTF-8"> jako pierwszy element <head>.

    kalendarz.php PHP zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (kalendarz.php)
  12. Krok 12: Tytuł strony

    Kryteria:

    R.2.3 Nadano tytuł strony: "Zadania na lipiec"

    ok. 1 min
    Polecenie z arkusza

    Tytuł strony widoczny na karcie przeglądarki: „Zadania na lipiec”.

    <title> w <head>.

    kalendarz.php PHP zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Zadania na lipiec</title>
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (kalendarz.php)
  13. Krok 13: Podpięcie arkusza stylów

    Kryteria:

    R.3.3 Strona zawiera działające połączenie z zewnętrznym arkuszem stylów o nazwie styl6.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 styl6.css prawidłowo połączony z kodem strony.

    Uwaga na nietypową nazwę: styl6.css - z cyfrą.

    Typowe błędy

    styl.css bez szóstki odcina wszystkie style, a razem z nimi kryterium R.3.3.

    kalendarz.php PHP zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Zadania na lipiec</title>
        <link rel="stylesheet" href="styl6.css">
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (kalendarz.php)
  14. Krok 14: Bloki strony

    Kryteria:

    R.2.4 Układ strony zdefiniowano dzieląc ją na: 2 bloki banera, blok główny i stopkę. Zastosowano znaczniki sekcji

    ok. 1 min
    Polecenie z arkusza

    Podział strony na bloki: dwa bloki banera, poniżej blok główny, w którym znajdują się generowane skryptem bloki kalendarza, na dole blok stopki. Podział zrealizowany za pomocą znaczników sekcji tak, aby po uruchomieniu w przeglądarce wygląd układu bloków był zgodny z Obrazem 2.

    Dwie <section> z identyfikatorami banner1 i banner2, <main> na blok główny i <footer>. Bloki kalendarza nie są tu wpisane - wygeneruje je Skrypt 2.

    kalendarz.php PHP zmienione: 8 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Zadania na lipiec</title>
        <link rel="stylesheet" href="styl6.css">
    </head>
    <body>
        <section id="banner1">
        </section>
        <section id="banner2">
        </section>
        <main>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kalendarz.php)
  15. Krok 15: Pierwszy blok banera: logo

    Kryteria:

    R.2.7 W pierwszym bloku banera umieszczono obraz logo1.png wraz z tekstem alternatywnym "lipiec"

    ok. 1 min
    Polecenie z arkusza

    Zawartość pierwszego bloku banera: logo1.png z tekstem alternatywnym o treści: „lipiec”.

    Obraz z atrybutem alt.

    kalendarz.php PHP zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Zadania na lipiec</title>
        <link rel="stylesheet" href="styl6.css">
    </head>
    <body>
        <section id="banner1">
            <img src="logo1.png" alt="lipiec">
        </section>
        <section id="banner2">
        </section>
        <main>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kalendarz.php)
  16. Krok 16: Drugi blok banera: nagłówek i akapit

    Kryteria: ,

    R.2.5 W banerze drugim zapisano nagłówek h1: "TERMINARZ"

    R.2.6 W banerze drugim zapisano paragraf rozpoczynający się od: "najbliższe zadania:" oraz w stopce zapisano paragraf z numerem zdającego

    ok. 1 min
    Polecenie z arkusza

    Zawartość drugiego bloku banera: Nagłówek pierwszego stopnia o treści: „TERMINARZ”. Paragraf (akapit) z wpisem: „najbliższe zadania:”, a dalej efekt działania skryptu 1.

    <h1> i <p>. Akapit kończy się po dwukropku i spacji - zadania dopisze tu Skrypt 1.

    kalendarz.php PHP zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Zadania na lipiec</title>
        <link rel="stylesheet" href="styl6.css">
    </head>
    <body>
        <section id="banner1">
            <img src="logo1.png" alt="lipiec">
        </section>
        <section id="banner2">
            <h1>TERMINARZ</h1>
            <p>najbliższe zadania: </p>
        </section>
        <main>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kalendarz.php)
  17. Krok 17: Stopka i strona sierpien.html

    Kryteria: ,

    R.2.6 W banerze drugim zapisano paragraf rozpoczynający się od: "najbliższe zadania:" oraz w stopce zapisano paragraf z numerem zdającego

    R.3.2 Wybranie odnośnika "Terminarz na sierpień" powoduje otwarcie strony sierpien.html

    ok. 2 min
    Polecenie z arkusza

    Zawartość stopki: Odnośnik o treści „Terminarz na sierpień” prowadzący do pliku sierpien.html. Plik sierpien.html należy utworzyć i zapisać w nim „strona w trakcie budowy”. Paragraf (akapit) o treści: „Stronę wykonał: ”, dalej wstawiony numer zdającego.

    Odnośnik do pliku z tego samego folderu i nowy plik sierpien.html - wystarczy w nim sam napis, tu w krótkim szkielecie HTML5 (R.3.2). Na egzaminie po „Stronę wykonał:” wpisujesz swój numer zdającego (PESEL), tu - autor rozwiązania.

    kalendarz.php PHP zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Zadania na lipiec</title>
        <link rel="stylesheet" href="styl6.css">
    </head>
    <body>
        <section id="banner1">
            <img src="logo1.png" alt="lipiec">
        </section>
        <section id="banner2">
            <h1>TERMINARZ</h1>
            <p>najbliższe zadania: </p>
        </section>
        <main>
        </main>
        <footer>
            <a href="sierpien.html">Terminarz na sierpień</a>
            <p>Stronę wykonał: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    sierpien.html HTML nowy plik
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Terminarz na sierpień</title>
    </head>
    <body>
        <p>strona w trakcie budowy</p>
    </body>
    </html>
    Podgląd strony po tym kroku (kalendarz.php)
  18. Etap 3: Styl CSS

    Kroki 18-25 · po tym etapie masz 26 z 33 kryteriów (pkt)

    Krok 18: Plik styl6.css: czcionka dla wszystkich

    Kryteria:

    R.4.1 Ustawiono domyślne formatowanie wszystkich selektorów (*): krój czcionki Verdana

    ok. 1 min
    Polecenie z arkusza

    Ustawione domyślne wartości dla wszystkich selektorów stylu CSS: krój czcionki Verdana.

    Selektor uniwersalny *.

    styl6.css CSS nowy plik
    * {
        font-family: Verdana;
    }
    Podgląd strony po tym kroku (kalendarz.php)
  19. Krok 19: Bloki banera

    Kryteria: , ,

    R.4.2 Ustawiono kolor tła #6F79A8 dla obu bloków banera i stopki

    R.4.3 Ustawiono biały kolor czcionki dla obu bloków banera i stopki

    R.4.5 Ustawiono wysokość 140px dla obu bloków banera

    ok. 1 min
    Polecenie z arkusza

    Dla obu bloków banera: kolor tła #6F79A8, biały kolor czcionki, wysokość 140 px.

    Wspólna reguła dla dwóch identyfikatorów. Wysokość 140 px to dokładnie wysokość logo.

    styl6.css CSS zmienione: 5 linii
    * {
        font-family: Verdana;
    }
    #banner1, #banner2 {
        background-color: #6F79A8;
        color: white;
        height: 140px;
    }
    Podgląd strony po tym kroku (kalendarz.php)
  20. Krok 20: Szerokości bloków banera

    Kryteria:

    R.4.4 Ustawiono szerokość bloków banera: 30% pierwszy oraz 70% drugi (width lub grid- template-columns lub flex)

    ok. 1 min
    Polecenie z arkusza

    Dodatkowo szerokość pierwszego bloku banera wynosi 30%, drugiego 70%.

    Razem 100% - bloki staną obok siebie, gdy dostaną float (krok układu).

    styl6.css CSS zmienione: 6 linii
    * {
        font-family: Verdana;
    }
    #banner1, #banner2 {
        background-color: #6F79A8;
        color: white;
        height: 140px;
    }
    #banner1 {
        width: 30%;
    }
    #banner2 {
        width: 70%;
    }
    Podgląd strony po tym kroku (kalendarz.php)
  21. Krok 21: Blok kalendarza

    Kryteria: ,

    R.4.8 Ustawiono dla bloku kalendarza: kolor tła #9FA8DA, szerokość 160px, wysokość 85px, marginesy zewnętrzne (margin) 5px, obramowanie 1px solid #6F79A8 (np. za pomocą klasy. Użycie id jest błędem)

    R.4.9 Ustawiono dla bloku kalendarza ukrycie tekstu, który nie mieści się w bloku bez paska przewijania (overflow: hidden;)

    ok. 3 min
    Polecenie z arkusza

    Dla bloku kalendarza: kolor tła #9FA8DA, szerokość 160 px, wysokość 85 px, marginesy zewnętrzne 5 px, obramowanie linią ciągłą o szerokości 1 px i kolorze #6F79A8; tekst, który nie mieści się w bloku jest ukryty i wyświetlany bez paska przewijania.

    Bloków dnia jest 31, więc styl dostaje klasa .day - identyfikator musi być na stronie jednorazowy (klucz: użycie id jest błędem).

    overflow: hidden (opis właściwości jest na ostatniej stronie arkusza) obcina tekst, który nie mieści się w 85 px - „Wycieczka nad morze” zostaje uciętym „Wycieczka nad”, bez paska przewijania. scroll i auto dałyby pasek.

    Typowe błędy

    #day zamiast .day - klucz wprost uznaje identyfikator za błąd (R.4.8).

    styl6.css CSS zmienione: 8 linii
    * {
        font-family: Verdana;
    }
    #banner1, #banner2 {
        background-color: #6F79A8;
        color: white;
        height: 140px;
    }
    #banner1 {
        width: 30%;
    }
    #banner2 {
        width: 70%;
    }
    .day {
        background-color: #9FA8DA;
        width: 160px;
        height: 85px;
        margin: 5px;
        border: 1px solid #6F79A8;
        overflow: hidden;
    }
    Podgląd strony po tym kroku (kalendarz.php)
  22. Krok 22: Blok kalendarza po wskazaniu kursorem

    Kryteria:

    R.4.10 Gdy kursor znajdzie się na bloku kalendarza jego kolor tła zmienia się na #6F79A8, a kolor czcionki na biały

    ok. 1 min
    Polecenie z arkusza

    Gdy kursor znajdzie się na bloku kalendarza jego kolor tła zmienia się na #6F79A8, a kolor czcionki na biały.

    Pseudoklasa :hover dla klasy day. Efekt zobaczysz w podglądzie, gdy pojawią się bloki dni.

    styl6.css CSS zmienione: 4 linie
    * {
        font-family: Verdana;
    }
    #banner1, #banner2 {
        background-color: #6F79A8;
        color: white;
        height: 140px;
    }
    #banner1 {
        width: 30%;
    }
    #banner2 {
        width: 70%;
    }
    .day {
        background-color: #9FA8DA;
        width: 160px;
        height: 85px;
        margin: 5px;
        border: 1px solid #6F79A8;
        overflow: hidden;
    }
    .day:hover {
        background-color: #6F79A8;
        color: white;
    }
    Podgląd strony po tym kroku (kalendarz.php)
  23. Krok 23: Stopka

    Kryteria: , , ,

    R.4.2 Ustawiono kolor tła #6F79A8 dla obu bloków banera i stopki

    R.4.3 Ustawiono biały kolor czcionki dla obu bloków banera i stopki

    R.4.6 Ustawiono marginesy wewnętrzne (padding) 5px dla stopki

    R.4.7 Ustawiono wyrównanie tekstu do środka dla selektora h6 oraz do prawej strony dla stopki

    ok. 1 min
    Polecenie z arkusza

    Dla stopki: kolor tła #6F79A8, biały kolor czcionki, marginesy wewnętrzne 5 px, wyrównanie tekstu do prawej strony.

    Selektor footer.

    styl6.css CSS zmienione: 6 linii
    * {
        font-family: Verdana;
    }
    #banner1, #banner2 {
        background-color: #6F79A8;
        color: white;
        height: 140px;
    }
    #banner1 {
        width: 30%;
    }
    #banner2 {
        width: 70%;
    }
    .day {
        background-color: #9FA8DA;
        width: 160px;
        height: 85px;
        margin: 5px;
        border: 1px solid #6F79A8;
        overflow: hidden;
    }
    .day:hover {
        background-color: #6F79A8;
        color: white;
    }
    footer {
        background-color: #6F79A8;
        color: white;
        padding: 5px;
        text-align: right;
    }
    Podgląd strony po tym kroku (kalendarz.php)
  24. Krok 24: Nagłówek szóstego stopnia

    Kryteria:

    R.4.7 Ustawiono wyrównanie tekstu do środka dla selektora h6 oraz do prawej strony dla stopki

    ok. 1 min
    Polecenie z arkusza

    Dla selektora nagłówka szóstego stopnia: wyrównanie tekstu do środka.

    Selektor znacznika h6 - w nim Skrypt 2 wypisze datę każdego dnia.

    Typowe błędy

    Styl dla .day h6 albo klasy nie spełnia R.4.7 - klucz uznaje tylko selektor znacznika.

    styl6.css CSS zmienione: 3 linie
    * {
        font-family: Verdana;
    }
    #banner1, #banner2 {
        background-color: #6F79A8;
        color: white;
        height: 140px;
    }
    #banner1 {
        width: 30%;
    }
    #banner2 {
        width: 70%;
    }
    .day {
        background-color: #9FA8DA;
        width: 160px;
        height: 85px;
        margin: 5px;
        border: 1px solid #6F79A8;
        overflow: hidden;
    }
    .day:hover {
        background-color: #6F79A8;
        color: white;
    }
    footer {
        background-color: #6F79A8;
        color: white;
        padding: 5px;
        text-align: right;
    }
    h6 {
        text-align: center;
    }
    Podgląd strony po tym kroku (kalendarz.php)
  25. Krok 25: Układ: bloki obok siebie

    Kryteria:

    R.3.1 Układ bloków po uruchomieniu strony w przeglądarce jest zgodny z obrazem 2 w arkuszu (Nie należy sprawdzać bloku głównego i bloków kalendarza; 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

    Podział zrealizowany za pomocą znaczników sekcji tak, aby po uruchomieniu w przeglądarce wygląd układu bloków był zgodny z Obrazem 2.

    float: left stawia obok siebie dwa bloki banera i kolejne dni kalendarza (dni same zawijają się do następnego wiersza, gdy brak miejsca). clear: both sprowadza blok główny pod baner, a stopkę pod ostatni wiersz dni.

    styl6.css CSS zmienione: 6 linii
    * {
        font-family: Verdana;
    }
    #banner1, #banner2 {
        background-color: #6F79A8;
        color: white;
        height: 140px;
    }
    #banner1 {
        width: 30%;
    }
    #banner2 {
        width: 70%;
    }
    .day {
        background-color: #9FA8DA;
        width: 160px;
        height: 85px;
        margin: 5px;
        border: 1px solid #6F79A8;
        overflow: hidden;
    }
    .day:hover {
        background-color: #6F79A8;
        color: white;
    }
    footer {
        background-color: #6F79A8;
        color: white;
        padding: 5px;
        text-align: right;
    }
    h6 {
        text-align: center;
    }
    #banner1, #banner2, .day {
        float: left;
    }
    main, footer {
        clear: both;
    }
    Podgląd strony po tym kroku (kalendarz.php)
  26. Etap 4: Skrypty PHP

    Kroki 26-29 · po tym etapie masz 33 z 33 kryteriów (pkt)

    Krok 26: Połączenie w akapicie, zamknięcie w bloku głównym

    Kryteria: ,

    R.5.1 Skrypt zawiera działające połączenie z serwerem bazy danych i wybór bazy terminarz

    R.5.2 Ostatnią operacją na bazie jest jej zamknięcie

    ok. 3 min
    Polecenie z arkusza

    Łączy się z serwerem bazodanowym na localhost, użytkownik root bez hasła, baza danych o nazwie terminarz. Na końcu działania skrypt zamyka połączenie z serwerem.

    Skrypt 1 stoi wewnątrz akapitu „najbliższe zadania:”, bo jego wynik ma się pojawić po dwukropku. Tam otwierasz połączenie (to pierwszy kod PHP na stronie). Skrypt 2 stoi w <main> i kończy się zamknięciem mysqli_close - to ostatnia operacja na bazie (R.5.2). Zmienna $connection jest wspólna dla obu bloków PHP tego pliku.

    Podgląd jest już wynikiem uruchomienia strony: skrypty jeszcze niczego nie wypisują.

    kalendarz.php PHP zmienione: 6 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Zadania na lipiec</title>
        <link rel="stylesheet" href="styl6.css">
    </head>
    <body>
        <section id="banner1">
            <img src="logo1.png" alt="lipiec">
        </section>
        <section id="banner2">
            <h1>TERMINARZ</h1>
            <p>najbliższe zadania: <?php
                $connection = mysqli_connect("localhost", "root", "", "terminarz");
            ?></p>
        </section>
        <main>
            <?php
                mysqli_close($connection);
            ?>
        </main>
        <footer>
            <a href="sierpien.html">Terminarz na sierpień</a>
            <p>Stronę wykonał: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kalendarz.php)
  27. Krok 27: Skrypt 1: najbliższe zadania

    Kryteria: ,

    R.5.3 Skrypt 1 wysyła do bazy danych zapytanie 1 lub skrypt 2 wysyła zapytanie 2

    R.5.4 Skrypt 1 wyświetla rozdzielone średnikiem i spacją wszystkie wartości zwrócone zapytaniem

    ok. 3 min
    Polecenie z arkusza

    Działanie skryptu 1: Wysyła do bazy danych zapytanie 1. Wyświetla rozdzielone średnikiem i spacją wszystkie wartości zwrócone zapytaniem.

    Zapytanie 1, a w pętli while każdy wpis i po nim "; " - średnik ze spacją. Pętla działa dla dowolnej liczby wpisów. Podgląd: „najbliższe zadania: Projekt z programowania; Weterynarz - Brutus;” - z średnikiem także na końcu, dokładnie jak na obrazie 2.

    kalendarz.php PHP zmienione: 5 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Zadania na lipiec</title>
        <link rel="stylesheet" href="styl6.css">
    </head>
    <body>
        <section id="banner1">
            <img src="logo1.png" alt="lipiec">
        </section>
        <section id="banner2">
            <h1>TERMINARZ</h1>
            <p>najbliższe zadania: <?php
                $connection = mysqli_connect("localhost", "root", "", "terminarz");
                $query = "SELECT DISTINCT wpis FROM zadania WHERE dataZadania BETWEEN '2020-07-01' AND '2020-07-07' AND wpis <> '';";
                $result = mysqli_query($connection, $query);
                while ($row = mysqli_fetch_row($result)) {
                    echo "$row[0]; ";
                }
            ?></p>
        </section>
        <main>
            <?php
                mysqli_close($connection);
            ?>
        </main>
        <footer>
            <a href="sierpien.html">Terminarz na sierpień</a>
            <p>Stronę wykonał: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kalendarz.php)
  28. Krok 28: Skrypt 2: blok dla każdego dnia

    Kryteria: ,

    R.5.3 Skrypt 1 wysyła do bazy danych zapytanie 1 lub skrypt 2 wysyła zapytanie 2

    R.5.5 Skrypt 2 wyświetla w bloku głównym bloki zdefiniowane za pomocą znaczników sekcji. Liczba wygenerowanych bloków odpowiada liczbie wierszy zwróconych zapytaniem

    ok. 4 min
    Polecenie z arkusza

    Działanie skryptu 2: Wysyła do bazy danych zapytanie 2. Za pomocą znacznika sekcji definiuje blok, a w nim wyświetla dane dotyczące jednego zwróconego wiersza. Data zadania w nagłówku szóstego stopnia. Liczba wygenerowanych bloków odpowiada liczbie wierszy zwróconych zapytaniem.

    Zapytanie 2 i pętla: dla każdego wiersza jeden <section class="day"> z datą w <h6>. Cudzysłowy wokół nazwy klasy są wewnątrz napisu w cudzysłowie, więc poprzedzasz je ukośnikiem \". Podgląd: 31 bloków - tyle, ile wierszy zwraca zapytanie (R.5.5).

    Typowe błędy

    Pojedynczy blok <section> wypisany przed pętlą, a w pętli tylko daty - wtedy jest jeden blok zamiast 31 (R.5.5).

    kalendarz.php PHP zmienione: 5 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Zadania na lipiec</title>
        <link rel="stylesheet" href="styl6.css">
    </head>
    <body>
        <section id="banner1">
            <img src="logo1.png" alt="lipiec">
        </section>
        <section id="banner2">
            <h1>TERMINARZ</h1>
            <p>najbliższe zadania: <?php
                $connection = mysqli_connect("localhost", "root", "", "terminarz");
                $query = "SELECT DISTINCT wpis FROM zadania WHERE dataZadania BETWEEN '2020-07-01' AND '2020-07-07' AND wpis <> '';";
                $result = mysqli_query($connection, $query);
                while ($row = mysqli_fetch_row($result)) {
                    echo "$row[0]; ";
                }
            ?></p>
        </section>
        <main>
            <?php
                $query = "SELECT dataZadania, wpis FROM zadania WHERE miesiac = 'lipiec';";
                $result = mysqli_query($connection, $query);
                while ($row = mysqli_fetch_row($result)) {
                    echo "<section class=\"day\"><h6>$row[0]</h6></section>";
                }
                mysqli_close($connection);
            ?>
        </main>
        <footer>
            <a href="sierpien.html">Terminarz na sierpień</a>
            <p>Stronę wykonał: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kalendarz.php)
  29. Krok 29: Skrypt 2: wpis w akapicie

    Kryteria: ,

    R.5.6 Skrypt 2 wyświetla datę zadania w nagłówku h6 oraz pole wpis w paragrafie

    R.5.7 Zastosowano znaczące nazewnictwo dla wszystkich zmiennych lub funkcji w języku polskim lub angielskim. Nazwy odzwierciedlają cel zastosowania

    ok. 2 min
    Polecenie z arkusza

    Pole wpis w paragrafie (akapicie).

    Po nagłówku akapit z drugim polem wiersza. Podgląd jak na obrazie 2: dni z wpisami, 18 lipca ucięte „Wycieczka nad” (reszta schowana przez overflow: hidden). Najedź na dzień - zmieni kolor. Nazwy zmiennych są po angielsku i mówią, co przechowują (R.5.7).

    kalendarz.php PHP zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Zadania na lipiec</title>
        <link rel="stylesheet" href="styl6.css">
    </head>
    <body>
        <section id="banner1">
            <img src="logo1.png" alt="lipiec">
        </section>
        <section id="banner2">
            <h1>TERMINARZ</h1>
            <p>najbliższe zadania: <?php
                $connection = mysqli_connect("localhost", "root", "", "terminarz");
                $query = "SELECT DISTINCT wpis FROM zadania WHERE dataZadania BETWEEN '2020-07-01' AND '2020-07-07' AND wpis <> '';";
                $result = mysqli_query($connection, $query);
                while ($row = mysqli_fetch_row($result)) {
                    echo "$row[0]; ";
                }
            ?></p>
        </section>
        <main>
            <?php
                $query = "SELECT dataZadania, wpis FROM zadania WHERE miesiac = 'lipiec';";
                $result = mysqli_query($connection, $query);
                while ($row = mysqli_fetch_row($result)) {
                    echo "<section class=\"day\"><h6>$row[0]</h6><p>$row[1]</p></section>";
                }
                mysqli_close($connection);
            ?>
        </main>
        <footer>
            <a href="sierpien.html">Terminarz na sierpień</a>
            <p>Stronę wykonał: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kalendarz.php)
  30. Etap 5: Dobre praktyki (poza kluczem)

    Krok 30 · po tym etapie masz 33 z 33 kryteriów (pkt)

    Krok 30: Średniki tylko między wpisami, pełny wpis w dymku

    ok. 4 min
    Polecenie z arkusza

    Wyświetla rozdzielone średnikiem i spacją wszystkie wartości zwrócone zapytaniem.

    Trzy drobne poprawki:

    • implode("; ", $entries) - wpisy zbierasz do tablicy i sklejasz separatorem, który staje tylko między nimi; znika wiszący średnik po ostatnim wpisie,
    • htmlspecialchars przy wypisywaniu - wpis z kalendarza to tekst wpisany przez człowieka; znak < albo & przeglądarka wzięłaby za początek znacznika,
    • atrybut title z pełnym wpisem - overflow: hidden ucina długie wpisy („Wycieczka nad”), a po najechaniu przeglądarka pokaże całość w dymku.

    Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza, a średnik na końcu jest nawet na obrazie 2.

    kalendarz.php PHP zmienione: 6 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Zadania na lipiec</title>
        <link rel="stylesheet" href="styl6.css">
    </head>
    <body>
        <section id="banner1">
            <img src="logo1.png" alt="lipiec">
        </section>
        <section id="banner2">
            <h1>TERMINARZ</h1>
            <p>najbliższe zadania: <?php
                $connection = mysqli_connect("localhost", "root", "", "terminarz");
                $query = "SELECT DISTINCT wpis FROM zadania WHERE dataZadania BETWEEN '2020-07-01' AND '2020-07-07' AND wpis <> '';";
                $result = mysqli_query($connection, $query);
                // while ($row = mysqli_fetch_row($result)) { echo "$row[0]; "; }
                $entries = [];
                while ($row = mysqli_fetch_row($result)) {
                    $entries[] = htmlspecialchars($row[0]);
                }
                echo implode("; ", $entries);
            ?></p>
        </section>
        <main>
            <?php
                $query = "SELECT dataZadania, wpis FROM zadania WHERE miesiac = 'lipiec';";
                $result = mysqli_query($connection, $query);
                while ($row = mysqli_fetch_row($result)) {
                    $entry = htmlspecialchars($row[1]);
                    echo "<section class=\"day\" title=\"$entry\"><h6>$row[0]</h6><p>$entry</p></section>";
                }
                mysqli_close($connection);
            ?>
        </main>
        <footer>
            <a href="sierpien.html">Terminarz na sierpień</a>
            <p>Stronę wykonał: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kalendarz.php)
  31. Etap 6: Oddanie pracy

    Krok 31 · po tym etapie masz 33 z 33 kryteriów (pkt)

    Krok 31: Plik przeglądarka.txt i nagranie płyty

    ok. 5 min
    Polecenie z arkusza

    Po zakończeniu pracy utwórz w folderze z numerem zdającego 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: import.png, kalendarz.php, kw1.jpg - kw4.jpg, kwerendy.txt, logo1.png, przeglądarka.txt, sierpien.html, styl6.css. Nagraj płytę, sprawdź jej odczyt i opisz ją numerem zdającego.

    przeglądarka.txt Tekst nowy plik
    Google Chrome

    Podgląd strony bez zmian - taki jak po kroku 30.

Podgląd

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: . 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.