TOP 10 Najtrudniejszych zadan PHP - Egzamin INF.03

Ranking najtrudniejszych zadan z PHP z egzaminow INF.03


#1 -- inf03_2025_06_06 (Trudnosc: 10/10)

Temat: Biblioteka miejska -- system rezerwacji ksiazek

Polecenie z arkusza: Skrypty lacza sie z serwerem bazodanowym na localhost, uzytkownik root bez hasla, baza danych biblioteka.

  • Skrypt 1: wyswietla 20 razy grafike obraz.png. Nalezy zastosowac instrukcje iteracyjna (petle).
  • Skrypt 2 w sekcji "Liryka": wysyla do bazy zapytanie 1. Ze zwroconych wierszy generuje kolejne opcje listy rozwijanej (tytul jest trescia opcji, id jest przypisane do atrybutu value). Skrypt 2 do sekcji "Epika" i "Dramat" nalezy powielić i dostosowac.
  • Skrypt 3: jezeli dokonano wyboru w liscie rozwijanej liryki -- wysyla zapytanie 5 z wartoscia id wyslana przez formularz, wyswietla paragraf "Ksiazka zostala zarezerwowana", wysyla zmodyfikowane zapytanie 4 (UPDATE). Skrypt 3 do sekcji "Epika" i "Dramat" nalezy powielić i dostosowac.
  • Skrypt 4: wysyla zapytanie 2 (JOIN). Kazdy zwrocony wiersz wyswietla w elemencie listy: tytul, id czytelnika i date oddania.

Dlaczego najtrudniejsze: Absolutny rekord -- 3 osobne formularze POST, 9 zapytan SQL, SELECT + UPDATE w jednym procesie, JOIN, petla for generujaca obrazki w headerze. Najdluzszy i najbardziej zlozony plik PHP ze wszystkich egzaminow.

Na co zwrocic uwagę:

  • 3 formularze POST na jednej stronie -- kazdy z osobnym name na buttonie
  • isset($_POST["rezerwujLiryka"]) -- rozpoznawanie ktory formularz wyslano
  • SELECT do pobrania tytulu + UPDATE do zmiany flagi -- dwie operacje po jednym POST
  • Dynamiczne generowanie <option> w petli while
  • JOIN w sekcji zaleglych ksiazek
  • Petla for do generowania obrazkow w headerze

#2 -- inf03_2026_01_04 (Trudnosc: 9/10)

Temat: System informacji maturalnej -- 2 pliki PHP

Polecenie z arkusza: Skrypty lacza sie z serwerem bazodanowym na localhost, uzytkownik root bez hasla, baza danych matura.

  • Skrypt 1: w bloku "Przedmioty" wysyla zapytanie 2 i wyswietla dane oddzielone spacja. W bloku "Lata" wysyla zapytanie 3 i wyswietla dane oddzielone spacjami i myslnikiem. W bloku "Najlepszy wynik" wysyla zapytanie 4 i wyswietla dane ze znakiem %. W bloku "Najgorszy wynik" wysyla zmodyfikowane zapytanie 4 (zmiana sortowania na rosnacy).
  • Skrypt 2 (index.php): wysyla zapytanie 1. Dla kazdego wiersza definiuje odnosnik -- tresc: ". ", adres: strona wynik.php z przeslanymi metoda GET parametrami id, imie i nazwisko.
  • Skrypt 3 (wynik.php): w naglowku wyswietla imie i nazwisko przeslane metoda GET. Wysyla zmodyfikowane zapytanie 5 (dane dla ucznia o id przeslanym GET). Dla kazdego wiersza wyswietla rok i sesje w naglowku trzeciego stopnia, nazwe przedmiotu i punkty w paragrafie.

Dlaczego trudne: Jedyne zadanie z DWOMA plikami PHP ktore wspolpracuja ze soba. Przekazywanie danych przez GET, AVG + GROUP BY, MIN/MAX, 5+ zapytan SQL.

Plik index.php:

Plik wynik.php:

Na co zwrocic uwagę:

  • Budowanie linkow z parametrami GET: wynik.php?id=...&imie=...&nazwisko=...
  • Odczytywanie GET na drugiej stronie: $_GET['id'], $_GET['imie']
  • AVG + GROUP BY + ORDER BY DESC + LIMIT 1 -- "znajdz najlepsza srednia"
  • JOIN miedzy arkusz a wynik po kolumnie symbol
  • 2 pliki wspolpracujace -- to jedyne takie zadanie!

#3 -- inf03_2026_01_10 (Trudnosc: 9/10)

Temat: Blog kulinarny -- przepisy z alergenami

Polecenie z arkusza: Skrypty lacza sie z serwerem bazodanowym na localhost, uzytkownik root bez hasla, baza danych przepisy. Jesli do strony zostala przeslana wartosc metoda GET, zmienna jest inicjowana ta wartoscia. W przeciwnym wypadku, zmienna jest inicjowana wartoscia 7 (dalej nazywana ID).

  • Skrypt 1: wysyla zapytanie 2 (zmodyfikowane -- sprawdzana jest zmienna ID). Wyswietla wartosc zwrocona polem rodzaj.
  • Skrypt 2: wysyla zapytanie 1 (zmodyfikowane -- sprawdzana jest zmienna ID). Wyswietla naglowek drugiego stopnia z nazwa potrawy. Paragraf o tresci "Trudnosc: , Kalorie: ", gdzie przyjmuje wartosci: "latwe" dla 1, "srednie" dla 2, "trudne" dla 3.
  • Skrypt 3: wysyla zapytanie 3 (zmodyfikowane -- sprawdzana jest zmienna ID). Wyswietla oddzielone spacja nazwy wszystkich alergenow zwroconych z bazy.
  • Skrypt 4: wysyla zapytanie 4 (zmodyfikowane -- sprawdzana jest zmienna ID). Wyswietla wartosc pola przepis. Pole plik powinno zostac uzyte do ustawienia tla sekcji stylem CSS inline.

Dlaczego trudne: Relacja wiele-do-wielu (3-tabelowy JOIN), strtoupper(), logika warunkowa trudnosci, dynamiczne tlo CSS, nawigacja GET.

Na co zwrocic uwagę:

  • 3-tabelowy JOIN: potrawy -> lista_alergenow -> alergeny (wiele-do-wielu)
  • strtoupper() -- zmiana na wielkie litery
  • if/elseif/else -- mapowanie liczby na tekst (1='latwe', 2='srednie', 3='trudne')
  • <?= ... ?> -- skrocony echo w atrybucie HTML
  • Domyslna wartosc GET: $id = 7; if (isset($_GET['id'])) $id = $_GET['id'];
  • 4 osobne zapytania SQL

#4 -- inf03_2024_06_03 (Trudnosc: 9/10)

Temat: Monitoring poziomu rzek z filtrami

Polecenie z arkusza: Skrypty lacza sie z serwerem bazodanowym na localhost, uzytkownik root bez hasla, baza danych rzeki.

  • Skrypt skojarzony z formularzem: po wyslaniu danych z formularza, wyswietla dane w tabeli w zaleznosci od wybranego pola opcji: wszystkie dane wodomierzy (zapytanie 2), dane wodomierzy z przekroczonym stanem ostrzegawczym (zapytanie 3 lub zapytanie 2 z odpowiednim warunkiem), dane wodomierzy z przekroczonym stanem alarmowym (zmodyfikowane zapytanie 3 lub zapytanie 2 z odpowiednim warunkiem).
  • Skrypt 2: wysyla do bazy zapytanie 4. Kazdy zwrocony wiersz jest wyswietlany w paragrafie o tresci: ": ", gdzie dane sa pobierane z bazy danych. Na koncu zamykane jest polaczenie z serwerem.

Dlaczego trudne: switch/case z radio buttonami POST, JOIN z porownaniem kolumn (stanWody > stanOstrzegawczy), AVG + GROUP BY, obsluga stanu domyslnego.

Na co zwrocic uwagę:

  • switch/case z wartosciami radio buttonow -- 3 warianty zapytania
  • stanWody > stanOstrzegawczy -- porownanie KOLUMN z roznych tabel po JOINie
  • Stan domyslny: !isset($_POST['pokaz']) -- co pokazac przy pierwszym ladowaniu
  • $row[0] zamiast $row['nazwa'] -- dostep po indeksie (tez dziala!)
  • AVG + GROUP BY w drugiej sekcji

#5 -- inf03_2024_06_05 (Trudnosc: 8/10)

Temat: Internetowy komis samochodowy

Polecenie z arkusza:

Skrypty lacza sie z serwerem bazodanowym na localhost, uzytkownik root bez hasla, baza danych kupauto.

  • Skrypt 1: wysyla zapytanie 2. W pierwszym bloku glownym wyswietla: obraz (zrodlo: pole zdjecie, alt: "oferta dnia"), naglowek h4 "Oferta Dnia: Toyota ", paragraf "Rocznik: , przebieg: , rodzaj paliwa: ", naglowek h4 "Cena: ".
  • Skrypt 2: wysyla zapytanie 3. Kazdy wiersz wyswietlony w osobnym bloku z obrazem, naglowkiem h4 z marka i modelem, paragrafem z rocznikiem, naglowkiem h4 z cena. Cztery bloki obok siebie.
  • Skrypt 3: wysyla zapytanie 1. Zwrocone nazwy marek sa elementami listy rozwijalnej.
  • Skrypt 4: po zatwierdzeniu formularza wysyla zmodyfikowane zapytanie 4 (sprawdzana nazwa marki z listy). Kazdy wiersz w osobnym bloku z obrazem, naglowkiem z marka i modelem, naglowkiem z cena.

Dlaczego trudne: 4 rozne zapytania SQL, 2 JOINy, dynamiczny select z bazy, formularz wyszukiwania, generowanie blokow div z obrazkami.

Na co zwrocic uwagę:

  • 4 niezalezne zapytania SQL na jednej stronie
  • 2x JOIN samochody z markami (oferty + wyszukiwanie)
  • Dynamiczny <select> generowany z bazy
  • WHERE z kolumna z formularza POST: WHERE nazwa = '$marka'
  • Generowanie blokow <div class='blok'> z danymi i obrazkami

#6 -- inf03_2025_06_09 (Trudnosc: 8/10)

Temat: Serwis remontowy -- 2 formularze na jednej stronie

Polecenie z arkusza:

Skrypty lacza sie z serwerem bazodanowym na localhost, uzytkownik root bez hasla, baza danych remonty.

  • Skrypt 1: wykonywany tylko gdy wypelniono formularz. Wysyla zapytanie 2 zmodyfikowane tak, ze w warunku podana jest wartosc wyslana z formularza. Dla kazdego zwroconego wiersza wypisuje paragraf o tresci ", pracownikow".
  • Skrypt 2: wysyla zapytanie 3. Kazde zwrocone miasto jest trescia opcji listy rozwijanej.
  • Skrypt 3: wykonywany tylko gdy wypelniono formularz. Wysyla zapytanie 4 zmodyfikowane tak, ze w warunku podane sa nazwa miasta i rodzaj remontu wyslane z formularza. Kazde zwrocone imie i cene wypisuje w elementach listy punktowanej, oddzielone znakiem myslnika.

Dlaczego trudne: 2 niezalezne formularze POST (dla klientow i wykonawcow), radio buttony + select, JOIN, DISTINCT + ORDER BY.

Na co zwrocic uwagę:

  • 2 formularze POST na jednej stronie -- rozroznianie po name buttona
  • Select dynamiczny z DISTINCT + ORDER BY
  • Radio buttony do wyboru typu uslugi
  • JOIN klienci z zlecenia + WHERE z dwoma warunkami
  • Rozna struktura kazdego formularza (number vs select+radio)

#7 -- inf03_2026_01_07 (Trudnosc: 8/10)

Temat: Serwis pogodowy z warunkowym wyswietlaniem obrazkow

Polecenie z arkusza:

Skrypty lacza sie z serwerem bazodanowym na localhost, uzytkownik root bez hasla, baza danych pogoda.

  • Skrypt 1: wysyla zapytanie 3. W pierwszych trzech kolumnach tabeli zapisuje kolejne nazwy miast, krajow i temperatury. Czwarta kolumna wypelniona jest obrazem: slonce.png gdy temperatura powyzej 30°C, deszcz.png gdy ponizej 26°C, chmury.png w innych przypadkach.
  • Skrypt 2: wykonywany tylko jezeli zostaly wyslane dane przez klikniecie odnosnika. Wysyla zapytanie 1 zmodyfikowane tak, zeby wybierane byly dane dotyczace wybranego przez uzytkownika miesiaca (w miejscu id miesiaca wstawiona wartosc przeslana metoda GET). Zwrocona temperature wyswietla w naglowku trzeciego stopnia: " stopni".

Dlaczego trudne: JOIN + warunkowe obrazki (if/elseif/else generuje rozne img w tabeli), nawigacja GET po 12 miesiacach, ROUND(AVG()).

Na co zwrocic uwagę:

  • if/elseif/else wewnatrz petli while -- rozne obrazki per wiersz tabeli
  • Dynamiczny HTML w komorkach tabeli (img w td)
  • GET z 12 linkami nawigacyjnymi (miesiace)
  • ROUND(AVG(temperatura), 2) -- zaokraglona srednia
  • JOIN miedzy miejscowosc a pomiary

#8 -- inf03_2025_06_01 (Trudnosc: 8/10)

Temat: Ranking gier komputerowych

Polecenie z arkusza:

Skrypty lacza sie z serwerem bazodanowym na localhost, uzytkownik root bez hasla, baza danych gry.

  • Skrypt 1: wysyla zapytanie 3. Zwrocone wiersze sa wyswietlane w elementach listy z sekcji lewej wedlug wzoru: " ". Liczba punktow jest dodatkowo formatowana stylem.
  • Skrypt 2: wysyla zapytanie 1. Zwrocone wiersze sa wyswietlone w bloku z: obrazem (zrodlo: pole zdjecie, alt: pole nazwa, dymek: pole id), paragrafem z nazwa zdjecia.
  • Skrypt 3 (formularz w stopce): jezeli wpisano id do pola edycyjnego, wysyla zapytanie 2 zmodyfikowane tak, ze wybierany jest wiersz o podanym id. Wyswietla w naglowku h2: ", punktow, zl" oraz opis w paragrafie.
  • Skrypt 4 (formularz z sekcji prawej): jezeli wypelniono pole nazwa, wysyla zmodyfikowane zapytanie 4 z wartosciami z formularza, liczba punktow wynosi 0.

Dlaczego trudne: 2 formularze POST (dodaj gre + pokaz opis), INSERT, LEFT() w SQL, header("location:") redirect, ORDER BY DESC LIMIT, walidacja !empty.

Na co zwrocic uwagę:

  • INSERT INTO gry VALUES (NULL, ...) -- NULL na auto_increment
  • header("location: gry.php") -- przekierowanie po INSERT (zapobiega podwojnemu wysylaniu)
  • LEFT(opis, 100) -- obciecie tekstu w SQL (nie w PHP!)
  • !empty() -- walidacja czy pole nie jest puste
  • ORDER BY punkty DESC LIMIT 5 -- top 5

#9 -- inf03_2025_06_07 (Trudnosc: 8/10)

Temat: Biuro turystyczne -- symulacja ceny wycieczki

Polecenie z arkusza:

Skrypty lacza sie z serwerem bazodanowym na localhost, uzytkownik root bez hasla, baza danych wyprawy.

  • Skrypt 1: wysyla zapytanie 1. Kazde zwrocone miejsce wycieczki wypisuje jako element listy rozwijanej.
  • Skrypt 2: sprawdza, czy z formularza zostaly wyslane dane. Jezeli tak: wysyla zapytanie 2 zmodyfikowane (sprawdzane jest miejsce wycieczki wyslane z formularza). Wylicza wartosc wycieczki na podstawie liczby doroslych i dzieci oraz ceny zwroconej zapytaniem, przy czym dzieci placa polowe ceny. Wyswietla paragraf "W dniu: " i paragraf " zlotych".
  • Skrypt 3: wysyla zapytanie 3. Dla kazdego wiersza tworzy blok z klasa CSS wycieczka zawierajacy: obraz, naglowek h2 z nazwa miejsca, paragraf z cena.

Dlaczego trudne: Formularz z 4 polami (select dynamiczny + 2x number + date), obliczenia matematyczne (cena * (dorosli + dzieci/2)), LIKE w SQL.

Na co zwrocic uwagę:

  • Obliczenia: cena * (dorosli + dzieci/2) -- dzieci za polowe ceny
  • 4 pola formularza: select, 2x number, date
  • Pobranie ceny z bazy, obliczenie w PHP, wyswietlenie wyniku
  • LIKE '0%' -- filtrowanie po poczatku nazwy pliku

#10 -- inf03_2025_06_04 (Trudnosc: 7/10)

Temat: Firma przewozowa -- lista zadan z dodawaniem i usuwaniem

Polecenie z arkusza:

Skrypty lacza sie z serwerem bazodanowym na localhost, uzytkownik root bez hasla, baza danych przewozy.

  • Skrypt 1: wysyla zapytanie 1. Kolejne zwrocone pola zadanie i data sa wyswietlane w kolejnych wierszach tabeli w dwoch pierwszych kolumnach. Trzecia kolumna tabeli zawiera odnosnik o tresci "Usun". Jego wybranie powoduje usuniecie rekordu z bazy za pomoca zmodyfikowanego zapytania 3 (odnosnik dotyczy id_zadania dla wiersza tabeli w ktorym jest umieszczony).
  • Skrypt 2: dane pobrane z formularza wstawia do bazy za pomoca zmodyfikowanego zapytania 2. Zadanie jest przypisane do osoby o id rownym 1.

Dlaczego trudne: Jedyne zadanie z obsluga GET i POST na jednej stronie, DELETE przez link GET, INSERT przez formularz POST, header("location:") po obu operacjach.

Na co zwrocic uwagę:

  • GET do usuwania: link przewozy.php?id_zadania=5 wywoluje DELETE
  • POST do dodawania: formularz z polami text i date
  • header("location: przewozy.php") -- redirect po obu operacjach
  • Dynamiczne generowanie linkow "Usun" z ID w tabeli
  • Mieszanie GET i POST na jednej stronie -- rozne akcje

Podsumowanie

Najtrudniejsze koncepcje PHP na egzaminie INF.03:

  1. Wiele formularzy POST na jednej stronie (rozroznianie po name buttona)
  2. 2 pliki PHP wspolpracujace przez GET
  3. SELECT + UPDATE w jednym procesie (odczyt + zmiana)
  4. Dynamiczne generowanie selectow z bazy danych
  5. switch/case z radio buttonami
  6. JOIN w zapytaniach SQL wewnatrz PHP
  7. header("location:") -- przekierowanie po INSERT/DELETE
  8. Obliczenia matematyczne z danymi z bazy i formularza
  9. Warunkowe generowanie HTML (rozne obrazki per wiersz)
  10. LEFT() -- obcinanie tekstu w SQL