KINO / LAB — autorski projekt do lekcji PHP INF.03, PHP8.3 + mysqli/mysqlnd + mbstring, MariaDB11.4 / MySQL8.

1. Rozpakuj CAŁY folder. src i schema.sql są poza katalogiem public.
2. Uruchom lokalny serwer bazy w pracowni. W phpMyAdmin wejdź do Import i wybierz schema.sql. SQL tworzy TYLKO szkolną bazę serwis_filmowy i jej tabele, bez DROP. Pracuj na własnej bazie ćwiczeniowej.
3. Z pomocą nauczyciela utwórz użytkownika uczen_php z prawami SELECT, INSERT, UPDATE, DELETE wyłącznie do serwis_filmowy.*. Konto administracyjne służy do instalacji, nie do pracy witryny.
4. Skopiuj src/config.example.php do src/config.local.php. Wpisz lokalny host, port, użytkownika i hasło bazy. Tego pliku nie publikuj ani nie oddawaj w ZIP-ie.
5. Otwórz terminal w folderze projektu. Sprawdź php -v i php -m. Uruchom: php -S 127.0.0.1:8091 -t public
6. Otwórz http://127.0.0.1:8091/index.php. file:// nie wykonuje PHP. Wbudowany serwer PHP jest wyłącznie do pracy lokalnej. W XAMPP ustaw DocumentRoot na public; nie udostępniaj src i konfiguracji jako plików WWW.
7. Najpierw obejrzyj podstawy/01-start.php do podstawy/06-funkcje.php. Potem formularz.php i sesja.php. Następnie załóż fikcyjne konto i przejdź rejestracja → logowanie → panel → dodaj → edytuj → koszyk → zamówienie → wyloguj.
8. Nie podawaj prawdziwych haseł lub danych uczniów. Fikcyjny email może należeć do domeny example.org. Hasło do ćwiczenia wymyśl samodzielnie; nie używaj hasła z innego konta.
9. Limit logowania w tym modelu: do5 prób na IP w15min; przy wspólnym szkolnym IP limit współdzielony. Kolejne próby zwracają429. Zmiana sesji go nie zeruje. Własne testy limitu uruchamiaj na końcu albo odczekaj15min.
10. Polityka hasła w projekcie: min15 znaków, max72 bajty UTF-8 (świadome ograniczenie dla zgodności z bcrypt). Nie jest to limit liczby liter. PASSWORD_DEFAULT i rehash mogą z czasem zmienić algorytm.
11. To model edukacyjny. Przed prawdziwą publikacją dochodzą m.in. HTTPS (ustaw https=true), zaufany reverse proxy, limitowanie per konto/IP z ochroną przed blokowaniem użytkowników, MFA, potwierdzenie email, bezpieczne odzyskiwanie konta, monitorowanie i backupy. Nie jest to gotowy publiczny sklep ani operator płatności. Zamówienia mają status symulacja.
12. Diagnostyka: sprawdź usługę i port bazy, import, config.local.php, rozszerzenie mysqli/mysqlnd i dziennik PHP. Błąd500 nie powinien ujawniać odwiedzającemu danych połączenia ani surowego SQL.

Schemat bazy: Uzytkownicy1:N Filmy (własność), Uzytkownicy1:N Zamowienia1:N PozycjeN:1 Filmy. Ceny w groszach jako INT, nie float.
SQLInjection: prepare/bind_param/execute od pierwszego zapisu. XSS: h() przy wyświetlaniu tekstu w HTML. CSRF: POST + losowy token + hash_equals. IDOR: warunek wlasciciel_id w odczycie i zapisie. Nie utożsamiaj tych czterech zabezpieczeń.
