INF.03 · Aplikacje internetowe PHP
Słowniczek — Aplikacje internetowe (PHP)
Słownik, który prowadzi do diagnozy.
- PHP8.3
- mysqli · MariaDB
- Praktyka i diagnoza
Po tej lekcji: Połączysz pojęcia z konkretnymi plikami, kodem i objawami błędów.
Zrozum mechanizm
Nie ucz się samych skrótów. Przy każdym pojęciu pokaż miejsce w kodzie i wyjaśnij, przed jaką pomyłką lub atakiem chroni. Najważniejsze rozróżnienia: return/echo, GET/POST, id w bazie/identyfikator sesji, hash/szyfrowanie, walidacja/kodowanie HTML, uwierzytelnienie/autoryzacja, CSRF/idempotencja.
Debuguj lokalnie: sprawdź metodę i dane w Network, kod odpowiedzi, logPHP oraz stan bazy po operacji. Poprawny wygląd formularza nie dowodzi poprawności serwera. Błąd 403 oznacza odmowę,404 brak dostępnego zasobu,405 niewłaściwą metodę,422 złe dane,429 nadmiar prób, a 500 nieobsłużony problem serwera.
Pojęcie i jego rola
| Zapis | Znaczenie |
|---|---|
echo | Wysyła tekst do odpowiedzi |
return | Zwraca wynik i kończy wywołanie |
require_once | Dołącza wymagany plik najwyżej raz |
$_GET | Dane parametrów adresu |
$_POST | Dane formularzaPOST |
mysqli | Biblioteka komunikacji z MariaDB/MySQL |
prepare | Przygotowuje strukturę SQL |
bind_param | Wiąże wartości z parametrami |
execute | Wykonuje przygotowane zapytanie |
fetch_assoc | Odczytuje wiersz po nazwach kolumn |
utf8mb4 | Kodowanie połączenia i danych |
session_start | Odtwarza lub zaczyna sesję |
session_regenerate_id | Odnawia identyfikator sesji |
session_destroy | Usuwa stan sesji serwera |
HttpOnly | Cookie niedostępne do odczytu przez JS |
Secure | Cookie wysyłane przezHTTPS |
SameSite | Ogranicza część żądań między witrynami |
password_hash | Tworzy hash z solą |
password_verify | Sprawdza hasło względem hasha |
password_needs_rehash | Sprawdza potrzebę aktualizacji hasha |
htmlspecialchars | Koduje tekst w kontekście HTML |
CSRF | Niechciana operacja z aktywną sesją |
hash_equals | Porównanie tokenów bez prostego wczesnego wyjścia |
IDOR | Dostęp do cudzego obiektu przez podmianę ID |
UNIQUE | Wymusza unikalność w bazie |
begin_transaction | Początek transakcji |
commit | Zatwierdzenie |
rollback | Wycofanie |
idempotencja | Powtórzenie nie tworzy drugiego rezultatu |
303 | Przejście po POST do stronyGET |
422 | Błędne dane wejściowe |
429 | Przekroczenie limitu |
Jak uruchamiać krótkie przykłady?
Każdy krótki przykład oznaczony własnym plikiem uruchamiaj osobno, nie doklejaj wszystkich definicji do jednego pliku. W edytorze zapisz go jako .php, a w terminalu tego folderu wpisz np. php for.php. Wtedy pokazane końce wierszy PHP_EOL są widoczne. W odpowiedzi HTML znak końca wiersza sam nie robi nowej linii na ekranie: użyj <br> albo znacznika <pre>. Wyświetl źródło pozwala zobaczyć tekst odpowiedzi.
Przykłady opisane jako fragment projektu wymagają paczki KINO / LAB i wcześniejszej konfiguracji. Nie uruchamiaj ich jako samodzielnych endpointów. Pełny plik niżej pokazuje kontekst. Funkcje h(), pole() i wymagajPost() są nasze; ich definicje wczytuje bootstrap.php.
Czytaj zapis od środka na zewnątrz
Złożony wiersz jest łatwiejszy, gdy rozbijesz go na etapy. Nie musisz od razu zapamiętać wszystkich nazw.
Podstawowa forma: funkcja(argument) wywołuje funkcję; $obiekt->metoda(argument) wywołuje metodę obiektu
<?php
$dane = ['email' => ' ala@example.test '];
$surowy = $dane['email'] ?? '';
$przyciety = trim($surowy);
$bezpiecznyHTML = htmlspecialchars($przyciety, ENT_QUOTES, 'UTF-8');
echo $bezpiecznyHTML;
ala@example.test
- Najpierw odczytujemy element tablicy po kluczu email; ?? obsługuje brak/null.
- trim przyjmuje jeden napis i oddaje nowy bez zewnętrznych spacji. Nie zmienia samo z siebie tablicy dane.
- htmlspecialchars przyjmuje wynik trim i przygotowuje go do HTML. echo dopiero wysyła rezultat.
- Zapis
echo h(trim(pole($_POST, "email")));w projekcie to podobne zagnieżdżenie: pole → trim → h → echo. Każdą funkcję czytaj z jej argumentami.
Jak czytać pozostałe zapisy w pełnym przykładzie
| Zapis | Znaczenie | Przykład użycia |
|---|---|---|
pole($dane, $nazwa) | Nasza funkcja: pobiera wskazany klucz tylko wtedy, gdy ma wartość string; inaczej oddaje pusty napis. isset sprawdza obecność i brak null, is_string typ. | pole($_POST, "email") |
h($tekst) | Nasza funkcja kodująca tekst/atrybut HTML przez htmlspecialchars; nie wykonuje walidacji zakresu ani zabezpieczenia SQL. | h($film["tytul"]) |
wymagajPost() | Nasza funkcja: sprawdza metodę POST oraz CSRF; przy błędzie przerywa odpowiedź z405/403. | wymagajPost(); |
wymagajLogowania() | Nasza funkcja: oddaje int ID konta z sesji lub przekierowuje do logowania. | $id = wymagajLogowania(); |
tokenFormularza() | Nasza funkcja zwraca HTML ukrytego pola csrf z wartością sesji zakodowaną przez h. | <?= tokenFormularza() ?> |
przekieruj($adres) | Nasza funkcja wysyła Location ze statusem303 i kończy wykonanie przez exit. Typ wyniku never oznacza, że nie wraca do dalszej instrukcji. | przekieruj("/panel.php"); |
naglowek($tytul), stopka() | Nasze funkcje wypisujące wspólny HTML strony. void oznacza brak zwracanego wyniku do użycia w wyrażeniu. | naglowek("Katalog"); |
pieniadze($grosze) | Nasza funkcja formatuje grosze jako złote. number_format przyjmuje liczbę, liczbę miejsc po przecinku, separator dziesiętny i separator grup. Wynik to string. | number_format(12.99, 2, ",", " ") |
dirname(__DIR__) | dirname daje katalog nadrzędny; __DIR__ to katalog bieżącego pliku. W public prowadzi to do katalogu projektu, a dopisana ścieżka wskazuje src. | dirname(__DIR__)."/src/bootstrap.php" |
try / catch / throw | try obejmuje próbę, catch przechwytuje wyjątek, throw go zgłasza; $blad jest obiektem błędu. W mysqli raportowanie wyjątków trzeba włączyć. | try { /* operacja */ } catch (Throwable $blad) { /* obsługa */ } |
$_SESSION i $_POST | Specjalne tablice PHP: pierwsza to stan sesji, druga dane formularza POST. Zewnętrzne wartości trzeba sprawdzić, nie ufać samym nazwom kluczy. | $_SESSION["user_id"] |
?? i ??= | a ?? b wybiera b dla braku/null; a ??= b zapisuje b tylko, gdy a nie istnieje lub ma null. Nie reagują na0 ani pusty napis. | $_SESSION["koszyk"] ??= []; |
===, !==, &&, ||, ! | Identyczne, nieidentyczne, i, lub, zaprzeczenie. Porównanie ścisłe obejmuje typ; &&/|| nie sprawdzają drugiej części, gdy wynik jest już rozstrzygnięty. | $rok === false || $rok < 1888 |
-> oraz :: | -> wybiera właściwość lub metodę obiektu; :: odnosi się do elementu statycznego klasy. To nie jest zapis dostępu do tablicy. | $zapytanie->execute(); |
(int), : int, : void, : never | (int) konwertuje wartość. Po dwukropku w definicji funkcji deklarujesz typ wyniku, nie wykonujesz konwersji: int liczba, void brak wyniku, never brak powrotu. | function id(): int { return 7; } |
bin2hex(random_bytes(32)) | Najpierw losujemy32 bajty bezpiecznym generatorem, potem zamieniamy je na64 znaki HEX. Token musi być generowany, nie zapisany na stałe. | $_SESSION["csrf"] = bin2hex(random_bytes(32)); |
Sprawdź w działaniu
Słownik, który prowadzi do diagnozy — sprawdź w modelu
Model w przeglądarce wyjaśnia mechanizm na fikcyjnych danych. Nie wykonuje PHP ani zapytań SQL i nie tworzy kont. Prawdziwe skrypty uruchomisz lokalnie z paczki.
Przewidź rezultat, wykonaj próbę i wyjaśnij, która decyzja po stronie serwera decyduje o wyniku.
Uruchom krok po kroku
Wybierz pojęcie i znajdź je w projekcie. Przykład: bind_param w dodaj.php łączy dane z parametrami; session_regenerate_id w logowanie.php odnawia ID; hash_equals w wymagajPost porównuje token. Opisz efekt, nie kopiuj całych plików bez komentarza.
Funkcje ochrony i odpowiedzi
<?php
declare(strict_types=1);
function h(string $tekst): string
{
return htmlspecialchars($tekst, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
function pole(array $dane, string $nazwa): string
{
// email[]=x jest tablicą, nie poprawnym tekstem. Nie rzutuj jej na string.
return isset($dane[$nazwa]) && is_string($dane[$nazwa]) ? $dane[$nazwa] : '';
}
function przekieruj(string $adres): never
{
header('Location: '.$adres, true, 303);
exit;
}
function wymagajPost(): void
{
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header('Allow: POST');
http_response_code(405);
exit('Ta operacja wymaga POST.');
}
$token = pole($_POST, 'csrf');
if ($token === '' || ! hash_equals($_SESSION['csrf'], $token)) {
http_response_code(403);
exit('Nieprawidłowy token formularza. Odśwież stronę.');
}
}
function wymagajLogowania(): int
{
if (! isset($_SESSION['user_id'])) {
przekieruj('/logowanie.php');
}
return (int) $_SESSION['user_id'];
}
function tokenFormularza(): string
{
return '<input type="hidden" name="csrf" value="'.h($_SESSION['csrf']).'">';
}
function pieniadze(int $grosze): string
{
return number_format($grosze / 100, 2, ',', ' ').' zł';
}
Pobierz i odtwórz projekt
W „Źródłach i materiałach” na końcu pobierz KINO / LAB.zip. Rozpakuj całość; instrukcja START.txt opisuje konfigurację. Pierwsze 6 przykładów w public/podstawy działa bez bazy. Dalsze wymagają lokalnej MariaDB 11.4, importu schema.sql i lokalnego konta bazy z minimalnymi prawami. Gotowa paczka pokazuje całość, ale w tej lekcji wykonaj opisane kroki i własne zadanie.
Ćwiczenie z pomocą · samodzielna praca
Twoja próba — podpowiedzi otwieraj po kolei
Dopasuj 10 pojęć do fragmentu własnego kodu. Dla 5 kodów HTTP opisz lokalny przypadek testowy.
Własne przykłady i konkretne wyniki, bez haseł i identyfikatorów sesji.
? Potrzebujesz pomocy? Rozwiązuj krok po kroku.
Krok 1 — pokaż podpowiedź
Odszukaj wskazany plik i zapisz przewidywany rezultat przed zmianą.
Krok 2 — pokaż podpowiedź
Zmień jedną rzecz. Sprawdź metodę żądania, dane i odpowiedź lub wynik programu.
Krok 3 — pokaż podpowiedź
Wykonaj próbę graniczną lub błędną. Porównaj także stan bazy lub sesji, nie tylko komunikat.
Otwórz tylko tyle podpowiedzi, ile potrzebujesz. Po każdym kroku wróć do zadania i sprawdź wynik.
Podsumowanie
Co warto zapamiętać
- Połączysz pojęcia z konkretnymi plikami, kodem i objawami błędów.
- Potrafisz wskazać w kodzie przyczynę wyniku i zaplanować próbę błędnych danych.
- Nie oddajesz haseł, pliku config.local.php ani wartości cookie.
Dalej na swoim koncie
Rozgrzewki, quiz i zadania są w biurku ucznia.
Teoria jest otwarta dla wszystkich. Żeby rozwiązywać zadania, zapisywać szkice i widzieć swój postęp, zaloguj się.
Zaloguj się →