V návodu o kontaktním formuláři jsme postavili formulář, který po odeslání pošle e-mail. Teď se podíváme pod kapotu: jak PHP vlastně převezme to, co návštěvník vyplnil, jak ověřit, že data dávají smysl, a hlavně jak s nimi naložit bezpečně. Tyhle základy využijete u každého formuláře – od kontaktu přes přihlášení až po objednávku.
Dvě cesty, kudy data přijdou: $_POST a $_GET
Když návštěvník něco odešle, PHP to najde v jedné ze dvou „schránek":
- $_POST – data jdou skrytě v těle požadavku, nejsou vidět v adrese. Použijte ho u formulářů, které něco mění nebo odesílají (kontakt, přihlášení, objednávka).
- $_GET – data jsou vidět přímo v adrese za otazníkem, např.
?hledat=kniha. Hodí se na vyhledávání a filtry, které si člověk může uložit do záložek nebo poslat odkazem.
Jednoduché pravidlo: něco se mění → POST, jen se něco zobrazuje nebo filtruje → GET. Formuláři řeknete, kterou cestou odeslat, atributem method:
<form method="post" action="zpracuj.php">
<input type="text" name="jmeno">
<input type="email" name="email">
<button type="submit">Odeslat</button>
</form>
Klíčové je name u každého políčka – přesně pod tímhle názvem data v PHP najdete.
Krok 1: Přečteme hodnoty
Na stránce zpracuj.php si odeslané hodnoty vytáhnete podle jejich name:
<?php
$jmeno = trim($_POST['jmeno'] ?? '');
$email = trim($_POST['email'] ?? '');
?>
Zápis ?? '' znamená „když políčko nedorazí, ber prázdný text" – ušetří vás to otravných hlášek Undefined array key. A trim() ořízne mezery na začátku a konci, které tam lidé omylem nechávají.
Krok 2: Ověříme, že data dávají smysl (validace)
Nikdy nespoléhejte na to, že člověk vyplnil všechno správně. Základ je zkontrolovat povinná pole a formát e-mailu:
<?php
$chyby = [];
if ($jmeno === '') {
$chyby[] = 'Vyplňte prosím jméno.';
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$chyby[] = 'Zadejte platný e-mail.';
}
if (!$chyby) {
// vše v pořádku → teď data zpracujeme
}
?>
Funkce filter_var() s FILTER_VALIDATE_EMAIL je vestavěná kontrola e-mailu – nemusíte vymýšlet složité vzorce. Chyby si sbíráme do pole $chyby a teprve když je prázdné, pokračujeme dál.
required v HTML. HTML kontrolu lze snadno obejít – rozhoduje až to, co ověří server.Krok 3: Bezpečnost – vstupu nikdy nevěřte
Cokoli přijde od návštěvníka, berte jako neznámý text, dokud ho neošetříte. Platí dvě věci, které znáte už z návodu o databázi:
- Když vstup vypisujete zpět do stránky (třeba „Díky, jméno!"), prožeňte ho funkcí
htmlspecialchars(). Jinak může někdo do políčka propašovat kus skriptu – útok zvaný XSS. - Když vstup ukládáte do databáze, posílejte ho do dotazu přes otazník a
execute()(prepared statements), nikdy ho nelepte přímo do SQL. Podrobně v návodu Jak z PHP pracovat s databází.
echo 'Díky, ' . htmlspecialchars($jmeno) . '!';
A ještě jedno pravidlo: akce, která něco mění nebo maže, nikdy nemá viset na odkazu přes $_GET (např. ?smazat=5). Takový odkaz by stačilo někomu podstrčit a mohl by ho projít i vyhledávač. Mazání a změny posílejte přes POST.
Celé to spojené dohromady
Takhle vypadá kostra bezpečného zpracování formuláře – přečíst → ověřit → teprve pak zpracovat a slušně odpovědět:
<?php
$jmeno = trim($_POST['jmeno'] ?? '');
$email = trim($_POST['email'] ?? '');
$chyby = [];
if ($jmeno === '') {
$chyby[] = 'Vyplňte jméno.';
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$chyby[] = 'Neplatný e-mail.';
}
if (!$chyby) {
// … uložit do databáze nebo poslat e-mail …
echo 'Děkujeme, ' . htmlspecialchars($jmeno) . '!';
} else {
foreach ($chyby as $ch) {
echo '<p>' . htmlspecialchars($ch) . '</p>';
}
}
?>
Časté chyby
- Špatná „schránka". Formulář má
method="post", ale data čtete z$_GET(nebo naopak). Metoda a místo, odkud čtete, musí sedět. - Překlep v
name. V HTMLname="email", v PHP ale$_POST['e-mail']– musí to být přesně stejně. - Chybějící
?? ''. Bez něj PHP při nevyplněném poli hlásí Undefined array key. - Výpis vstupu bez
htmlspecialchars(). Otevřená brána pro XSS – ošetřujte vše, co jde od uživatele zpět na stránku. - Spoléhání jen na HTML
required. Kontrolu zopakujte v PHP; prohlížeč se dá obejít.
A to je celé. Teď umíte formulář nejen postavit, ale i bezpečně zpracovat – přečíst data, ověřit je a slušně odpovědět. Stejný postup použijete u přihlášení, objednávky i jakéhokoli dalšího formuláře. 👍
Všechny návodyNechcete web řešit sami a chcete ho mít hotový a profesionální?
Podívejte se na tvorbu webů →© Ondřej Šteigl. Autorem návodů jsem já. Obsah je autorským dílem chráněným podle zákona č. 121/2000 Sb. (autorský zákon). Kopírování, přebírání nebo šíření bez mého předchozího písemného souhlasu je zakázáno. Výukové použití je vítáno – stačí uvést zdroj (osteigl.cz).