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.
PHP (PHP: Hypertext Preprocessor, procesor hipertekstu) to język skryptowy wykonywany po stronie serwera: kod z pliku uruchamia serwer WWW, a do przeglądarki trafia sam wynik jego pracy, zwykle gotowy HTML. W części pisemnej wracają pytania „które zadanie wykonuje się po stronie serwera", „co pokaże przeglądarka po wykonaniu przedstawionego kodu", „jakimi znacznikami osadza się PHP w pliku" oraz „które języki są skryptowe i interpretowane". W zadaniu praktycznym w PHP napisany jest cały oceniany rezultat „skrypt połączenia z bazą".
Klient kontra serwer
Strona klienta to przeglądarka na komputerze użytkownika, a strona serwera to komputer, na którym stoi serwer WWW razem z interpreterem PHP i serwerem bazy danych. Ten podział rozstrzyga, gdzie który kod się wykonuje. HTML i CSS przeglądarka rysuje u siebie. JavaScript też pracuje u niej: kliknięcie przycisku zmienia kolor tła albo rozwija menu, i dzieje się to bez pytania serwera o cokolwiek. PHP pracuje wyłącznie na serwerze: zapisuje zamówienie do bazy, sprawdza login i hasło, składa listę produktów z wierszy tabeli produkt. Wierszy z bazy przeglądarka nie dostaje, dostaje 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. Przeglądarka wysyła żądanie HTTP na port 80 serwera. Apache widzi rozszerzenie .php i oddaje plik interpreterowi zamiast wysyłać go takim, jaki jest. Skrypt się wykonuje, łączy się z MySQL na porcie 3306, odbiera wiersze i składa z nich tekst strony. Apache odsyła ten tekst jako odpowiedź HTTP. Na tym samym serwerze stoi phpMyAdmin, który sam jest zestawem skryptów PHP: dlatego otwiera się w przeglądarce pod adresem http://localhost/phpmyadmin i dlatego działa dopiero po uruchomieniu Apache.
Żeby cokolwiek z tego zadziałało, plik musi trafić do serwera. Podwójne kliknięcie pliku index.php w Eksploratorze otwiera go z dysku, adresem file:///, i wtedy żaden serwer go nie dotyka: przeglądarka pokaże surowy kod albo pustą stronę, bo sama nie umie wykonać PHP. Ten sam plik otwarty adresem http://localhost/... przechodzi przez Apache i wraca jako HTML. Do wykonania kodu wystarczy serwer WWW z interpreterem PHP, a MySQL jest potrzebny dopiero wtedy, gdy skrypt sięga do bazy.
Język interpretowany to taki, którego kod czyta i wykonuje wiersz po wierszu osobny program, interpreter, bez wcześniejszego tłumaczenia na plik wykonywalny. Interpretowane są PHP, JavaScript, Python, Ruby i Perl, kompilowane zaś C, C++ i Pascal: ich kod zamienia kompilator na gotowy program, który dopiero potem się uruchamia. Stąd cecha wygodna na egzaminie: poprawiony plik PHP działa zaraz po odświeżeniu strony, bez żadnego budowania. Wśród technologii strony jedna nie przetwarza danych użytkownika w ogóle: CSS opisuje wygląd i niczego nie liczy. Dane wpisane w formularz obsłuży PHP na serwerze albo JavaScript w przeglądarce, a HTML tylko je zbiera.
Pierwszy skrypt: plik, adres, znaczniki
Skrypt PHP to zwykły plik tekstowy z rozszerzeniem .php, położony w katalogu obsługiwanym przez serwer WWW. W XAMPP jest to C:\xampp\htdocs, więc plik C:\xampp\htdocs\sklep\index.php otwiera się adresem http://localhost/sklep/index.php. Skrót http://localhost/sklep/ daje to samo, bo index.php jest plikiem domyślnym.
Kod PHP otwiera znacznik <?php, a zamyka ?>. Wszystko poza tymi znacznikami serwer przepisuje na wyjście bez zmian, więc jeden plik może być w połowie HTML, a w połowie kodem. Zapisy <php>, <?php> i <php ... /> nie znaczą nic i są w pytaniach wyłącznie odpowiedziami błędnymi.
Do wypisywania służy echo (WYPISZ), konstrukcja przyjmująca jedną wartość albo kilka po przecinku. Prawie to samo robi print: przyjmuje dokładnie jeden argument i zwraca 1, więc wolno go użyć w wyrażeniu. W arkuszach 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 operator łączenia napisów: skleja wartości w jeden ciąg. Każdą instrukcję zamyka średnik i jego brak jest najczęstszą przyczyną przerwania pracy interpretera. Wielkość liter ma znaczenie w nazwach zmiennych, więc $sklep i $Sklep to dwie różne zmienne, ale nie w nazwach funkcji i słowach kluczowych: ECHO zadziała jak echo. Komentarz jednoliniowy zaczyna // albo # i sięga do końca wiersza, a komentarz wieloliniowy obejmują /* i */. Zapis <!-- --> jest komentarzem HTML i w kodzie PHP nie działa. Wywołanie phpinfo(); wypisuje całą konfigurację serwera PHP: wersję, system operacyjny i wartości ustawień.
Osadzanie PHP w HTML
Osadzanie to przeplatanie w jednym pliku znaczników HTML i bloków kodu, dzięki czemu strona powstaje z danych dopiero w chwili otwarcia. Blok <?php ... ?> można otworzyć i zamknąć w dowolnym miejscu dokumentu, także w środku listy. Do samego wypisania wartoś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>
Przeglądarka pokaże nagłówek, trzy punkty listy i zdanie z liczbą 3. Pętla foreach (DLA KAŻDEGO) wypisała trzy razy znacznik <li>, a <h2>, <ul> i </ul> przeszły przez serwer nietknięte. Same pętle i warunki opisuje lekcja o instrukcjach sterujących. Plik z przeplataniem jest szablonem: HTML stanowi szkielet, a PHP wstawia zmienne wartości. Plik czysto obliczeniowy, na przykład skrypt łączący się z bazą, pisze się inaczej: zaczyna się od <?php i nie ma na końcu ?> w ogóle. Znacznik zamykający jest tam zbędny, a łatwo za nim zostawić spację, którą serwer wyśle jako treść i zepsuje wysyłanie nagłówków.
Sposób zapisania napisu zmienia to, co zobaczy użytkownik. Napis w cudzysłowie przechodzi interpolację: nazwa zmiennej w jego wnętrzu zostaje zastąpiona wartością, a sekwencja \n łamie wiersz. Napis w apostrofach idzie na wyjście dosłownie, razem ze znakiem 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 pierwszy wiersz daje zapis z kropkami: echo 'Produkt ' . $nazwa . ' kosztuje ' . $cena . ' zł';. Złamanie wiersza znakiem \n widać w źródle strony, ale nie w oknie, bo HTML zwija białe znaki; przełamanie widoczne na ekranie daje dopiero znacznik <br>.
Co widzi przeglądarka i co widać po błędzie
Polecenie „pokaż źródło strony" pokazuje wyłącznie to, co przyszło z serwera: HTML razem z JavaScriptem i odnośnikami do arkuszy stylów. Kodu PHP nie ma tam nigdy, bo został wykonany i zniknął, zostawiając po sobie wynik. Dlatego hasło do bazy wpisane w skrypcie zostaje niewidoczne, a własny błąd poznaje się dopiero po komunikacie.
Komunikaty mają dwa poziomy. Parse error zatrzymuje skrypt, zanim ten wykona choćby jedną instrukcję, i bierze się z błędu składni: brakującego średnika, niedomkniętego nawiasu albo apostrofu. Strona jest wtedy pusta albo urywa się w połowie. Warning: Undefined variable oraz Warning: Undefined array key to ostrzeżenia: skrypt działa dalej, tylko w miejscu odczytanej zmiennej wypisuje pustkę, co zwykle znaczy literówkę w nazwie albo brak danych z formularza. Ostrzeżenia i błędy trafiają też do logu serwera, jeśli włącza to wpis w php.ini.
Wspólny kod trzyma się w osobnych plikach i dołącza dwiema instrukcjami. include (DOŁĄCZ) wstawia zawartość wskazanego pliku w to miejsce, a gdy pliku nie ma, zgłasza ostrzeżenie i idzie dalej. require (WYMAGAJ) robi to samo, ale brak pliku kończy się błędem krytycznym i zatrzymaniem skryptu. Połączenie 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>';
Środowisko pracy
Środowisko uruchomieniowe to komplet programów potrzebnych do wykonania skryptu: serwer WWW, interpreter języka i serwer bazy danych. Na egzaminie jest nim XAMPP, pakiet instalujący naraz Apache, PHP i MariaDB, z panelem, w którym uruchamia się usługi przyciskami Start. Do pisania kodu służy edytor z podświetlaniem składni i numeracją wierszy: kolor napisów wyłapuje niedomknięty apostrof przed odświeżeniem strony. Gotowym pakietem do obsługi bazy jest phpMyAdmin, wbudowany w XAMPP: przez niego zakłada się bazę sklep, importuje plik .sql i sprawdza, czy skrypt zapisał wiersz.
Pliki zapisuje się w kodowaniu UTF-8 bez BOM. Znacznik BOM to trzy niewidoczne bajty na początku pliku, które serwer wyśle jako treść przed pierwszym znacznikiem HTML, przez co przestaje działać wysyłanie nagłówków. Polskie znaki wymagają jeszcze deklaracji <meta charset="utf-8"> w nagłówku dokumentu.
Na egzaminie
Pytania pisemne o podstawy PHP mają kilka stałych kształtów. Pierwszy dotyczy miejsca wykonania: kod strony napisanej w PHP jest wykonywany po stronie serwera i musi zostać zinterpretowany po stronie serwera, żeby dało się zobaczyć jego wynik, a do uruchomienia wystarczy serwer WWW z interpreterem PHP. Drugi wymienia języki: po stronie serwera pracują PHP, Python, Ruby, Java i C#, a jedynym z popularnych, który działa w przeglądarce, jest JavaScript; językiem skryptowym ogólnego przeznaczenia, zagnieżdżanym w HTML i uruchamianym na serwerze, jest właśnie PHP. Trzeci podaje krótki kod i pyta o wynik echo: o odpowiedzi rozstrzyga to, czy napis stoi w cudzysłowie, czy w apostrofach, oraz co skleja kropka. Czwarty pyta o znaczniki: kod umieszcza się między <?php a ?>, nie w <php> ani <?php>. Piąty dotyczy komentarzy: wieloliniowy to /* */, jednoliniowy to // oraz #, a <!-- --> należy do HTML. Szósty odróżnia dołączanie plików: zawartość pliku egzamin.php włącza include("egzamin.php") albo require, przy czym require przerywa skrypt, gdy pliku brakuje. Wraca też pytanie o phpinfo() jako polecenie pokazujące konfigurację serwera oraz o technologię, która nie przetwarza danych użytkownika: CSS.
Pułapka: brak średnika daje Parse error i pustą stronę, a literówka w nazwie zmiennej tylko ostrzeżenie Undefined variable i puste miejsce w tekście.
W zadaniu praktycznym obowiązują trzy zasady niezależne od treści polecenia. Plik ze skryptem ma rozszerzenie .php i leży w katalogu serwera htdocs, zwykle w podkatalogu z numerem PESEL zdającego. Stronę otwiera się adresem http://localhost/..., nigdy podwójnym kliknięciem pliku, bo wtedy PHP się nie wykona i egzaminator zobaczy kod zamiast wyniku. Apache i MySQL muszą być uruchomione w panelu XAMPP. Skrypt składający stronę z danych łączy HTML z wynikami zapytań tak, jak pokazuje pętla z tej lekcji: znaczniki wypisuje echo, a wartości wstawia między nie.
Ściąga
<?php ... ?>
znaczniki otwarcia i zamknięcia kodu PHP
<?= $x ?>
skrót od <?php echo $x; ?>
echo 'tekst';
wypisuje wartość na stronę
print 'tekst';
to samo, jeden argument, zwraca 1
.
łączy napisy w jeden ciąg
"Cena: $cena"
cudzysłów, zmienna zastąpiona wartością, działa \n
'Cena: $cena'
apostrofy, tekst dosłowny razem ze znakiem dolara
// komentarz
komentarz jednoliniowy, tak samo #
/* komentarz */
komentarz wieloliniowy
include 'plik.php';
dołącza plik, brak pliku to ostrzeżenie
require 'plik.php';
dołącza plik, brak pliku zatrzymuje skrypt
phpinfo();
wypisuje konfigurację serwera PHP
C:\xampp\htdocs\sklep\index.php
plik skryptu w katalogu serwera
http://localhost/sklep/index.php
adres, pod którym skrypt się wykona
Pobierz ściągę PDF