Obsługa formularzy HTML w języku PHP

Wprowadzenie do formularzy HTML i PHP

Formularze HTML umożliwiają interakcję użytkownika z aplikacją webową – pozwalają na wprowadzenie danych (np. tekstu, wyboru opcji) i przesłanie ich na serwer. PHP, jako skrypt po stronie serwera, potrafi odbierać dane z formularzy, przetwarzać je i generować odpowiedź (np. wyświetlić wyniki lub komunikaty). Proces zwykle wygląda następująco:

  • Formularz HTML zdefiniowany w kodzie strony (za pomocą elementu <form>) zawiera pola input (np. pole tekstowe, checkbox, itp.) oraz przycisk submit do wysłania danych.
  • Gdy użytkownik wypełni formularz i wyśle go (klikając przycisk Wyślij), przeglądarka tworzy żądanie HTTP do serwera. Dane z formularza są kodowane i dołączane do tego żądania (w URL lub w treści żądania – zależnie od metody).
  • Na serwerze skrypt PHP (określony przez atrybut action formularza) odbiera to żądanie. PHP udostępnia superglobalne zmienne (takie jak $_GET i $_POST), przez które możemy odczytać przesłane wartości pól formularza.
  • Skrypt PHP może następnie wykonać różne operacje na otrzymanych danych: np. walidację (sprawdzenie poprawności), obliczenia, zapis do pliku/bazy (tego nie omawiamy tutaj) lub przygotowanie odpowiedzi HTML.
  • Ostatecznie PHP zwraca wynik (HTML wygenerowany dynamicznie) do przeglądarki, która wyświetla go użytkownikowi. Może to być np. strona potwierdzająca przyjęcie danych lub wyświetlająca przesłane informacje.

W dalszych sekcjach omówimy krok po kroku kluczowe zagadnienia związane z obsługą formularzy w PHP: konfigurację formularza HTML, różnice między metodami przesyłania danych (GET i POST), odbieranie danych po stronie PHP, podstawową walidację tych danych oraz obsługę błędów i wyświetlanie komunikatów dla użytkownika. Na końcu zaprezentujemy praktyczne przykłady kodu oraz propozycje ćwiczeń do samodzielnej realizacji.

(Uwaga: Ten wykład skupia się na podstawach obsługi formularzy w PHP dla początkujących i nie obejmuje zagadnień baz danych, takich jak MySQL.)

Metody GET i POST – różnice i zastosowanie

HTML udostępnia dwa główne sposoby wysyłania danych formularza w żądaniu HTTP: metodę GET i POST. Wybór metody odbywa się poprzez atrybut method w tagu <form>. Choć obie metody mogą przesłać te same informacje, różnią się sposobem transmisji i zastosowaniami:

  • Metoda GET:
    • Dane formularza są dołączane do adresu URL jako ciąg zapytania (query string). Przykład: po wysłaniu formularza na index.php z polem name o wartości „Jan”, adres może wyglądać tak:
      index.php?name=Jan
      Wszystkie pary nazwa_pola=wartość stają się częścią URL (po znaku ?, rozdzielone & jeśli jest ich wiele).
    • Zawartość wysyłanych pól jest widoczna w pasku adresu przeglądarki. Umożliwia to m.in. łatwe testowanie i bookmarkowanie (dodanie do zakładek) wyników – np. wyniki wyszukiwania można zapisać jako URL z zapytaniem.
    • Ograniczenia: Nie należy używać GET do przesyłania wrażliwych danych (hasła, dane osobowe), ponieważ adres URL może być zapisywany w historii przeglądarki i logach serwera. Ponadto URL ma ograniczoną długość – w praktyce można przesłać około 1024 do 2048 znaków (zależnie od przeglądarki), co ogranicza wielkość danych.
    • Zastosowania: GET jest zalecany, gdy formularz pobiera dane lub wykonuje operację bez skutków ubocznych na serwerze. Np. formularze wyszukiwarek używają GET – zapytanie nie zmienia danych na serwerze, a wyniki można łatwo udostępnić poprzez URL. Również do nawigacji (filtrowanie, sortowanie) często stosuje się GET.
  • Metoda POST:
    • Dane formularza są wysyłane w ciele (body) żądania HTTP, a nie przez URL. Dzięki temu parametry nie są bezpośrednio widoczne w adresie strony.
    • Brak ograniczeń długości w praktycznym ujęciu – POST pozwala przesłać większe ilości danych (np. długie wpisy tekstowe). Metoda ta jest także używana do przesyłania plików (wymaga dodatkowo ustawienia enctype=”multipart/form-data” w formularzu, co jednak jest poza zakresem tego wykładu).
    • Dane przesłane POSTem nie pojawiają się w historii ani zakładkach – jeśli odświeżysz stronę po wysłaniu POST, przeglądarka ostrzeże przed ponownym wysłaniem formularza (co mogłoby np. spowodować dodanie tego samego wpisu drugi raz).
    • Zastosowania: POST jest zalecany, gdy formularz modyfikuje stan serwera lub przesyła wrażliwe dane. Na przykład formularze logowania (hasła), rejestracji, dodawania komentarzy używają metody POST. Ogólnie, operacje typu „utwórz/zapisz/wyślij” wykorzystują POST, aby dane nie były ujawniane w URL i aby uniknąć ograniczeń długości.

Podsumowanie: Wybór metody jest ważny. GET nadaje się do zapytań, filtrów i wszelkich działań „czytających”, natomiast POST do działań „zmieniających” lub przesyłania danych, których nie chcemy ujawniać. W kodzie PHP odpowiednie superglobalne tablice ($_GET lub $_POST) pozwalają odczytać dane – należy ich używać zależnie od wybranej metody (nie można odebrać danych POST przez $_GET i vice versa).

Przykład definicji formularza z określeniem metody:

 <form action="przetwarzaj.php" method="GET">

     <!-- pola formularza tutaj -->

     <input type="text" name="imie">

     <input type="submit" value="Wyślij">

 </form>

W powyższym kodzie dane będą wysłane metodą GET do skryptu przetwarzaj.php. Zmieniając method=”GET” na method=”POST”, prześlemy dane metodą POST. W dalszej części zobaczymy, jak te dane odebrać po stronie PHP.

Odbieranie danych z formularza w PHP

Po wysłaniu formularza, skrypt PHP wskazany w atrybucie action formularza zostaje wywołany. W PHP do dostępu do przesłanych danych używamy superglobalnych tablic asocjacyjnych: głównie $_GET i $_POST. Są to zmienne typu tablica dostępne w każdym miejscu skryptu, zawierające pary klucz-wartość odpowiadające nazwom pól formularza i ich zawartości.

Jak to działa? Jeśli w formularzu mamy pole <input type=”text” name=”imie”> i użytkownik wpisał „Jan”, to po wysłaniu:

  • Jeżeli formularz użył metody GET, PHP umieści tę wartość pod kluczem „imie” w tablicy $_GET. Czyli $_GET[„imie”] zwróci string „Jan”.
  • Jeżeli formularz użył metody POST, analogicznie wartość będzie dostępna jako $_POST[„imie”].

Przykładowo, wyobraźmy sobie formularz HTML wysyłający imię i adres e-mail metodą POST do skryptu wynik.php. Kod HTML formularza (plik formularz.html lub .php) mógłby wyglądać tak:

 <form action="wynik.php" method="POST">

    Imię: <input type="text" name="imie"><br>

    E-mail: <input type="email" name="email"><br>

    <input type="submit" value="Wyślij">

 </form>

Po wciśnięciu „Wyślij” przeglądarka wywoła wynik.php i przekaże dane. W pliku wynik.php możemy odebrać i wyświetlić te dane następująco:

<?php

// wynik.php - skrypt odbierający dane z formularza

$imie = $_POST["imie"];    // pobranie wartości pola 'imie'

$email = $_POST["email"];  // pobranie wartości pola 'email'

// Wyświetlenie odebranych danych

echo "<h3>Witaj, $imie!</h3>";

echo "<p>Twój podany email to: $email</p>";

?>

Jeśli formularz zostałby zmieniony na method=”GET”, w powyższym skrypcie wystarczyłoby użyć $_GET zamiast $_POST. Poza tym odbiór danych przebiega tak samo.

Ważne uwagi:

  • Zanim użyjemy wartości z $_POST czy $_GET, dobrze jest sprawdzić, czy dane pole zostało przesłane. Można to zrobić za pomocą funkcji isset(). Np. isset($_POST[„imie”]) sprawdzi, czy klucz „imie” istnieje (formularz został wysłany i to pole ma jakąś wartość, nawet pusty ciąg).
  • PHP oferuje też tablicę $_REQUEST, która zawiera dane zarówno z GET, jak i POST (oraz ciasteczek). Jednak dla przejrzystości i bezpieczeństwa lepiej korzystać z konkretnych $_GET lub $_POST w zależności od potrzeb.
  • Wszystkie wartości z formularza trafiają jako łańcuchy tekstowe (string). Nawet jeśli pole input jest typu number, w PHP otrzymamy wartość jako string i np. aby wykonać operacje arytmetyczne, trzeba ją przekonwertować (np. (int) $_POST[„wiek”] dla liczby całkowitej).
  • Nazwy pól formularza (atrybuty name) rozróżniają wielkość liter po stronie PHP (to klucze tablicy). Np. $_POST[„Imie”] to co innego niż $_POST[„imie”]. W HTML atrybut name również powinien być unikalny w ramach formularza dla każdego pola, aby dane były poprawnie odebrane.

Podstawowa walidacja danych formularza

Walidacja danych to proces sprawdzania, czy dane wprowadzone przez użytkownika spełniają oczekiwane kryteria (np. czy wymagane pola nie są puste, czy email ma poprawny format). Walidacja jest kluczowa, ponieważ chroni naszą aplikację przed nieprawidłowymi danymi lub nawet złośliwymi wpisami.

Podstawowe kroki walidacji, które omówimy:

  1. Sprawdzenie wymaganych pól – czy użytkownik wypełnił wszystkie pola, które muszą mieć wartość.
  2. Sprawdzenie formatu danych – np. czy w polu e-mail rzeczywiście jest adres e-mail, a nie ciąg znaków bez @, itp.
  3. Inne proste reguły – np. czy liczba mieści się w oczekiwanym zakresie, czy tekst nie przekracza określonej długości, czy w polu imię są tylko litery, itd. (Dla początkujących skupimy się na kilku podstawowych przykładach).

Walidację można wykonywać po stronie klienta (w przeglądarce, np. za pomocą HTML5 lub JavaScript) i po stronie serwera (w PHP). Należy pamiętać, że walidacja po stronie klienta jest dodatkowa – zawsze musimy sprawdzić dane w PHP, ponieważ użytkownik może ominąć lub wyłączyć skrypty w przeglądarce. Poniżej skupiamy się na walidacji w PHP (serwerowej).

Załóżmy, że mamy formularz z polami: imie, email oraz wiadomość. Chcemy sprawdzić, czy imie i email nie są puste, a także czy email ma poprawny format. Przykładowe podejście:

  • Sprawdzanie, czy pole jest puste: Możemy użyć funkcji empty() lub sprawdzić, czy po trim (usunięciu białych znaków) długość stringa > 0.
    Przykład:
 if (empty($_POST["imie"])) {

    // imie jest puste

 }

lub bardziej precyzyjnie:

 $imie = trim($_POST["imie"]);

 if ($imie == "") {

    // imie jest puste lub zawierało tylko spacje

 }
  • Walidacja adresu e-mail: Najprostszym sposobem jest użycie wbudowanego filtra FILTER_VALIDATE_EMAIL. Można go użyć z funkcją filter_var().
    Przykład:
 $email = $_POST["email"];

 if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {

    // email jest niepoprawny

 }

Powyższa funkcja zwróci false, jeśli $email nie zawiera poprawnie sformatowanego adresu (czyli musi mieć przynajmniej znak @ i kropkę po nim, bez niedozwolonych znaków).

  • Inne walidacje: Możemy sprawdzić długość tekstu (np. strlen($pole) > 255 aby ograniczyć długość wpisu), czy w imieniu są tylko litery (np. używając wyrażenia regularnego preg_match(’/^[A-Za-z\s]+$/’, $imie)), czy liczba jest rzeczywiście liczbą (is_numeric($wiek)). Na poziomie podstawowym często wystarczy sprawdzenie niepustych pól i kluczowych formatów (email, ewentualnie liczby).

Walidację przeprowadzamy po odebraniu danych z formularza (czyli np. po sprawdzeniu $_SERVER[„REQUEST_METHOD”] == „POST” lub po kliknięciu submit). Najczęściej tworzy się zestaw zmiennych na błędy (np. $error_imie, $error_email) i jeśli kryterium nie jest spełnione, przypisuje się tym zmiennym komunikat o błędzie. Gdy wszystkie dane przejdą walidację, można bezpiecznie je wykorzystać (np. wyświetlić lub przetworzyć dalej).

Przykład fragmentu PHP walidującego dwa pola z formularza:

 $errors = [];  // tablica na komunikaty błędów

 // Sprawdzenie pola "imie"

 $imie = trim($_POST["imie"] ?? "");

 if ($imie === "") {

     $errors["imie"] = "Pole imię nie może być puste.";

 }

 // Sprawdzenie pola "email"

 $email = trim($_POST["email"] ?? "");

 if ($email === "") {

     $errors["email"] = "Pole e-mail jest wymagane.";

 } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {

     $errors["email"] = "Nieprawidłowy format adresu e-mail.";

 }

//... (ewentualnie kolejne pola)

W powyższym kodzie użyto operatora ?? aby w razie braku klucza w tablicy $_POST użyć domyślnej pustej wartości (zapobiega to błędom Notice). Zmienna $errors gromadzi komunikaty – kluczami są nazwy pól, co ułatwia późniejsze odniesienie się do konkretnych błędów.

Dlaczego walidacja jest ważna?
Poza poprawnością danych dla logiki aplikacji, walidacja chroni również przed nadużyciami. Np. wpisanie tagów HTML lub skryptów <script> w polu formularza mogłoby bez walidacji (lub filtrowania) skutkować wstrzyknięciem niepożądanego kodu w wyświetlanej stronie (tzw. atak XSS – Cross-Site Scripting). Dlatego często podczas walidacji lub przed wyświetleniem danych używa się funkcji PHP takich jak htmlspecialchars() do zamiany < > i innych specjalnych znaków na encje HTML (żeby ewentualny wpis <script> został wyświetlony jako ciąg znaków, a nie wykonany). Na przykład:

echo htmlspecialchars($userInput);

sprawi, że nawet jeśli $userInput zawiera <b>tekst</b> lub <script>…, to na stronie zobaczymy bezpiecznie &lt;b&gt;tekst&lt;/b&gt; (czyli dosłowny napis, bez pogrubienia czy wykonania skryptu).

Podsumowując, zawsze ufaj, ale sprawdzaj dane od użytkownika. W następnym rozdziale omówimy, jak informować użytkownika o ewentualnych błędach walidacji.

Obsługa błędów i komunikaty dla użytkownika

Gdy skrypt PHP wykryje błędne lub brakujące dane w formularzu, powinien poinformować o tym użytkownika w czytelny sposób, aby ten mógł poprawić swoje wpisy. Obsługa błędów formularza zazwyczaj obejmuje:

  • Zatrzymanie dalszego przetwarzania niepoprawnych danych – np. nie wysyłamy formularza do bazy ani nie wykonujemy akcji, jeśli wykryto błędy.
  • Przechowanie komunikatów o błędach – zwykle w zmiennych lub tablicy (jak $errors powyżej), tak aby można je było wyświetlić wraz z formularzem.
  • Ponowne wyświetlenie formularza z informacją o błędach – użytkownik powinien zobaczyć, które pola wymagają poprawy, i móc je poprawić bez przepisywania wszystkiego od zera. Dlatego często stosuje się mechanizm „sticky form”, czyli wypełnianie formularza ponownie poprzednio wpisanymi wartościami (żeby np. imię pozostało w polu, jeśli błąd dotyczył innego pola).

Typowy przepływ obsługi błędów w jednym skrypcie PHP:

  1. Sprawdzenie, czy formularz został wysłany. Często używamy:
if ($_SERVER["REQUEST_METHOD"] == "POST") {

    // ... przetwarzaj formularz

}

lub sprawdzamy isset($_POST[’nazwa_pola’]) czy np. isset($_POST[’submit’]) (jeśli przycisk submit ma name).

  1. Walidacja danych (jak opisano wyżej). Wykrywamy błędy i zapisujemy komunikaty.
  2. Jeśli są błędy: wyświetlamy ponownie formularz z komunikatami i zachowanymi poprzednimi wartościami pól.
    Jeśli brak błędów: możemy bezpiecznie skorzystać z danych – np. wyświetlić podsumowanie („Dziękujemy za wysłanie formularza, oto Twoje dane…”) lub wykonać inną akcję (wysłać email z informacją, zapisać do pliku itp.).
  3. Wyświetlanie komunikatów błędów: Można to zrobić na różne sposoby:
    • W formie listy nad formularzem (wypisując wszystkie komunikaty).
    • Przy każdym polu osobno – np. obok pola „email” czerwoną czcionką tekst „Wprowadź poprawny email”. To wymaga, aby w kodzie HTML formularza umieścić np. <?php echo $errors[’email’] ?? ” ?> w odpowiednim miejscu.
    • Wyskakujące alerty JS lub inne mechanizmy front-end (to jednak wykracza poza czysty PHP i wymaga JS; na poziomie podstaw wystarczą komunikaty tekstowe na stronie).

Poniżej znajduje się fragment kodu PHP ilustrujący obsługę błędów i ponowne wyświetlanie formularza. Łączymy tu razem walidację i generowanie HTML z formularzem w jednym pliku PHP:

 <?php

 // Inicjalizacja zmiennych dla wartości pól i błędów

 $imie = $email = $wiadomosc = "";

 $errors = ["imie" => "", "email" => "", "wiadomosc" => ""];

 // Sprawdź, czy formularz został wysłany metodą POST

 if ($_SERVER["REQUEST_METHOD"] == "POST") {

     // Walidacja pola "imie"
 
    $imie = trim($_POST["imie"] ?? "");

    if ($imie === "") {

        $errors["imie"] = "Pole imię jest wymagane.";

    }

    // Walidacja pola "email"

    $email = trim($_POST["email"] ?? "");

    if ($email === "") {

        $errors["email"] = "Pole e-mail jest wymagane.";

    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {

        $errors["email"] = "Nieprawidłowy format adresu e-mail.";

    }

    // Walidacja pola "wiadomosc"

    $wiadomosc = trim($_POST["wiadomosc"] ?? "");

    if ($wiadomosc === "") {

        $errors["wiadomosc"] = "Pole wiadomość nie może być puste.";

    }

    // Sprawdź, czy nie ma żadnych błędów

    $czy_blad = false;

    foreach ($errors as $err) {

        if ($err != "") {

            $czy_blad = true;

            break;

        }

    }

    if (!$czy_blad) {

        // Brak błędów – tutaj moglibyśmy np. wysłać dane do bazy lub maila.

        // W tym przykładzie po prostu wyświetlimy podsumowanie.

        echo "<h3>Dziękujemy za przesłanie formularza!</h3>";

        echo "<p><strong>Imię:</strong> " . htmlspecialchars($imie) . "</p>";

        echo "<p><strong>E-mail:</strong> " . htmlspecialchars($email) . "</p>";

        echo "<p><strong>Wiadomość:</strong> " . nl2br(htmlspecialchars($wiadomosc)) . "</p>";

        // Zakończ dalsze wykonywanie skryptu, aby nie wyświetlać ponownie formularza

        exit;

    }

 }

 ?>

 <!-- Formularz HTML wyświetlany zarówno na początku, jak i w razie błędów -->

 <form method="POST" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>">

    <label>Imię:

       <input type="text" name="imie" value="<?php echo htmlspecialchars($imie); ?>">

       <span style="color:red;"><?php echo $errors["imie"]; ?></span>

    </label><br><br>

    <label>E-mail:

       <input type="text" name="email" value="<?php echo htmlspecialchars($email); ?>">

       <span style="color:red;"><?php echo $errors["email"]; ?></span>

    </label><br><br>

    <label>Wiadomość: <br>

       <textarea name="wiadomosc" rows="5" cols="40">
             <?php echo htmlspecialchars($wiadomosc); ?>
       </textarea>

       <span style="color:red;"><?php echo $errors["wiadomosc"]; ?></span>

    </label><br><br>

    <input type="submit" value="Wyślij">

 </form>

W powyższym kodzie warto zwrócić uwagę na kilka rzeczy:

  • Użyliśmy $_SERVER[„PHP_SELF”] w atrybucie action formularza, opakowane w htmlspecialchars(). To sprawia, że formularz wysyła dane do samego siebie (do bieżącego skryptu PHP). Dzięki temu możemy w jednym pliku obsłużyć zarówno wyświetlanie formularza, jak i przetwarzanie danych po wysłaniu. htmlspecialchars() zabezpiecza ewentualne specjalne znaki (to zabezpieczenie przed nietypowymi sytuacjami, gdyby nazwa skryptu zawierała np. znak &).
  • Po przetworzeniu formularza i wykryciu braku błędów, wykorzystaliśmy exit; aby zakończyć wykonywanie skryptu po wyświetleniu podziękowania i podsumowania. Gdyby tego nie zrobić, skrypt kontynuowałby i wyświetlił ponownie formularz pod podziękowaniem (co w tym przypadku nie jest pożądane).
  • Funkcja nl2br() została użyta przy wyświetleniu wiadomości – zamienia ona znaki nowej linii na <br>, aby np. tekst wielolinijkowy wpisany w <textarea> wyświetlił się z zachowaniem nowych linii.
  • Wszystkie wyświetlane dane pochodzące od użytkownika przepuszczamy przez htmlspecialchars(). Zapobiega to potencjalnemu wstrzyknięciu kodu HTML/JS. Jest to dobra praktyka przy wyświetlaniu danych od użytkownika (walidacja to osobny etap – tutaj dbamy o bezpieczne prezentowanie).
  • Błędy przypisaliśmy do <span style=”color:red;”> obok odpowiednich pól, aby użytkownik widział konkretnie, co należy poprawić.

Powyższy przykład pokazuje, jak może wyglądać kompleksowa obsługa formularza z walidacją i komunikatami o błędach w jednym pliku PHP. Alternatywnie, można podzielić to na dwa pliki (jeden z formularzem HTML, drugi z logiką PHP i wyświetlaniem wyników), ale wtedy trudniej jest zrobić „powrót” do formularza z zachowaniem już wpisanych danych.

Przykłady praktyczne

W tej sekcji zademonstrujemy dwie pełne implementacje obsługi formularza w PHP:

  1. Prosty formularz i wyświetlenie danych (bez walidacji) – pokazuje mechanizm przesłania i odbioru danych przy użyciu osobnych plików dla formularza i skryptu PHP.
  2. Formularz z walidacją i obsługą błędów (jeden plik) – bardziej rozbudowany przykład ilustrujący wprowadzone wyżej zasady walidacji i komunikatów, w ramach jednego skryptu.

Przykład 1: Prosty formularz (GET/POST) i odbiór danych

Opis: Utworzymy prosty formularz z dwoma polami: imię i ulubiony kolor. Użytkownik wypełnia pola i wysyła formularz. Skrypt PHP odbiera dane i wyświetla komunikat powitalny. Nie będziemy tutaj wykonywać walidacji – zakładamy, że użytkownik wpisał dane.

Plik HTML z formularzem (formularz.html):

 <!DOCTYPE html>

 <html lang="pl">

 <head>

   <meta charset="UTF-8">

   <title>Formularz powitalny</title>

 </head>

 <body>

 <h2>Witaj! Wypełnij formularz:</h2>

 <form action="odbierz.php" method="POST">

     <label>Imię: <input type="text" name="imie"></label><br><br>

     <label>Ulubiony kolor: <input type="text" name="kolor"></label><br><br>

     <input type="submit" value="Wyślij">

 </form>

 </body>

 </html>

Kilka wyjaśnień do powyższego kodu:

  • Atrybut action=”odbierz.php” oznacza, że dane zostaną wysłane do skryptu o nazwie odbierz.php (musimy go napisać za moment). Można tu podać również pełny URL lub ścieżkę do skryptu obsługi.
  • method=”POST” wskazuje, że używamy metody POST (dzięki czemu dane nie pojawią się w adresie URL).
  • Każde pole input ma atrybut name – odpowiednio „imie” i „kolor”. Te nazwy posłużą jako klucze w tablicy $_POST po przesłaniu.
  • Używamy prostych pól tekstowych (type=”text”). Ewentualnie dla koloru można by użyć <input type=”color”> lub listy wyboru, ale dla prostoty pozostajemy przy tekście.

Plik PHP obsługujący formularz (odbierz.php):

 <?php

 // Upewnijmy się, że skrypt został wywołany metodą POST

 if ($_SERVER["REQUEST_METHOD"] == "POST") {

     // Pobranie danych z tablicy $_POST

     $imie = $_POST["imie"] ?? "";

     $kolor = $_POST["kolor"] ?? "";

     // Opcjonalnie: proste "walidacje" - w tym przykładzie tylko sprawdzimy czy nie są puste

     if ($imie == "" || $kolor == "") {

         echo "Nie podano imienia lub koloru. Wróć i uzupełnij formularz.";

         exit; // zakończ, nie pokazuj dalszej części, jeśli brak danych

     }

     // Bezpieczne wyświetlenie wprowadzonych danych

     $imie_clean = htmlspecialchars($imie);

     $kolor_clean = htmlspecialchars($kolor);

     echo "<h2>Witaj, $imie_clean!</h2>";

     echo "<p>Twój ulubiony kolor to: <span style=\"color:$kolor_clean;\">$kolor_clean</span>.</p>";

} else {

    // Jeśli ten skrypt został wywołany inaczej niż POST (np. bezpośrednie wejście), można przekierować lub wyświetlić komunikat

    echo "Formularz nie został poprawnie wysłany.";

 }

 ?>

Co robi powyższy skrypt:

  • Sprawdza, czy metoda żądania to POST (jeśli ktoś spróbuje wejść na odbierz.php bezpośrednio przez URL, komunikat informuje, że formularz nie został wysłany).
  • Odczytuje wartości imie i kolor z $_POST. Użyto operatora ?? aby w razie braku ustawić pusty string (to zabezpiecza przed sytuacją, że klucz nie istnieje).
  • Proste sprawdzenie: jeśli któreś pole jest puste, wypisujemy komunikat o braku danych i przerywamy działanie (exit).
  • Jeśli dane są dostępne, używamy htmlspecialchars do zneutralizowania ewentualnych tagów HTML wprowadzonych przez użytkownika (np. jeśli ktoś wpisałby „<script>…</script>” jako kolor, to bez tego zabezpieczenia mógłby nam popsuć stronę).
  • Wyświetlamy powitanie i kolor. Użyliśmy span z parametrem style=”color:$kolor_clean;” – to spowoduje, że jeżeli użytkownik wpisał np. „czerwony” to spróbujemy ustawić kolor tekstu na „czerwony”. W większości przeglądarek nazwy kolorów po angielsku działają (np. „red”, „blue”), natomiast wpisanie „czerwony” nie zmieni koloru tekstu (bo CSS nie zna tej nazwy). To tylko przykład – realnie, żeby to działało dla dowolnego koloru, potrzebna by była inna metoda (np. predefiniowana lista lub input typu color). Tu celem jest głównie pokazanie wstawienia wartości w HTML.

Jak to przetestować:
Plik formularz.html otwieramy w przeglądarce (przez serwer, jeśli to .php można też osadzić formularz w .php). Uzupełniamy imię i kolor, wysyłamy. Skrypt odbierz.php powinien wyświetlić powitanie. Np. dla imienia „Jan” i koloru „niebieski” zobaczymy:

Witaj, Jan!

Twój ulubiony kolor to: niebieski.

(Kolor tekstu „niebieski” nie zmieni się, bo CSS nie interpretuje polskiej nazwy koloru – ale gdyby wpisać „blue”, tekst „blue” pojawi się na niebiesko.)

Możesz też zmienić metodę na GET w formularzu i przetestować ponownie. Wtedy zauważysz, że po wysłaniu adres w przeglądarce zmienia się na np. …/odbierz.php?imie=Jan&kolor=niebieski. Skrypt zadziała tak samo (o ile w PHP zmienimy $_POST na $_GET przy odbiorze). To ćwiczenie pomoże zrozumieć różnicę – przy metodzie GET wynik możesz zobaczyć w URL i np. odświeżać stronę bez ponownego ostrzeżenia, natomiast przy POST dane nie pojawiają się w adresie.

Przykład 2: Formularz z walidacją danych i obsługą błędów

Opis: Ten przykład ilustruje kompletne rozwiązanie w jednym pliku PHP: formularz zbiera dane kontaktowe od użytkownika, a skrypt jednocześnie je waliduje i wyświetla odpowiednie komunikaty. Pola formularza: imię (wymagane), e-mail (wymagane, format email), wiadomość (wymagana). Jeśli wszystkie dane są poprawne, wyświetlana jest strona potwierdzająca ich otrzymanie; jeśli nie, formularz pokazuje błędy przy odpowiednich polach.

Skrypt PHP (formularz_kontaktowy.php):

 <?php

 // Inicjalizacja zmiennych dla utrzymania wartości pól i komunikatów błędów

 $imie = $email = $wiadomosc = "";

 $err_imie = $err_email = $err_wiadomosc = "";

 // Sprawdzenie, czy formularz został przesłany

 if ($_SERVER["REQUEST_METHOD"] == "POST") {

    // Pobranie i obróbka danych z formularza

    $imie = trim($_POST["imie"] ?? "");

    $email = trim($_POST["email"] ?? "");

    $wiadomosc = trim($_POST["wiadomosc"] ?? "");

    // Walidacja pola "imie"

    if ($imie === "") {

        $err_imie = "Proszę podać imię.";

    }

    // Walidacja pola "email"

    if ($email === "") {

        $err_email = "Proszę podać adres e-mail.";

    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {

        $err_email = "Adres e-mail jest niepoprawny.";

    }

    // Walidacja pola "wiadomosc"

    if ($wiadomosc === "") {

        $err_wiadomosc = "Proszę wpisać treść wiadomości.";

    }

    // Sprawdzenie czy nie ma błędów

    if ($err_imie === "" && $err_email === "" && $err_wiadomosc === "") {

        // Wszystkie pola poprawnie wypełnione

        echo "<h2>Dziękujemy, $imie!</h2>";

        echo "<p>Twoja wiadomość została wysłana poprawnie. Poniżej przesłane dane:</p>";

        echo "<ul>";

        echo "<li><strong>Imię:</strong> " . htmlspecialchars($imie) . "</li>";

        echo "<li><strong>E-mail:</strong> " . htmlspecialchars($email) . "</li>";

        echo "<li><strong>Wiadomość:</strong> " . nl2br(htmlspecialchars($wiadomosc)) . "</li>";

        echo "</ul>";

        // Zakończenie skryptu, aby nie wyświetlać formularza ponownie

        exit;

    }

}

 ?>

 <!DOCTYPE html>

 <html lang="pl">

 <head>

   <meta charset="UTF-8">

   <title>Formularz kontaktowy</title>

   <style>

     .error { color: red; }

   </style>

 </head>

 <body>

 <h2>Formularz kontaktowy</h2>

 <p>Wypełnij poniższe pola i wyślij wiadomość.</p>

 <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="POST">

    <p>

      <label>Imię:<br>

      <input type="text" name="imie" value="<?php echo htmlspecialchars($imie); ?>">

      <span class="error"><?php echo $err_imie; ?></span>

      </label>

    </p>

    <p>

      <label>E-mail:<br>

      <input type="text" name="email" value="<?php echo htmlspecialchars($email); ?>">

      <span class="error"><?php echo $err_email; ?></span>

      </label>

    </p>

    <p>

      <label>Wiadomość:<br>

      <textarea name="wiadomosc" rows="5" cols="40"><?php echo htmlspecialchars($wiadomosc); ?></textarea>

      <span class="error"><?php echo $err_wiadomosc; ?></span>

      </label>

    </p>

    <p>

      <input type="submit" value="Wyślij">

    </p>

 </form>

 </body>

 </html> 

Co robi ten skrypt:

  • Przed zdefiniowaniem HTML inicjalizujemy zmienne dla przechowania wpisanych wartości ($imie, $email, $wiadomosc) oraz zmienne na błędy ($err_imie, $err_email, $err_wiadomosc). Dzięki temu, nawet jeśli formularz nie został jeszcze wysłany, te zmienne istnieją (puste) i możemy je użyć w HTML (np. value w inputach).
  • Po wykryciu $_SERVER[„REQUEST_METHOD”] == „POST” następuje pobranie danych z formularza (trim() usuwa zbędne spacje na początku/końcu).
  • Walidujemy każde pole, ustawiając komunikat błędu, jeśli nie spełnia warunków:
    • Imię: musi być podane.
    • Email: musi być podany i poprawny format (filter_var).
    • Wiadomość: musi być podana (nie pusta).
  • Jeśli po walidacji wszystkie zmienne błędów ($err_…) są wciąż puste, to znaczy brak błędów. Wtedy wyświetlamy podziękowanie i listę przesłanych danych, po czym wywołujemy exit aby nie pokazywać formularza.
  • Jeśli którykolwiek błąd wystąpił, skrypt nie kończy się, więc przechodzi do części HTML poniżej i wyświetla formularz ponownie. W polach formularza jako value/tekst ustawione są wcześniejsze wartości (ze zmiennych $imie, $email, $wiadomosc) – dzięki czemu użytkownik nie musi wpisywać od nowa wszystkiego, tylko poprawia te pola, które są błędne. Komunikaty błędów są wyświetlane w <span class=”error”> obok odpowiednich pól.

Testowanie:
Po otwarciu formularz_kontaktowy.php w przeglądarce (przez serwer PHP) powinniśmy zobaczyć formularz. Scenariusze do wypróbowania:

  • Wysłanie pustego formularza: powinny pojawić się komunikaty przy każdym polu „Proszę podać …”.
  • Wpisanie niepoprawnego email (np. „abc” lub „test@com”): powinien pojawić się błąd przy polu email o niepoprawnym formacie.
  • Poprawne wypełnienie wszystkich pól: powinna pojawić się strona z podziękowaniem i wypisanymi danymi (imię, email, wiadomość z zachowaniem nowych linii). Formularz już się nie wyświetli.
  • Częściowe błędy: np. wypełnić imię i wiadomość, zostawić pusty email – formularz pojawi się ponownie z informacją tylko o brakującym emailu, a pola imię i wiadomość zachowają wpisane wcześniej wartości.