PHP od podstaw — w stronę INF.03

Tak jak w kursie JS: każdy temat ma tę samą budowę — krótkie wyjaśnienie, potem przykład z gotowym rozwiązaniem (rozwiń, żeby zobaczyć kod), a obok analogiczne zadanie do zrobienia samodzielnie tą samą metodą. Różnica jest jedna: kod PHP wykonuje się na serwerze, więc żeby zobaczyć efekt, pliki .php muszą leżeć na serwerze (np. XAMPP) i być otwierane przez http://localhost/..., a nie klikane bezpośrednio w przeglądarce.

◆ przykład + rozwiązanie ◆ zadanie do zrobienia samemu

00

Jak umieszczamy i uruchamiamy PHP?

PHP to język wykonywany po stronie serwera — inaczej niż JavaScript, który działa w przeglądarce. Zanim przeglądarka cokolwiek zobaczy, serwer musi najpierw wykonać kod PHP i zamienić go na zwykły HTML. Dlatego pliku .php nie da się po prostu otworzyć podwójnym kliknięciem — trzeba mieć uruchomiony serwer (np. XAMPP z modułem Apache) i wejść na adres http://localhost/nazwa-folderu/plik.php.

SKŁADNIA — ZNACZNIKI PHP

Kod PHP umieszcza się między znacznikami <?php i ?>. Każda instrukcja kończy się średnikiem ;.

<?php
    echo "Cześć ze świata PHP!";
?>

Zapisany jako index.php i otwarty przez http://localhost/kurs/index.php, w przeglądarce pokaże zwykły tekst — użytkownik nigdy nie zobaczy kodu PHP, tylko jego wynik.

SPRAWDŹ U SIEBIE

Zainstaluj (jeśli jeszcze nie masz) XAMPP, uruchom moduł Apache, a w folderze htdocs utwórz plik test.php z Twoim własnym powitaniem wypisanym przez echo.

// otwórz http://localhost/test.php i sprawdź, czy widzisz swój tekst

PHP W CZYSTYM PLIKU

Cały plik może składać się wyłącznie z kodu PHP — tak wyglądają np. pliki obsługujące formularze (dodaj.php, usun.php), które niczego nie wyświetlają wprost, tylko przetwarzają dane i przekierowują dalej.

<?php
    $imie = "Ala";
    echo "Witaj, " . $imie . "!";
?>
PHP WMIESZANY W HTML

PHP można też wielokrotnie „włączać i wyłączać” w środku zwykłego pliku HTML — to najczęstszy widok na egzaminie INF.03. Napisz plik powitanie.php, w którym nagłówek <h1> jest zwykłym HTML-em, a imię wewnątrz wstawiasz przez krótki blok <?php echo ...; ?>.

// podpowiedź: <h1>Witaj, <?php echo "Ala"; ?>!</h1>

Zapamiętaj: PHP wykonuje się zanim strona trafi do przeglądarki. Jeśli chcesz zobaczyć kod źródłowy wygenerowanego HTML-a (bez PHP), użyj w przeglądarce opcji „Wyświetl źródło strony” — nie zobaczysz tam ani jednej linijki PHP, tylko czysty wynik działania echo.

01

Zmienne, typy, wypisywanie danych

Zmienną w PHP tworzysz, poprzedzając jej nazwę znakiem dolara: $nazwa. Nie trzeba deklarować typu — PHP sam go rozpozna (tzw. typowanie dynamiczne). Dane wypisujesz poleceniem echo (najczęściej) lub print, a strukturę zmiennej możesz podejrzeć funkcją var_dump().

PRZYKŁAD

Zdefiniuj zmienną $liczba i przypisz jej wartość 42. Wyświetl ją poleceniem echo.

Rozwiązanie
<?php
    $liczba = 42;
    echo $liczba;
?>
TWOJE ZADANIE

Zdefiniuj zmienną $temperatura i przypisz jej dzisiejszą temperaturę powietrza (dowolna liczba, może być ujemna). Wyświetl ją poleceniem echo.

// napisz kod samodzielnie, korzystając z przykładu obok

PRZYKŁAD

Połącz tekst i zmienną operatorem kropki . (konkatenacja) i wypisz zdanie.

Rozwiązanie
<?php
    $imie = "Kasia";
    $wiek = 21;
    echo "Cześć, mam na imię " . $imie . " i mam " . $wiek . " lat.";
?>
TWOJE ZADANIE

Stwórz zmienne $marka i $rocznik (Twojego wymarzonego samochodu) i wypisz zdanie łączące obie wartości operatorem kropki.

// napisz kod samodzielnie, korzystając z przykładu obok

PRZYKŁAD — TYPY DANYCH

PHP rozpoznaje typ automatycznie. Funkcją var_dump() możesz sprawdzić, jaki typ ma dana zmienna (string, integer, float, boolean, array...).

Rozwiązanie
<?php
    $tekst  = "cześć";     // string
    $liczba = 10;          // integer
    $ulamek = 3.14;        // float (double)
    $prawda = true;        // boolean

    var_dump($tekst);
    var_dump($liczba);
    var_dump($ulamek);
    var_dump($prawda);
?>
TWOJE ZADANIE

Stwórz po jednej zmiennej każdego z czterech typów (string, integer, float, boolean) na dowolny temat i sprawdź ich typy funkcją var_dump().

// napisz kod samodzielnie, korzystając z przykładu obok


02

Mieszanie PHP z HTML

To jedna z rzeczy, które najbardziej odróżniają PHP od JS: w jednym pliku możesz swobodnie wychodzić ze znacznika ?> do zwykłego HTML-a, a potem wracać do PHP znacznikiem <?php — tyle razy, ile potrzebujesz, nawet w środku pętli czy warunku.

SPOSÓB 1 — WSZYSTKO PRZEZ ECHO

Cały HTML wypisujesz z poziomu PHP, poleceniami echo. Wygodne przy krótkich fragmentach.

<?php
    $tytul = "Moja strona";
    echo "<h1>" . $tytul . "</h1>";
    echo "<p>Wygenerowane w całości przez PHP.</p>";
?>
SPOSÓB 2 — PRZEPLATANIE (INF.03)

Ten sposób jest czytelniejszy przy dłuższym HTML-u i tak najczęściej wygląda kod na egzaminie: HTML pisze się normalnie, a PHP „wskakuje” tylko tam, gdzie trzeba wstawić dynamiczną wartość.

<!DOCTYPE html>
<html lang="pl">
<body>
    <h1><?php echo $tytul; ?></h1>
    <p>Dziś jest <?php echo date("d.m.Y"); ?></p>
</body>
</html>

Napisz plik wizytowka.php, w którym w zwykłym HTML-u wstawiasz przez krótkie bloki PHP swoje imię, ulubiony kolor i wynik prostego działania matematycznego.

Zasada: każde wyjście ze znacznika ?> kończy „tryb PHP” — wszystko, co napiszesz później (aż do kolejnego <?php), trafia do przeglądarki jako zwykły, niezmieniony tekst/HTML.

03

Pętle

PHP ma te same rodzaje pętli co większość języków: for (znana liczba powtórzeń), while (dopóki warunek prawdziwy) oraz foreach — najważniejszą przy pracy z tablicami i wynikami z bazy danych.

PRZYKŁAD — FOR

Wypisz liczby od 1 do 5 pętlą for.

Rozwiązanie
<?php
    for ($i = 1; $i <= 5; $i++) {
        echo $i . "<br>";
    }
?>
TWOJE ZADANIE

Wypisz pętlą for tabliczkę mnożenia przez 5 (od 5×1 do 5×10), każdy wynik w nowej linii (<br>).

// napisz kod samodzielnie, korzystając z przykładu obok

PRZYKŁAD — WHILE

Odliczaj od 10 do 1 pętlą while.

Rozwiązanie
<?php
    $i = 10;
    while ($i >= 1) {
        echo $i . "<br>";
        $i--;
    }
?>
TWOJE ZADANIE

Pętlą while wypisz tylko liczby parzyste od 2 do 20 (podpowiedź: operator %).

// napisz kod samodzielnie, korzystając z przykładu obok

PRZYKŁAD — FOREACH

foreach przechodzi po każdym elemencie tablicy — nie musisz liczyć indeksów.

Rozwiązanie
<?php
    $owoce = ["jabłko", "gruszka", "banan"];
    foreach ($owoce as $owoc) {
        echo $owoc . "<br>";
    }
?>
TWOJE ZADANIE

Stwórz tablicę $miasta z pięcioma nazwami miast i wypisz je pętlą foreach, numerując je od 1 (podpowiedź: osobna zmienna-licznik zwiększana w pętli).

// napisz kod samodzielnie, korzystając z przykładu obok


04

Instrukcje warunkowe

if / elseif / else wykonują różny kod w zależności od warunku. Do porównań wielu konkretnych wartości jednej zmiennej wygodniejszy bywa switch.

PRZYKŁAD — IF/ELSE

Sprawdź, czy liczba jest dodatnia, ujemna czy równa zero.

Rozwiązanie
<?php
    $liczba = -7;

    if ($liczba > 0) {
        echo "Liczba dodatnia";
    } elseif ($liczba < 0) {
        echo "Liczba ujemna";
    } else {
        echo "Liczba to zero";
    }
?>
TWOJE ZADANIE

Zdefiniuj zmienną $wiek i wypisz komunikat: „dziecko” (0–12), „nastolatek” (13–17) albo „dorosły” (18+).

// napisz kod samodzielnie, korzystając z przykładu obok

PRZYKŁAD — SWITCH

Wypisz nazwę dnia tygodnia na podstawie jego numeru.

Rozwiązanie
<?php
    $dzien = 3;

    switch ($dzien) {
        case 1:
            echo "Poniedziałek";
            break;
        case 2:
            echo "Wtorek";
            break;
        case 3:
            echo "Środa";
            break;
        default:
            echo "Inny dzień";
    }
?>
TWOJE ZADANIE

Za pomocą switch na podstawie zmiennej $ocena (liczba 1–6) wypisz jej słowny odpowiednik (niedostateczny, dopuszczający, ... celujący).

// napisz kod samodzielnie, korzystając z przykładu obok


05

Funkcje

Funkcja to nazwany fragment kodu, który wykonujesz wielokrotnie, podając za każdym razem inne argumenty. Definiuje się ją słowem function, a wynik zwraca return.

PRZYKŁAD

Napisz funkcję powitaj(), która przyjmuje imię i zwraca powitanie.

Rozwiązanie
<?php
    function powitaj($imie) {
        return "Cześć, " . $imie . "!";
    }

    echo powitaj("Tomek");
    echo powitaj("Zosia");
?>
TWOJE ZADANIE

Napisz funkcję poleObszaru($a, $b), która oblicza i zwraca pole prostokąta o bokach $a i $b. Wywołaj ją dwa razy z różnymi liczbami.

// napisz kod samodzielnie, korzystając z przykładu obok

PRZYKŁAD — WARTOŚĆ DOMYŚLNA

Argument funkcji może mieć wartość domyślną, używaną, gdy nikt jej nie poda.

Rozwiązanie
<?php
    function opisz($imie, $miasto = "nieznane") {
        return $imie . " mieszka w: " . $miasto;
    }

    echo opisz("Ania", "Kraków") . "<br>";
    echo opisz("Piotr"); // użyje wartości domyślnej
?>
TWOJE ZADANIE

Napisz funkcję cenaZRabatem($cena, $rabat = 10), która zwraca cenę po odjęciu podanego procentu rabatu (domyślnie 10%).

// napisz kod samodzielnie, korzystając z przykładu obok


06

Tablice — podstawy

Tablica indeksowana ma kolejne liczby jako klucze (0, 1, 2...). Tablica asocjacyjna ma klucze nazwane samodzielnie (jak małe „rekordy” danych) — to właśnie ta druga forma przypomina pojedynczy wiersz z bazy danych.

PRZYKŁAD — TABLICA INDEKSOWANA

Stwórz tablicę liczb i wypisz sumę jej elementów.

Rozwiązanie
<?php
    $liczby = [4, 8, 15, 16, 23];
    $suma = 0;

    foreach ($liczby as $l) {
        $suma += $l;
    }

    echo "Suma: " . $suma;
?>
TWOJE ZADANIE

Stwórz tablicę pięciu ocen (liczby 1–6) i wypisz ich średnią (podpowiedź: count() zwraca liczbę elementów tablicy).

// napisz kod samodzielnie, korzystając z przykładu obok

PRZYKŁAD — TABLICA ASOCJACYJNA

Klucze nazwane pozwalają czytać dane po nazwie, a nie po numerze indeksu.

Rozwiązanie
<?php
    $uczen = [
        "imie"      => "Marek",
        "nazwisko"  => "Nowak",
        "ocena"     => 5
    ];

    echo $uczen["imie"] . " " . $uczen["nazwisko"] . " — ocena: " . $uczen["ocena"];
?>
TWOJE ZADANIE

Stwórz tablicę asocjacyjną $produkt z kluczami nazwa, cena, ilosc i wypisz zdanie z wyliczoną wartością całkowitą (cena * ilosc).

// napisz kod samodzielnie, korzystając z przykładu obok

PRZYKŁAD — TABLICA TABLIC

Tablica tablic asocjacyjnych to dokładnie to, co dostaniesz z bazy danych po pobraniu wielu wierszy naraz — dlatego warto się z tym oswoić już teraz.

Rozwiązanie
<?php
    $uczniowie = [
        ["imie" => "Ala",   "ocena" => 5],
        ["imie" => "Bartek","ocena" => 3],
        ["imie" => "Celina","ocena" => 4],
    ];

    foreach ($uczniowie as $u) {
        echo $u["imie"] . ": " . $u["ocena"] . "<br>";
    }
?>
TWOJE ZADANIE

Stwórz tablicę czterech produktów (każdy jako tablica asocjacyjna z nazwa i cena) i wypisz pętlą foreach listę w formacie „nazwa — cena zł”.

// napisz kod samodzielnie, korzystając z przykładu obok


07

Formularze: $_GET i $_POST

Dane z formularza HTML trafiają do PHP w tablicach superglobalnych. Przy method="GET" lądują w $_GET (widoczne w adresie URL), a przy method="POST" — w $_POST (niewidoczne w adresie, lepsze dla haseł i większych danych).

PRZYKŁAD — FORMULARZ GET

index.php z formularzem oraz powitaj.php, który odczytuje przesłane imię.

<!-- index.php -->
<form action="powitaj.php" method="GET">
    Imię: <input type="text" name="imie"><br>
    <button type="submit">WYŚLIJ</button>
</form>
Rozwiązanie (powitaj.php)
<?php
    $imie = $_GET['imie'];
    echo "Witaj, " . $imie . "!";
?>
TWOJE ZADANIE

Zbuduj formularz z dwoma polami — liczba1 i liczba2 — metodą GET, a w pliku docelowym wypisz ich sumę pobraną z $_GET.

// pamiętaj o rzutowaniu na liczbę: (int)$_GET['liczba1']

PRZYKŁAD — FORMULARZ POST

Zmiana method="GET" na method="POST" w formularzu wymaga też zmiany $_GET na $_POST po stronie odbierającej.

<form action="zaloguj.php" method="POST">
    Login: <input type="text" name="login"><br>
    Hasło: <input type="password" name="haslo"><br>
    <button type="submit">ZALOGUJ</button>
</form>
Rozwiązanie (zaloguj.php)
<?php
    $login = $_POST['login'];
    $haslo = $_POST['haslo'];
    echo "Próba logowania: " . $login;
?>
TWOJE ZADANIE

Zbuduj formularz kontaktowy metodą POST z polami imie, email, wiadomosc, a w pliku docelowym wypisz wszystkie trzy wartości pod sobą.

// napisz kod samodzielnie, korzystając z przykładu obok

Debugowanie formularza: gdy nie wiesz, co dokładnie przyszło z formularza, wypisz całą tablicę naraz: echo "<pre>"; print_r($_GET); echo "</pre>"; — dokładnie tak, jak w plikach dodaj.php i usun.php w sekcji 10.

08

Ciasteczka i sesje

Ciasteczka ($_COOKIE) i sesje ($_SESSION) pozwalają „zapamiętać” dane pomiędzy kolejnymi wejściami użytkownika na stronę — coś, czego zwykłe zmienne PHP nie potrafią, bo znikają zaraz po wygenerowaniu strony. Ciasteczko zapisuje się w przeglądarce użytkownika, sesja — na serwerze.

USTAWIANIE CIASTECZKA

Funkcja setcookie(nazwa, wartość, czas_wygaśnięcia) musi zostać wywołana zanim jakikolwiek HTML trafi do przeglądarki.

Rozwiązanie
<?php
    // Ustawienie ciasteczka na 30 dni
    setcookie("uzytkownik", "Jan Kowalski", time() + 30*24*60*60);
?>
TWOJE ZADANIE

Ustaw ciasteczko motyw z wartością "ciemny", ważne przez 7 dni.

// time() + 7*24*60*60

ODCZYT WARTOŚCI CIASTECZKA

Zapisaną wartość odczytujesz z tablicy $_COOKIE — ale dopiero przy kolejnym wejściu na stronę (ciasteczko nie jest dostępne w tym samym żądaniu, w którym je ustawiono).

Rozwiązanie
<?php
    echo $_COOKIE["uzytkownik"];
?>
TWOJE ZADANIE

Odczytaj i wypisz wartość ciasteczka motyw ustawionego w zadaniu obok.

// napisz kod samodzielnie, korzystając z przykładu obok

WERYFIKACJA I USUWANIE

isset() sprawdza, czy ciasteczko w ogóle istnieje. Usuwa się je, ustawiając mu datę ważności w przeszłości.

Rozwiązanie
<?php
    // Weryfikacja
    if (isset($_COOKIE["uzytkownik"])) {
        echo "Cześć " . $_COOKIE["uzytkownik"];
    } else {
        echo "Witaj, gościu!";
    }

    // Usuwanie
    setcookie("uzytkownik", "", time() - 3600);
?>
TWOJE ZADANIE

Sprawdź, czy ciasteczko motyw istnieje — jeśli tak, wypisz jego wartość, jeśli nie, wypisz "jasny" jako domyślną. Następnie napisz osobny plik, który to ciasteczko usuwa.

// napisz kod samodzielnie, korzystając z przykładu obok

SESJE — START I ZAPIS

Sesję trzeba najpierw uruchomić funkcją session_start() — na samej górze pliku, przed jakimkolwiek HTML-em. Dane trzymasz w tablicy $_SESSION, tak jak w zwykłej tablicy asocjacyjnej.

Rozwiązanie
<?php
    session_start();
    $_SESSION["zalogowany"] = "Kasia";
?>
TWOJE ZADANIE

Uruchom sesję i zapisz w niej licznik odwiedzin: jeśli $_SESSION["odwiedziny"] nie istnieje, ustaw go na 1; jeśli istnieje — zwiększ o 1. Wyświetl aktualną wartość.

// pamiętaj: session_start() musi być pierwszą linią pliku

Cookie vs sesja: ciasteczko żyje w przeglądarce użytkownika nawet po zamknięciu strony (do wygaśnięcia). Sesja domyślnie kończy się po zamknięciu przeglądarki i trzyma dane po stronie serwera — dlatego lepiej nadaje się do np. zalogowania użytkownika w panelu administracyjnym.

09

Połączenie z bazą danych

Na egzaminie INF.03 baza to najczęściej MySQL, a łączysz się z nią rozszerzeniem mysqli. Do każdego pliku, który rozmawia z bazą, potrzebne jest jedno i to samo połączenie na początku.

PRZYKŁAD — POŁĄCZENIE

mysqli_connect(host, użytkownik, hasło, nazwa_bazy) — na lokalnym XAMPP-ie zwykle host to "localhost", użytkownik "root", a hasło puste.

Rozwiązanie
<?php
    $conn = mysqli_connect("localhost", "root", "", "szkola");

    if (!$conn) {
        die("Błąd połączenia: " . mysqli_connect_error());
    }

    echo "Połączono z bazą!";
?>
TWOJE ZADANIE

Utwórz w phpMyAdmin bazę o nazwie sklep, a następnie napisz plik polaczenie.php, który się z nią łączy i wypisuje komunikat sukcesu lub błędu.

// jeśli baza nie istnieje, mysqli_connect zwróci błąd dopiero przy zapytaniu do niej — samo połączenie z serwerem może się udać osobno

Dobra praktyka na egzaminie: dane połączenia (host, użytkownik, hasło, baza) warto trzymać w jednym pliku, np. polaczenie.php, i dołączać go poleceniem require "polaczenie.php"; na górze każdego pliku, który korzysta z bazy — zobaczysz to w szablonie w sekcji 17.

10

SELECT, INSERT, DELETE

Trzy podstawowe operacje na bazie, z których zbudowana jest niemal każda aplikacja na egzaminie: odczyt danych (SELECT), dodawanie nowego wiersza (INSERT) i usuwanie wiersza (DELETE). Wszystkie trzy mają ten sam szkielet: połącz się, zbuduj zapytanie SQL jako tekst, wykonaj je mysqli_query().

SELECT — WYŚWIETLANIE

Wynik zapytania SELECT to zbiór wierszy, po których przechodzisz pętlą, pobierając każdy wiersz funkcją mysqli_fetch_assoc() (klucze = nazwy kolumn).

Rozwiązanie (wyswietl.php)
<?php
    $conn = mysqli_connect("localhost", "root", "", "szkola");

    $query  = "SELECT * FROM uczniowie";
    $result = mysqli_query($conn, $query) or die("Problem z odczytem danych!");

    while ($row = mysqli_fetch_assoc($result)) {
        echo $row["imie"] . " " . $row["nazwisko"] . " — " . $row["ocena"] . "<br>";
    }

    mysqli_close($conn);
?>
TWOJE ZADANIE

Załóż tabelę uczniowie (kolumny: id, imie, nazwisko, ocena), wpisz w phpMyAdmin kilka rekordów i napisz plik, który wyświetla je wszystkie w formie listy HTML (<ul><li>).

// mysqli_fetch_assoc($result) zwraca kolejny wiersz albo null, gdy wiersze się skończą

INSERT — DODAWANIE

Dane z formularza ($_GET lub $_POST) wstawiasz bezpośrednio do zapytania INSERT INTO, a po sukcesie zwykle przekierowujesz z powrotem funkcją header().

Rozwiązanie (dodaj.php)
<?php
    $conn = mysqli_connect("localhost", "root", "", "szkola");

    $imie     = $_GET['imie'];
    $nazwisko = $_GET['nazwisko'];
    $ocena    = $_GET['ocena'];

    $query = "INSERT INTO uczniowie (imie, nazwisko, ocena)
              VALUES ('$imie', '$nazwisko', '$ocena')";

    mysqli_query($conn, $query) or die("Problem z dodaniem danych!");

    mysqli_close($conn);
    header("Location: index.php");
?>
TWOJE ZADANIE

Zbuduj formularz w index.php z polami imie, nazwisko, ocena wysyłający dane do dodaj.php, oraz sam plik dodaj.php, który wstawia nowy rekord do tabeli uczniowie.

// napisz kod samodzielnie, korzystając z przykładu obok

DELETE — USUWANIE

Usuwanie działa tak samo jak dodawanie — różni się tylko treścią zapytania SQL. Zwykle identyfikujesz wiersz po jego unikalnym id.

Rozwiązanie (usun.php)
<?php
    $conn = mysqli_connect("localhost", "root", "", "szkola");

    $id = $_GET['id'];

    $query = "DELETE FROM uczniowie WHERE id = '$id'";
    mysqli_query($conn, $query) or die("Problem z usunięciem!");

    mysqli_close($conn);
    header("Location: index.php"); // powrót do strony głównej
?>
TWOJE ZADANIE

Dodaj do index.php formularz z jednym polem id, wysyłający dane do usun.php, który usuwa wskazany rekord z tabeli uczniowie.

// napisz kod samodzielnie, korzystając z przykładu obok

Dwa warianty wyświetlania: kod SELECT można wywołać wprost w treści pliku (jak wyżej) albo owinąć w funkcję, np. function wyswietl() { ... }, i wywołać ją poleceniem <?php wyswietl(); ?> dokładnie w miejscu, gdzie ma się pojawić tabela — oba podejścia dają ten sam efekt, drugie jest wygodniejsze przy dłuższych stronach.

11

Mini-projekt: prosta aplikacja CRUD

Połącz sekcje 9 i 10 w jedną, spójną, działającą całość — dokładnie taki zestaw plików bywa punktem wyjścia na egzaminie: jeden plik z formularzami, i po jednym pliku na każdą operację.

PROJEKT DO SAMODZIELNEJ REALIZACJI

Cel: strona do zarządzania tabelą uczniowie (imię, nazwisko, ocena) — wyświetlanie, dodawanie i usuwanie, w czterech plikach.

Krok 1 — baza. W phpMyAdmin utwórz bazę szkola i tabelę uczniowie z kolumnami id (INT, AUTO_INCREMENT, klucz główny), imie, nazwisko (VARCHAR), ocena (INT).

Krok 2 — index.php. Umieść trzy formularze: „Wyświetl uczniów” (przycisk bez pól, prowadzący do wyswietl.php), „Dodaj ucznia” (pola imię/nazwisko/ocena do dodaj.php) i „Usuń ucznia” (pole id do usun.php).

Krok 3 — wyswietl.php. Połącz się z bazą, wykonaj SELECT * FROM uczniowie i wypisz wszystkich uczniów w prostej tabeli HTML (<table>) z nagłówkami kolumn.

Krok 4 — dodaj.php. Odbierz dane z $_GET, wykonaj INSERT INTO i przekieruj z powrotem do index.php funkcją header().

Krok 5 — usun.php. Odbierz id z $_GET, wykonaj DELETE FROM i przekieruj z powrotem do index.php.

Krok 6 (dodatkowo). Po każdej operacji (dodaniu, usunięciu) od razu pokaż aktualną listę uczniów na dole index.php, wywołując tam kod z kroku 3.


BLOK EGZAMINACYJNY

Zadania typowe dla egzaminu INF.03

Od tego miejsca zadania odzwierciedlają to, co najczęściej pojawia się w części praktycznej egzaminu: walidację danych z formularza, proste obliczenia biznesowe, sortowanie i filtrowanie danych pobranych z bazy oraz budowanie tabeli wynikowej ze statystykami. Sekcja 16 łączy to wszystko w jeden projekt egzaminacyjny.

12

Walidacja formularza (serwerowa)

W przeciwieństwie do JS, walidacja w PHP dzieje się po wysłaniu formularza, po stronie serwera — dlatego zawsze sprawdzasz dane po fakcie, zanim cokolwiek zrobisz z bazą danych, i wyświetlasz komunikat błędu zamiast wykonywać dalszy kod.

PRZYKŁAD

Sprawdź, czy pole „imię” nie jest puste i czy „wiek” jest liczbą większą od 0, zanim cokolwiek wypiszesz.

Rozwiązanie
<?php
    $imie = $_GET['imie'];
    $wiek = $_GET['wiek'];

    if (empty($imie)) {
        die("Błąd: pole 'imię' nie może być puste!");
    }

    if (!is_numeric($wiek) || $wiek <= 0) {
        die("Błąd: wiek musi być liczbą większą od 0!");
    }

    echo "Dane poprawne: " . $imie . ", " . $wiek . " lat.";
?>
TWOJE ZADANIE

Zwaliduj formularz rejestracji z polami login (min. 3 znaki) i haslo (min. 6 znaków) — jeśli warunek nie jest spełniony, zatrzymaj skrypt komunikatem błędu (podpowiedź: strlen()).

// napisz kod samodzielnie, korzystając z przykładu obok

PRZYKŁAD — WYRAŻENIE REGULARNE

Format adresu e-mail najłatwiej sprawdzić funkcją preg_match() z wyrażeniem regularnym.

Rozwiązanie
<?php
    $email = $_GET['email'];

    if (!preg_match("/^[^\s@]+@[^\s@]+\.[^\s@]+$/", $email)) {
        die("Błąd: nieprawidłowy format adresu e-mail!");
    }

    echo "E-mail poprawny: " . $email;
?>
TWOJE ZADANIE

Zwaliduj pole telefon tak, aby akceptowało tylko dokładnie 9 cyfr (podpowiedź: wyrażenie /^[0-9]{9}$/).

// napisz kod samodzielnie, korzystając z przykładu obok


13

Obliczenia biznesowe

Typowe zadanie egzaminacyjne: na podstawie danych z formularza (ceny, ilości, stawki) policz wynik końcowy — kwotę do zapłaty, podatek, rabat — i wyświetl go w czytelnej formie.

PRZYKŁAD

Oblicz cenę brutto na podstawie ceny netto i stawki VAT.

Rozwiązanie
<?php
    $cenaNetto = $_GET['cena'];
    $vat       = 23; // procent

    $cenaBrutto = $cenaNetto * (1 + $vat / 100);

    echo "Cena netto: " . $cenaNetto . " zł<br>";
    echo "Cena brutto (VAT " . $vat . "%): " . round($cenaBrutto, 2) . " zł";
?>
TWOJE ZADANIE

Napisz kalkulator, który na podstawie cena i ilosc z formularza oblicza wartość zamówienia, a jeśli suma przekracza 500 zł, nalicza 5% rabatu i pokazuje kwotę przed i po rabacie.

// podpowiedź: round($liczba, 2) zaokrągla do dwóch miejsc po przecinku

PRZYKŁAD — RATY

Podziel kwotę na równe raty i przedstaw wynik w pętli.

Rozwiązanie
<?php
    $kwota       = 1200;
    $liczbaRat   = 4;
    $wysokoscRaty = $kwota / $liczbaRat;

    for ($i = 1; $i <= $liczbaRat; $i++) {
        echo "Rata " . $i . ": " . $wysokoscRaty . " zł<br>";
    }
?>
TWOJE ZADANIE

Na podstawie wynagrodzenieBrutto z formularza oblicz i wypisz wynagrodzenie netto, zakładając uproszczone potrącenie 23% (składki + podatek łącznie).

// napisz kod samodzielnie, korzystając z przykładu obok


14

Dane z bazy — sortowanie i filtrowanie

Sortowanie i filtrowanie można zrobić na dwa sposoby: zapytaniem SQL (ORDER BY, WHERE) albo już po pobraniu danych, funkcjami PHP na tablicy. Warto znać oba — egzamin czasem wymusza jeden z nich.

SORTOWANIE PRZEZ SQL

Najprostszy sposób — dopisujesz ORDER BY bezpośrednio w zapytaniu.

Rozwiązanie
<?php
    $conn  = mysqli_connect("localhost", "root", "", "szkola");
    $query = "SELECT * FROM uczniowie ORDER BY ocena DESC";
    $result = mysqli_query($conn, $query);

    while ($row = mysqli_fetch_assoc($result)) {
        echo $row["imie"] . " — " . $row["ocena"] . "<br>";
    }
?>
TWOJE ZADANIE

Wyświetl uczniów posortowanych alfabetycznie po nazwisku (ORDER BY nazwisko ASC).

// napisz kod samodzielnie, korzystając z przykładu obok

FILTROWANIE PRZEZ SQL

WHERE ogranicza wynik do wierszy spełniających warunek — podany np. z formularza.

Rozwiązanie
<?php
    $conn = mysqli_connect("localhost", "root", "", "szkola");
    $minOcena = $_GET['minOcena'];

    $query  = "SELECT * FROM uczniowie WHERE ocena >= '$minOcena'";
    $result = mysqli_query($conn, $query);

    while ($row = mysqli_fetch_assoc($result)) {
        echo $row["imie"] . " — " . $row["ocena"] . "<br>";
    }
?>
TWOJE ZADANIE

Dodaj formularz z polem fraza i wyświetl tylko uczniów, których nazwisko zawiera wpisaną frazę (podpowiedź: WHERE nazwisko LIKE '%$fraza%').

// napisz kod samodzielnie, korzystając z przykładu obok

SORTOWANIE W PHP (NA TABLICY)

Gdy dane masz już w tablicy (np. po pobraniu z bazy do $uczniowie), możesz je posortować funkcją usort() z własną funkcją porównującą.

Rozwiązanie
<?php
    $uczniowie = [
        ["imie" => "Ala",   "ocena" => 3],
        ["imie" => "Bartek","ocena" => 5],
        ["imie" => "Celina","ocena" => 4],
    ];

    usort($uczniowie, function ($a, $b) {
        return $b["ocena"] <=> $a["ocena"]; // malejąco
    });

    foreach ($uczniowie as $u) {
        echo $u["imie"] . " — " . $u["ocena"] . "<br>";
    }
?>
TWOJE ZADANIE

Mając tę samą tablicę $uczniowie, użyj array_filter(), by zostawić tylko uczniów z oceną co najmniej 4, a następnie wypisz wynik.

// array_filter($uczniowie, function($u) { return ...; })


15

Tabela z bazy + statystyki

Ostatni typowy element egzaminacyjny: dane z bazy w formie tabeli HTML, a pod nią (albo w niej) — policzone statystyki, np. średnia, suma, liczba wierszy.

PRZYKŁAD

Wyświetl uczniów w tabeli i policz średnią ocen w trakcie tego samego przebiegu pętli.

Rozwiązanie
<?php
    $conn  = mysqli_connect("localhost", "root", "", "szkola");
    $query = "SELECT * FROM uczniowie";
    $result = mysqli_query($conn, $query);

    echo "<table border='1'><tr><th>Imię</th><th>Ocena</th></tr>";

    $suma = 0;
    $ile  = 0;

    while ($row = mysqli_fetch_assoc($result)) {
        echo "<tr><td>" . $row["imie"] . "</td><td>" . $row["ocena"] . "</td></tr>";
        $suma += $row["ocena"];
        $ile++;
    }

    echo "</table>";
    echo "Średnia ocen: " . round($suma / $ile, 2);
?>
TWOJE ZADANIE

Rozbuduj tabelę o dodatkową kolumnę „Ocena słownie” (np. 5 → „bardzo dobry”) obliczaną w PHP dla każdego wiersza, oraz dodaj pod tabelą informację o najwyższej i najniższej ocenie w klasie.

// przechowuj min/max w zmiennych aktualizowanych w tej samej pętli while

PRZYKŁAD — FUNKCJE AGREGUJĄCE SQL

Zamiast liczyć statystyki w PHP, część z nich można zlecić bazie danych funkcjami takimi jak AVG(), COUNT(), MAX().

Rozwiązanie
<?php
    $conn  = mysqli_connect("localhost", "root", "", "szkola");
    $query = "SELECT AVG(ocena) AS srednia, COUNT(*) AS ile FROM uczniowie";
    $result = mysqli_query($conn, $query);
    $row = mysqli_fetch_assoc($result);

    echo "Liczba uczniów: " . $row["ile"] . "<br>";
    echo "Średnia ocen: " . round($row["srednia"], 2);
?>
TWOJE ZADANIE

Napisz zapytanie SQL zwracające jednocześnie MAX(ocena) i MIN(ocena) dla tabeli uczniowie i wypisz obie wartości.

// napisz kod samodzielnie, korzystając z przykładu obok


16

Projekt egzaminacyjny: system zamówień

Zadanie łączy wszystko z bloku egzaminacyjnego: formularz z walidacją, obliczenia i zapis do bazy danych jako „koszyk” zamówień. Jak w mini-projekcie z sekcji 11 — brak gotowego rozwiązania, tylko kroki do samodzielnej realizacji.

PROJEKT DO SAMODZIELNEJ REALIZACJI

Cel: formularz zamawiania produktów z walidacją danych, zapisem pozycji do bazy i podsumowaniem z rabatem.

Krok 1 — baza. Utwórz tabelę zamowienia z kolumnami id, produkt, ilosc, cena.

Krok 2 — index.php. Dodaj formularz z polami produkt, ilosc, cena, wysyłający dane do dodaj.php.

Krok 3 — walidacja w dodaj.php. Sprawdź: czy produkt nie jest pusty, czy ilosc jest liczbą większą od 0, czy cena jest liczbą większą od 0. Jeśli warunek zawiedzie — zatrzymaj skrypt (die()) z komunikatem błędu, jak w sekcji 12.

Krok 4 — zapis. Jeśli dane są poprawne, wykonaj INSERT INTO zamowienia i przekieruj z powrotem do index.php.

Krok 5 — wyswietl.php. Pobierz wszystkie pozycje z tabeli zamowienia i zbuduj tabelę HTML z kolumnami: produkt, ilość, cena, wartość pozycji (ilosc * cena).

Krok 6 — podsumowanie z rabatem. W tym samym pliku zsumuj wartość wszystkich pozycji. Jeśli suma przekracza 1000 zł, zastosuj rabat 10% i wyraźnie zaznacz w podsumowaniu kwotę przed rabatem i po rabacie (jak w sekcji 13).

Krok 7 (dodatkowo). Dodaj do index.php formularz z polem id, wysyłający dane do usun.php, który usuwa wybraną pozycję z koszyka (jak w sekcji 10).


ARKUSZ UNIWERSALNY

Gotowy szablon projektu — teraz go rozbuduj

Wszystko powyżej to pojedyncze, wyizolowane ćwiczenia. W praktyce na egzaminie dostajesz jednak jeden, kompletny projekt — stronę z formularzem, wyświetlaniem i tabelą naraz, podłączoną do bazy danych — i musisz w nim coś dopisać albo poprawić. Dlatego obok tego zbioru ćwiczeń istnieje osobny, gotowy „arkusz uniwersalny”: pięć plików PHP + jedna baza danych, które razem tworzą działającą aplikację do zarządzania listą uczniów.

Aplikacja ma trzy niezależne części, każda odpowiadająca innemu typowemu zadaniu z egzaminu: formularz dodawania z walidacją i zapisem do bazy (sekcje 7, 10, 12), wyświetlanie danych w formie tabeli ze statystykami (sekcje 10, 14, 15) oraz usuwanie rekordów po identyfikatorze (sekcja 10). Każdy plik jest gęsto skomentowany — tłumaczy krok po kroku, dlaczego wygląda tak, a nie inaczej.

polaczenie.php index.php wyswietl.php dodaj.php usun.php
17

Propozycje rozbudowy szablonu uniwersalnego

Tu nie ma przykładów z gotowym rozwiązaniem — to konkretne zadania do dopisania bezpośrednio w plikach szablonu, obok istniejącego, podobnego kodu. Każda z trzech części ma zadania łatwe (jedna sztuczka), średnie (łączą dwie rzeczy) i trudne (pełny, samodzielny mechanizm) — dokładnie tak, jak stopniowany bywa egzamin praktyczny.

DO ROZBUDOWY — CZĘŚĆ 1

Formularz dodawania (index.php + dodaj.php)

Łatwe

  • Dodaj do formularza w index.php nowe pole „Przedmiot” i przekaż je do dodaj.php — na razie wystarczy, że plik ją odbierze i wypisze przez print_r($_GET).
  • Zmień etykiety przycisków i pól tak, aby cała strona była spójna językowo (np. wszędzie „Uczeń”, a nie mieszanka „Uczeń”/„Pacjent”).

Średnie

  • W dodaj.php dodaj walidację: „imię” i „nazwisko” muszą mieć co najmniej 2 znaki, a „ocena” musi być liczbą z zakresu 1–6 — jak w sekcji 12.
  • Jeśli walidacja się nie powiedzie, zamiast die() przekieruj z powrotem do index.php z komunikatem błędu przekazanym w adresie URL (np. index.php?blad=1), a w index.php wyświetl go warunkowo.

Trudne

  • Zamiast $_GET, przepisz cały formularz i plik dodaj.php na method="POST" i $_POST, tak żeby dane nie były widoczne w adresie URL.
DO ROZBUDOWY — CZĘŚĆ 2

Wyświetlanie i statystyki (wyswietl.php)

Łatwe

  • Zamień prosty echo na budowę tabeli HTML (<table>) z nagłówkami kolumn — jak w sekcji 15.

Średnie

  • Dodaj pod tabelą obliczoną w PHP średnią ocen wszystkich wyświetlonych uczniów (sekcja 15).
  • Dodaj do index.php formularz z polem minOcena, a w wyswietl.php filtruj wynik zapytaniem WHERE ocena >= '$minOcena' (sekcja 14).

Trudne

  • Dodaj do index.php dwa przyciski sortowania („wg oceny malejąco”, „wg nazwiska alfabetycznie”) prowadzące do wyswietl.php?sort=ocena / wyswietl.php?sort=nazwisko, a w wyswietl.php na podstawie $_GET['sort'] zbuduj odpowiedni ORDER BY.
DO ROZBUDOWY — CZĘŚĆ 3

Usuwanie i połączenie (usun.php + polaczenie.php)

Łatwe

  • Wydziel powtarzającą się linijkę mysqli_connect(...) z każdego pliku do wspólnego polaczenie.php i dołączaj go poleceniem require "polaczenie.php"; na górze wyswietl.php, dodaj.php i usun.php.

Średnie

  • Przed usunięciem w usun.php sprawdź, czy uczeń o podanym id w ogóle istnieje (dodatkowe zapytanie SELECT) — jeśli nie, wypisz stosowny komunikat zamiast wykonywać DELETE.

Trudne

  • Dodaj piąty plik edytuj.php, który na podstawie id pobiera dane jednego ucznia, wypełnia nimi formularz (wartości w atrybutach value="..."), a po zatwierdzeniu wykonuje zapytanie UPDATE uczniowie SET ... WHERE id = '$id'.

To już komplet materiału

Osiemnaście sekcji: od podłączenia PHP do strony, przez zmienne, pętle, funkcje i tablice, po pracę z bazą danych — to podstawy z pierwszych jedenastu sekcji. Kolejne pięć — wyróżnione czerwienią i osobnym blokiem — to zadania typowe dla egzaminu praktycznego INF.03 (walidacja, obliczenia, sortowanie i filtrowanie danych, tabele wynikowe, projekt egzaminacyjny), a ostatnia, fioletowa sekcja to zadania rozbudowy gotowego, pięcioplikowego szablonu aplikacji (polaczenie.php + index.php + wyswietl.php + dodaj.php + usun.php), traktowanego jako jeden, spójny projekt. Najlepiej działa to tak: przeczytaj przykład, rozwiń rozwiązanie dopiero gdy utkniesz, a zadanie obok zrób samodzielnie w osobnym pliku .php uruchamianym przez lokalny serwer — a zadania z ostatniej sekcji dopisz wprost do plików szablonu.