Krok 1: Baza danych podroze
Utwórz bazę danych o nazwie podroze.
Rozpakuj materialy6.7z z pulpitu (hasło $poDrozE&!) do folderu z numerem zdającego: egzamin.sql i zdjęcia 1.jpg - 9.jpg. W phpMyAdmin: Nowa, nazwa podroze.
Rozwiązanie buduje stronę biura podróży: baza podroze i cztery zapytania - sortowanie po podpisie, filtr po polu logicznym (wycieczki niedostępne), złączenie dwóch tabel (JOIN) i usunięcie tabeli (DROP TABLE), potem strona biuro.php z banerem, trzema blokami obok siebie (promocje, galeria, kontakt), blokiem z listą dawnych wyjazdów i stopką oraz style w styl9.css. Dwa skrypty PHP: pierwszy buduje z bazy galerię dziewięciu zdjęć z dymkami, drugi wypisuje wyjazdy w liście numerowanej cyframi rzymskimi.
To jest wersja podstawowa. W zakładce „Nowoczesny kod (grid, PDO)” jest drugi sposób rozwiązania tego samego arkusza: trzy bloki na siatce CSS, kolory w zmiennych, dane pobierane przez PDO na początku pliku, a w treści strony tylko pętle wyświetlające - 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 zdjęcia pochodzą z prawdziwego archiwum materialy6 (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; najedź na zdjęcie w galerii, a pojawi się dymek z nazwą miasta, jak na obrazie 2.
Jak liczą się punkty. Klucz ma 34 kryteria (R.1.1 - R.5.7), każde za 1 punkt. Próg zdania części praktycznej to 75%, czyli 26 punktów - można stracić 8 kryteriów i nadal zdać. Przy każdym kroku jest napisane, które kryteria spełnia; egzaminator ocenia spełnienie kryteriów z klucza, nie zgodność z tym kodem.
Kroki 1-7 · po tym etapie masz 6 z 34 kryteriów (pkt)
Utwórz bazę danych o nazwie podroze.
Rozpakuj materialy6.7z z pulpitu (hasło $poDrozE&!) do folderu z numerem zdającego: egzamin.sql i zdjęcia 1.jpg - 9.jpg. W phpMyAdmin: Nowa, nazwa podroze.
Do bazy podroze zaimportuj tabele z pliku egzamin.sql z rozpakowanego archiwum.
Import → egzamin.sql. Plik ma kilka tabel; w zadaniu potrzebne są dwie z obrazu 1: zdjecia (nazwa pliku i podpis) i wycieczki (cel, data, cena, pole dostepna oraz zdjecia_id - klucz obcy wskazujący zdjęcie celu).
Wykonaj zrzut ekranu po imporcie. Zrzut zapisz w formacie PNG pod nazwą import. 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. Zrzuty zapytań mają być w JPEG (kw1.jpg - kw4.jpg) i zawierać treść zapytania.
Zapytanie 1: wybierające jedynie pola nazwaPliku i podpis z tabeli zdjecia sortując je rosnąco według kolumny podpis.
SELECT nazwaPliku, podpis FROM zdjecia - dwie kolumny,ORDER BY podpis - rosnąco, czyli alfabetycznie; ASC jest domyślne i można je pominąć.Wynik: 9 zdjęć w kolejności plików 8, 3, 5, 1, 9, 7, 6, 4, 2 (od Barcelony do Wenecji), jak w kluczu. Zapytanie do kwerendy.txt, zrzut kw1.jpg. To zapytanie wyśle Skrypt 1 - galeria będzie w tej kolejności.
kwerendy.txt Tekst nowy plik -- Zapytanie 1
SELECT nazwaPliku, podpis FROM zdjecia ORDER BY podpis;
Zapytanie 2: wybierające jedynie pola cel i dataWyjazdu z tabeli wycieczki dla wycieczek, które nie są dostępne.
WHERE dostepna = 0 - pole logiczne w MariaDB przechowuje TRUE jako 1, a FALSE jako 0; równoważnie dostepna = FALSE.Wynik: 3 wycieczki - Paryż 2019-07-14 oraz Barcelona 2019-07-14 i 2019-08-14. Zrzut kw2.jpg. To zapytanie wyśle Skrypt 2.
kwerendy.txt Tekst zmienione: 3 linie -- Zapytanie 1
SELECT nazwaPliku, podpis FROM zdjecia ORDER BY podpis;
-- Zapytanie 2
SELECT cel, dataWyjazdu FROM wycieczki WHERE dostepna = 0;
Zapytanie 3: wybierające jedynie pola cel i cena z tabeli wycieczki oraz odpowiadające im pole podpis z tabeli zdjecia, dla wycieczek, których cena jest wyższa niż 1300 zł. Zapytanie wykorzystuje relację.
FROM wycieczki JOIN zdjecia - łączysz dwie tabele,ON zdjecia.id = wycieczki.zdjecia_id - relacja: wiersz wycieczki dostaje wiersz zdjęcia, na które wskazuje jej klucz obcy zdjecia_id,WHERE cena > 1300 - „wyższa niż”, więc Paryż za równe 1300 zł nie wchodzi.Wynik: 4 wiersze - Paryż 1350 i trzy razy Barcelona (1500, 1500, 1400), każdy z podpisem swojego zdjęcia. Zrzut kw3.jpg.
FROM wycieczki, zdjecia bez warunku łączącego daje iloczyn kartezjański - każdą wycieczkę z każdym zdjęciem.
kwerendy.txt Tekst zmienione: 3 linie -- Zapytanie 1
SELECT nazwaPliku, podpis FROM zdjecia ORDER BY podpis;
-- Zapytanie 2
SELECT cel, dataWyjazdu FROM wycieczki WHERE dostepna = 0;
-- Zapytanie 3
SELECT cel, cena, podpis FROM wycieczki JOIN zdjecia ON zdjecia.id = wycieczki.zdjecia_id WHERE cena > 1300;
Zapytanie 4: usuwające tabelę uzytkownik.
DROP TABLE usuwa całą tabelę - strukturę i dane (w przeciwieństwie do DELETE, który kasuje wiersze, a tabelę zostawia). phpMyAdmin pyta o potwierdzenie. Zrzut kw4.jpg - komunikat albo lista tabel bez uzytkownik.
DELETE FROM uzytkownik opróżnia tabelę, ale jej nie usuwa - to nie spełnia R.1.6.
kwerendy.txt Tekst zmienione: 3 linie -- Zapytanie 1
SELECT nazwaPliku, podpis FROM zdjecia ORDER BY podpis;
-- Zapytanie 2
SELECT cel, dataWyjazdu FROM wycieczki WHERE dostepna = 0;
-- Zapytanie 3
SELECT cel, cena, podpis FROM wycieczki JOIN zdjecia ON zdjecia.id = wycieczki.zdjecia_id WHERE cena > 1300;
-- Zapytanie 4
DROP TABLE uzytkownik;
Kroki 8-19 · po tym etapie masz 14 z 34 kryteriów (pkt)
Cechy witryny: Składa się ze strony o nazwie biuro.php zapisanej w języku HTML 5.
Jedna strona, biuro.php. Dopóki nie ma w niej kodu PHP, podgląd pokazuje ją wprost. Zdjęcia 1.jpg - 9.jpg leżą obok strony.
biuro.php PHP nowy plik <!DOCTYPE html>
<html>
<head>
</head>
<body>
</body>
</html>Ustawiony język zawartości strony na polski.
Atrybut lang="pl".
biuro.php PHP zmienione: 1 linia <!DOCTYPE html>
<html lang="pl">
<head>
</head>
<body>
</body>
</html>Jawnie zastosowany właściwy standard kodowania polskich znaków.
<meta charset="UTF-8">.
biuro.php PHP zmienione: 1 linia <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
</head>
<body>
</body>
</html>Tytuł strony widoczny na karcie przeglądarki: „Poznaj Europę”.
<title> w <head>.
biuro.php PHP zmienione: 1 linia <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Poznaj Europę</title>
</head>
<body>
</body>
</html>Arkusz stylów w pliku o nazwie styl9.css prawidłowo połączony z kodem strony.
Nazwa z cyfrą: styl9.css.
styl.css bez dziewiątki odcina wszystkie style (R.3.3).
biuro.php PHP zmienione: 1 linia <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Poznaj Europę</title>
<link rel="stylesheet" href="styl9.css">
</head>
<body>
</body>
</html>Podział strony na bloki: na górze baner, poniżej obok siebie trzy bloki: lewy, środkowy i prawy, poniżej blok z danymi, poniżej stopka. 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.
<header> na baner, cztery <section> (left, middle, right, data) i <footer>.
biuro.php PHP zmienione: 12 linii <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Poznaj Europę</title>
<link rel="stylesheet" href="styl9.css">
</head>
<body>
<header>
</header>
<section id="left">
</section>
<section id="middle">
</section>
<section id="right">
</section>
<section id="data">
</section>
<footer>
</footer>
</body>
</html>Zawartość banera: nagłówek pierwszego stopnia o treści: „BIURO PODRÓŻY”.
<h1>.
biuro.php PHP zmienione: 1 linia <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Poznaj Europę</title>
<link rel="stylesheet" href="styl9.css">
</head>
<body>
<header>
<h1>BIURO PODRÓŻY</h1>
</header>
<section id="left">
</section>
<section id="middle">
</section>
<section id="right">
</section>
<section id="data">
</section>
<footer>
</footer>
</body>
</html>Zawartość bloku lewego: Nagłówek drugiego stopnia o treści: „Promocje”. Tabela o dwóch kolumnach i trzech wierszach, wypełniona danymi: Warszawa od 600 zł, Wenecja od 1200 zł, Paryż od 1200 zł.
<h2> i tabela 3 × 2: trzy <tr>, w każdym dwie komórki <td>. Tabela nie ma wiersza nagłówkowego - arkusz go nie wymaga.
biuro.php PHP zmienione: 15 linii <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Poznaj Europę</title>
<link rel="stylesheet" href="styl9.css">
</head>
<body>
<header>
<h1>BIURO PODRÓŻY</h1>
</header>
<section id="left">
<h2>Promocje</h2>
<table>
<tr>
<td>Warszawa</td>
<td>od 600 zł</td>
</tr>
<tr>
<td>Wenecja</td>
<td>od 1200 zł</td>
</tr>
<tr>
<td>Paryż</td>
<td>od 1200 zł</td>
</tr>
</table>
</section>
<section id="middle">
</section>
<section id="right">
</section>
<section id="data">
</section>
<footer>
</footer>
</body>
</html>Zawartość bloku środkowego: Nagłówek drugiego stopnia o treści: „W tym roku jedziemy do...”. Efekt działania skryptu 1.
<h2>; pod nim Skrypt 1 wstawi galerię zdjęć.
biuro.php PHP zmienione: 1 linia <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Poznaj Europę</title>
<link rel="stylesheet" href="styl9.css">
</head>
<body>
<header>
<h1>BIURO PODRÓŻY</h1>
</header>
<section id="left">
<h2>Promocje</h2>
<table>
<tr>
<td>Warszawa</td>
<td>od 600 zł</td>
</tr>
<tr>
<td>Wenecja</td>
<td>od 1200 zł</td>
</tr>
<tr>
<td>Paryż</td>
<td>od 1200 zł</td>
</tr>
</table>
</section>
<section id="middle">
<h2>W tym roku jedziemy do...</h2>
</section>
<section id="right">
</section>
<section id="data">
</section>
<footer>
</footer>
</body>
</html>Zawartość bloku prawego: Nagłówek drugiego stopnia o treści: „Kontakt”. Odnośnik do adresu e-mail [email protected] o treści: „napisz do nas”. Paragraf (akapit) o treści „telefon: 444555666”.
Odnośnik do adresu e-mail ma w href przedrostek mailto: - kliknięcie otwiera program pocztowy z gotowym adresatem (R.3.2).
href="[email protected]" bez mailto: przeglądarka traktuje jak plik w bieżącym folderze.
biuro.php PHP zmienione: 3 linie <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Poznaj Europę</title>
<link rel="stylesheet" href="styl9.css">
</head>
<body>
<header>
<h1>BIURO PODRÓŻY</h1>
</header>
<section id="left">
<h2>Promocje</h2>
<table>
<tr>
<td>Warszawa</td>
<td>od 600 zł</td>
</tr>
<tr>
<td>Wenecja</td>
<td>od 1200 zł</td>
</tr>
<tr>
<td>Paryż</td>
<td>od 1200 zł</td>
</tr>
</table>
</section>
<section id="middle">
<h2>W tym roku jedziemy do...</h2>
</section>
<section id="right">
<h2>Kontakt</h2>
<a href="mailto:[email protected]">napisz do nas</a>
<p>telefon: 444555666</p>
</section>
<section id="data">
</section>
<footer>
</footer>
</body>
</html>Zawartość bloku z danymi: Nagłówek trzeciego stopnia o treści: „W poprzednich latach byliśmy...”. Lista numerowana (uporządkowana), a w niej efekt działania skryptu 2.
<h3> i pusta lista <ol> - jej elementy <li> wypisze Skrypt 2.
biuro.php PHP zmienione: 3 linie <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Poznaj Europę</title>
<link rel="stylesheet" href="styl9.css">
</head>
<body>
<header>
<h1>BIURO PODRÓŻY</h1>
</header>
<section id="left">
<h2>Promocje</h2>
<table>
<tr>
<td>Warszawa</td>
<td>od 600 zł</td>
</tr>
<tr>
<td>Wenecja</td>
<td>od 1200 zł</td>
</tr>
<tr>
<td>Paryż</td>
<td>od 1200 zł</td>
</tr>
</table>
</section>
<section id="middle">
<h2>W tym roku jedziemy do...</h2>
</section>
<section id="right">
<h2>Kontakt</h2>
<a href="mailto:[email protected]">napisz do nas</a>
<p>telefon: 444555666</p>
</section>
<section id="data">
<h3>W poprzednich latach byliśmy...</h3>
<ol>
</ol>
</section>
<footer>
</footer>
</body>
</html>Zawartość stopki: akapit (paragraf) o treści: „Stronę wykonał: ”, dalej wstawiony numer zdającego.
Na egzaminie po dwukropku wpisujesz swój numer zdającego (PESEL), tu - autor rozwiązania.
biuro.php PHP zmienione: 1 linia <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Poznaj Europę</title>
<link rel="stylesheet" href="styl9.css">
</head>
<body>
<header>
<h1>BIURO PODRÓŻY</h1>
</header>
<section id="left">
<h2>Promocje</h2>
<table>
<tr>
<td>Warszawa</td>
<td>od 600 zł</td>
</tr>
<tr>
<td>Wenecja</td>
<td>od 1200 zł</td>
</tr>
<tr>
<td>Paryż</td>
<td>od 1200 zł</td>
</tr>
</table>
</section>
<section id="middle">
<h2>W tym roku jedziemy do...</h2>
</section>
<section id="right">
<h2>Kontakt</h2>
<a href="mailto:[email protected]">napisz do nas</a>
<p>telefon: 444555666</p>
</section>
<section id="data">
<h3>W poprzednich latach byliśmy...</h3>
<ol>
</ol>
</section>
<footer>
<p>Stronę wykonał: Bartosz Bryniarski</p>
</footer>
</body>
</html>Kroki 20-28 · po tym etapie masz 25 z 34 kryteriów (pkt)
Ustawione domyślne wartości dla wszystkich selektorów stylu CSS: krój czcionki Georgia, wyrównanie tekstu do środka.
Selektor uniwersalny *.
styl9.css CSS nowy plik * {
font-family: Georgia;
text-align: center;
}Wspólne dla banera i stopki: kolor tła #BA6B6C, biały kolor czcionki, marginesy wewnętrzne 7 px.
Jedna reguła dla dwóch selektorów.
styl9.css CSS zmienione: 5 linii * {
font-family: Georgia;
text-align: center;
}
header, footer {
background-color: #BA6B6C;
color: white;
padding: 7px;
}Dla bloku lewego i prawego: kolor tła #EF9A9A, szerokość 20%, wysokość 500 px. Dla bloku środkowego: kolor tła MistyRose, szerokość 60%, wysokość 500 px.
20% + 60% + 20% = cała szerokość.
styl9.css CSS zmienione: 10 linii * {
font-family: Georgia;
text-align: center;
}
header, footer {
background-color: #BA6B6C;
color: white;
padding: 7px;
}
#left, #right {
background-color: #EF9A9A;
width: 20%;
height: 500px;
}
#middle {
background-color: MistyRose;
width: 60%;
height: 500px;
}Dla bloku z danymi: kolor tła MistyRose, marginesy wewnętrzne 50 px.
Selektor #data.
styl9.css CSS zmienione: 4 linie * {
font-family: Georgia;
text-align: center;
}
header, footer {
background-color: #BA6B6C;
color: white;
padding: 7px;
}
#left, #right {
background-color: #EF9A9A;
width: 20%;
height: 500px;
}
#middle {
background-color: MistyRose;
width: 60%;
height: 500px;
}
#data {
background-color: MistyRose;
padding: 50px;
}Dla selektora listy numerowanej: punktor jest wielką cyfrą rzymską. Dla selektora elementu listy: wyrównanie tekstu do lewej strony.
Wielkie cyfry rzymskie to upper-roman (I, II, III); lower-roman dałoby i, ii, iii. Elementy listy wyrównujesz do lewej, bo cała strona jest wyśrodkowana.
styl9.css CSS zmienione: 6 linii * {
font-family: Georgia;
text-align: center;
}
header, footer {
background-color: #BA6B6C;
color: white;
padding: 7px;
}
#left, #right {
background-color: #EF9A9A;
width: 20%;
height: 500px;
}
#middle {
background-color: MistyRose;
width: 60%;
height: 500px;
}
#data {
background-color: MistyRose;
padding: 50px;
}
ol {
list-style-type: upper-roman;
}
li {
text-align: left;
}Dla pierwszej litery nagłówka drugiego stopnia: rozmiar czcionki 170%, kolor czcionki Maroon.
Pseudoelement ::first-letter wybiera tylko pierwszą literę elementu - stąd duże „P”, „W”, „K” na obrazie 2, bez dodatkowych znaczników w HTML.
styl9.css CSS zmienione: 4 linie * {
font-family: Georgia;
text-align: center;
}
header, footer {
background-color: #BA6B6C;
color: white;
padding: 7px;
}
#left, #right {
background-color: #EF9A9A;
width: 20%;
height: 500px;
}
#middle {
background-color: MistyRose;
width: 60%;
height: 500px;
}
#data {
background-color: MistyRose;
padding: 50px;
}
ol {
list-style-type: upper-roman;
}
li {
text-align: left;
}
h2::first-letter {
font-size: 170%;
color: Maroon;
}Dla selektora tabeli: marginesy zewnętrzne automatycznie wyliczane przez przeglądarkę, szerokość 80%, obramowanie linią ciągłą o szerokości 1 px i kolorze Maroon.
Obramowanie tylko dla table - komórki go nie mają, więc na obrazie 2 widać jedną ramkę wokół całej tabeli.
styl9.css CSS zmienione: 5 linii * {
font-family: Georgia;
text-align: center;
}
header, footer {
background-color: #BA6B6C;
color: white;
padding: 7px;
}
#left, #right {
background-color: #EF9A9A;
width: 20%;
height: 500px;
}
#middle {
background-color: MistyRose;
width: 60%;
height: 500px;
}
#data {
background-color: MistyRose;
padding: 50px;
}
ol {
list-style-type: upper-roman;
}
li {
text-align: left;
}
h2::first-letter {
font-size: 170%;
color: Maroon;
}
table {
margin: auto;
width: 80%;
border: 1px solid Maroon;
}Dla selektora obrazu: wysokość 120 px, marginesy zewnętrzne 7 px, cień o przesunięciu 7 px w obu osiach, rozmyciu 7 px i kolorze DimGray.
box-shadow wg składni z arkusza: przesunięcie poziome, pionowe, rozmycie, kolor. Wysokość 120 px bez szerokości - przeglądarka dobierze szerokość z zachowaniem proporcji (180 px).
styl9.css CSS zmienione: 5 linii * {
font-family: Georgia;
text-align: center;
}
header, footer {
background-color: #BA6B6C;
color: white;
padding: 7px;
}
#left, #right {
background-color: #EF9A9A;
width: 20%;
height: 500px;
}
#middle {
background-color: MistyRose;
width: 60%;
height: 500px;
}
#data {
background-color: MistyRose;
padding: 50px;
}
ol {
list-style-type: upper-roman;
}
li {
text-align: left;
}
h2::first-letter {
font-size: 170%;
color: Maroon;
}
table {
margin: auto;
width: 80%;
border: 1px solid Maroon;
}
img {
height: 120px;
margin: 7px;
box-shadow: 7px 7px 7px DimGray;
}Podział strony na bloki: na górze baner, poniżej obok siebie trzy bloki: lewy, środkowy i prawy, poniżej blok z danymi, poniżej stopka.
float: left dla trzech bloków, clear: both dla bloku z danymi.
padding dla bloków bocznych poszerzyłby je ponad 100% razem - prawy blok spadłby pod spód.
styl9.css CSS zmienione: 6 linii * {
font-family: Georgia;
text-align: center;
}
header, footer {
background-color: #BA6B6C;
color: white;
padding: 7px;
}
#left, #right {
background-color: #EF9A9A;
width: 20%;
height: 500px;
}
#middle {
background-color: MistyRose;
width: 60%;
height: 500px;
}
#data {
background-color: MistyRose;
padding: 50px;
}
ol {
list-style-type: upper-roman;
}
li {
text-align: left;
}
h2::first-letter {
font-size: 170%;
color: Maroon;
}
table {
margin: auto;
width: 80%;
border: 1px solid Maroon;
}
img {
height: 120px;
margin: 7px;
box-shadow: 7px 7px 7px DimGray;
}
#left, #middle, #right {
float: left;
}
#data {
clear: both;
}Kroki 29-32 · po tym etapie masz 34 z 34 kryteriów (pkt)
Łączy się z serwerem bazodanowym na localhost, użytkownik root bez hasła, baza danych o nazwie podroze. Na końcu działania skrypt zamyka połączenie z serwerem.
Skrypt 1 stoi pod nagłówkiem bloku środkowego i otwiera połączenie. Skrypt 2 stoi wewnątrz <ol> - wypisze tam elementy listy - i kończy się mysqli_close (R.5.2). Podgląd: skrypty jeszcze niczego nie wypisują.
biuro.php PHP zmienione: 6 linii <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Poznaj Europę</title>
<link rel="stylesheet" href="styl9.css">
</head>
<body>
<header>
<h1>BIURO PODRÓŻY</h1>
</header>
<section id="left">
<h2>Promocje</h2>
<table>
<tr>
<td>Warszawa</td>
<td>od 600 zł</td>
</tr>
<tr>
<td>Wenecja</td>
<td>od 1200 zł</td>
</tr>
<tr>
<td>Paryż</td>
<td>od 1200 zł</td>
</tr>
</table>
</section>
<section id="middle">
<h2>W tym roku jedziemy do...</h2>
<?php
$connection = mysqli_connect("localhost", "root", "", "podroze");
?>
</section>
<section id="right">
<h2>Kontakt</h2>
<a href="mailto:[email protected]">napisz do nas</a>
<p>telefon: 444555666</p>
</section>
<section id="data">
<h3>W poprzednich latach byliśmy...</h3>
<ol>
<?php
mysqli_close($connection);
?>
</ol>
</section>
<footer>
<p>Stronę wykonał: Bartosz Bryniarski</p>
</footer>
</body>
</html>Skrypt 1: Wysyła do bazy danych zapytanie 1. Dane z każdego zwróconego zapytaniem wiersza są wykorzystane do wyświetlenia kolejnych obrazów, w ten sposób, że pole nazwaPliku jest źródłem obrazu, a pole podpis jest tekstem alternatywnym obrazu.
Dla każdego wiersza jeden <img>: nazwa pliku w src, podpis w alt. Cudzysłowy atrybutów są wewnątrz napisu w cudzysłowie, więc poprzedzasz je ukośnikiem \". Podgląd: dziewięć zdjęć od Barcelony do Wenecji.
biuro.php PHP zmienione: 5 linii <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Poznaj Europę</title>
<link rel="stylesheet" href="styl9.css">
</head>
<body>
<header>
<h1>BIURO PODRÓŻY</h1>
</header>
<section id="left">
<h2>Promocje</h2>
<table>
<tr>
<td>Warszawa</td>
<td>od 600 zł</td>
</tr>
<tr>
<td>Wenecja</td>
<td>od 1200 zł</td>
</tr>
<tr>
<td>Paryż</td>
<td>od 1200 zł</td>
</tr>
</table>
</section>
<section id="middle">
<h2>W tym roku jedziemy do...</h2>
<?php
$connection = mysqli_connect("localhost", "root", "", "podroze");
$query = "SELECT nazwaPliku, podpis FROM zdjecia ORDER BY podpis;";
$result = mysqli_query($connection, $query);
while ($row = mysqli_fetch_row($result)) {
echo "<img src=\"$row[0]\" alt=\"$row[1]\">";
}
?>
</section>
<section id="right">
<h2>Kontakt</h2>
<a href="mailto:[email protected]">napisz do nas</a>
<p>telefon: 444555666</p>
</section>
<section id="data">
<h3>W poprzednich latach byliśmy...</h3>
<ol>
<?php
mysqli_close($connection);
?>
</ol>
</section>
<footer>
<p>Stronę wykonał: Bartosz Bryniarski</p>
</footer>
</body>
</html>Pole podpis jest także tekstem pokazującym się w dymku, gdy kursor znajdzie się na grafice, patrz Obraz 2, dymek do grafiki z Londynem.
Dymek po najechaniu to atrybut title - ten sam podpis drugi raz. alt jest dla czytników ekranu i na wypadek braku obrazu, title - dla wskazówki po najechaniu. Najedź w podglądzie na zdjęcie Londynu.
biuro.php PHP zmienione: 1 linia <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Poznaj Europę</title>
<link rel="stylesheet" href="styl9.css">
</head>
<body>
<header>
<h1>BIURO PODRÓŻY</h1>
</header>
<section id="left">
<h2>Promocje</h2>
<table>
<tr>
<td>Warszawa</td>
<td>od 600 zł</td>
</tr>
<tr>
<td>Wenecja</td>
<td>od 1200 zł</td>
</tr>
<tr>
<td>Paryż</td>
<td>od 1200 zł</td>
</tr>
</table>
</section>
<section id="middle">
<h2>W tym roku jedziemy do...</h2>
<?php
$connection = mysqli_connect("localhost", "root", "", "podroze");
$query = "SELECT nazwaPliku, podpis FROM zdjecia ORDER BY podpis;";
$result = mysqli_query($connection, $query);
while ($row = mysqli_fetch_row($result)) {
echo "<img src=\"$row[0]\" alt=\"$row[1]\" title=\"$row[1]\">";
}
?>
</section>
<section id="right">
<h2>Kontakt</h2>
<a href="mailto:[email protected]">napisz do nas</a>
<p>telefon: 444555666</p>
</section>
<section id="data">
<h3>W poprzednich latach byliśmy...</h3>
<ol>
<?php
mysqli_close($connection);
?>
</ol>
</section>
<footer>
<p>Stronę wykonał: Bartosz Bryniarski</p>
</footer>
</body>
</html>Skrypt 2: Wysyła do bazy danych zapytanie 2. Każdy zwrócony zapytaniem wiersz jest wyświetlany w elemencie listy, według wzoru: „Dnia <data> pojechaliśmy do <cel>”.
Zapytanie 2 zwraca najpierw cel, potem datę, a zdanie zaczyna się od daty - dlatego $row[1] stoi przed $row[0]. Podgląd: trzy elementy listy numerowane I, II, III, jak na obrazie 2. Nazwy zmiennych są po angielsku i mówią, co przechowują (R.5.7).
$row[0] w miejscu daty daje „Dnia Francja, Paryz pojechaliśmy do 2019-07-14”.
biuro.php PHP zmienione: 5 linii <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Poznaj Europę</title>
<link rel="stylesheet" href="styl9.css">
</head>
<body>
<header>
<h1>BIURO PODRÓŻY</h1>
</header>
<section id="left">
<h2>Promocje</h2>
<table>
<tr>
<td>Warszawa</td>
<td>od 600 zł</td>
</tr>
<tr>
<td>Wenecja</td>
<td>od 1200 zł</td>
</tr>
<tr>
<td>Paryż</td>
<td>od 1200 zł</td>
</tr>
</table>
</section>
<section id="middle">
<h2>W tym roku jedziemy do...</h2>
<?php
$connection = mysqli_connect("localhost", "root", "", "podroze");
$query = "SELECT nazwaPliku, podpis FROM zdjecia ORDER BY podpis;";
$result = mysqli_query($connection, $query);
while ($row = mysqli_fetch_row($result)) {
echo "<img src=\"$row[0]\" alt=\"$row[1]\" title=\"$row[1]\">";
}
?>
</section>
<section id="right">
<h2>Kontakt</h2>
<a href="mailto:[email protected]">napisz do nas</a>
<p>telefon: 444555666</p>
</section>
<section id="data">
<h3>W poprzednich latach byliśmy...</h3>
<ol>
<?php
$query = "SELECT cel, dataWyjazdu FROM wycieczki WHERE dostepna = 0;";
$result = mysqli_query($connection, $query);
while ($row = mysqli_fetch_row($result)) {
echo "<li>Dnia $row[1] pojechaliśmy do $row[0]</li>";
}
mysqli_close($connection);
?>
</ol>
</section>
<footer>
<p>Stronę wykonał: Bartosz Bryniarski</p>
</footer>
</body>
</html>Krok 33 · po tym etapie masz 34 z 34 kryteriów (pkt)
Pole podpis jest tekstem alternatywnym obrazu oraz tekstem pokazującym się w dymku.
Trzy poprawki z prawdziwych projektów:
mysqli_fetch_assoc - kolumny po nazwach ($row["podpis"]) zamiast numerów; nie trzeba pamiętać, że data jest drugą kolumną,htmlspecialchars - podpis trafia do atrybutów alt i title; podpis z cudzysłowem (np. Wieża "Eiffla") urwałby atrybut w połowie i rozbił znacznik,date("d.m.Y", strtotime(...)) - data z bazy (2019-07-14) zapisana tak, jak czyta ją człowiek: 14.07.2019.Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.
biuro.php PHP zmienione: 8 linii <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Poznaj Europę</title>
<link rel="stylesheet" href="styl9.css">
</head>
<body>
<header>
<h1>BIURO PODRÓŻY</h1>
</header>
<section id="left">
<h2>Promocje</h2>
<table>
<tr>
<td>Warszawa</td>
<td>od 600 zł</td>
</tr>
<tr>
<td>Wenecja</td>
<td>od 1200 zł</td>
</tr>
<tr>
<td>Paryż</td>
<td>od 1200 zł</td>
</tr>
</table>
</section>
<section id="middle">
<h2>W tym roku jedziemy do...</h2>
<?php
$connection = mysqli_connect("localhost", "root", "", "podroze");
$query = "SELECT nazwaPliku, podpis FROM zdjecia ORDER BY podpis;";
$result = mysqli_query($connection, $query);
while ($row = mysqli_fetch_assoc($result)) {
$file = htmlspecialchars($row["nazwaPliku"]);
$caption = htmlspecialchars($row["podpis"]);
echo "<img src=\"$file\" alt=\"$caption\" title=\"$caption\">";
}
?>
</section>
<section id="right">
<h2>Kontakt</h2>
<a href="mailto:[email protected]">napisz do nas</a>
<p>telefon: 444555666</p>
</section>
<section id="data">
<h3>W poprzednich latach byliśmy...</h3>
<ol>
<?php
$query = "SELECT cel, dataWyjazdu FROM wycieczki WHERE dostepna = 0;";
$result = mysqli_query($connection, $query);
while ($row = mysqli_fetch_assoc($result)) {
$date = date("d.m.Y", strtotime($row["dataWyjazdu"]));
$destination = htmlspecialchars($row["cel"]);
echo "<li>Dnia $date pojechaliśmy do $destination</li>";
}
mysqli_close($connection);
?>
</ol>
</section>
<footer>
<p>Stronę wykonał: Bartosz Bryniarski</p>
</footer>
</body>
</html>Krok 34 · po tym etapie masz 34 z 34 kryteriów (pkt)
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: zdjęcia 1.jpg - 9.jpg, biuro.php, import.png, kw1.jpg - kw4.jpg, kwerendy.txt, przeglądarka.txt, styl9.css. Nagraj płytę, sprawdź jej odczyt i opisz ją numerem zdającego.
przeglądarka.txt Tekst nowy plik Google ChromePodgląd strony bez zmian - taki jak po kroku 33.
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.