V návodu Co je PHP jsme si řekli, že PHP běží na serveru a umí web „oživit". Teď to využijeme na nejčastější věc vůbec – kontaktní formulář, který po odeslání pošle e-mail.
.php (ne .html) a běžet na hostingu s podporou PHP – Wedos ji má. Otevřít soubor v počítači dvojklikem nestačí, PHP potřebuje server. Formulář tedy vyzkoušíte až po nahrání na hosting.Jak to funguje
Postup má čtyři kroky, které se odehrají na jednom místě:
- Návštěvník vyplní formulář (HTML) a klikne na Odeslat.
- Data se pošlou na server, kde je převezme PHP.
- PHP data zkontroluje a pošle e-mail funkcí
mail(). - Návštěvníkovi se zobrazí poděkování.
Vše dáme do jednoho souboru kontakt.php – formulář i jeho zpracování.
Krok 1: Formulář (HTML)
Formulář je obyčejné HTML. Klíčové je method="post" (jak se data pošlou) a action="kontakt.php" (kam se pošlou – tady na sebe sama). Každé pole má name, pod kterým ho pak v PHP najdeme:
<form method="post" action="kontakt.php">
<label>Jméno:<br>
<input type="text" name="jmeno"></label>
<label>E-mail:<br>
<input type="email" name="email"></label>
<label>Zpráva:<br>
<textarea name="zprava" rows="5"></textarea></label>
<button type="submit">Odeslat</button>
</form>
Odeslat
Krok 2: Zpracování v PHP
Na úplný začátek souboru (ještě před HTML) dáme PHP blok. Ten se spustí jen tehdy, když formulář někdo odeslal, načte pole z $_POST a zkontroluje je:
<?php
$odeslano = false;
$chyba = "";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
// načtení polí (trim odřízne mezery)
$jmeno = trim($_POST["jmeno"] ?? "");
$email = trim($_POST["email"] ?? "");
$zprava = trim($_POST["zprava"] ?? "");
// kontrola: prázdná pole a platný e-mail
if ($jmeno === "" || $email === "" || $zprava === "") {
$chyba = "Vyplňte prosím všechna pole.";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$chyba = "Zadejte platný e-mail.";
} else {
// ... odeslání (viz krok 3)
}
}
?>
filter_var(..., FILTER_VALIDATE_EMAIL) je hotová funkce PHP, která ověří, že e-mail vypadá platně. Když něco chybí, uložíme text do $chyba a později ho ukážeme.
Krok 3: Odeslání e-mailu a poděkování
Když je vše v pořádku, sestavíme a odešleme e-mail funkcí mail(). Ta bere čtyři údaje: komu, předmět, text a hlavičky:
// ochrana proti vkládání do hlaviček e-mailu
$email = str_replace(["\r", "\n"], "", $email);
$jmeno = str_replace(["\r", "\n"], "", $jmeno);
$komu = "vas-email@osteigl.cz"; // kam zprávy chodí
$predmet = "Nová zpráva z webu";
$telo = "Jméno: $jmeno\nE-mail: $email\n\nZpráva:\n$zprava";
$hlavicky = "From: web@osteigl.cz\r\n" // adresa z VAŠÍ domény
. "Reply-To: $email\r\n" // odpověď půjde návštěvníkovi
. "Content-Type: text/plain; charset=UTF-8";
if (mail($komu, $predmet, $telo, $hlavicky)) {
$odeslano = true;
} else {
$chyba = "Zprávu se nepodařilo odeslat, zkuste to později.";
}
V HTML části pak podle výsledku ukážeme buď poděkování, nebo formulář (a případnou chybu):
<?php if ($odeslano): ?>
<p>Děkujeme! Vaše zpráva byla odeslána.</p>
<?php else: ?>
<?php if ($chyba !== ""): ?>
<p style="color:red;"><?= htmlspecialchars($chyba) ?></p>
<?php endif; ?>
<!-- ... sem přijde formulář z kroku 1 ... -->
<?php endif; ?>
Kompletní soubor kontakt.php
Takhle vypadá celý soubor pohromadě – stačí zkopírovat, změnit e-mailové adresy a nahrát na hosting:
<?php
$odeslano = false;
$chyba = "";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$jmeno = trim($_POST["jmeno"] ?? "");
$email = trim($_POST["email"] ?? "");
$zprava = trim($_POST["zprava"] ?? "");
if ($jmeno === "" || $email === "" || $zprava === "") {
$chyba = "Vyplňte prosím všechna pole.";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$chyba = "Zadejte platný e-mail.";
} else {
$email = str_replace(["\r", "\n"], "", $email);
$jmeno = str_replace(["\r", "\n"], "", $jmeno);
$komu = "vas-email@osteigl.cz";
$predmet = "Nová zpráva z webu";
$telo = "Jméno: $jmeno\nE-mail: $email\n\nZpráva:\n$zprava";
$hlavicky = "From: web@osteigl.cz\r\n"
. "Reply-To: $email\r\n"
. "Content-Type: text/plain; charset=UTF-8";
if (mail($komu, $predmet, $telo, $hlavicky)) {
$odeslano = true;
} else {
$chyba = "Zprávu se nepodařilo odeslat, zkuste to později.";
}
}
}
?>
<!DOCTYPE html>
<html lang="cs">
<head><meta charset="UTF-8"><title>Kontakt</title></head>
<body>
<?php if ($odeslano): ?>
<p>Děkujeme! Vaše zpráva byla odeslána.</p>
<?php else: ?>
<?php if ($chyba !== ""): ?>
<p style="color:red;"><?= htmlspecialchars($chyba) ?></p>
<?php endif; ?>
<form method="post" action="kontakt.php">
<p><label>Jméno:<br>
<input type="text" name="jmeno"
value="<?= htmlspecialchars($_POST['jmeno'] ?? '') ?>"></label></p>
<p><label>E-mail:<br>
<input type="email" name="email"
value="<?= htmlspecialchars($_POST['email'] ?? '') ?>"></label></p>
<p><label>Zpráva:<br>
<textarea name="zprava" rows="5"><?= htmlspecialchars($_POST['zprava'] ?? '') ?></textarea></label></p>
<p><button type="submit">Odeslat</button></p>
</form>
<?php endif; ?>
</body>
</html>
value="<?= htmlspecialchars($_POST['jmeno'] ?? '') ?>", zůstanou po chybě vyplněná pole vyplněná – návštěvník je nemusí psát znovu.Bezpečnost a spam
Vstupu od cizích lidí se nikdy nedá věřit naslepo. Tři věci, na které nezapomenout:
- Výpis přes
htmlspecialchars(). Cokoli od návštěvníka, co zobrazujete zpět na stránce, prožeňte touto funkcí – zabrání vložení cizího kódu do stránky. - Ochrana e-mailových hlaviček. Proto to
str_replace(["\r","\n"], "", ...)– útočník by jinak mohl přes zalomení řádku přidat do e-mailu vlastní hlavičky. - Jednoduchá past na roboty (honeypot). Přidejte skryté pole, které člověk nevidí a nevyplní – ale robot ano. Když přijde vyplněné, zprávu zahodíte:
<!-- v formuláři: skryté pole -->
<input type="text" name="web" style="display:none" tabindex="-1">
<?php // v PHP na začátku zpracování:
if (!empty($_POST["web"])) { exit; } // vyplnil jen robot
?>
Časté chyby
- Soubor je
.html. PHP se spustí jen v souboru.php. V.htmlse kód jen vypíše jako text. - „Nic to nedělá" v počítači.
mail()a PHP fungují až na serveru, ne po otevření souboru dvojklikem. Testujte na hostingu. - E-maily padají do spamu. Nejčastěji kvůli špatné adrese ve
From. Musí to být adresa z vaší domény (např.web@osteigl.cz), ne e-mail návštěvníka. Toho dejte doReply-To. - Rozbitá diakritika. Chybí
Content-Type: text/plain; charset=UTF-8v hlavičkách. - Hosting neumí PHP. Pak formulář nepojede – na Wedosu ale PHP běžně k dispozici je.
Co dál?
Máte funkční kontaktní formulář. E-mailovou adresu ve $komu nastavte na svou schránku, adresu From na účet z vaší domény a soubor nahrajte na hosting. Základy jazyka si připomenete v návodu Co je PHP.
Nechcete 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).