Zadanie egzaminacyjne INF.03 – Wyprawy rowerowe

Wszystkie polecenia wykonaj w jednym pliku PHP. Najpierw zaimportuj poniższą bazę, potem realizuj kolejne zadania!

Zadanie 0 – Utworzenie bazy danych

W phpMyAdmin utwórz bazę rowery oraz zaimportuj poniższy kod SQL. Zostanie utworzona struktura bazy, przykładowi użytkownicy, wyprawy i zdjęcia.
-- Utworzenie bazy danych
CREATE DATABASE rowery CHARACTER SET utf8 COLLATE utf8_unicode_ci;
USE rowery;

-- Tabela użytkowników
CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  login VARCHAR(40) NOT NULL UNIQUE,
  password_hash VARCHAR(255) NOT NULL
);

-- Tabela wypraw
CREATE TABLE wyprawy (
  id INT AUTO_INCREMENT PRIMARY KEY,
  uzytkownik_id INT,
  nazwa VARCHAR(60),
  lokalizacja VARCHAR(60),
  status VARCHAR(30),
  data_zamowienia DATE,
  FOREIGN KEY (uzytkownik_id) REFERENCES users(id)
);

-- Tabela zdjęć wypraw
CREATE TABLE zdjecia (
  id INT AUTO_INCREMENT PRIMARY KEY,
  id_wyprawy INT,
  zrodlo VARCHAR(128),
  FOREIGN KEY (id_wyprawy) REFERENCES wyprawy(id)
);

-- Dodaj testowych użytkowników (hasła: "test1", "admin")
INSERT INTO users (login, password_hash) VALUES
('test1', '$2y$10$EfvVZGwHDDpC/uxx0IDFz.F5Z.Fm2DFDLRI4vfS6kHmIB1scDEy6y'),
('admin', '$2y$10$kB9o56ZUFVWRq.i8jTVXkOkpNL0A8ZahRuqp1L2E8nw6BVRHiYw7i');

-- Dodaj wyprawy
INSERT INTO wyprawy (uzytkownik_id, nazwa, lokalizacja, status, data_zamowienia) VALUES
(1, 'Rowerem przez Mazury', 'Giżycko', 'zrealizowana', '2025-07-10'),
(1, 'Beskid Śląski MTB', 'Wisła', 'w realizacji', '2025-11-03'),
(2, 'Wybrzeżem Bałtyku', 'Ustka', 'zrealizowana', '2025-06-15');

-- Dodaj zdjęcia wypraw
INSERT INTO zdjecia (id_wyprawy, zrodlo) VALUES
(1, 'mazury.jpg'),
(2, 'beskid.jpg'),
(3, 'baltyk.jpg');

Zadanie 1 – Panel logowania

Stwórz formularz logowania użytkowników z weryfikacją hasła przy użyciu password_hash() i password_verify().
<form method="post">
Login: <input type="text" name="login"><br>
Hasło: <input type="password" name="haslo"><br>
<input type="submit" name="submit" value="Zaloguj">
</form>

<?php
if(isset($_POST['submit'])){
    $login = $_POST['login'];
    $haslo = $_POST['haslo'];
    $conn = new mysqli('localhost','root','','rowery');
    $result = $conn->query("SELECT password_hash FROM users WHERE login='$login'");
    if($result->num_rows){
        $row = $result->fetch_assoc();
        if(password_verify($haslo, $row['password_hash'])){
            echo "Zalogowano!";
        } else {
            echo "Niepoprawne hasło";
        }
    } else {
        echo "Nie znaleziono użytkownika";
    }
    $conn->close();
}
?>

Zadanie 2 – Lista wypraw

Wyświetl listę wszystkich wypraw (nazwa, lokalizacja) z bazy rowery. Obok każdej wyprawy dodaj link "Zobacz zdjęcie".
<?php
$conn = new mysqli('localhost', 'root', '', 'rowery');
$sql = "SELECT w.id, w.nazwa, w.lokalizacja, z.zrodlo FROM wyprawy w LEFT JOIN zdjecia z ON w.id = z.id_wyprawy";
$wynik = $conn->query($sql);
while($row = $wynik->fetch_assoc()) {
    echo "<div><strong>{$row['nazwa']}</strong> ({$row['lokalizacja']}) ";
    if($row['zrodlo']) echo "<a href='{$row['zrodlo']}' target='_blank'>Zobacz zdjęcie</a>";
    echo "</div>";
}
$conn->close();
?>

Zadanie 3 – Wyszukiwanie wypraw

Dodaj formularz umożliwiający wyszukiwanie wypraw po tytule lub lokalizacji.
<form method="get">
Szukaj wyprawy: <input type="text" name="szukaj">
<input type="submit" value="Szukaj">
</form>

<?php
if(isset($_GET['szukaj'])){
    $conn = new mysqli('localhost', 'root', '', 'rowery');
    $szukaj = $conn->real_escape_string($_GET['szukaj']);
    $sql = "SELECT w.id, w.nazwa, w.lokalizacja FROM wyprawy w WHERE w.nazwa LIKE '%$szukaj%' OR w.lokalizacja LIKE '%$szukaj%'";
    $wynik = $conn->query($sql);
    while($row = $wynik->fetch_assoc()){
        echo "<div><strong>{$row['nazwa']}</strong> ({$row['lokalizacja']})</div>";
    }
    $conn->close();
}
?>

Zadanie 4 – Raport statystyk

Przygotuj raport liczby wypraw według statusu i daty realizacji. Użyj GROUP BY.
SELECT status, COUNT(*) AS ile, DATE(data_zamowienia) AS dzien
FROM wyprawy
GROUP BY status, dzien;

Zadanie 5 – Usuwanie wypraw

Dodaj możliwość usuwania wypraw po ID. Wyświetl przy każdej wyprawie przycisk "Usuń".
<form method="post">
<input type="hidden" name="usun_id" value="ID_WYPRAWY">
<input type="submit" value="Usuń">
</form>

<?php
if(isset($_POST['usun_id'])){
    $conn = new mysqli('localhost', 'root', '', 'rowery');
    $id = intval($_POST['usun_id']);
    $conn->query("DELETE FROM wyprawy WHERE id=$id");
    $conn->close();
}
?>

Zadanie 6 – Panel administratora

Panel, w którym administrator może zobaczyć wszystkich użytkowników i ich wyprawy.
<?php
$conn = new mysqli('localhost', 'root', '', 'rowery');
$sql = "SELECT u.login, w.nazwa, w.lokalizacja 
        FROM users u 
        LEFT JOIN wyprawy w ON u.id = w.uzytkownik_id";
$wynik = $conn->query($sql);
while($row = $wynik->fetch_assoc()){
    echo "<div><b>{$row['login']}</b>: {$row['nazwa']} ({$row['lokalizacja']})</div>";
}
$conn->close();
?>