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

ZapisZnaczenie
echoWysyła tekst do odpowiedzi
returnZwraca wynik i kończy wywołanie
require_onceDołącza wymagany plik najwyżej raz
$_GETDane parametrów adresu
$_POSTDane formularzaPOST
mysqliBiblioteka komunikacji z MariaDB/MySQL
preparePrzygotowuje strukturę SQL
bind_paramWiąże wartości z parametrami
executeWykonuje przygotowane zapytanie
fetch_assocOdczytuje wiersz po nazwach kolumn
utf8mb4Kodowanie połączenia i danych
session_startOdtwarza lub zaczyna sesję
session_regenerate_idOdnawia identyfikator sesji
session_destroyUsuwa stan sesji serwera
HttpOnlyCookie niedostępne do odczytu przez JS
SecureCookie wysyłane przezHTTPS
SameSiteOgranicza część żądań między witrynami
password_hashTworzy hash z solą
password_verifySprawdza hasło względem hasha
password_needs_rehashSprawdza potrzebę aktualizacji hasha
htmlspecialcharsKoduje tekst w kontekście HTML
CSRFNiechciana operacja z aktywną sesją
hash_equalsPorównanie tokenów bez prostego wczesnego wyjścia
IDORDostęp do cudzego obiektu przez podmianę ID
UNIQUEWymusza unikalność w bazie
begin_transactionPoczątek transakcji
commitZatwierdzenie
rollbackWycofanie
idempotencjaPowtórzenie nie tworzy drugiego rezultatu
303Przejście po POST do stronyGET
422Błędne dane wejściowe
429Przekroczenie 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

read-expression.phpphp
<?php
$dane = ['email' => '  ala@example.test  '];
$surowy = $dane['email'] ?? '';
$przyciety = trim($surowy);
$bezpiecznyHTML = htmlspecialchars($przyciety, ENT_QUOTES, 'UTF-8');
echo $bezpiecznyHTML;
Wynik
ala@example.test
  1. Najpierw odczytujemy element tablicy po kluczu email; ?? obsługuje brak/null.
  2. trim przyjmuje jeden napis i oddaje nowy bez zewnętrznych spacji. Nie zmienia samo z siebie tablicy dane.
  3. htmlspecialchars przyjmuje wynik trim i przygotowuje go do HTML. echo dopiero wysyła rezultat.
  4. 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

ZapisZnaczeniePrzykł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 / throwtry 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 $_POSTSpecjalne 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.

Ta interakcja wymaga włączonego JavaScriptu.

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

src/funkcje.phpphp
<?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.

Oczekiwany rezultat
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ć

  1. Połączysz pojęcia z konkretnymi plikami, kodem i objawami błędów.
  2. Potrafisz wskazać w kodzie przyczynę wyniku i zaplanować próbę błędnych danych.
  3. 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ę →
Źródła i dalsza nauka