Lekcja 6 – Praca z formularzami HTML w PHP

Praca z formularzami HTML w PHP – wprowadzenie

Formularze HTML umożliwiają użytkownikom wprowadzanie danych, które mogą być przetwarzane na serwerze przez PHP. Formularze mogą zawierać różne elementy, takie jak pola tekstowe, przyciski, pola wyboru, listy rozwijane czy załączniki plików. W tej lekcji dowiesz się, jak odbierać i przetwarzać dane z formularzy w PHP, używając metod GET i POST, a także jak obsługiwać różne typy pól formularza.

Tworzenie formularza HTML

Na początku stwórzmy prosty formularz HTML z podstawowymi polami, które będziemy przetwarzać za pomocą PHP:

<form action="przetworz.php" method="post">
  Imię: <input type="text" name="imie"><br>
  Wiek: <input type="number" name="wiek"><br>
  Płeć: 
  <input type="radio" name="plec" value="mężczyzna"> Mężczyzna
  <input type="radio" name="plec" value="kobieta"> Kobieta<br>
  Zainteresowania:
  <input type="checkbox" name="zainteresowania[]" value="sport"> Sport
  <input type="checkbox" name="zainteresowania[]" value="muzyka"> Muzyka
  <input type="checkbox" name="zainteresowania[]" value="film"> Film<br>
  <input type="submit" value="Wyślij">
</form>

Wyjaśnienie:

  • input type="radio": Umożliwia użytkownikowi wybór jednej opcji z kilku dostępnych.
  • input type="checkbox": Umożliwia wybór wielu opcji.
  • zainteresowania[]: Tablica, w której PHP zapisuje wszystkie wybrane wartości checkboxów.

Odbieranie danych z formularza

Dane z formularza mogą być odebrane przy użyciu superglobalnych tablic PHP: $_POST (dla metody POST) i $_GET (dla metody GET). Poniżej przedstawiamy przykład, jak przetwarzać dane przesłane formularzem:

<?php
  if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $imie = $_POST['imie'];
    $wiek = $_POST['wiek'];
    $plec = $_POST['plec'];
    $zainteresowania = $_POST['zainteresowania'];

    echo "Cześć, " . htmlspecialchars($imie) . "!<br>";
    echo "Masz " . htmlspecialchars($wiek) . " lat.<br>";
    echo "Jesteś " . htmlspecialchars($plec) . ".<br>";
    
    if (!empty($zainteresowania)) {
      echo "Twoje zainteresowania to: " . implode(", ", $zainteresowania);
    } else {
      echo "Nie wybrano żadnych zainteresowań.";
    }
  }
?>

Wynik:

Cześć, Jan!
Masz 25 lat.
Jesteś mężczyzną.
Twoje zainteresowania to: Sport, Film

Obsługa plików w formularzach

Formularze mogą również służyć do przesyłania plików na serwer. Aby to zrobić, musisz ustawić atrybut enctype="multipart/form-data" w tagu <form> i dodać pole typu file.

Przykład formularza do przesyłania plików:

<form action="upload.php" method="post" enctype="multipart/form-data">
  Wybierz plik: <input type="file" name="plik"><br>
  <input type="submit" value="Wyślij">
</form>

Odbieranie i przetwarzanie plików w PHP

Przesyłane pliki są dostępne w superglobalnej tablicy $_FILES. Przykład przetwarzania przesłanego pliku:

<?php
  if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $plik = $_FILES['plik'];

    // Sprawdzanie, czy plik został przesłany bez błędów
    if ($plik['error'] === UPLOAD_ERR_OK) {
      $nazwaPliku = basename($plik['name']);
      $sciezkaDocelowa = "uploads/" . $nazwaPliku;

      // Przenoszenie pliku z tymczasowego katalogu do docelowego
      if (move_uploaded_file($plik['tmp_name'], $sciezkaDocelowa)) {
        echo "Plik został przesłany: " . htmlspecialchars($nazwaPliku);
      } else {
        echo "Wystąpił błąd podczas przesyłania pliku.";
      }
    } else {
      echo "Wystąpił błąd: " . $plik['error'];
    }
  }
?>

W powyższym przykładzie, funkcja move_uploaded_file() przenosi przesłany plik z katalogu tymczasowego do docelowego. Aby przesyłanie plików działało poprawnie, należy upewnić się, że katalog docelowy ma odpowiednie uprawnienia do zapisu.

Walidacja danych formularza

Walidacja danych jest kluczowa, aby upewnić się, że dane wprowadzone przez użytkownika są poprawne, zanim zostaną przetworzone na serwerze. PHP umożliwia walidację danych na różne sposoby.

Przykład walidacji:

<?php
  if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (empty($_POST['imie'])) {
      echo "Pole 'Imię' jest wymagane.<br>";
    } else {
      $imie = htmlspecialchars($_POST['imie']);
    }

    if (!is_numeric($_POST['wiek'])) {
      echo "Wiek musi być liczbą.<br>";
    } else {
      $wiek = (int) $_POST['wiek'];
    }

    if (isset($imie) && isset($wiek)) {
      echo "Cześć, " . $imie . "! Masz " . $wiek . " lat.";
    }
  }
?>

Powyższy kod sprawdza, czy pole “Imię” nie jest puste, a pole “Wiek” zawiera wartość liczbową.

Bezpieczeństwo danych z formularzy

Bezpieczne przetwarzanie danych z formularzy jest bardzo ważne, ponieważ dane te mogą być potencjalnie niebezpieczne, jeśli nie zostaną odpowiednio zabezpieczone. Oto kilka podstawowych zasad bezpieczeństwa:

  1. Używaj htmlspecialchars(): Funkcja ta zapobiega atakom XSS, konwertując znaki specjalne HTML na ich odpowiedniki.
  2. Waliduj dane: Upewnij się, że dane wprowadzone przez użytkownika są odpowiednie (np. sprawdź, czy wiek to liczba).
  3. Sanityzuj dane: Oczyść dane przed ich zapisaniem lub przetwarzaniem (np. usuwanie niepotrzebnych białych znaków, specjalnych znaków).

Przykład zabezpieczenia danych:

<?php
  if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $imie = htmlspecialchars(trim($_POST['imie']));
    $wiek = filter_var($_POST['wiek'], FILTER_VALIDATE_INT);

    if ($wiek === false) {
      echo "Wiek musi być liczbą.<br>";
    } else {
      echo "Cześć, " . $imie . "! Masz " . $wiek . " lat.";
    }
  }
?>

W tym przykładzie używamy funkcji trim(), aby usunąć niepotrzebne białe znaki, oraz filter_var() z filtrem FILTER_VALIDATE_INT, aby sprawdzić, czy wiek jest liczbą całkowitą.

Różnice między metodami GET a POST

Metoda GET
  • Dane są przesyłane jako część adresu URL, np. http://example.com/form.php?imie=Jan&wiek=25.
  • Używana do zapytań, które nie zmieniają stanu aplikacji (np. wyszukiwania).
  • Dane są widoczne w przeglądarce, co może być problematyczne w przypadku poufnych informacji.
Metoda POST
  • Dane są przesyłane w treści żądania HTTP, a nie w URL.
  • Bezpieczniejsza niż GET, ponieważ dane nie są widoczne w adresie.
  • Preferowana metoda do przesyłania poufnych danych, takich jak hasła.

Podsumowanie

W tej rozbudowanej wersji lekcji nauczyliśmy się, jak tworzyć i przetwarzać dane z formularzy w PHP, korzystając z metod GET i POST. Omówiliśmy różne typy pól formularza, w tym pola wyboru i przesyłanie plików, a także walidację i bezpieczeństwo danych. Formularze są podstawowym elementem interaktywnych stron internetowych, a PHP oferuje wiele narzędzi do ich obsługi.

Gratulacje! Ukończyłeś lekcję 6.
Przejdź teraz do lekcji 7 >> Obsługa plików w PHP


Spis Treści - darmowy kurs PHP

Wprowadzenie: Instalacja środowiska PHP
Lekcja 1: Podstawy składni PHP
Lekcja 2: Funkcje i instrukcje warunkowe w PHP
Lekcja 3: Pętle w PHP
Lekcja 4: Tablice w PHP
Lekcja 5: Dodatkowe podstawy funkcji w PHP
Lekcja 6: Praca z formularzami HTML w PHP
Lekcja 7: Obsługa plików w PHP
Lekcja 8: Sesje i ciasteczka w PHP
Lekcja 9: Podstawy operacji na bazach danych MySQL z PHP
Lekcja 10: Prepared Statements w PHP i bezpieczeństwo aplikacji
Lekcja 11: Zarządzanie użytkownikami – rejestracja, logowanie i autoryzacja w PHP
Lekcja 12: Wzorce projektowe w PHP – wprowadzenie do wzorca MVC
Lekcja 13: Zaawansowane techniki pracy z bazami danych w PHP
Lekcja 14: Testowanie jednostkowe w PHP z PHPUnit
Lekcja 15: Tworzenie i korzystanie z API RESTful w PHP
Lekcja 16: Obsługa plików JSON i XML w PHP

Dodatki
- Spis najważniejszych funkcji PHP