Hledáme fulltime PHP programátora do ITnetwork týmu - 100% homeoffice, 100% časově flexibilní #bezdeadlinu Mám zájem!
Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 50% výuky zdarma!
Discount week 50

Lekce 8 - Kontaktní emailový 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 kterého návštěvníci našich stránek napíší vzkaz a ten se nám odešle emailem. Jedná se o velmi užitečný webový doplněk, díky kterému nás mohou uživatelé našich stránek lépe kontaktovat.

HTML část

Jako vždy bude aplikace rozdělena na 2 čá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)
  • Emailová adresa - Emailová 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žíte na internet nějakou stránku s formulářem, objeví se časem 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 vloží odkaz na nějaké služby (často půjčky nebo pornografii), část lidí na tu 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í captchy č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žte 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>
    <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áš email</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>
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

A výsledek:

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

Formulář jsme vložili do tabulky, aby byly prvky hezky zarovnané. Dělá se to tak často, pokud chceme formulář rychle nastylovat. Všimněte si, že ve formuláři není vyplněný parametr action. Data se tedy odešlou na ten samý 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 správně vyplněný. Sice ještě neumíme ověřit, zda jsou v polích správné hodnoty, ale umíme zjistit, zda nejsou prázdná.

Kromě toho, že pole přišlo prázdné, je 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 nic neodeslat. 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é. Tito začátečníci si místo toho, aby kód opravili, vypnou výpis chyb v PHP. Později sem chodí a diví se, že jim něco nefunguje a nemohou chyby najít.

Když už jsme u nastavení chyb, tak 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 odhalíte při testování většinu problémů a na produkci vám nikdo díky viditelné chybové hlášce nebude napadat aplikaci. Chyby lze zapínat a vypínat v php.ini, někdy ovšem na produkci nemusíme mít k tomuto nastavení přístup a existuje k tomu nějaký přepínač v administrátorském rozhraní daného webhostingu.

Validace formuláře by mohla vypadat asi 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í emailu
    }
    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í emailu není složité. Slouží k tomu funkce mb_send_mail(), která narozdíl od starší funkce mail() podporuje UTF-8 kódování. K funkcím s prefixem mb_ se ještě dostaneme, nyní nám musí stačit, ž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áč

Přejděme dovnitř naší podmínky s validací a umístěme tam odeslání emailu 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 = 'Email byl úspěšně odeslán, brzy vám odpovíme.';
}
else
    $hlaska = 'Email se nepodařilo odeslat. Zkontrolujte adresu.';

Do několika proměnných si připravíme hlavičku, adresu, kam se má email odeslat (tu si samozřejmě nastavte na svou) a předmět. Jak vypadá hlavička je dané a nemusíte nad tím přemýšlet, podstatná je jen proměnná v prvním řádku, která určuje odesílatele emailu. Email potom vypadá jako že přišel z této adresy, i když ho odeslalo PHP z vašich stránek. Funkce mb_send_mail() vrací true pokud se odeslání podařilo a false pokud 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 emaily a zobrazovat chybové hlášky. Musíte to ale vyzkoušet spíše tak, že si ho nahrajete někam na webhosting. V XAMPPu ve výchozím nastavení není odesílání emailů funkční, i když jde nastavit v konfiguračním souboru. Pokud máte s nastavením problémy, nevadí, prostě si formulář někam nahrajte (třeba 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í formulář.


 

Stáhnout

Staženo 5502x (1.2 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
Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
48 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 let. Má rád Nirvanu, sushi 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 (17)

 

 

Komentáře
Zobrazit starší komentáře (256)

Avatar
Patrik Pastor:24.8.2020 22:38

Nevim proc v clanku nepadla ani zminka, ze pro posilani mailu v php (o cemz je cely tento clanek) je zapotrebi nakonfigurovany mail server. Musel jsem cely den googlit (viz muj predchozi komentar, kde mam spravny kod, dokonce vypise uspesnou hlasku, ale mail nikdy nedostanu), jak si nastavit postfix, nakofigurovat php.ini a umozit z mailu, z nehoz se odesila mail ("From:" v hlavicce) aby mohl byt pouzit aplikacemi tretich stran (php) (plati pro ucty od gmailu). Tohle ale moc neni pro zacatecniky a zabralo mi to celkem dost casu to vyhledat, tak bych pozdejsim ctenarum chtel jen upozornit na to, proc se vam nic neodesila -> nemate nakonfigurovany mail server. Pokud jste na linux (a pouzivate LAMP, potom -> https://stackoverflow.com/…ost/45125490#… , zde je dobre vysvetleni pro nastaveni postfixu), pokud jste na windows a pouzivate XAMPP, to nevim, windows nemam. Ale znova zduraznuju, ze to autor mohl prinejmensim zminit, ze je to nutne pro posilani php mailu funkci mail() nebo jinymi funkcemi.

Editováno 24.8.2020 22:41
 
Odpovědět
24.8.2020 22:38
Avatar
ed ita
Člen
Avatar
Odpovídá na Patrik Pastor
ed ita:3.10.2020 21:27

Ahoj, pro ty, co pouzivaji LAMP a chteji zprovoznit posilani mailu z vyse popsaneho v php-ku vytvoreneho formulare: me pomohl hodne tento navod: https://askubuntu.com/…8046/1132936 - pouziti ssmtp a gmail smtp server.

 
Odpovědět
3.10.2020 21:27
Avatar
Jaroslav Hušek:13.10.2020 20:55

Nevalí mi ani vlastní kód, ani stažený odsud, končím na chybě "Email se nepodařilo odeslat. Zkontrolujte adresu". Žádnou další chybovou hlášku nedostanu, jak mohu debugovat problém prosím?

 
Odpovědět
13.10.2020 20:55
Avatar
Outsider
Člen
Avatar
Outsider:17.10.2020 18:33

PROC MI PISE "FAILED TO CONNECT IN... ON LINE"?? Prvne mi to hlasilo ze nefunguje MB_INTERNAL_EN­CODING, to jsem si musel najit jinde ted ze nelze se pripojit nebo co a kdyz najedu na cislo LINE tak ze mb_send_mail nefunguje??

 
Odpovědět
17.10.2020 18:33
Avatar
František Červeňák:3.11.2020 12:00

funkcia mb_send_mail je už zastaraná, v najnovšej verzii php 7.4.9 ju engine síce vykoná(e-mail sa odošle, aj z localhostu), no upozorňuje na to, že je to zastaraná funkcia, a nemá sa používať teda

 
Odpovědět
3.11.2020 12:00
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na Outsider
František Červeňák:3.11.2020 13:07

Predpokladám, že skript spúšťaš z lokalhostu, cez virtuálny server (wamp/xampp/lamp). Ak je to tak, určite nemáš správne nakonfigurovaný server pre odosielanie mailov

 
Odpovědět
3.11.2020 13:07
Avatar
Outsider
Člen
Avatar
Odpovídá na František Červeňák
Outsider:4.12.2020 23:57

Díky za odpověd. Sry byl sem ve stresu, ale ted mi to už po pár úpravách hlásí že odesláno, upravil sem nastavení v php.ini, php část jsem dál na začátek, mb_internal_en­coding a zobrazuje mi to v pohodě odesláno, ale nezkoušel sem to uplně realně že bych fakt někam odeslal email takže nevím.

 
Odpovědět
4.12.2020 23:57
Avatar
Outsider
Člen
Avatar
Odpovídá na František Červeňák
Outsider:5.12.2020 0:01

Tohle je další věc co mě trápí. Dělám si starosti, jestli budu moct se naučit IT a ještě stačit držet krok s rychle přibývajícími informacemi/no­vinkami,/vylep­senimi. :-S Jediné co mě napadá, je porozhlížet se po anglických materialech, které jsou aktualní a pravidelně je objednavat.

 
Odpovědět
5.12.2020 0:01
Avatar
Milan Turyna
Redaktor
Avatar
Odpovídá na Outsider
Milan Turyna:5.12.2020 14:33

Pokud se chces naucit kvalitne programovat, neni potreba nic objednavat ale spise vyuzivat vice zdroju, fora, stackoverflow a tak dale, neni mozne aby bylo vse vsude aktualni, jelikoz IT nespi.

Proto ti doporucuji brat navody (ty ktere te dovedou k nejakemu vysledku, treba tu k formulari) jako nejaky zaklad, ktery ti da principy a ukaze zakladni konstrukce, ale zbytek uz musis odmakat sam s dokumentaci a snahou hledat moderni, bezpecnejsi a celkove lepsi reseni.

Je pravda, ze anglicke materialy jsou vetsinou modernejsi a aktualnejsi, jelikoz anglictinu pouziva cely svet a my jsme prakticky mala zeme s par programatorama, takze koukat nejen po ceskych zdrojech je skvely krok.

 
Odpovědět
5.12.2020 14:33
Avatar
Jiří Šefránek:4. února 16:47

s funkcí mb_send_mail se mi odesílaly jen nějaké nesmyslné znaky ale nahradil jsem jí funkcí mail a funguje to :)

 
Odpovědět
4. února 16:47
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 266. Zobrazit vše