Ondřej Šteigl - Logo ONDŘEJ ŠTEIGL
PHP

Kontaktní formulář v PHP

Krok za krokem: formulář, který po odeslání pošle e-mail. S kompletním souborem k okopírování.

Čtení 8 min mírně pokročilý Naposledy upraveno 25. 9. 2026

Předtím: Co je PHP

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.

⚠️ Důležité: Soubor musí mít příponu .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ě:

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>
náhled formuláře

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; ?>
náhled po odeslání
✅ Děkujeme! Vaše zpráva byla odeslána.

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>
💡 Když necháme ve formuláři 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 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

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).

← Zpět na všechny návody