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.
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.
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.
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
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 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>
echo.
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().
Zdefiniuj zmienną $liczba i przypisz jej wartość 42. Wyświetl ją poleceniem echo.
Rozwiązanie
<?php
$liczba = 42;
echo $liczba;
?>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
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.";
?>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
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);
?>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
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.
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>";
?>
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.
?> kończy „tryb PHP” — wszystko, co napiszesz później (aż do kolejnego <?php), trafia do przeglądarki jako zwykły, niezmieniony tekst/HTML.
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.
Wypisz liczby od 1 do 5 pętlą for.
Rozwiązanie
<?php
for ($i = 1; $i <= 5; $i++) {
echo $i . "<br>";
}
?>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
Odliczaj od 10 do 1 pętlą while.
Rozwiązanie
<?php
$i = 10;
while ($i >= 1) {
echo $i . "<br>";
$i--;
}
?>Pętlą while wypisz tylko liczby parzyste od 2 do 20 (podpowiedź: operator %).
// napisz kod samodzielnie, korzystając z przykładu obok
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>";
}
?>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
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.
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";
}
?>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
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ń";
}
?>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
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.
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");
?>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
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
?>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
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.
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;
?>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
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"];
?>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
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>";
}
?>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
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).
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 . "!";
?>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']
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;
?>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
echo "<pre>"; print_r($_GET); echo "</pre>"; — dokładnie tak, jak w plikach dodaj.php i usun.php w sekcji 10.
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.
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);
?>Ustaw ciasteczko motyw z wartością "ciemny", ważne przez 7 dni.
// time() + 7*24*60*60
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"];
?>Odczytaj i wypisz wartość ciasteczka motyw ustawionego w zadaniu obok.
// napisz kod samodzielnie, korzystając z przykładu obok
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);
?>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
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";
?>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
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.
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ą!";
?>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
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.
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().
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);
?>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ą
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");
?>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
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
?>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
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.
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ę.
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.
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.
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.
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.";
?>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
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;
?>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
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.
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ł";
?>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
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>";
}
?>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
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.
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>";
}
?>Wyświetl uczniów posortowanych alfabetycznie po nazwisku (ORDER BY nazwisko ASC).
// napisz kod samodzielnie, korzystając z przykładu obok
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>";
}
?>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
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>";
}
?>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 ...; })
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.
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);
?>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
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);
?>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
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.
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).
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
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.
Formularz dodawania (index.php + dodaj.php)
Łatwe
- Dodaj do formularza w
index.phpnowe pole „Przedmiot” i przekaż je dododaj.php— na razie wystarczy, że plik ją odbierze i wypisze przezprint_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.phpdodaj 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 doindex.phpz komunikatem błędu przekazanym w adresie URL (np.index.php?blad=1), a windex.phpwyświetl go warunkowo.
Trudne
- Zamiast
$_GET, przepisz cały formularz i plikdodaj.phpnamethod="POST"i$_POST, tak żeby dane nie były widoczne w adresie URL.
Wyświetlanie i statystyki (wyswietl.php)
Łatwe
- Zamień prosty
echona 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.phpformularz z polemminOcena, a wwyswietl.phpfiltruj wynik zapytaniemWHERE ocena >= '$minOcena'(sekcja 14).
Trudne
- Dodaj do
index.phpdwa przyciski sortowania („wg oceny malejąco”, „wg nazwiska alfabetycznie”) prowadzące dowyswietl.php?sort=ocena/wyswietl.php?sort=nazwisko, a wwyswietl.phpna podstawie$_GET['sort']zbuduj odpowiedniORDER BY.
Usuwanie i połączenie (usun.php + polaczenie.php)
Łatwe
- Wydziel powtarzającą się linijkę
mysqli_connect(...)z każdego pliku do wspólnegopolaczenie.phpi dołączaj go poleceniemrequire "polaczenie.php";na górzewyswietl.php,dodaj.phpiusun.php.
Średnie
- Przed usunięciem w
usun.phpsprawdź, czy uczeń o podanymidw ogóle istnieje (dodatkowe zapytanieSELECT) — jeśli nie, wypisz stosowny komunikat zamiast wykonywaćDELETE.
Trudne
- Dodaj piąty plik
edytuj.php, który na podstawieidpobiera dane jednego ucznia, wypełnia nimi formularz (wartości w atrybutachvalue="..."), a po zatwierdzeniu wykonuje zapytanieUPDATE 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.