PHP: jak działa po stronie serwera, składnia, echo i osadzanie w HTML

INF.03 · teoria
autor: redakcja · 08.09.2026
PHP wykonuje się na serwerze, a do przeglądarki trafia sam wynik jego pracy, zwykle gotowy HTML. Znaczniki otwarcia i zamknięcia, echo i print, komentarze, osadzanie kodu w stronie, plik w htdocs i adres przez localhost. Lekcja 12.1 kursu INF.03.

[ INF.03: PYTANIA Z TEGO DZIAŁU ]

PHP (PHP: Hypertext Preprocessor, pro­ce­sor hi­per­tek­stu) to język skryp­to­wy wy­ko­ny­wa­ny po stro­nie ser­we­ra: kod z pliku uru­cha­mia serwer WWW, a do prze­glą­dar­ki trafia sam wynik jego pracy, zwykle gotowy HTML. W części pi­sem­nej wra­ca­ją py­ta­nia „które za­da­nie wy­ko­nu­je się po stro­nie ser­we­ra", „co pokaże prze­glą­dar­ka po wy­ko­na­niu przed­sta­wio­ne­go kodu", „jakimi znacz­ni­ka­mi osadza się PHP w pliku" oraz „które języki są skryp­to­we i in­ter­pre­to­wa­ne". W za­da­niu prak­tycz­nym w PHP na­pi­sa­ny jest cały oce­nia­ny re­zul­tat „skrypt po­łą­cze­nia z bazą".

Klient kontra serwer

Strona klien­ta to prze­glą­dar­ka na kom­pu­te­rze użyt­kow­ni­ka, a strona ser­we­ra to kom­pu­ter, na którym stoi serwer WWW razem z in­ter­pre­te­rem PHP i ser­we­rem bazy danych. Ten po­dział roz­strzy­ga, gdzie który kod się wy­ko­nu­je. HTML i CSS prze­glą­dar­ka rysuje u siebie. JavaScript też pra­cu­je u niej: klik­nię­cie przy­ci­sku zmie­nia kolor tła albo roz­wi­ja menu, i dzieje się to bez py­ta­nia ser­we­ra o co­kol­wiek. PHP pra­cu­je wy­łącz­nie na ser­we­rze: za­pi­su­je za­mó­wie­nie do bazy, spraw­dza login i hasło, składa listę pro­duk­tów z wier­szy tabeli produkt. Wier­szy z bazy prze­glą­dar­ka nie do­sta­je, do­sta­je gotową listę.
Przeglądarka wysyła żądanie na port 80 do Apache, ten uruchamia skrypt PHP, PHP pyta MySQL na porcie 3306, z wierszy składa HTML, a Apache odsyła gotową stronę
Cykl ma zawsze te same cztery kroki. Prze­glą­dar­ka wysyła żą­da­nie HTTP na port 80 ser­we­ra. Apache widzi roz­sze­rze­nie .php i oddaje plik in­ter­pre­te­ro­wi za­miast wy­sy­łać go takim, jaki jest. Skrypt się wy­ko­nu­je, łączy się z MySQL na porcie 3306, od­bie­ra wier­sze i składa z nich tekst strony. Apache odsyła ten tekst jako od­po­wiedź HTTP. Na tym samym ser­we­rze stoi phpMyAdmin, który sam jest ze­sta­wem skryp­tów PHP: dla­te­go otwie­ra się w prze­glą­dar­ce pod ad­re­sem http://localhost/phpmyadmin i dla­te­go działa do­pie­ro po uru­cho­mie­niu Apache.
Żeby co­kol­wiek z tego za­dzia­ła­ło, plik musi trafić do ser­we­ra. Po­dwój­ne klik­nię­cie pliku index.php w Eks­plo­ra­to­rze otwie­ra go z dysku, ad­re­sem file:///, i wtedy żaden serwer go nie dotyka: prze­glą­dar­ka pokaże surowy kod albo pustą stronę, bo sama nie umie wy­ko­nać PHP. Ten sam plik otwar­ty ad­re­sem http://localhost/... prze­cho­dzi przez Apache i wraca jako HTML. Do wy­ko­na­nia kodu wy­star­czy serwer WWW z in­ter­pre­te­rem PHP, a MySQL jest po­trzeb­ny do­pie­ro wtedy, gdy skrypt sięga do bazy.
Język in­ter­pre­to­wa­ny to taki, któ­re­go kod czyta i wy­ko­nu­je wiersz po wier­szu osobny pro­gram, in­ter­pre­ter, bez wcze­śniej­sze­go tłu­ma­cze­nia na plik wy­ko­ny­wal­ny. In­ter­pre­to­wa­ne są PHP, JavaScript, Python, Ruby i Perl, kom­pi­lo­wa­ne zaś C, C++ i Pascal: ich kod za­mie­nia kom­pi­la­tor na gotowy pro­gram, który do­pie­ro potem się uru­cha­mia. Stąd cecha wy­god­na na eg­za­mi­nie: po­pra­wio­ny plik PHP działa zaraz po od­świe­że­niu strony, bez żad­ne­go bu­do­wa­nia. Wśród tech­no­lo­gii strony jedna nie prze­twa­rza danych użyt­kow­ni­ka w ogóle: CSS opi­su­je wygląd i ni­cze­go nie liczy. Dane wpi­sa­ne w for­mu­larz ob­słu­ży PHP na ser­we­rze albo JavaScript w prze­glą­dar­ce, a HTML tylko je zbiera.
In­sta­la­cję Apache, MySQL i phpMyAdmin opi­su­je lekcja o SZBD, XAMPP i phpMyAdmin, a sam obieg żą­da­nia i od­po­wie­dzi lekcja o tym, jak działa strona WWW.

Pierw­szy skrypt: plik, adres, znacz­ni­ki

Skrypt PHP to zwykły plik tek­sto­wy z roz­sze­rze­niem .php, po­ło­żo­ny w ka­ta­lo­gu ob­słu­gi­wa­nym przez serwer WWW. W XAMPP jest to C:\xampp\htdocs, więc plik C:\xampp\htdocs\sklep\index.php otwie­ra się ad­re­sem http://localhost/sklep/index.php. Skrót http://localhost/sklep/ daje to samo, bo index.php jest pli­kiem do­myśl­nym.
Kod PHP otwie­ra znacz­nik <?php, a zamyka ?>. Wszyst­ko poza tymi znacz­ni­ka­mi serwer prze­pi­su­je na wyj­ście bez zmian, więc jeden plik może być w po­ło­wie HTML, a w po­ło­wie kodem. Zapisy <php>, <?php> i <php ... /> nie znaczą nic i są w py­ta­niach wy­łącz­nie od­po­wie­dzia­mi błęd­ny­mi.
Do wy­pi­sy­wa­nia służy echo (WYPISZ), kon­struk­cja przyj­mu­ją­ca jedną war­tość albo kilka po prze­cin­ku. Prawie to samo robi print: przyj­mu­je do­kład­nie jeden ar­gu­ment i zwraca 1, więc wolno go użyć w wy­ra­że­niu. W ar­ku­szach i w banku pytań stoi prawie zawsze echo.
<?php // nagłówek strony sklepu $sklep = 'Sklep komputerowy'; $sztuk = 12; echo '<h1>' . $sklep . '</h1>'; echo 'W ofercie: ' . $sztuk . ' produktów.';
<h1>Sklep komputerowy</h1>W ofercie: 12 produktów.
Kropka to ope­ra­tor łą­cze­nia na­pi­sów: skleja war­to­ści w jeden ciąg. Każdą in­struk­cję zamyka śred­nik i jego brak jest naj­częst­szą przy­czy­ną prze­rwa­nia pracy in­ter­pre­te­ra. Wiel­kość liter ma zna­cze­nie w na­zwach zmien­nych, więc $sklep i $Sklep to dwie różne zmien­ne, ale nie w na­zwach funk­cji i sło­wach klu­czo­wych: ECHO za­dzia­ła jak echo. Ko­men­tarz jed­no­li­nio­wy za­czy­na // albo # i sięga do końca wier­sza, a ko­men­tarz wie­lo­li­nio­wy obej­mu­ją /* i */. Zapis <!-- --> jest ko­men­ta­rzem HTML i w kodzie PHP nie działa. Wy­wo­ła­nie phpinfo(); wy­pi­su­je całą kon­fi­gu­ra­cję ser­we­ra PHP: wersję, system ope­ra­cyj­ny i war­to­ści usta­wień.

Osa­dza­nie PHP w HTML

Osa­dza­nie to prze­pla­ta­nie w jednym pliku znacz­ni­ków HTML i bloków kodu, dzięki czemu strona po­wsta­je z danych do­pie­ro w chwili otwar­cia. Blok <?php ... ?> można otwo­rzyć i za­mknąć w do­wol­nym miej­scu do­ku­men­tu, także w środku listy. Do samego wy­pi­sa­nia war­to­ści służy skrót <?= ?>, czyli <?php echo ... ?>.
<h2>Produkty</h2> <ul> <?php $produkty = ['Mysz', 'Klawiatura', 'Monitor 24']; foreach ($produkty as $produkt) { echo '<li>' . $produkt . '</li>'; } ?> </ul> <p>Razem: <?= count($produkty) ?> pozycje</p>
<h2>Produkty</h2> <ul> <li>Mysz</li><li>Klawiatura</li><li>Monitor 24</li></ul> <p>Razem: 3 pozycje</p>
Prze­glą­dar­ka pokaże na­głó­wek, trzy punkty listy i zdanie z liczbą 3. Pętla foreach (DLA KAŻDEGO) wy­pi­sa­ła trzy razy znacz­nik <li>, a <h2>, <ul> i </ul> prze­szły przez serwer nie­tknię­te. Same pętle i wa­run­ki opi­su­je lekcja o in­struk­cjach ste­ru­ją­cych.
Plik z prze­pla­ta­niem jest sza­blo­nem: HTML sta­no­wi szkie­let, a PHP wsta­wia zmien­ne war­to­ści. Plik czysto ob­li­cze­nio­wy, na przy­kład skrypt łą­czą­cy się z bazą, pisze się ina­czej: za­czy­na się od <?php i nie ma na końcu ?> w ogóle. Znacz­nik za­my­ka­ją­cy jest tam zbędny, a łatwo za nim zo­sta­wić spację, którą serwer wyśle jako treść i ze­psu­je wy­sy­ła­nie na­głów­ków.
Sposób za­pi­sa­nia napisu zmie­nia to, co zo­ba­czy użyt­kow­nik. Napis w cu­dzy­sło­wie prze­cho­dzi in­ter­po­la­cję: nazwa zmien­nej w jego wnę­trzu zo­sta­je za­stą­pio­na war­to­ścią, a se­kwen­cja \n łamie wiersz. Napis w apo­stro­fach idzie na wyj­ście do­słow­nie, razem ze zna­kiem dolara.
<?php $nazwa = 'Mysz'; $cena = 45; echo "Produkt $nazwa kosztuje $cena zł\n"; echo 'Produkt $nazwa kosztuje $cena zł';
Produkt Mysz kosztuje 45 zł Produkt $nazwa kosztuje $cena zł
Ten sam pierw­szy wiersz daje zapis z krop­ka­mi: echo 'Produkt ' . $nazwa . ' kosztuje ' . $cena . ' zł';. Zła­ma­nie wier­sza zna­kiem \n widać w źródle strony, ale nie w oknie, bo HTML zwija białe znaki; prze­ła­ma­nie wi­docz­ne na ekra­nie daje do­pie­ro znacz­nik <br>.

Co widzi prze­glą­dar­ka i co widać po błę­dzie

Po­le­ce­nie „pokaż źródło strony" po­ka­zu­je wy­łącz­nie to, co przy­szło z ser­we­ra: HTML razem z JavaScriptem i od­no­śni­ka­mi do ar­ku­szy stylów. Kodu PHP nie ma tam nigdy, bo został wy­ko­na­ny i znik­nął, zo­sta­wia­jąc po sobie wynik. Dla­te­go hasło do bazy wpi­sa­ne w skryp­cie zo­sta­je nie­wi­docz­ne, a własny błąd po­zna­je się do­pie­ro po ko­mu­ni­ka­cie.
Ko­mu­ni­ka­ty mają dwa po­zio­my. Parse error za­trzy­mu­je skrypt, zanim ten wykona choćby jedną in­struk­cję, i bierze się z błędu skład­ni: bra­ku­ją­ce­go śred­ni­ka, nie­do­mknię­te­go na­wia­su albo apo­stro­fu. Strona jest wtedy pusta albo urywa się w po­ło­wie. Warning: Undefined variable oraz Warning: Undefined array key to ostrze­że­nia: skrypt działa dalej, tylko w miej­scu od­czy­ta­nej zmien­nej wy­pi­su­je pustkę, co zwykle znaczy li­te­rów­kę w nazwie albo brak danych z for­mu­la­rza. Ostrze­że­nia i błędy tra­fia­ją też do logu ser­we­ra, jeśli włącza to wpis w php.ini.
Wspól­ny kod trzyma się w osob­nych pli­kach i do­łą­cza dwiema in­struk­cja­mi. include (DOŁĄCZ) wsta­wia za­war­tość wska­za­ne­go pliku w to miej­sce, a gdy pliku nie ma, zgła­sza ostrze­że­nie i idzie dalej. require (WYMAGAJ) robi to samo, ale brak pliku kończy się błędem kry­tycz­nym i za­trzy­ma­niem skryp­tu. Po­łą­cze­nie z bazą do­łą­cza się przez require, stopkę czy menu przez include.
<?php require 'polaczenie.php'; $tytul = 'Sklep komputerowy'; include 'naglowek.php'; echo '<p>Witaj w sklepie.</p>';

Śro­do­wi­sko pracy

Śro­do­wi­sko uru­cho­mie­nio­we to kom­plet pro­gra­mów po­trzeb­nych do wy­ko­na­nia skryp­tu: serwer WWW, in­ter­pre­ter języka i serwer bazy danych. Na eg­za­mi­nie jest nim XAMPP, pakiet in­sta­lu­ją­cy naraz Apache, PHP i MariaDB, z pa­ne­lem, w którym uru­cha­mia się usługi przy­ci­ska­mi Start. Do pi­sa­nia kodu służy edytor z pod­świe­tla­niem skład­ni i nu­me­ra­cją wier­szy: kolor na­pi­sów wy­ła­pu­je nie­do­mknię­ty apo­strof przed od­świe­że­niem strony. Go­to­wym pa­kie­tem do ob­słu­gi bazy jest phpMyAdmin, wbu­do­wa­ny w XAMPP: przez niego za­kła­da się bazę sklep, im­por­tu­je plik .sql i spraw­dza, czy skrypt za­pi­sał wiersz.
Pliki za­pi­su­je się w ko­do­wa­niu UTF-8 bez BOM. Znacz­nik BOM to trzy nie­wi­docz­ne bajty na po­cząt­ku pliku, które serwer wyśle jako treść przed pierw­szym znacz­ni­kiem HTML, przez co prze­sta­je dzia­łać wy­sy­ła­nie na­głów­ków. Pol­skie znaki wy­ma­ga­ją jesz­cze de­kla­ra­cji <meta charset="utf-8"> w na­głów­ku do­ku­men­tu.

Na eg­za­mi­nie

Py­ta­nia pi­sem­ne o pod­sta­wy PHP mają kilka sta­łych kształ­tów. Pierw­szy do­ty­czy miej­sca wy­ko­na­nia: kod strony na­pi­sa­nej w PHP jest wy­ko­ny­wa­ny po stro­nie ser­we­ra i musi zostać zin­ter­pre­to­wa­ny po stro­nie ser­we­ra, żeby dało się zo­ba­czyć jego wynik, a do uru­cho­mie­nia wy­star­czy serwer WWW z in­ter­pre­te­rem PHP. Drugi wy­mie­nia języki: po stro­nie ser­we­ra pra­cu­ją PHP, Python, Ruby, Java i C#, a je­dy­nym z po­pu­lar­nych, który działa w prze­glą­dar­ce, jest JavaScript; ję­zy­kiem skryp­to­wym ogól­ne­go prze­zna­cze­nia, za­gnież­dża­nym w HTML i uru­cha­mia­nym na ser­we­rze, jest wła­śnie PHP. Trzeci podaje krótki kod i pyta o wynik echo: o od­po­wie­dzi roz­strzy­ga to, czy napis stoi w cu­dzy­sło­wie, czy w apo­stro­fach, oraz co skleja kropka. Czwar­ty pyta o znacz­ni­ki: kod umiesz­cza się między <?php a ?>, nie w <php> ani <?php>. Piąty do­ty­czy ko­men­ta­rzy: wie­lo­li­nio­wy to /* */, jed­no­li­nio­wy to // oraz #, a <!-- --> należy do HTML. Szósty od­róż­nia do­łą­cza­nie plików: za­war­tość pliku egzamin.php włącza include("egzamin.php") albo require, przy czym require prze­ry­wa skrypt, gdy pliku bra­ku­je. Wraca też py­ta­nie o phpinfo() jako po­le­ce­nie po­ka­zu­ją­ce kon­fi­gu­ra­cję ser­we­ra oraz o tech­no­lo­gię, która nie prze­twa­rza danych użyt­kow­ni­ka: CSS.
Pu­łap­ka: brak śred­ni­ka daje Parse error i pustą stronę, a li­te­rów­ka w nazwie zmien­nej tylko ostrze­że­nie Undefined variable i puste miej­sce w tek­ście.
W za­da­niu prak­tycz­nym obo­wią­zu­ją trzy zasady nie­za­leż­ne od treści po­le­ce­nia. Plik ze skryp­tem ma roz­sze­rze­nie .php i leży w ka­ta­lo­gu ser­we­ra htdocs, zwykle w pod­ka­ta­lo­gu z nu­me­rem PESEL zda­ją­ce­go. Stronę otwie­ra się ad­re­sem http://localhost/..., nigdy po­dwój­nym klik­nię­ciem pliku, bo wtedy PHP się nie wykona i eg­za­mi­na­tor zo­ba­czy kod za­miast wyniku. Apache i MySQL muszą być uru­cho­mio­ne w panelu XAMPP. Skrypt skła­da­ją­cy stronę z danych łączy HTML z wy­ni­ka­mi za­py­tań tak, jak po­ka­zu­je pętla z tej lekcji: znacz­ni­ki wy­pi­su­je echo, a war­to­ści wsta­wia między nie.

Ściąga

Zapis
Znaczy
<?php ... ?>
znacz­ni­ki otwar­cia i za­mknię­cia kodu PHP
<?= $x ?>
skrót od <?php echo $x; ?>
echo 'tekst';
wy­pi­su­je war­tość na stronę
print 'tekst';
to samo, jeden ar­gu­ment, zwraca 1
.
łączy napisy w jeden ciąg
"Cena: $cena"
cu­dzy­słów, zmien­na za­stą­pio­na war­to­ścią, działa \n
'Cena: $cena'
apo­stro­fy, tekst do­słow­ny razem ze zna­kiem dolara
// komentarz
ko­men­tarz jed­no­li­nio­wy, tak samo #
/* komentarz */
ko­men­tarz wie­lo­li­nio­wy
include 'plik.php';
do­łą­cza plik, brak pliku to ostrze­że­nie
require 'plik.php';
do­łą­cza plik, brak pliku za­trzy­mu­je skrypt
phpinfo();
wy­pi­su­je kon­fi­gu­ra­cję ser­we­ra PHP
C:\xampp\htdocs\sklep\index.php
plik skryp­tu w ka­ta­lo­gu ser­we­ra
http://localhost/sklep/index.php
adres, pod którym skrypt się wykona
Pobierz ściągę PDF
ZAWODNIK
egzamin zawodowy INF.02 · INF.03 · INF.04
Serwer Discord
Egzaminy zawodowe IT/Matury/Studia
@yastor
© 2026 Zawodnik · by Yastor
Arkusze i zasady oceniania pochodzą z CKE. Serwis nie jest powiązany z Centralną Komisją Egzaminacyjną.