Jak zacząć programować w PHP w 2024 roku: praktyczny przewodnik dla początkujących webmasterów

0
24
Rate this post

Spis Treści:

Od statycznej strony do pierwszego skryptu – po co ci PHP w 2024 roku

Dlaczego PHP wciąż ma sens dla początkującego webmastera

Statyczna strona HTML jest jak wizytówka wydrukowana na papierze – ładna, ale nie odpowie na pytanie, nie zapisze kontaktu, nie przefiltruje produktów i nie zaloguje użytkownika. PHP dodaje do strony „mózg”, który działa po stronie serwera. W 2024 roku ogromna część internetu nadal opiera się na PHP, choć wiele osób ogłaszało jego „śmierć” już kilkanaście razy.

Najbardziej namacalny przykład: WordPress, czyli najpopularniejszy system CMS na świecie, jest zbudowany w PHP. To na nim stoją blogi, serwisy firmowe, sklepy (WooCommerce), portale informacyjne i landing page’e. Każda wtyczka, motyw czy modyfikacja logiki WordPressa to bezpośrednio kod PHP. Jeśli jako webmaster chcesz robić coś więcej niż tylko klikać w panelu – PHP jest naturalnym kolejnym krokiem.

Poza WordPressem w PHP działa mnóstwo sklepów (np. na PrestaShop), panele administracyjne, proste API dla aplikacji mobilnych i systemy intranetowe. PHP jest obecne na tysiącach hostingów współdzielonych, co oznacza, że nie trzeba kupować drogiego serwera ani znać Dockera, żeby wypchnąć pierwszą aplikację do sieci.

Czy PHP umiera? Rzeczowe spojrzenie na mity

Mit „PHP umiera” powraca jak bumerang od ponad dekady. Tymczasem kolejne wersje języka – w szczególności PHP 7 i PHP 8 – pokazały odwrotny trend: ogromny skok wydajności, nowoczesne funkcje i stale rozwijany ekosystem. Język dorósł, uporządkował wiele dawnych „dziwactw” i mocno poprawił bezpieczeństwo.

PHP 8 wprowadził między innymi typowanie, atrybuty, union types, konstruktor property promotion i sporo usprawnień wydajnościowych w silniku. Dla początkującego webmastera oznacza to, że ucząc się teraz, poznajesz wersję języka, która będzie aktualna i wspierana jeszcze przez długie lata. Nie zanurzasz się w martwą technologię.

W praktyce firmy wciąż rekrutują programistów PHP, a projekty oparte na WordPressie, Symfony czy Laravelu powstają każdego dnia. Oczywiście warto znać też JavaScript po stronie serwera (Node.js) czy inne języki, ale jako pierwszy backend PHP ma ogromny sens: jest prosty w uruchomieniu, świetnie wspierany przez hostingi i ma dużo polskojęzycznych materiałów.

Kiedy HTML/CSS/JS przestają wystarczać

Do pewnego momentu czysty HTML i CSS w zupełności wystarczą – statyczna wizytówka, prosta strona firmowa z 3–4 podstronami, landing. Gdy jednak pojawiają się potrzeby:

  • obsługa formularza kontaktowego z walidacją,
  • logowanie użytkownika i prosty panel klienta,
  • dodawanie i edycja treści bez wchodzenia w pliki (CMS),
  • lista produktów lub artykułów wczytywana z bazy danych,
  • integracja z zewnętrznym systemem (np. bramką płatności, API newslettera),

wtedy front-end przestaje wystarczać. JavaScript w przeglądarce może wiele, ale są rzeczy, których nie zrobi bezpiecznie: nie przechowa haseł, nie połączy się bezpośrednio z bazą danych w sposób niewidoczny dla użytkownika, nie ukryje kluczy API. Backend w PHP rozwiązuje te zadania „po cichu” na serwerze.

Dodatkowo dynamiczne generowanie stron (na podstawie bazy danych czy szablonów) staje się dużo wygodniejsze. Zamiast kopiować ten sam HTML w 50 plikach, tworzysz jeden szablon i serwujesz różne dane. Dla webmastera, który obsługuje wielu klientów, to ogromna oszczędność czasu.

Jakie problemy webmastera rozwiązuje PHP na co dzień

Patrząc z perspektywy osoby, która utrzymuje i rozwija strony klientów, PHP pozwala rozwiązać bardzo konkretne problemy:

  • tworzenie i obsługa formularzy kontaktowych, zgłoszeniowych, zapisów na newsletter,
  • logowanie i rejestracja użytkowników, przypomnienie hasła, proste uprawnienia,
  • wysyłka e‑maili transakcyjnych (np. potwierdzenia zamówień, powiadomienia o komentarzu),
  • zapisywanie danych do bazy: leadów, zamówień, opinii, zgłoszeń,
  • budowa małych paneli administracyjnych do zarządzania treścią bez pełnego WordPressa,
  • łączenie się z zewnętrznymi API – np. pobieranie kursów walut, statusów przesyłek,
  • tworzenie prostych raportów, statystyk, zestawień dla klienta.

To wszystko są scenariusze, które pojawiają się szybko, gdy zaczynasz działać komercyjnie. Zamiast każdemu klientowi wciskać ten sam gotowy CMS, możesz elastycznie zdecydować: tu wystarczy mały skrypt, tu warto zbudować coś na WordPressie, a tu zrobimy małą aplikację w frameworku.

Realne cele po 3–6 miesiącach nauki PHP

Początkujący często pytają: „Ile czasu zajmie, żeby coś umieć?”. Przy konsekwentnej nauce 5–8 godzin tygodniowo, w ciągu 3–6 miesięcy można dojść do poziomu, na którym:

  • spokojnie konfigurujesz środowisko (lokalny serwer, hosting, baza MySQL),
  • piszesz małe skrypty obsługujące formularze, zapisujące dane i wysyłające e‑maile,
  • rozumiesz podstawy OOP w PHP i potrafisz prosto zorganizować kod,
  • czytasz i modyfikujesz prostsze wtyczki i motywy WordPressa,
  • tworzysz prosty, własny mini‑CMS z logowaniem, edycją treści i bazą danych.

Taki poziom w zupełności wystarczy, by jako webmaster oferować usługi wykraczające poza sam front‑end, a do tego stopniowo wchodzić w bardziej zaawansowany backend albo frameworki.

Co trzeba umieć przed wejściem w PHP – fundament pod spokojną naukę

Minimum z HTML i CSS, które naprawdę się przydaje

PHP jest rozszerzeniem tego, co już znasz z HTML i CSS. Skrypty generują zwykły HTML, który trafia do przeglądarki użytkownika. Żebyś czuł się pewnie, przyda się solidne minimum:

  • rozumienie struktury dokumentu HTML: znacznik <html>, <head>, <body>,
  • umiejętność budowania nagłówków, paragrafów, list, linków, obrazków, tabel,
  • opanowane formularze: <form>, <input>, <textarea>, <select>, przyciski,
  • zrozumienie atrybutów action, method i name w formularzach,
  • podstawy CSS: klasy, identyfikatory, proste layouty (flexbox, grid nie są konieczne na start, ale pomagają).

Bez tego łatwo zgubić się w kodzie mieszającym HTML z PHP. Gdy potrafisz spokojnie zbudować formularz czy prostą podstronę, PHP „dokleja się” dużo naturalniej.

Jak działa przeglądarka i serwer – prosty obrazek w głowie

Dobra metafora: przeglądarka to „klient w restauracji”, a serwer to „kuchnia”. Przeglądarka wysyła zamówienie (żądanie HTTP), serwer je otrzymuje, uruchamia PHP (kucharza), ten przygotowuje danie (HTML, JSON, plik) i odsyła gotową odpowiedź. Klient nie widzi, co działo się w kuchni, widzi tylko efekt.

Kod JavaScript w przeglądarce działa po stronie klienta – każdy użytkownik ma swoją kopię tego kodu. Kod PHP działa na serwerze – użytkownik widzi tylko wynik jego działania. Gdy user wpisuje adres strony lub klika przycisk „Wyślij” w formularzu, przeglądarka kontaktuje się z serwerem, ten wykonuje odpowiedni skrypt PHP i odsyła rezultat.

Świadomość, „po której stronie” coś się dzieje, jest kluczowa: PHP nie może bezpośrednio modyfikować DOM w przeglądarce po załadowaniu strony, a JavaScript nie powinien bezpośrednio dotykać bazy danych. Obie warstwy współpracują, ale pełnią różne role.

Do kompletu polecam jeszcze: Code review w środowisku wielojęzycznym (multilang) — znajdziesz tam dodatkowe wskazówki.

Podstawy pracy z plikami i terminalem

Żeby wygodnie pracować z PHP, dobrze jest umieć:

  • tworzyć, kopiować i przenosić pliki i katalogi w systemie (Explorer, Finder, menedżer plików),
  • zmieniać rozszerzenie pliku (np. z .html na .php),
  • uruchomić prostą komendę w terminalu/PowerShellu – choćby php -v,
  • zorientować się w strukturze katalogów (np. gdzie leży folder z plikami serwera lokalnego).

Nie trzeba od razu zostać adminem Linuksa. Wystarczy, że nie będziesz się bał otworzyć okna terminala i przepisać kilku komend z poradnika. Z czasem dojdą git i proste skrypty, ale to da się stopniowo oswoić.

Baza danych i SQL – absolutne podstawy pojęciowe

Prędzej czy później PHP spotyka się z bazą danych, najczęściej MySQL lub MariaDB. Zanim zaczniesz pisać zapytania, przydaje się rozumieć kilka pojęć:

  • baza danych – jak plik Excela, tylko dużo wydajniejszy i bezpieczniejszy,
  • tabela – arkusz wewnątrz bazy, np. uzytkownicy, posty,
  • wiersz (rekord) – pojedynczy wpis, np. jeden użytkownik, jeden artykuł,
  • kolumna – pole w tabeli, np. email, haslo, data_dodania.

Jeśli wiesz, że zapytanie SQL typu SELECT * FROM posty „pobiera wszystkie wiersze z tabeli posty”, a INSERT INTO dodaje nowy rekord, jesteś już w połowie drogi. Głębszą składnię SQL spokojnie dociągniesz, gdy pojawi się potrzeba.

Krótka autodiagnoza fundamentów

Zanim zanurzysz się w naukę PHP od zera, odpowiedz sobie na kilka pytań:

  • Czy umiem stworzyć prosty formularz HTML (pole tekstowe, e‑mail, textarea, przycisk) i nadać polom atrybut name?
  • Czy rozumiem, że po kliknięciu „Wyślij” dane lecą na serwer i tam są przetwarzane?
  • Czy jestem w stanie zainstalować program (np. XAMPP, Laragon) i odnaleźć folder z plikami serwera?
  • Czy wiem, czym jest tabela i rekord w bazie danych, choćby z analogii do Excela?
Programistka pracuje nad kodem PHP w nowoczesnym biurze
Źródło: Pexels | Autor: ThisIsEngineering

Przygotowanie środowiska w 2024 roku – wygodny start bez bólu głowy

Serwer HTTP, interpreter PHP – o co w tym w ogóle chodzi

Żeby skrypt PHP zadziałał, potrzebuje trzech elementów:

  • serwera HTTP – zwykle Apache lub Nginx, który przyjmuje żądania z przeglądarki,
  • interpretera PHP – programu, który rozumie kod PHP i „tłumaczy” go na wynik (HTML, JSON itd.),
  • bazy danych – np. MySQL/MariaDB, jeśli aplikacja przechowuje dane.

Na produkcyjnym hostingu te elementy są już skonfigurowane przez dostawcę. Na komputerze lokalnym trzeba je zainstalować w formie paczki lub kontenerów. Dobra wiadomość jest taka, że istnieją gotowe zestawy „wszystko w jednym”, które ten problem rozwiązują niemal jednym kliknięciem.

XAMPP, Laragon, MAMP, Docker – co wybrać na początek

Na rynku jest kilka popularnych opcji do uruchamiania PHP lokalnie. Każda ma swoje plusy i minusy. Poniżej proste porównanie, które pomaga wybrać sensownie na start.

NarzędzieSystemDla kogoZaletyWady
XAMPPWindows, macOS, LinuxPoczątkujący, uniwersalny wybórŁatwa instalacja, duża liczba poradników, Apache + PHP + MySQLBywa cięższy, kilka drobnych pułapek konfiguracyjnych
LaragonWindowsPoczątkujący na WindowsieBardzo wygodny, lekkie środowisko, automatyczne domeny lokalneTylko Windows, mniejsza ilość oficjalnych materiałów
MAMPmacOS, WindowsUżytkownicy Maca, graficzne środowiskoPrzyjazny interfejs, prostotaWersja darmowa ma ograniczenia, wersja Pro płatna
DockerWszystkie

Dlaczego na start lepiej wybrać „paczki all‑in‑one” niż ręczną konfigurację

Kto choć raz próbował ręcznie zestawić Apache + PHP + MySQL, ten wie, że pół dnia potrafi pójść na walkę z wersjami, portami i uprawnieniami. Na początku nie chodzi o to, żebyś został adminem serwera, tylko żeby kod wreszcie się uruchomił. Gotowe paczki typu XAMPP, Laragon czy MAMP rozwiązują za ciebie 90% konfiguracji. Klikasz „Start”, wrzucasz plik .php do odpowiedniego folderu i możesz pisać.

Ręczna konfiguracja też ma swoje miejsce – przyda się później, gdy zaczniesz pracować z VPS‑em czy Dockerem w projekcie komercyjnym. Na pierwsze miesiące nauki lepsza jest droga „najmniejszego oporu”, bo więcej energii idzie wtedy w zrozumienie PHP, a nie logów serwera.

Instalacja XAMPP krok po kroku (Windows/macOS)

Jeden konkretny przykład ułatwia start. Załóżmy, że wybierasz XAMPP, bo działa podobnie na Windowsie i macOS.

  1. Wejdź na oficjalną stronę apachefriends.org i pobierz XAMPP dla swojego systemu.
  2. Zainstaluj program, zostawiając domyślne ustawienia (Apache, MySQL, PHP zaznaczone domyślnie).
  3. Uruchom „XAMPP Control Panel” (Windows) lub aplikację XAMPP (macOS).
  4. Włącz minimum dwa moduły: Apache (serwer HTTP) i MySQL (baza danych).
  5. Otwórz przeglądarkę i wpisz w pasek adresu: http://localhost/. Jeśli widzisz stronę powitalną XAMPP, środowisko działa.

Teraz najważniejsze: gdzie wrzucać swoje pliki? W XAMPP pod Windows domyślnie będzie to katalog C:xampphtdocs. Pod macOS – zwykle /Applications/XAMPP/htdocs/. Każdy plik .php w tym folderze będzie dostępny pod adresem http://localhost/nazwa_pliku.php.

Test konfiguracji – pierwszy „suchy” skrypt

Zanim napiszesz choćby jedno echo, dobrze upewnić się, że interpreter PHP naprawdę działa i widzi właściwą wersję. Przydaje się tu specjalna funkcja diagnostyczna.

  1. W katalogu htdocs utwórz nowy plik o nazwie info.php.
  2. Wklej do środka taki kod:
<?php
phpinfo();
  1. Wejdź w przeglądarce na adres http://localhost/info.php.

Powinieneś zobaczyć rozbudowaną stronę z informacjami o PHP: wersja, załadowane moduły, konfiguracja. To sygnał, że PHP jest uruchamiane poprawnie przez Apache i że możesz przejść do właściwej nauki. Plik info.php po teście najlepiej usunąć – to wygodne narzędzie, ale na publicznym serwerze nie powinien być dostępny.

Edytor kodu – od czego zacząć, żeby sobie nie przeszkadzać

Edytor nie nauczy za ciebie PHP, ale może ci skutecznie uprzyjemnić albo uprzykrzyć naukę. Dobre narzędzie podpowie składnię, zaznaczy błędy, ułatwi nawigację po plikach.

Na start świetnie sprawdza się jeden z tych programów:

  • Visual Studio Code – darmowy, działa na Windows, macOS, Linux; ogrom rozszerzeń (PHP Intelephense, PHP Debug).
  • PHPStorm (płatny, ale z trialem) – bardzo rozbudowane IDE, później często używane w komercyjnych projektach.
  • Sublime Text lub Notepad++ – lekkie edytory, gdy komputer jest słabszy lub lubisz minimalizm.

Na początku wystarczy włączyć numerację linii, podświetlanie składni i zapisywać pliki w UTF‑8. Wszystkie pozostałe wodotryski (linting, formatowanie, integracja z Gitem) można dodawać stopniowo, gdy poczujesz się pewniej.

Foldery projektów – prosta struktura, żeby się nie pogubić

Już przy pierwszych eksperymentach opłaca się trzymać porządek. Zamiast wrzucać wszystkie pliki do jednego wielkiego „worka”, utwórz w htdocs osobne foldery na konkretne mini‑projekty:

  • htdocs/hello-php/ – pierwsze skrypty i testy,
  • htdocs/formularze/ – przykłady obsługi formularzy,
  • htdocs/blog-mini/ – prosta aplikacja z bazą danych.

Potem otwierasz w przeglądarce np. http://localhost/hello-php/ i masz wszystkie pliki związane z jednym tematem w jednym miejscu. To niby drobiazg, ale gdy kodu przybywa, taki porządek naprawdę ratuje czas i nerwy.

Pierwszy skrypt PHP – od „Hello, world” do prostej logiki serwera

Plik .php a plik .html – co się zmienia

Najprostsza rzecz: rozszerzenie. Żeby serwer uruchomił interpreter PHP, plik musi mieć rozszerzenie .php. Jeśli nazwiesz go index.html, Apache potraktuje go jak zwykły HTML i nie „zauważy” żadnego kodu PHP w środku.

Druga sprawa to specjalne znaczniki otwierające i zamykające kod PHP:

<?php
// tu jest kod PHP
?>

Wszystko, co znajduje się poza nimi, jest traktowane jako zwykły HTML. Dzięki temu w jednym pliku możesz łączyć strukturę strony z fragmentami logiki serwerowej.

Pierwsze „Hello, world” po stronie serwera

Zróbmy najprostszy możliwy przykład, ale uruchomiony poprawnie, przez serwer.

  1. W folderze htdocs/hello-php/ utwórz plik index.php.
  2. Wklej do niego taki kod:
<!doctype html>
<html lang="pl">
<head>
    <meta charset="utf-8">
    <title>Pierwszy skrypt PHP</title>
</head>
<body>
    <h1>Strona wygenerowana przez PHP</h1>

    <p>
        <?php
        echo 'Hello, world z PHP!'; 
        ?>
    </p>
</body>
</html>
  1. W przeglądarce wejdź na adres: http://localhost/hello-php/.

Zobaczysz stronę z nagłówkiem i tekstem wygenerowanym przez PHP. Gdy klikniesz prawym przyciskiem i wybierzesz „Pokaż źródło strony”, zauważysz, że przeglądarka widzi już tylko czysty HTML, a po znacznikach <?php ?> nie ma śladu. Interpretacja odbyła się po stronie serwera.

Zmienne i proste operacje – pierwszy krok do „myślącego” kodu

Bez zmiennych kod zachowuje się jak sztywna ulotka. Ze zmiennymi zaczyna przypominać rozmowę, w której można reagować na to, co się dzieje. W PHP zmienna zawsze zaczyna się od znaku $:

<?php
$imie = 'Kasia';
$wiek = 27;

echo 'Cześć, ' . $imie . '!<br>';
echo 'Masz ' . $wiek . ' lat.';
?>

Zwróć uwagę na kropkę – w PHP łączy tekst (łańcuchy znaków) w całość. Gdy podmienisz wartość $imie lub $wiek, wynik na stronie od razu się zmieni. To pierwsza cegiełka pod dynamiczne treści.

Instrukcje warunkowe – inaczej dla różnych sytuacji

Załóżmy, że chcesz na stronie pokazywać inny komunikat w zależności od godziny. W „surowym” HTML‑u jest to niemożliwe, bo to statyczny tekst. PHP radzi sobie z tym bardzo naturalnie, używając instrukcji if.

<?php
$godzina = date('H'); // zwraca bieżącą godzinę 00-23

if ($godzina < 12) {
    echo 'Dzień dobry, poranek jeszcze młody!';
} elseif ($godzina < 18) {
    echo 'Dobre popołudnie, jak tam dzień?';
} else {
    echo 'Dobry wieczór, czas na odpoczynek.';
}
?>

Ten prosty przykład robi wrażenie na osobach przyzwyczajonych do statycznych stron: ten sam adres, a komunikat inny o 10:00 niż o 21:00. I właśnie o takie drobne „żyjące” elementy stron zwykle chodzi webmasterowi na początku.

Pętle – gdy trzeba powtórzyć podobny fragment wiele razy

Jeśli choć raz kopiowałeś w HTML‑u ten sam blok kilkanaście razy tylko po to, by zmienić w nim jeden numer, to już intuicyjnie czujesz, po co są pętle. Dzięki nim jeden fragment kodu może wygenerować wiele podobnych elementów.

<ul>
<?php
for ($i = 1; $i <= 5; $i++) {
    echo '<li>Element listy numer ' . $i . '</li>';
}
?>
</ul>

W wyniku otrzymasz listę z pięcioma elementami. Jeśli zmienisz warunek na $i <= 10, lista magicznie urośnie do dziesięciu pozycji bez dodatkowego klepania HTML‑a. W realnych projektach w pętlach bardzo często wypisuje się wpisy z bloga, produkty ze sklepu czy komentarze użytkowników.

Jeśli większość odpowiedzi brzmi „tak” – możesz spokojnie startować. Jeśli „nie” – warto poświęcić tydzień na doszlifowanie HTML/CSS i podstaw baz danych. Ta inwestycja bardzo ułatwi dalsze kroki, a wiele materiałów znajdziesz choćby na Porady-IT.pl – Kurs PHP, Webmastering i Skrypty dla Nowoczesnych.

Mieszanie PHP z HTML – jak zachować czytelność

Największą pokusą początkujących jest wpychanie całych fragmentów HTML‑a do funkcji echo. Technicznie zadziała, ale czytanie takiego kodu po tygodniu to mały koszmar. Czytelniej jest, gdy HTML wciąż wygląda jak HTML, a PHP „tylko” wstrzykuje dynamiczne kawałki.

Dwa warianty dla porównania:

<!-- Wariant mniej czytelny -->
<?php
echo '<h2>Witaj, ' . $imie . '!</h2>';
echo '<p>Dzisiaj jest ' . date('Y-m-d') . '</p>';
?>
<!-- Wariant czytelniejszy -->
<h2>Witaj, <?php echo $imie; ?>!</h2>
<p>Dzisiaj jest <?php echo date('Y-m-d'); ?></p>

Drugi przykład łatwiej zrozumie nawet osoba, która PHP prawie nie zna, bo struktura HTML‑a jest widoczna niemal jak na dłoni. To podejście procentuje przy większych projektach i współpracy z grafikami czy front‑endowcami.

Młoda osoba programuje w PHP przy biurku, pijąc z kubka
Źródło: Pexels | Autor: cottonbro studio

PHP a przeglądarka – obsługa formularzy i danych użytkownika krok po kroku

Co tak naprawdę dzieje się po kliknięciu „Wyślij”

Formularz HTML to tylko ładny interfejs. Cała „magia” dzieje się po drugiej stronie, gdy przeglądarka wysyła dane do skryptu serwerowego. PHP odczytuje je, przetwarza i odsyła wynik – może to być nowa strona, komunikat o błędzie albo ta sama strona z wypełnionymi polami.

Mechanizm jest prosty: formularz wysyła dane metodą GET lub POST pod adres z atrybutu action. PHP udostępnia te dane w superglobalnych tablicach $_GET i $_POST. Każde pole formularza trafia tam pod kluczem z atrybutu name.

Najprostszy formularz tekstowy – echo tego, co wpisał użytkownik

Zacznijmy od mini‑przykładu: pole na imię i przycisk. Po wysłaniu strona ma przywitać użytkownika z użyciem wpisanego imienia.

<!doctype html>
<html lang="pl">
<head>
    <meta charset="utf-8">
    <title>Powitanie z formularza</title>
</head>
<body>

<form method="post" action="">
    <label>Jak masz na imię?
        <input type="text" name="imie">
    </label>
    <button type="submit">Wyślij</button>
</form>

<?php
if (!empty($_POST['imie'])) {
    $imie = $_POST['imie'];
    echo '<p>Miło cię poznać, ' . htmlspecialchars($imie) . '!</p>';
}
?>

</body>
</html>

Kilka szczegółów jest tu kluczowych:

  • method="post" – dane nie pojawiają się w adresie URL, lecą „w środku” żądania HTTP,
  • name="imie" – pod tym kluczem PHP odbiera wartość w $_POST,
  • htmlspecialchars() – zabezpiecza przed wstrzyknięciem HTML/JS do odpowiedzi (np. gdy ktoś zamiast imienia wpisze tagi).

Metoda GET vs POST – kiedy którą stosować

To jedno z częstszych pytań na początku: co wybrać w atrybucie method? Różnice są dość intuicyjne:

GET kontra POST na przykładach z życia

Najprościej myśleć o tym tak: GET służy do pobierania strony z konkretnymi parametrami, a POST do wysyłania danych, które coś zmieniają – zapisują się, modyfikują, usuwają.

  • GET – parametry widać w adresie URL, np. /szukaj.php?q=php&strona=2. Dobre do wyszukiwania, filtrowania, paginacji, czyli działań, które nie zmieniają danych po stronie serwera.
  • POST – dane idą w treści żądania, nie są widoczne w pasku adresu. Używa się go przy logowaniu, rejestracji, składaniu zamówienia, wysyłaniu formularza kontaktowego.

W praktyce wygląda to tak:

<!-- Filtrowanie produktów: GET -->
<form method="get" action="/produkty.php">
    <label>Szukaj:
        <input type="text" name="q">
    </label>
    <button type="submit">Filtruj</button>
</form>

<!-- Formularz kontaktowy: POST -->
<form method="post" action="/kontakt.php">
    <label>E-mail:
        <input type="email" name="email">
    </label>
    <label>Treść wiadomości:
        <textarea name="wiadomosc"></textarea>
    </label>
    <button type="submit">Wyślij</button>
</form>

Jeśli użytkownik ma móc skopiować link i wysłać znajomemu, żeby ten zobaczył dokładnie ten sam widok (np. przefiltrowaną listę produktów), wygodniej oprzeć się na GET. Gdy dane są wrażliwe albo efekt ma coś zapisać w systemie – lepiej użyć POST.

Walidacja danych po stronie serwera – druga linia obrony

Przeglądarka potrafi sprawdzać część rzeczy sama (np. wymagane pola, format e-maila). Tylko że użytkownik może ją wyłączyć lub wysłać żądanie innym narzędziem. Kod PHP jest ostatnim sędzią, który decyduje, czy dane są wystarczająco poprawne, by w ogóle je przyjąć.

Prosty przykład: krótki formularz rejestracyjny z podstawową walidacją.

<?php
$bledy = [];
$email = '';
$haslo = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $email = trim($_POST['email'] ?? '');
    $haslo = $_POST['haslo'] ?? '';

    if ($email === '') {
        $bledy[] = 'Podaj adres e-mail.';
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $bledy[] = 'Adres e-mail ma nieprawidłowy format.';
    }

    if (strlen($haslo) < 6) {
        $bledy[] = 'Hasło musi mieć co najmniej 6 znaków.';
    }

    if (empty($bledy)) {
        // tutaj np. zapis do bazy lub wysyłka maila
        echo '<p>Rejestracja przebiegła pomyślnie.</p>';
    }
}
?>

<form method="post">
    <label>E-mail:
        <input type="email" name="email"
               value="<?= htmlspecialchars($email) ?>">
    </label><br>

    <label>Hasło:
        <input type="password" name="haslo">
    </label><br>

    <button type="submit">Zarejestruj</button>
</form>

<?php if (!empty($bledy)): ?>
    <ul style="color:red">
        <?php foreach ($bledy as $blad): ?>
            <li><?= htmlspecialchars($blad) ?></li>
        <?php endforeach; ?>
    </ul>
<?php endif; ?>

Kilka drobiazgów mocno poprawia doświadczenie użytkownika:

  • wartość pola email jest przywracana po błędzie, więc nie trzeba wpisywać jej od nowa,
  • błędy wyświetlają się na tej samej stronie, nad lub pod formularzem,
  • wstępne „czyszczenie” danych funkcją trim() usuwa przypadkowe spacje.

Przekierowanie po wysłaniu formularza – wzorzec PRG

Znany efekt uboczny: użytkownik wysyła formularz, widzi potwierdzenie, po czym odświeża stronę i przeglądarka pyta „Czy ponowić wysłanie formularza?”. Gdy formularz zapisuje coś w bazie, łatwo o duplikaty. Rozwiązaniem jest schemat „Post/Redirect/Get” (PRG).

Dobrym uzupełnieniem będzie też materiał: Kodowanie jako droga do samodoskonalenia — warto go przejrzeć w kontekście powyższych wskazówek.

Idea jest prosta: po poprawnym przetworzeniu danych nie wyświetlasz od razu HTML‑a, tylko robisz przekierowanie na inny adres, np. stronę z podziękowaniem.

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // ... walidacja, zapis do bazy itd.

    if (empty($bledy)) {
        header('Location: dziekujemy.php');
        exit; // zatrzymuje dalsze wykonywanie skryptu
    }
}
?>

Dzięki temu odświeżenie strony „dziekujemy.php” nie powoduje ponownego zapisu formularza, tylko zwykłe ponowne pobranie strony metodą GET. Mały trik, który oszczędza sporo problemów.

Obsługa wielu pól jednocześnie – tablice w formularzach

Przy prostym formularzu kontaktowym jedno czy dwa pola wystarczą. Ale gdy budujesz np. koszyk sklepu, listę zadań albo kilka kontaktów naraz, wygodnie jest przesyłać dane jako tablicę.

<form method="post">
    <h3>Lista zadań</h3>

    <label>Zadanie 1:
        <input type="text" name="zadania[]">
    </label><br>

    <label>Zadanie 2:
        <input type="text" name="zadania[]">
    </label><br>

    <label>Zadanie 3:
        <input type="text" name="zadania[]">
    </label><br>

    <button type="submit">Zapisz</button>
</form>

Po stronie PHP wszystkie wpisane wartości pojawią się w jednej tablicy:

<?php
if (!empty($_POST['zadania']) && is_array($_POST['zadania'])) {
    echo '<ul>';
    foreach ($_POST['zadania'] as $zadanie) {
        $zadanie = trim($zadanie);
        if ($zadanie === '') {
            continue;
        }
        echo '<li>' . htmlspecialchars($zadanie) . '</li>';
    }
    echo '</ul>';
}
?>

Takie podejście przydaje się szczególnie, gdy pola mają się dodawać dynamicznie w JavaScripcie – każde nowe pole po prostu używa tego samego name="zadania[]", a PHP robi z tego poręczną listę.

Pliki wysyłane formularzem – pierwszy upload w PHP

Dodanie w formularzu możliwość wgrania pliku (np. zdjęcia profilowego) jest częstym wymaganiem. Trzeba jednak spełnić kilka konkretnych warunków, inaczej nic nie zadziała.

Formularz do wysyłania plików musi mieć:

  • method="post",
  • enctype="multipart/form-data",
  • pole typu file.
<form method="post" enctype="multipart/form-data">
    <label>Wybierz avatar:
        <input type="file" name="avatar">
    </label>
    <button type="submit">Wyślij</button>
</form>

PHP udostępnia informacje o pliku w tablicy $_FILES:

<?php
if (!empty($_FILES['avatar']) && $_FILES['avatar']['error'] === UPLOAD_ERR_OK) {
    $tmpPath = $_FILES['avatar']['tmp_name'];
    $nazwaOryginalna = $_FILES['avatar']['name'];
    $rozmiar = (int) $_FILES['avatar']['size'];
    $typ = $_FILES['avatar']['type'];

    // proste sprawdzenie typu MIME i rozmiaru
    $dozwoloneTypy = ['image/jpeg', 'image/png'];
    if (!in_array($typ, $dozwoloneTypy, true)) {
        echo '<p style="color:red">Dozwolone są tylko pliki JPG i PNG.</p>';
    } elseif ($rozmiar > 2 * 1024 * 1024) { // 2 MB
        echo '<p style="color:red">Plik jest za duży.</p>';
    } else {
        $folderDocelowy = __DIR__ . '/upload/';
        if (!is_dir($folderDocelowy)) {
            mkdir($folderDocelowy, 0777, true);
        }

        $nowaNazwa = uniqid('avatar_', true) . '-' . basename($nazwaOryginalna);
        $sciezkaDocelowa = $folderDocelowy . $nowaNazwa;

        if (move_uploaded_file($tmpPath, $sciezkaDocelowa)) {
            echo '<p>Plik został zapisany.</p>';
        } else {
            echo '<p style="color:red">Nie udało się zapisać pliku.</p>';
        }
    }
}
?>

W realnej aplikacji taki plik zwykle ląduje w katalogu poza publicznym htdocs, a w bazie danych zapisuje się tylko jego ścieżkę lub nazwę. Dzięki temu możesz później łatwo podpiąć to np. jako avatar użytkownika.

Pierwsze spotkanie z bazą danych – PHP + MySQL w praktyce

Po co ci baza danych, skoro masz już PHP?

PHP bez bazy danych przypomina notes z kartkami, na których co chwilę dopisujesz nowe informacje – prędzej czy później panuje tam chaos. Baza danych to uporządkowana szuflada z przegródkami, w której zapisujesz użytkowników, wpisy blogowe, komentarze, produkty.

Jeśli chcesz mieć stronę z systemem logowania, bloga, który pamięta wpisy sprzed miesięcy, czy prosty sklep – potrzebujesz miejsca, gdzie te dane będą trwale przechowywane. Tym miejscem bardzo często jest MySQL lub jego otwarta wersja MariaDB.

Tworzenie bazy i tabeli w phpMyAdmin – prosty scenariusz

U lokalnego webmastera najczęściej króluje phpMyAdmin – webowy panel do zarządzania bazą. Po uruchomieniu XAMPP‑a zwykle masz go pod adresem http://localhost/phpmyadmin/.

Dla przykładu stwórzmy bazę na mini‑blog:

  1. Wejdź do phpMyAdmin i w zakładce „Bazy danych” utwórz nową bazę, np. blog_mini, ustaw jej zestaw znaków na utf8mb4_general_ci.
  2. Po stworzeniu bazy przejdź do niej i w zakładce „SQL” wklej taki kod:
CREATE TABLE wpisy (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tytul VARCHAR(255) NOT NULL,
    tresc TEXT NOT NULL,
    data_dodania DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Tabela wpisy będzie przechowywała tytuł, treść i datę dodania. Gdybyś miał robić to ręcznie w plikach tekstowych, każde dodanie wpisu to byłaby dłubanina. W bazie danych to po prostu nowe wiersze w tabeli.

Łączenie się z MySQL w PHP – PDO jako złoty standard

Starsze poradniki pokazują funkcje mysqli_*. W 2024 roku lepiej od razu przyzwyczaić się do PDO (PHP Data Objects). Działa z różnymi bazami, ma wbudowane przygotowane zapytania i sensowną obsługę błędów.

Podstawowe połączenie wygląda tak:

<?php
$dsn = 'mysql:host=localhost;dbname=blog_mini;charset=utf8mb4';
$user = 'root';
$pass = ''; // w XAMPP-ie domyślnie puste

try {
    $pdo = new PDO($dsn, $user, $pass, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    ]);
} catch (PDOException $e) {
    echo 'Błąd połączenia z bazą: ' . htmlspecialchars($e->getMessage());
    exit;
}
?>

Taki fragment warto wydzielić do osobnego pliku (np. db.php) i potem dołączać require 'db.php'; wszędzie tam, gdzie potrzebne jest połączenie z bazą. Unikasz dzięki temu kopiowania tego samego kodu do wielu plików.

Dodawanie danych do bazy – przygotowane zapytania INSERT

Najprostszy scenariusz: formularz „Dodaj wpis”, który zapisuje tytuł i treść do tabeli wpisy. Połączmy to z tym, co już znasz z obsługi formularzy.

<?php
require __DIR__ . '/db.php';

$bledy = [];
$tytul = '';
$tresc = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $tytul = trim($_POST['tytul'] ?? '');
    $tresc = trim($_POST['tresc'] ?? '');

    if ($tytul === '') {
        $bledy[] = 'Podaj tytuł wpisu.';
    }
    if ($tresc === '') {
        $bledy[] = 'Podaj treść wpisu.';
    }

    if (empty($bledy)) {
        $sql = 'INSERT INTO wpisy (tytul, tresc) VALUES (:tytul, :tresc)';
        $stmt = $pdo->prepare($sql);
        $stmt->execute([
            ':tytul' => $tytul,
            ':tresc' => $tresc,
        ]);

        header('Location: lista-wpisow.php');
        exit;
    }
}
?>

<!

Najczęściej zadawane pytania (FAQ)

Czy w 2024 roku w ogóle opłaca się uczyć PHP, skoro „wszyscy” mówią o jego końcu?

PHP ma się dobrze, tylko trochę przestało być „modnym hasłem”. Ogromna część sieci – od WordPressa, przez sklepy internetowe, po firmowe panele – nadal działa właśnie na PHP. Firmy wciąż szukają ludzi do utrzymania i rozwijania takich projektów, bo te systemy nie znikną z dnia na dzień.

Nowe wersje PHP (7 i 8) mocno przyspieszyły działanie aplikacji, uporządkowały język i dodały nowoczesne funkcje. Uczysz się więc technologii, która nadal jest rozwijana i będzie wspierana przez lata, a nie muzealnego eksponatu.

Co powinienem umieć przed rozpoczęciem nauki PHP jako początkujący webmaster?

Na start przydaje się solidna podstawa z HTML i CSS. Chodzi o rzeczy typu: zbudowanie struktury strony, ogarnięcie nagłówków, akapitów, list, prostych tabel oraz formularzy (form, input, textarea, select, przyciski). Do tego podstawy CSS – klasy, identyfikatory i prosty układ strony.

Dobrze też rozumieć, jak działa przeglądarka i serwer: przeglądarka wysyła żądanie, serwer uruchamia skrypt PHP, ten generuje HTML i odsyła odpowiedź. Jeśli potrafisz swobodnie zrobić prosty formularz kontaktowy w czystym HTML/CSS, przejście do jego obsługi w PHP będzie dużo łatwiejsze.

Ile czasu potrzebuję, żeby zacząć coś sensownego robić w PHP?

Przy regularnej nauce 5–8 godzin tygodniowo po około 3–6 miesiącach jesteś w stanie robić już całkiem praktyczne rzeczy. To nie jest poziom „senior”, ale zdecydowanie „daję radę w realnych, prostych projektach”.

Po tym czasie zwykle potrafisz skonfigurować lokalny serwer i prosty hosting, obsłużyć formularze (zapisywać dane, wysyłać maile), ogarnąć podstawy programowania obiektowego i modyfikować nieskomplikowane wtyczki czy motywy WordPressa. Dla wielu początkujących webmasterów to już otwiera drzwi do pierwszych płatnych zleceń.

Kiedy HTML, CSS i JavaScript przestają wystarczać i warto dołożyć PHP?

Dopóki robisz statyczne wizytówki firmowe, proste landing page’e i kilka podstron „o nas”, front‑end w zupełności wystarcza. Problem zaczyna się, gdy klient chce logowanie, panel użytkownika, edycję treści bez grzebania w plikach, listę produktów z bazy danych albo integrację z płatnościami.

JavaScript w przeglądarce nie przechowa bezpiecznie haseł ani nie ukryje kluczy API. Tu wchodzi PHP – obsługuje formularze po stronie serwera, rozmawia z bazą danych, integruje z zewnętrznymi usługami i generuje dynamiczne strony „w locie”. Innymi słowy, pomaga przejść od „ładnej ulotki” do żywej aplikacji.

Jakie realne problemy klientów mogę rozwiązać, znając podstawy PHP?

Nawet na dość początkującym poziomie możesz ogarnąć sporo codziennych zadań, z którymi klienci przychodzą do webmastera. Typowe przykłady to: obsługa formularza kontaktowego, zapisy na newsletter, proste logowanie i rejestracja użytkowników czy wysyłka maili z powiadomieniami.

PHP pozwoli ci też zapisywać dane do bazy (np. zapytania ofertowe, zamówienia, opinie), zbudować mały panel administracyjny do edycji treści bez pełnego WordPressa oraz połączyć stronę z zewnętrznym API – na przykład bramką płatności albo systemem do wysyłki newsletterów. Dzięki temu nie musisz każdemu klientowi wciskać tego samego gotowego rozwiązania.

Czy jako początkujący webmaster muszę od razu uczyć się frameworków typu Laravel lub Symfony?

Na samym początku nie ma takiej potrzeby. Lepiej najpierw zrozumieć „goły” PHP: zmienne, pętle, instrukcje warunkowe, obsługę formularzy, sesje, proste połączenia z bazą danych. To jak nauczenie się jazdy samochodem zanim wsiądziesz do zaawansowanej ciężarówki.

Kiedy już poczujesz się swobodnie z podstawami i zrozumiesz, jak działa aplikacja webowa od środka, wejście w Laravel czy Symfony będzie znacznie mniej bolesne. Framework przestanie być „magiczna czarną skrzynką”, a stanie się wygodnym zestawem narzędzi, który przyspiesza pracę przy większych projektach.

Czy do pierwszych projektów w PHP potrzebuję drogiego serwera lub Dockera?

Nie. Jedna z zalet PHP jest taka, że działa praktycznie na każdym zwykłym hostingu współdzielonym. Na początek w zupełności wystarczy tani hosting z obsługą PHP i MySQL – dokładnie taki, jaki kupują małe firmy pod swoje strony.

Do nauki możesz też użyć lokalnego serwera (np. XAMPP, Laragon, MAMP). Instalujesz, wrzucasz pliki do odpowiedniego katalogu, uruchamiasz przeglądarkę i już widzisz efekty. Docker i własny serwer VPS przydają się później, gdy projekty robią się większe i chcesz mieć pełną kontrolę nad środowiskiem.

Bibliografia i źródła

  • PHP Manual. The PHP Group – Oficjalna dokumentacja języka PHP, funkcje, zmiany w PHP 7 i 8
  • PHP 8: A New Version of PHP. JetBrains (2021) – Omówienie nowości i zmian wydajnościowych w PHP 8
  • Usage Statistics of Content Management Systems. W3Techs – Statystyki udziału CMS-ów, w tym WordPressa, w sieci