NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 9 - Kontaktní e-mailový formulář v PHP

V minulé lekci, Podmínky v PHP podruhé - přetypování, skládání a switch, jsme probírali přetypování a switch.

Na dnešní PHP tutoriál máme slíbený kontaktní formulář, do něhož návštěvníci našich stránek napíšou vzkaz, který se nám odešle e-mailem. Jedná se o velmi užitečný webový doplněk, díky němuž nás mohou uživatelé našich stránek lépe kontaktovat.

HTML část

Jako vždy bude aplikace rozdělena na dvě části. V tomto případě ovšem budou obě v jednom souboru mailform.php. Je to z toho důvodu, abychom měli při zpracování dat z formuláře přístupný i formulář. Pokud uživatel zadá něco špatně, vypíšeme nad formulář chybovou hlášku.

HTML část bude tedy obsahovat formulář, který bude mít následující prvky:

  • jméno – jméno návštěvníka (abychom věděli, kdo nám píše),
  • e-mailová adresa – e-mailová adresa návštěvníka (abychom mu mohli odpovědět),
  • zpráva – zpráva od uživatele,
  • antispam – ochrana proti spamu.

Kromě ochrany proti spamu asi není co vysvětlovat. Řekněme si tedy o spamu více.

Spam

Jakmile vložíme na internet nějakou stránku s formulářem, časem se objeví roboti, kteří do formuláře začnou psát reklamu. Důvod je prostý, formulář někam něco odesílá, a když do něj roboti vloží odkaz na nějaké služby (často půjčky nebo pornografii), část lidí na reklamu klikne a služby si koupí.

Proti spamu se dá velmi účinně bránit. K zabezpečení formulářů se používá tzv. Turingův test, známý spíše pod pojmem CAPTCHA. Účelem testu je položit takovou otázku, na kterou zná odpověď jen člověk. První CAPTCHA testy často zobrazovaly text na obrázku a předpokládalo se, že obrázek umí přečíst jen člověk. Postupem času však spammeři vyvinuli poměrně sofistikované OCR čtečky, které umí obrázky číst lépe než lidé. Není ovšem nic jednoduššího než položit nějakou otázku (nejlépe česky), kterou spamboti neumějí. Bohatě nám bude stačit např. Zadejte aktuální rok.

Formulář

Založme si tedy nový projekt a můžeme začít. HTML kód stránky s formulářem by mohl vypadat např. takto:

<!DOCTYPE html>
<html lang="cs">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Kontaktní formulář</title>
    </head>
    <body>
        <p>Můžete mě kontaktovat pomocí formuláře níže.</p>

        <form method="POST">
            <table>
                <tr>
                    <td>Vaše jméno</td>
                    <td><input name="jmeno" type="text" /></td>
                </tr>
                <tr>
                    <td>Váš e-mail</td>
                    <td><input name="email" type="email" /></td>
                </tr>
                <tr>
                    <td>Aktuální rok</td>
                    <td><input name="rok" type="number" /></td>
                </tr>
            </table>
            <textarea name="zprava"></textarea><br />

            <input type="submit" value="Odeslat" />
        </form>

    </body>
</html>

A výsledek:

Kontaktní formulář
localhost/mail­form.php

Formulář jsme vložili do tabulky, aby byly prvky hezky zarovnané. Takový postup je běžný, chceme-li formulář rychle nastylovat. Všimněme si, že ve formuláři není vyplněný parametr action. Data se tedy odešlou na tentýž soubor, ve kterém je formulář.

PHP část

Na úplný začátek souboru vložíme PHP direktivu a pustíme se do programování:

<?php

?>

Validace

Každý formulář bychom měli zvalidovat. Validace je ověření, zda je formulář správně vyplněný. Sice ještě neumíme ověřit, zda jsou v polích správné hodnoty, nicméně umíme zjistit, zda pole nejsou prázdná.

Kromě toho, že pole přišlo prázdné, je tu ještě jedna možnost – formulář se nemusel vůbec odeslat. S touto možností musíme počítat, jelikož máme zpracování i zobrazení ve stejném skriptu – uživatel mohl zatím jen zobrazit formulář a nemusel nic odeslat. Z minulé lekce víme, že pokud napíšeme:

if ($_POST)

Provede se podmínka v případě, když pole není prázdné.

Dále bychom měli počítat i s tím, že se formulář neodeslal celý, ale jen jeho část. Potřebujeme tedy zjistit, zda v $_POST existují jednotlivé proměnné. K tomu v PHP slouží funkce isset().

POZOR! Mnoho začátečníků používá k ověření toho, zda se něco odeslalo, následující kód:

if ($_POST['jmeno']) {
    // ...
}

To je ovšem špatně, a pokud se formulář neodeslal, PHP vypíše ošklivou chybu, jelikož čteme z neexistující proměnné. Někteří začátečníci si pak místo toho, aby kód opravili, vypnou v PHP výpis chyb. To však později vede k tomu, že kód není funkční a chyby nelze dohledat.

Nastavení chyb musí být vždy takové, že jsou na lokálním serveru (na vašem počítači při testování) zapnuté a na produkci (na internetu) vždy vypnuté. Jen tak při testování odhalíte většinu problémů a na produkci vám nikdo kvůli viditelné chybové hlášce nebude napadat aplikaci. Chyby lze zapínat a vypínat v php.ini. Někdy však na produkci nemusíme mít k tomuto nastavení přístup a existuje k tomu přepínač v administrátorském rozhraní daného webhostingu.

Validace formuláře by mohla vypadat takto:

$hlaska = '';
if ($_POST) { // V poli _POST něco je, odeslal se formulář
    if (isset($_POST['jmeno']) && $_POST['jmeno'] &&
        isset($_POST['email']) && $_POST['email'] &&
        isset($_POST['zprava']) && $_POST['zprava'] &&
        isset($_POST['rok']) && $_POST['rok'] == date('Y')
    ) {
        // Sem přijde odeslání e-mailu
    } else
        $hlaska = 'Formulář není správně vyplněný!';
}

Celý kód je v podmínce, která kontroluje, zda je něco v poli $_POST. Pokud se nic neodeslalo, není co zpracovávat. Další složená podmínka kontroluje, zda byla odeslána jednotlivá pole a zda v nich je nějaký text. U roku samozřejmě kontrolujeme, zda je aktuální. Ve skriptu používáme proměnnou $hlaska, kam vložíme hlášku pro uživatele v případě, že se validace nepovedla. Tu později vypíšeme v HTML části skriptu.

Zpracování

Samotné odeslání e-mailu není složité. Slouží k tomu funkce mb_send_mail(), která na rozdíl od starší funkce mail() podporuje UTF-8 kódování. K funkcím s prefixem mb_ se ještě dostaneme, pro tuto chvíli nám stačí vědět, že pokud je chceme používat, často musíme na úplném začátku souboru nastavit kódování:

<?php
mb_internal_encoding("UTF-8");

 V následující ukázce využíváme zavináč @. Zavináč na české klávesnici můžeme napsat pomocí klávesy pravý Alt a písmene V:

Zavináč - Základní konstrukce jazyka PHP

Přejděme dovnitř naší podmínky s validací a umístěme tam odeslání e-mailu a nastavení zprávy pro uživatele:

$hlavicka = 'From:' . $_POST['email'];
$hlavicka .= "\nMIME-Version: 1.0\n";
$hlavicka .= "Content-Type: text/html; charset=\"utf-8\"\n";
$adresa = '[email protected]';
$predmet = 'Nová zpráva z mailformu';
$uspech = mb_send_mail($adresa, $predmet, $_POST['zprava'], $hlavicka);
if ($uspech) {
    $hlaska = 'E-mail byl úspěšně odeslán, brzy vám odpovíme.';
} else
    $hlaska = 'E-mail se nepodařilo odeslat. Zkontrolujte adresu.';

Do několika proměnných si připravíme hlavičku, adresu, kam se má e-mail odeslat (tu si samozřejmě nastavíme na svou), a předmět. Jak vypadá hlavička, je dané a nemusíme nad tím přemýšlet, podstatná je jen proměnná v prvním řádku, která určuje odesílatele e-mailu. E-mail potom vypadá tak, jako by přišel z této adresy, i když ho odeslalo PHP z našich stránek. Funkce mb_send_mail() vrací true, pokud se odeslání podařilo, a false, pokud odeslání selhalo. Tuto hodnotu si uložíme do proměnné $uspech a nastavíme podle ní hlášku.

Úprava formuláře

Vraťme se k našemu formuláři a vložme těsně nad tag <form> další PHP sekvenci, ve které vypíšeme proměnnou $hlaska, pokud v ní něco je:

<?php
if ($hlaska)
    echo('<p>' . $hlaska . '</p>');
?>

Hotovo. Váš formulář by měl nyní odesílat e-maily a zobrazovat chybové hlášky. Vyzkoušet to však musíte spíše tak, že si ho nahrajete někam na webhosting. V balíčku XAMPP totiž ve výchozím nastavení není odesílání e-mailů funkční, i když jde nastavit v konfiguračním souboru. Pokud máte s nastavením problémy, nevadí, prostě formulář někam nahrajte (např. na webhosting OneBit) a vyzkoušejte ho online.

Kontaktní formulář
localhost/mail­form.php

V příští lekci, Vylepšení kontaktního formuláře v PHP, si vylepšíme kontaktní e-mailový formulář.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 6471x (1.72 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

Předchozí článek
Podmínky v PHP podruhé - přetypování, skládání a switch
Všechny články v sekci
Základní konstrukce jazyka PHP
Přeskočit článek
(nedoporučujeme)
Vylepšení kontaktního formuláře v PHP
Článek pro vás napsal David Hartinger
Avatar
Uživatelské hodnocení:
317 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity