Krok 1: Baza danych wedkowanie
Utwórz bazę danych o nazwie wedkowanie.
Rozpakuj pliki1.zip z pulpitu (hasło WedkoWaniE&) do folderu zdającego: baza.sql i ryba1.jpg. W phpMyAdmin: Nowa, nazwa wedkowanie (bez „ę”).
Rozwiązanie buduje portal dla wędkarzy: baza wedkowanie z rybami, okresami ochronnymi i łowiskami i cztery zapytania (warunek na kodzie stylu życia, porównanie <, złączenie z warunkiem na rodzaju łowiska i ALTER TABLE z typem TINYINT UNSIGNED - liczby 0-255), zdjęcie przeskalowane do 400 px, strona wedkuj.php z dwoma blokami lewymi i blokiem prawym oraz style w styl_1.css z cieniem obrazu i podświetlaniem wiersza tabeli. Dwa skrypty PHP: lista ryb rzecznych w zdaniach typu „Szczupak pływa w rzece Warta-Obrzycko, Wielkopolskie” i tabela ryb drapieżnych.
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ą. Kod PHP jest najpierw pisany funkcjami z tabeli 1 arkusza (proceduralne mysqli), a na końcu dochodzi odczyt kolumn po nazwach i escapowanie danych.
To jest wersja podstawowa. W zakładce „Nowoczesny kod (grid, PDO)” jest drugi sposób rozwiązania tego samego arkusza: siatka CSS z kolumnami 55% i 45% zamiast float i clear (bloki w kodzie w naturalnej kolejności), kolory w zmiennych CSS i oba zapytania wykonane przez PDO na górze pliku, z bezpiecznym wypisywaniem danych - obie wersje są zgodne z kluczem.
Baza i zdjęcie pochodzą z prawdziwego archiwum pliki1 (załącznik do arkusza, hasło w treści zadania). Zrzuty wyników zapytań są odtworzone z tej bazy - na egzaminie robisz je sam, z całego ekranu.
Jak liczą się punkty. Klucz ma 35 pozycji (R.1.1 - R.5.6), każda za 1 punkt; pozycja R.2.10 jest w opublikowanym kluczu pusta (bez treści kryterium). Próg zdania części praktycznej to 75%, czyli 27 punktów. 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 35 kryteriów (pkt)
Utwórz bazę danych o nazwie wedkowanie.
Rozpakuj pliki1.zip z pulpitu (hasło WedkoWaniE&) do folderu zdającego: baza.sql i ryba1.jpg. W phpMyAdmin: Nowa, nazwa wedkowanie (bez „ę”).
Do bazy wedkowanie zaimportuj tabele z pliku baza.sql z rozpakowanego archiwum.
Import → baza.sql → Wykonaj. Z obrazu 1 korzystasz z trzech tabel: ryby (styl_zycia: 1 - drapieżnik, 2 - ryba spokojnego żeru), okres_ochronny (z wymiar_ochronny w cm) i lowisko (rodzaj: 1 morze, 2 jezioro, 3 rzeka, 4 zalew, 5 staw). Obie mniejsze tabele wskazują rybę kluczem obcym Ryby_id. Plik zawiera też tabelę samochody - w zadaniu jej nie używasz.
Wykonaj zrzut ekranu po imporcie. Zrzut zapisz w formacie PNG i nazwij import. Nie kadruj zrzutu. Powinien on obejmować cały ekran monitora, z widocznym paskiem zadań. Na zrzucie powinny być widoczne elementy wskazujące na poprawnie wykonany import tabel.
Print Screen, zapis jako import.png; zrzuty zapytań będą w JPEG.
Zapytanie 1: wybierające jedynie pola id, nazwa i wystepowanie z tabeli Ryby dla ryb drapieżnych.
„Drapieżne” to w bazie styl_zycia = 1 (opis w treści zadania). Wynik: 5 ryb o identyfikatorach 1, 3, 4, 5, 6 - jak w kluczu. Zrzut kw1.jpg. To zapytanie wyśle skrypt 2.
kwerendy.txt Tekst nowy plik -- Zapytanie 1
SELECT id, nazwa, wystepowanie FROM ryby WHERE styl_zycia = 1;
Zapytanie 2: wybierające jedynie pola Ryby_id oraz wymiar_ochronny z tabeli Okres_ochronny dla ryb, których wymiar ochronny jest mniejszy niż 30 cm.
„Mniejszy niż” to < (mniejszy lub równy byłby <=). Wynik: 4 wiersze - 4/15, 6/0, 7/0, 8/25 - jak w kluczu. Zrzut kw2.jpg.
kwerendy.txt Tekst zmienione: 3 linie -- Zapytanie 1
SELECT id, nazwa, wystepowanie FROM ryby WHERE styl_zycia = 1;
-- Zapytanie 2
SELECT Ryby_id, wymiar_ochronny FROM okres_ochronny WHERE wymiar_ochronny < 30;
Zapytanie 3: wybierające jedynie pole nazwa z tabeli Ryby oraz odpowiadające tej nazwie pola akwen i wojewodztwo z tabeli Lowisko dla łowisk, które są rzekami. Zapytanie wykorzystuje relację.
FROM ryby JOIN lowisko ON ryby.id = lowisko.Ryby_id - ryba z jej łowiskiem; „rzeki” to rodzaj = 3. Wynik: Szczupak (Warta-Obrzycko, Wielkopolskie) i Leszcz (Przemsza k. Okradzinowa, Slaskie). Zrzut kw3.jpg. To zapytanie wyśle skrypt 1.
kwerendy.txt Tekst zmienione: 3 linie -- Zapytanie 1
SELECT id, nazwa, wystepowanie FROM ryby WHERE styl_zycia = 1;
-- Zapytanie 2
SELECT Ryby_id, wymiar_ochronny FROM okres_ochronny WHERE wymiar_ochronny < 30;
-- Zapytanie 3
SELECT nazwa, akwen, wojewodztwo FROM ryby JOIN lowisko ON ryby.id = lowisko.Ryby_id WHERE rodzaj = 3;
Zapytanie 4: dodające do tabeli Ryby kolumnę dobowy_limit typu numerycznego, o rozmiarze pozwalającym na wpisanie jedynie liczb z przedziału <0, 255>.
Typ dobierasz do zakresu: TINYINT zajmuje 1 bajt, czyli 256 wartości; bez znaku (UNSIGNED) to dokładnie 0-255. Klucz przyjmuje tylko ten typ i tę kolejność słów: TINYINT UNSIGNED. Zrzut kw4.jpg: wykonana kwerenda z komunikatem albo, jak obok, struktura tabeli z nowym polem.
UNSIGNED TINYINT (odwrotna kolejność) to błąd składni; INT pozwala na dużo większe liczby, a TINYINT bez UNSIGNED na zakres -128..127 - klucz nie uzna ani jednego, ani drugiego.
kwerendy.txt Tekst zmienione: 3 linie -- Zapytanie 1
SELECT id, nazwa, wystepowanie FROM ryby WHERE styl_zycia = 1;
-- Zapytanie 2
SELECT Ryby_id, wymiar_ochronny FROM okres_ochronny WHERE wymiar_ochronny < 30;
-- Zapytanie 3
SELECT nazwa, akwen, wojewodztwo FROM ryby JOIN lowisko ON ryby.id = lowisko.Ryby_id WHERE rodzaj = 3;
-- Zapytanie 4
ALTER TABLE ryby ADD COLUMN dobowy_limit TINYINT UNSIGNED;
Kroki 8-19 · po tym etapie masz 17 z 35 kryteriów (pkt)
Przygotowanie grafiki: Plik ryba1.jpg, wypakowany z archiwum, należy przeskalować z zachowaniem proporcji tak, aby jego szerokość wynosiła dokładnie 400 px.
Zdjęcie ma 600 × 480 px. Obraz → Skaluj obraz, łańcuch zamknięty, szerokość 400 - wysokość wyjdzie 320 px (klucz R.2.1: 320 ± 2). Eksport pod tą samą nazwą.

Cechy witryny: Składa się ze strony o nazwie wedkuj.php zapisanej w języku HTML5.
Utwórz wedkuj.php: <!DOCTYPE html> i szkielet strony.
wedkuj.php PHP nowy plik <!DOCTYPE html>
<html>
<head>
</head>
<body>
</body>
</html>Zadeklarowany język dla witryny: polski.
lang="pl" w <html>.
wedkuj.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">.
wedkuj.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: „Wędkowanie”.
<title> z polską literą - stąd potrzebne kodowanie UTF-8 (R.2.3).
wedkuj.php PHP zmienione: 1 linia <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Wędkowanie</title>
</head>
<body>
</body>
</html>Arkusz stylów w pliku o nazwie styl_1.css prawidłowo połączony z kodem strony.
Nazwa z podkreśleniem i cyfrą: styl_1.css.
styl.css zamiast styl_1.css odcina wszystkie style (R.3.3 i cały rezultat R.4).
wedkuj.php PHP zmienione: 1 linia <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Wędkowanie</title>
<link rel="stylesheet" href="styl_1.css">
</head>
<body>
</body>
</html>Podział strony na bloki: na górze blok banera, poniżej po lewej stronie dwa bloki lewe, obok jeden blok prawy, 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.
<header>, trzy <section> i <footer> (R.2.4). Identyfikatory po angielsku: rivers (ryby rzeczne - pierwszy lewy), predators (drapieżniki - drugi lewy), photo (prawy).
Blok prawy piszesz w kodzie przed blokami lewymi: na obrazie 2 stoi obok obu, od samej góry. Przy układzie opływanym (float) blok, który ma zacząć się na górze, musi pojawić się w kodzie przed blokami, obok których stoi.
wedkuj.php PHP zmienione: 10 linii <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Wędkowanie</title>
<link rel="stylesheet" href="styl_1.css">
</head>
<body>
<header>
</header>
<section id="photo">
</section>
<section id="rivers">
</section>
<section id="predators">
</section>
<footer>
</footer>
</body>
</html>Zawartość banera: nagłówek pierwszego stopnia o treści „Portal dla wędkarzy”.
<h1> w <header>.
wedkuj.php PHP zmienione: 1 linia <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Wędkowanie</title>
<link rel="stylesheet" href="styl_1.css">
</head>
<body>
<header>
<h1>Portal dla wędkarzy</h1>
</header>
<section id="photo">
</section>
<section id="rivers">
</section>
<section id="predators">
</section>
<footer>
</footer>
</body>
</html>Zawartość pierwszego bloku lewego: Nagłówek trzeciego stopnia o treści: „Ryby zamieszkujące rzeki”. Lista numerowana (uporządkowana) wypełniona przez skrypt 1.
<h3> i pusta <ol> - elementy wypisze skrypt 1.
wedkuj.php PHP zmienione: 3 linie <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Wędkowanie</title>
<link rel="stylesheet" href="styl_1.css">
</head>
<body>
<header>
<h1>Portal dla wędkarzy</h1>
</header>
<section id="photo">
</section>
<section id="rivers">
<h3>Ryby zamieszkujące rzeki</h3>
<ol>
</ol>
</section>
<section id="predators">
</section>
<footer>
</footer>
</body>
</html>Zawartość drugiego bloku lewego: Nagłówek trzeciego stopnia o treści: „Ryby drapieżne naszych wód”. Tabela o trzech kolumnach wypełniona danymi. Pierwszy wiersz zawiera komórki nagłówkowe o treści, kolejno: „L.p.”, „Gatunek”, „Występowanie”.
Pierwszy wiersz z trzema komórkami nagłówkowymi <th> (R.2.8); kolejne wiersze dopisze skrypt 2.
wedkuj.php PHP zmienione: 8 linii <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Wędkowanie</title>
<link rel="stylesheet" href="styl_1.css">
</head>
<body>
<header>
<h1>Portal dla wędkarzy</h1>
</header>
<section id="photo">
</section>
<section id="rivers">
<h3>Ryby zamieszkujące rzeki</h3>
<ol>
</ol>
</section>
<section id="predators">
<h3>Ryby drapieżne naszych wód</h3>
<table>
<tr>
<th>L.p.</th>
<th>Gatunek</th>
<th>Występowanie</th>
</tr>
</table>
</section>
<footer>
</footer>
</body>
</html>Zawartość bloku prawego: Obraz ryba1.jpg z tekstem alternatywnym o treści: „Sum”. W kolejnej linii odnośnik do pliku kwerendy.txt z treścią: „Pobierz kwerendy”.
Obraz i odnośnik są elementami liniowymi - stanęłyby obok siebie. „W kolejnej linii” to znacznik <br> między nimi. Odnośnik może prowadzić do dowolnego pliku, nie tylko strony: href="kwerendy.txt" - przeglądarka otworzy plik tekstowy albo go pobierze (R.2.9, R.3.2).
wedkuj.php PHP zmienione: 3 linie <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Wędkowanie</title>
<link rel="stylesheet" href="styl_1.css">
</head>
<body>
<header>
<h1>Portal dla wędkarzy</h1>
</header>
<section id="photo">
<img src="ryba1.jpg" alt="Sum">
<br>
<a href="kwerendy.txt">Pobierz kwerendy</a>
</section>
<section id="rivers">
<h3>Ryby zamieszkujące rzeki</h3>
<ol>
</ol>
</section>
<section id="predators">
<h3>Ryby drapieżne naszych wód</h3>
<table>
<tr>
<th>L.p.</th>
<th>Gatunek</th>
<th>Występowanie</th>
</tr>
</table>
</section>
<footer>
</footer>
</body>
</html>Zawartość stopki: akapit (paragraf) o treści: „Stronę wykonał: ”, oraz zawierający numer, którym został podpisany arkusz.
Akapit w <footer>. Na egzaminie wpisujesz numer PESEL - tu stoi autor rozwiązania.
wedkuj.php PHP zmienione: 1 linia <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Wędkowanie</title>
<link rel="stylesheet" href="styl_1.css">
</head>
<body>
<header>
<h1>Portal dla wędkarzy</h1>
</header>
<section id="photo">
<img src="ryba1.jpg" alt="Sum">
<br>
<a href="kwerendy.txt">Pobierz kwerendy</a>
</section>
<section id="rivers">
<h3>Ryby zamieszkujące rzeki</h3>
<ol>
</ol>
</section>
<section id="predators">
<h3>Ryby drapieżne naszych wód</h3>
<table>
<tr>
<th>L.p.</th>
<th>Gatunek</th>
<th>Występowanie</th>
</tr>
</table>
</section>
<footer>
<p>Stronę wykonał: Bartosz Bryniarski</p>
</footer>
</body>
</html>Kroki 20-27 · po tym etapie masz 28 z 35 kryteriów (pkt)
Styl CSS zdefiniowany w całości w zewnętrznym pliku o nazwie styl_1.css. Domyślne formatowanie wszystkich selektorów: krój czcionki Helvetica.
Utwórz styl_1.css; selektor * (R.4.1).
styl_1.css CSS nowy plik * {
font-family: Helvetica;
}Wspólne dla bloku banera i stopki: kolor tła #00838F, biały kolor czcionki, marginesy wewnętrzne 5 px, rozmiar czcionki 130%, wyrównanie tekstu do środka.
Jedna reguła dla dwóch selektorów.
styl_1.css CSS zmienione: 7 linii * {
font-family: Helvetica;
}
header, footer {
background-color: #00838F;
color: white;
padding: 5px;
font-size: 130%;
text-align: center;
}Dla obu bloków lewych: kolor tła #EFEFEF, szerokość 55%. Dodatkowo dla pierwszego bloku lewego wysokość 150 px oraz dla drugiego – 300 px.
Wspólna reguła dla obu bloków i dwie osobne z wysokościami. Razem 150 + 300 = 450 px - tyle, ile blok prawy.
styl_1.css CSS zmienione: 10 linii * {
font-family: Helvetica;
}
header, footer {
background-color: #00838F;
color: white;
padding: 5px;
font-size: 130%;
text-align: center;
}
#rivers, #predators {
background-color: #EFEFEF;
width: 55%;
}
#rivers {
height: 150px;
}
#predators {
height: 300px;
}Dla bloku prawego: kolor tła #4FB3BF, szerokość 45%, wysokość 450 px, wyrównanie tekstu do środka.
55% + 45% = 100% szerokości.
styl_1.css CSS zmienione: 6 linii * {
font-family: Helvetica;
}
header, footer {
background-color: #00838F;
color: white;
padding: 5px;
font-size: 130%;
text-align: center;
}
#rivers, #predators {
background-color: #EFEFEF;
width: 55%;
}
#rivers {
height: 150px;
}
#predators {
height: 300px;
}
#photo {
background-color: #4FB3BF;
width: 45%;
height: 450px;
text-align: center;
}Dla selektora obrazu: cień o przesunięciu 10 px w obu osiach, rozmyciu 7 px i kolorze DimGray, marginesy zewnętrzne 20 px.
box-shadow: przesunięcie w poziomie, w pionie, rozmycie, kolor (R.4.8). Selektor znacznika img, jak każe uwaga w arkuszu.
styl_1.css CSS zmienione: 4 linie * {
font-family: Helvetica;
}
header, footer {
background-color: #00838F;
color: white;
padding: 5px;
font-size: 130%;
text-align: center;
}
#rivers, #predators {
background-color: #EFEFEF;
width: 55%;
}
#rivers {
height: 150px;
}
#predators {
height: 300px;
}
#photo {
background-color: #4FB3BF;
width: 45%;
height: 450px;
text-align: center;
}
img {
box-shadow: 10px 10px 7px DimGray;
margin: 20px;
}Dla selektora tabeli, komórek tabeli, komórek nagłówkowych: obramowanie linią ciągłą o szerokości 1 px i kolorze #4FB3BF, obramowanie tabeli i komórek połączone. Dodatkowo dla selektora tabeli: marginesy zewnętrzne wyliczane automatycznie przez przeglądarkę, szerokość 80%. Dodatkowo dla selektora komórek tabeli i nagłówkowych: marginesy wewnętrzne 4 px.
Trzy reguły z arkusza po kolei. margin: auto przy szerokości 80% stawia tabelę na środku bloku; border-collapse: collapse łączy ramki (R.4.9).
styl_1.css CSS zmienione: 11 linii * {
font-family: Helvetica;
}
header, footer {
background-color: #00838F;
color: white;
padding: 5px;
font-size: 130%;
text-align: center;
}
#rivers, #predators {
background-color: #EFEFEF;
width: 55%;
}
#rivers {
height: 150px;
}
#predators {
height: 300px;
}
#photo {
background-color: #4FB3BF;
width: 45%;
height: 450px;
text-align: center;
}
img {
box-shadow: 10px 10px 7px DimGray;
margin: 20px;
}
table, td, th {
border: 1px solid #4FB3BF;
border-collapse: collapse;
}
table {
margin: auto;
width: 80%;
}
td, th {
padding: 4px;
}Gdy kursor myszy znajdzie się na wierszu tabeli, kolor tła wiersza zmienia się na #4FB3BF.
tr:hover - cały wiersz zmienia tło (R.4.10). Wiersze z danymi wypisze skrypt 2.
styl_1.css CSS zmienione: 3 linie * {
font-family: Helvetica;
}
header, footer {
background-color: #00838F;
color: white;
padding: 5px;
font-size: 130%;
text-align: center;
}
#rivers, #predators {
background-color: #EFEFEF;
width: 55%;
}
#rivers {
height: 150px;
}
#predators {
height: 300px;
}
#photo {
background-color: #4FB3BF;
width: 45%;
height: 450px;
text-align: center;
}
img {
box-shadow: 10px 10px 7px DimGray;
margin: 20px;
}
table, td, th {
border: 1px solid #4FB3BF;
border-collapse: collapse;
}
table {
margin: auto;
width: 80%;
}
td, th {
padding: 4px;
}
tr:hover {
background-color: #4FB3BF;
}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.
#photo { float: right; } - blok prawy przy prawej krawędzi, od góry (stąd jego miejsce w kodzie przed blokami lewymi),#rivers, #predators { float: left; } - pierwszy lewy na górze, a drugi już się obok niego nie zmieści (55% + 55%), więc spada pod pierwszy,footer { clear: both; } - stopka pod wszystkimi blokami (R.3.1).styl_1.css CSS zmienione: 5 linii * {
font-family: Helvetica;
}
footer {
clear: both;
}
header, footer {
background-color: #00838F;
color: white;
padding: 5px;
font-size: 130%;
text-align: center;
}
#rivers, #predators {
float: left;
background-color: #EFEFEF;
width: 55%;
}
#rivers {
height: 150px;
}
#predators {
height: 300px;
}
#photo {
float: right;
background-color: #4FB3BF;
width: 45%;
height: 450px;
text-align: center;
}
img {
box-shadow: 10px 10px 7px DimGray;
margin: 20px;
}
table, td, th {
border: 1px solid #4FB3BF;
border-collapse: collapse;
}
table {
margin: auto;
width: 80%;
}
td, th {
padding: 4px;
}
tr:hover {
background-color: #4FB3BF;
}Kroki 28-32 · po tym etapie masz 34 z 35 kryteriów (pkt)
Wymagania dotyczące skryptów: Napisane w języku PHP. Skrypty łączą się z serwerem bazodanowym na localhost, użytkownik root bez hasła, baza danych o nazwie wedkowanie.
Połączenie raz, zaraz po <body>, w $connection (R.5.1). Od tego kroku podgląd to wynik działania strony po stronie serwera.
wedkuj.php PHP zmienione: 3 linie <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Wędkowanie</title>
<link rel="stylesheet" href="styl_1.css">
</head>
<body>
<?php
$connection = mysqli_connect('localhost', 'root', '', 'wedkowanie');
?>
<header>
<h1>Portal dla wędkarzy</h1>
</header>
<section id="photo">
<img src="ryba1.jpg" alt="Sum">
<br>
<a href="kwerendy.txt">Pobierz kwerendy</a>
</section>
<section id="rivers">
<h3>Ryby zamieszkujące rzeki</h3>
<ol>
</ol>
</section>
<section id="predators">
<h3>Ryby drapieżne naszych wód</h3>
<table>
<tr>
<th>L.p.</th>
<th>Gatunek</th>
<th>Występowanie</th>
</tr>
</table>
</section>
<footer>
<p>Stronę wykonał: Bartosz Bryniarski</p>
</footer>
</body>
</html>Skrypt 1: wysyła do bazy danych zapytanie 3.
Skrypt stoi w <ol> pierwszego bloku lewego; wynik w $riverFish (ryby rzeczne).
wedkuj.php PHP zmienione: 3 linie <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Wędkowanie</title>
<link rel="stylesheet" href="styl_1.css">
</head>
<body>
<?php
$connection = mysqli_connect('localhost', 'root', '', 'wedkowanie');
?>
<header>
<h1>Portal dla wędkarzy</h1>
</header>
<section id="photo">
<img src="ryba1.jpg" alt="Sum">
<br>
<a href="kwerendy.txt">Pobierz kwerendy</a>
</section>
<section id="rivers">
<h3>Ryby zamieszkujące rzeki</h3>
<ol>
<?php
$riverFish = mysqli_query($connection, 'SELECT nazwa, akwen, wojewodztwo FROM ryby JOIN lowisko ON ryby.id = lowisko.Ryby_id WHERE rodzaj = 3;');
?>
</ol>
</section>
<section id="predators">
<h3>Ryby drapieżne naszych wód</h3>
<table>
<tr>
<th>L.p.</th>
<th>Gatunek</th>
<th>Występowanie</th>
</tr>
</table>
</section>
<footer>
<p>Stronę wykonał: Bartosz Bryniarski</p>
</footer>
</body>
</html>Podgląd strony bez zmian - taki jak po kroku 28.
Każdy zwrócony zapytaniem wiersz jest wyświetlany w osobnym elemencie listy, według wzoru: ”<nazwa_gatunku> pływa w rzece <nazwa_akwenu>, <wojewodztwo>”, gdzie nawiasy <> oznaczają wartości pobrane z bazy danych.
Pętla while z mysqli_fetch_row; w napisie w cudzysłowie PHP podstawia trzy kolumny: nazwa $row[0], akwen $row[1], województwo $row[2] - razem zdanie według wzoru. Każde zdanie w osobnym <li> (R.5.4, R.5.5).
wedkuj.php PHP zmienione: 3 linie <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Wędkowanie</title>
<link rel="stylesheet" href="styl_1.css">
</head>
<body>
<?php
$connection = mysqli_connect('localhost', 'root', '', 'wedkowanie');
?>
<header>
<h1>Portal dla wędkarzy</h1>
</header>
<section id="photo">
<img src="ryba1.jpg" alt="Sum">
<br>
<a href="kwerendy.txt">Pobierz kwerendy</a>
</section>
<section id="rivers">
<h3>Ryby zamieszkujące rzeki</h3>
<ol>
<?php
$riverFish = mysqli_query($connection, 'SELECT nazwa, akwen, wojewodztwo FROM ryby JOIN lowisko ON ryby.id = lowisko.Ryby_id WHERE rodzaj = 3;');
while ($row = mysqli_fetch_row($riverFish)) {
echo "<li>$row[0] pływa w rzece $row[1], $row[2]</li>";
}
?>
</ol>
</section>
<section id="predators">
<h3>Ryby drapieżne naszych wód</h3>
<table>
<tr>
<th>L.p.</th>
<th>Gatunek</th>
<th>Występowanie</th>
</tr>
</table>
</section>
<footer>
<p>Stronę wykonał: Bartosz Bryniarski</p>
</footer>
</body>
</html>Skrypt 2: wysyła do bazy danych zapytanie 1. Każdy zwrócony zapytaniem wiersz jest wyświetlany w osobnym wierszu tabeli.
Skrypt 2 stoi w tabeli, pod wierszem nagłówkowym. Każdy wiersz wyniku zapytania 1 to <tr> z trzema komórkami - w kolumnie „L.p.” stoi identyfikator ryby, jak na obrazie 2 (1, 3, 4, 5, 6). Najedź na wiersz - podświetla się (R.5.6).
wedkuj.php PHP zmienione: 6 linii <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Wędkowanie</title>
<link rel="stylesheet" href="styl_1.css">
</head>
<body>
<?php
$connection = mysqli_connect('localhost', 'root', '', 'wedkowanie');
?>
<header>
<h1>Portal dla wędkarzy</h1>
</header>
<section id="photo">
<img src="ryba1.jpg" alt="Sum">
<br>
<a href="kwerendy.txt">Pobierz kwerendy</a>
</section>
<section id="rivers">
<h3>Ryby zamieszkujące rzeki</h3>
<ol>
<?php
$riverFish = mysqli_query($connection, 'SELECT nazwa, akwen, wojewodztwo FROM ryby JOIN lowisko ON ryby.id = lowisko.Ryby_id WHERE rodzaj = 3;');
while ($row = mysqli_fetch_row($riverFish)) {
echo "<li>$row[0] pływa w rzece $row[1], $row[2]</li>";
}
?>
</ol>
</section>
<section id="predators">
<h3>Ryby drapieżne naszych wód</h3>
<table>
<tr>
<th>L.p.</th>
<th>Gatunek</th>
<th>Występowanie</th>
</tr>
<?php
$predators = mysqli_query($connection, 'SELECT id, nazwa, wystepowanie FROM ryby WHERE styl_zycia = 1;');
while ($row = mysqli_fetch_row($predators)) {
echo "<tr><td>$row[0]</td><td>$row[1]</td><td>$row[2]</td></tr>";
}
?>
</table>
</section>
<footer>
<p>Stronę wykonał: Bartosz Bryniarski</p>
</footer>
</body>
</html>Na końcu jest zamykane połączenie z serwerem.
mysqli_close($connection) po stopce - ostatnia operacja na bazie (R.5.2). Strona spełnia wszystkie kryteria arkusza.
wedkuj.php PHP zmienione: 3 linie <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Wędkowanie</title>
<link rel="stylesheet" href="styl_1.css">
</head>
<body>
<?php
$connection = mysqli_connect('localhost', 'root', '', 'wedkowanie');
?>
<header>
<h1>Portal dla wędkarzy</h1>
</header>
<section id="photo">
<img src="ryba1.jpg" alt="Sum">
<br>
<a href="kwerendy.txt">Pobierz kwerendy</a>
</section>
<section id="rivers">
<h3>Ryby zamieszkujące rzeki</h3>
<ol>
<?php
$riverFish = mysqli_query($connection, 'SELECT nazwa, akwen, wojewodztwo FROM ryby JOIN lowisko ON ryby.id = lowisko.Ryby_id WHERE rodzaj = 3;');
while ($row = mysqli_fetch_row($riverFish)) {
echo "<li>$row[0] pływa w rzece $row[1], $row[2]</li>";
}
?>
</ol>
</section>
<section id="predators">
<h3>Ryby drapieżne naszych wód</h3>
<table>
<tr>
<th>L.p.</th>
<th>Gatunek</th>
<th>Występowanie</th>
</tr>
<?php
$predators = mysqli_query($connection, 'SELECT id, nazwa, wystepowanie FROM ryby WHERE styl_zycia = 1;');
while ($row = mysqli_fetch_row($predators)) {
echo "<tr><td>$row[0]</td><td>$row[1]</td><td>$row[2]</td></tr>";
}
?>
</table>
</section>
<footer>
<p>Stronę wykonał: Bartosz Bryniarski</p>
</footer>
<?php
mysqli_close($connection);
?>
</body>
</html>Podgląd strony bez zmian - taki jak po kroku 31.
Krok 33 · po tym etapie masz 34 z 35 kryteriów (pkt)
Każdy zwrócony zapytaniem wiersz jest wyświetlany w osobnym elemencie listy.
mysqli_fetch_assoc oddaje wiersz po nazwach kolumn - $row['akwen'] mówi więcej niż $row[1], a zmiana kolejności w SELECT niczego nie psuje. Teksty z bazy przechodzą przez htmlspecialchars przy wypisywaniu, więc znacznik wpisany w nazwę łowiska nie wykona się na stronie (XSS). W napisie z cudzysłowem element tablicy z kluczem tekstowym obejmujesz klamrami: {$row['id']}. Podgląd bez zmian.
Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.
wedkuj.php PHP zmienione: 9 linii <!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Wędkowanie</title>
<link rel="stylesheet" href="styl_1.css">
</head>
<body>
<?php
$connection = mysqli_connect('localhost', 'root', '', 'wedkowanie');
?>
<header>
<h1>Portal dla wędkarzy</h1>
</header>
<section id="photo">
<img src="ryba1.jpg" alt="Sum">
<br>
<a href="kwerendy.txt">Pobierz kwerendy</a>
</section>
<section id="rivers">
<h3>Ryby zamieszkujące rzeki</h3>
<ol>
<?php
$riverFish = mysqli_query($connection, 'SELECT nazwa, akwen, wojewodztwo FROM ryby JOIN lowisko ON ryby.id = lowisko.Ryby_id WHERE rodzaj = 3;');
while ($row = mysqli_fetch_assoc($riverFish)) {
$name = htmlspecialchars($row['nazwa']);
$river = htmlspecialchars($row['akwen']);
$region = htmlspecialchars($row['wojewodztwo']);
echo "<li>$name pływa w rzece $river, $region</li>";
}
?>
</ol>
</section>
<section id="predators">
<h3>Ryby drapieżne naszych wód</h3>
<table>
<tr>
<th>L.p.</th>
<th>Gatunek</th>
<th>Występowanie</th>
</tr>
<?php
$predators = mysqli_query($connection, 'SELECT id, nazwa, wystepowanie FROM ryby WHERE styl_zycia = 1;');
while ($row = mysqli_fetch_assoc($predators)) {
$name = htmlspecialchars($row['nazwa']);
$habitat = htmlspecialchars($row['wystepowanie']);
echo "<tr><td>{$row['id']}</td><td>$name</td><td>$habitat</td></tr>";
}
?>
</table>
</section>
<footer>
<p>Stronę wykonał: Bartosz Bryniarski</p>
</footer>
<?php
mysqli_close($connection);
?>
</body>
</html>Podgląd strony bez zmian - taki jak po kroku 31.
Krok 34 · po tym etapie masz 34 z 35 kryteriów (pkt)
Po zakończeniu pracy utwórz plik tekstowy o nazwie przeglądarka.txt. Zapisz w nim nazwę przeglądarki internetowej, w której weryfikowałeś poprawność działania witryny. Umieść go w folderze z numerem, którym został podpisany arkusz. Nagraj płytę z rezultatami pracy. W folderze z numerem, którym został podpisany arkusz, powinny znajdować się pliki: import.png, kw1.jpg, kw2.jpg, kw3.jpg, kw4.jpg, kwerendy.txt, przeglądarka.txt, ryba1.jpg, styl_1.css, wedkuj.php, ewentualnie inne przygotowane pliki.
W przeglądarka.txt wpisujesz nazwę przeglądarki, w której sprawdzasz stronę przez http://localhost/….
Sprawdź listę plików (kwerendy.txt musi leżeć obok strony - prowadzi do niego odnośnik), 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 31.
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.