Formularze HTML i Przesyłanie Danych do PHP
Klucz Elementy Formularza
Aby formularz HTML wysłał dane do skryptu PHP, wymagane są dwa kluczowe atrybuty tagu <form>:
-
action: Określa ścieżkę do pliku PHP, który ma przetwarzać dane (np.action="przetworz.php"). -
method: Definiuje metodę przesyłania danych (zazwyczajGETlubPOST). -
Pola: Każde pole formularza (
<input>,<select>,<textarea>) musi mieć atrybutname, który stanie się kluczem w tablicy PHP.
Imię: <input type="text" name="imie" required><br>
Wiek: <input type="number" name="wiek"><br>
<button type="submit">Wyślij</button>
</form>
PHP Odbieranie Danych (Superglobale)
PHP udostępnia specjalne tablice superglobalne, które automatycznie przechowują dane przesłane przez użytkownika.
1. $_POST
Używane, gdy method="POST". Dane są przesyłane w treści żądania HTTP i nie są widoczne w pasku adresu.
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Pobieramy wartość pola 'imie'
$imie = $_POST['imie'];
echo "Witaj, $imie! Twoje dane zostały przesłane bezpiecznie.";
}
?>
2. $_GET
Używane, gdy method="GET" (lub gdy nie podano metody). Dane są dołączane do adresu URL jako ciąg zapytania.
<?php
// Pobieramy wartość parametru 'strona'
$numer_strony = $_GET['strona'];
echo "Wyświetlam stronę numer $numer_strony.";
?>
htmlspecialchars() przed wyświetleniem danych na stronie, aby zapobiec atakom XSS.
Walidacja Sprawdzanie i Filtrowanie
Walidacja to proces sprawdzania, czy dane przesłane przez użytkownika są poprawne, kompletne i bezpieczne.
1. Sprawdzanie, czy dane istnieją (isset)
Zanim użyjesz zmiennej superglobalnej, upewnij się, że pole zostało przesłane, aby uniknąć błędów.
if (isset($_POST['imie'])) {
$imie_bezpieczne = htmlspecialchars($_POST['imie']);
echo "Wprowadzono imię: $imie_bezpieczne";
} else {
echo "Nie wprowadzono imienia.";
}
?>
2. Przetwarzanie różnych typów pól (Checkboxy)
Do obsługi wielu zaznaczeń użyj nazwy z nawiasami kwadratowymi, wtedy PHP utworzy tablicę.
<input type="checkbox" name="zainteresowania[]" value="sport"> Sport
<input type="checkbox" name="zainteresowania[]" value="muzyka"> Muzyka
<input type="checkbox" name="zainteresowania[]" value="technologia"> Technologia
<?php
// PHP - Plik przetwarzający
if (isset($_POST['zainteresowania'])) {
$wybrane_zainteresowania = $_POST['zainteresowania'];
echo "Wybrano: " . implode(", ", $wybrane_zainteresowania);
} else {
echo "Nie wybrano żadnych zainteresowań.";
}
?>
Ćwiczenie Zadania Praktyczne
Zadanie 1: Formularz Logowania (Podstawowe)
Utwórz formularz HTML z polami "login" i "haslo", który wysyła dane do tego samego pliku.
Zadanie 2: Formularz Rejestracji i Walidacja (Ponadpodstawowe)
Utwórz formularz z polami: imię (text), wiek (number), newsletter (checkbox).
Rozwiązania Formularz Logowania i Rejestracji
Rozwiązanie Zadania 1: Formularz Logowania
Przykład jednego pliku login.php, który wyświetla formularz i przetwarza dane po wysłaniu.
<?php
// login.php
$komunikat = "";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
if (!empty($_POST["login"])) {
$login_bezpieczny = htmlspecialchars($_POST["login"]);
$komunikat = "Pomyślnie przesłano dane logowania dla: " . $login_bezpieczny;
} else {
$komunikat = "Pole login nie może być puste.";
}
}
?>
Formularz logowania
<h2>Formularz logowania</h2>
<form action="" method="POST">
Login: <input type="text" name="login"><br>
Hasło: <input type="password" name="haslo"><br>
<button type="submit">Zaloguj</button>
</form>
<p><?php echo $komunikat; ?></p>
Rozwiązanie Zadania 2: Formularz Rejestracji + Walidacja
Przykład prostego formularza z komunikatami błędów oraz informacją o newsletterze.
<?php
// rejestracja.php
$blad_imie = "";
$blad_wiek = "";
$komunikat_newsletter = "";
$komunikat_sukces = "";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
// IMIĘ
if (empty($_POST["imie"])) {
$blad_imie = "Imię jest wymagane.";
} else {
$imie = htmlspecialchars($_POST["imie"]);
}
// WIEK
if (isset($_POST["wiek"]) && $_POST["wiek"] !== "") {
$wiek = (int) $_POST["wiek"];
if ($wiek < 18) {
$blad_wiek = "Musisz być pełnoletni.";
}
} else {
$blad_wiek = "Wiek jest wymagany.";
}
// NEWSLETTER
if (isset($_POST["newsletter"])) {
$komunikat_newsletter = "Zapisano do newslettera.";
} else {
$komunikat_newsletter = "Nie zapisano do newslettera.";
}
// Jeśli brak błędów
if ($blad_imie === "" && $blad_wiek === "") {
$komunikat_sukces = "Dane poprawne. Użytkownik: " . $imie . " (" . $wiek . " lat).";
}
}
?>
Formularz rejestracji
<h2>Formularz rejestracji</h2>
<form action="" method="POST">
Imię: <input type="text" name="imie">
<span style="color:red"><?php echo $blad_imie; ?></span>
<br>
Wiek: <input type="number" name="wiek">
<span style="color:red"><?php echo $blad_wiek; ?></span>
<br>
Newsletter:
<label>
<input type="checkbox" name="newsletter"> Chcę otrzymywać newsletter
</label>
<br>
<button type="submit">Zarejestruj</button>
</form>
<p><?php echo $komunikat_sukces; ?></p>
<p><?php echo $komunikat_newsletter; ?></p>
Materiały Narzędzia i Linki
- PHP Manual: $_POST i $_GET.
- W3Schools: Walidacja formularzy PHP.
- Bezpieczeństwo: Wyszukaj hasło
PHP htmlspecialchars XSS, aby doczytać o ochronie przed wstrzyknięciem HTML/JS.