Formularze HTML umożliwiają użytkownikom przesyłanie danych, ale to PHP odpowiada za ich odbiór i przetwarzanie na serwerze. W tym artykule omówimy podstawy obsługi formularzy w PHP, sposoby przesyłania danych oraz ich walidację.
Tworzenie formularza HTML
Formularz w HTML umożliwia wprowadzenie różnych typów danych przez użytkownika, które następnie są przesyłane do serwera w celu ich dalszego przetwarzania. Możemy korzystać z pól tekstowych, przycisków wyboru (radio), list rozwijanych (select), pól wyboru (checkbox) oraz obsługi plików (file).
Przykładowy formularz HTML przesyłający dane metodą POST:
<form action="formularz.php" method="POST" enctype="multipart/form-data">
<label for="imie">Imię:</label>
<input type="text" name="imie" id="imie" required>
<label for="email">Email:</label>
<input type="email" name="email" id="email" required>
<label for="haslo">Hasło:</label>
<input type="password" name="haslo" id="haslo" required>
<label>Płeć:</label>
<input type="radio" name="plec" value="M"> Mężczyzna
<input type="radio" name="plec" value="K"> Kobieta
<label for="jezyki">Wybierz język:</label>
<select name="jezyki" id="jezyki">
<option value="pl">Polski</option>
<option value="en">Angielski</option>
<option value="de">Niemiecki</option>
</select>
<label>Zgoda na przetwarzanie danych:</label>
<input type="checkbox" name="zgoda" value="1">
<label for="plik">Załącz plik:</label>
<input type="file" name="plik" id="plik">
<button type="submit">Wyślij</button>
</form>
Odbiór danych w PHP
Po przesłaniu formularza PHP odbiera dane za pomocą tablicy $_POST oraz $_FILES. Warto sprawdzić, czy dane są poprawnie przesłane i obsłużyć sytuacje, gdy brakuje wymaganych pól.
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$imie = $_POST['imie'] ?? '';
$email = $_POST['email'] ?? '';
$haslo = $_POST['haslo'] ?? '';
$plec = $_POST['plec'] ?? 'Nie podano';
$jezyk = $_POST['jezyki'] ?? 'Nie wybrano';
$zgoda = isset($_POST['zgoda']) ? "Tak" : "Nie";
echo "<h3>Otrzymane dane:</h3>";
echo "Imię: $imie <br>";
echo "Email: $email <br>";
echo "Hasło: (ukryte) <br>";
echo "Płeć: $plec <br>";
echo "Wybrany język: $jezyk <br>";
echo "Zgoda na przetwarzanie danych: $zgoda <br>";
}
Obsługa przesyłania plików
Przesyłanie plików odbywa się poprzez tablicę $_FILES. Kluczowe parametry pliku to:
-
name– oryginalna nazwa pliku, -
tmp_name– tymczasowa ścieżka na serwerze, -
size– rozmiar pliku w bajtach.
Aby zabezpieczyć aplikację, warto sprawdzać format pliku i jego maksymalny rozmiar.
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_FILES['plik'])) {
$nazwaPliku = $_FILES['plik']['name'];
$tymczasowaSciezka = $_FILES['plik']['tmp_name'];
$rozmiarPliku = $_FILES['plik']['size'];
if ($rozmiarPliku > 0 && $rozmiarPliku < 2097152) { // Maks. 2MB
move_uploaded_file($tymczasowaSciezka, "uploads/" . $nazwaPliku);
echo "Plik $nazwaPliku został przesłany!";
} else {
echo "Błąd przesyłania pliku lub plik za duży.";
}
}
Walidacja i filtrowanie danych
Aby uniknąć błędów i ataków, dane należy filtrować:
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$imie = htmlspecialchars(strip_tags(trim($_POST['imie'])));
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
$haslo = trim($_POST['haslo']);
if (!$email) {
echo "Błąd: Niepoprawny adres email.";
} else {
echo "<h3>Otrzymane dane:</h3>";
echo "Imię: $imie <br>";
echo "Email: $email <br>";
}
}
Zagrożenia związane z obsługą formularzy
Obsługa danych wejściowych może prowadzić do różnych zagrożeń, dlatego warto zwrócić uwagę na:
-
SQL Injection – należy unikać wstrzykiwania niebezpiecznego kodu SQL poprzez stosowanie przygotowanych zapytań (
prepared statements). -
Cross-Site Scripting (XSS) – zabezpieczenie się przed wstrzyknięciem złośliwego kodu HTML i JavaScript poprzez funkcję
htmlspecialchars(). -
Cross-Site Request Forgery (CSRF) – dodanie tokena zabezpieczającego do formularza i weryfikacja jego poprawności.
-
Bezpieczeństwo haseł – zamiast przechowywać hasła w formie tekstowej, należy je hashować przy pomocy
password_hash().