Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.

8. diel - Kontaktný emailový formulár v PHP

V minulej lekcii, Podmienky v PHP druhýkrát - pretypovania, skladanie a switch , sme dokončili podmienky. Na dnešnej PHP tutoriál máme sľúbený kontaktný formulár, do ktorého návštevníci našich stránok napíšu odkaz a ten sa nám odošle emailom. Jedná sa o veľmi užitočný webový doplnok, vďaka ktorému nás môžu používatelia našich stránok lepšie kontaktovať.

Html časť

Ako vždy bude aplikácia rozdelená na 2 časti. V tomto prípade však budú obe v jednom súbore mailform.php. Je to z toho dôvodu, aby sme mali pri spracovaní dát z formulára prístupný aj formulár. Ak používateľ zadá niečo zle, vypíšeme nad formulár chybovú hlášku.

HTML časť bude teda obsahovať formulár, ktorý bude mať nasledujúce prvky:

  • Meno - Meno návštevníka (aby sme vedeli kto nám píše)
  • Emailová adresa - emailová adresa návštevníka (aby sme mu mohli odpovedať)
  • Správa - Správa od užívateľa
  • Antispam - Ochrana proti spamu

Okrem ochrany proti spamu asi nie je čo vysvetľovať. Povedzme si teda o spamu viac.

Spam

Akonáhle vložíte na internet nejakú stránku s formulárom, objaví sa časom roboti, ktorí do formulára začnú písať reklamu. Dôvod je prostý, formulár niekam niečo odosiela a keď do neho vloží odkaz na nejaké služby (často pôžičky alebo pornografiu), časť ľudí na tú reklamu klikne a služby si kúpi.

Proti spamu sa dá veľmi účinne brániť. K zabezpečeniu formulárov sa používa tzv. Turingov test, známy skôr pod pojmom Captcha. Účelom testu je položiť takúto otázku, na ktorú pozná odpoveď len človek. Prvý captcha často zobrazovali text na obrázku a predpokladalo sa, že obrázok vie prečítať len človek. Postupom času však spameri vyvinuli pomerne sofistikované OCR čítačky, ktoré vie obrázky čítať lepšie, než ľudia. Nie je však nič jednoduchšie, než položiť nejakú otázku (najlepšie slovensky), ktorú spambotmi nevedia. Bohato nám bude stačiť napr. Zadajte aktuálny rok.

Formulár

Založte si teda nový projekt a môžeme začať. HTML kód stránky s formulárom by mohol vyzerať napr. Nasledovne:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Kontaktný formulár</title>
    </head>
    <body>
        <p>Môžete ma kontaktovať pomocou formulára nižšie.</p>

        <form method="POST">
            <table>
                <tr>
                    <td>Vaše meno</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álny rok</td>
                    <td><input name="rok" type="number" /></td>
                </tr>
            </table>
            <textarea name="zprava"></textarea><br />

            <input type="submit" value="Odoslať" />
        </form>

    </body>
</html>

A výsledok:

Kontaktný formulár
localhost/mail­form.php

Formulár sme vložili do tabuľky, aby boli prvky pekne zarovnané. Robí sa to tak často, ak chceme formulár rýchlo nastylovať. Všimnite si, že vo formulári nie je vyplnený parameter action. Dáta sa teda odošlú na ten istý súbor, v ktorom je formulár.

Php časť

Na úplný začiatok súboru vložíme PHP direktívu a pustíme sa do programovania:

<?php

?>

Validácia

Každý formulár by sme mali zvalidovat. Validácia je overenie, či je správne vyplnený. Síce ešte nevieme overiť, či sú v poliach správne hodnoty, ale vieme zistiť, či nie sú prázdna.

Okrem toho, že pole prišlo prázdne, je ešte jedna možnosť - formulár sa nemusel vôbec odoslať. S touto možnosťou musíme počítať, pretože máme spracovanie aj zobrazenie v rovnakom skripte - užívateľ mohol zatiaľ len zobraziť formulár a nič neodoslať. Z minulej lekcie vieme, že ak napíšeme:

if ($_POST)

Vykoná sa podmienka v prípade, keď pole nie je prázdne.

Ďalej by sme mali počítať aj s tým, že sa formulár neodoslal celý, ale len jeho časť. Potrebujeme teda zistiť, či v $_POST existujú jednotlivé ukazovatele. K tomu v PHP slúži funkcia isset().

POZOR! Veľa začiatočníkov používa na overenie toho, či sa niečo odoslalo, nasledujúci kód:

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

To je však zle a ak sa formulár neodoslal, PHP vypíše škaredú chybu, pretože čítame z neexistujúce premennej. Títo začiatočníci si miesto toho, aby kód opravili, vypnú výpis chýb v PHP. Neskôr sem chodia a čuduje sa, že im niečo nefunguje a nemôžu chyby nájsť.

Keď už sme pri nastavení chýb, tak musí byť vždy také, že sú na lokálnom serveri (na vašom počítači pri testovaní) zapnuté a na produkciu (na internete) vždy vypnuté. Len tak odhalíte pri testovaní väčšinu problémov a na produkciu vám nikto vďaka viditeľnej chybové hláške nebude napádať aplikáciu. Chyby je možné zapínať a vypínať v php.ini, niekedy však na produkciu nemusíme mať k tomuto nastaveniu prístup a existuje k tomu nejaký prepínač v administrátorskom rozhraní daného webhostingu.

Validácie formulára by mohla vyzerať asi takto:

$hlaska = '';
if ($_POST) // V poli _POST niečo je, odoslal sa formulár
{
    if (isset($_POST['jmeno']) && $_POST['jmeno'] &&
        isset($_POST['email']) && $_POST['email'] &&
        isset($_POST['zprava']) && $_POST['zprava'] &&
        isset($_POST['rok']) && $_POST['rok'] == date('Y'))
    {
        // Sem príde odoslania emailu
    }
    else
        $hlaska = 'Formulár nie je správne vyplnený!';
}

Celý kód je v podmienke, ktorá kontroluje, či je niečo v poli $_POST. Ak sa nič neodoslal, nie je čo spracovávať. Ďalšie zložená podmienka kontroluje, či bola odoslaná jednotlivé polia a či v nich je nejaký text. U roka samozrejme kontrolujeme, či je aktuálna. V skripte používame premennú $hlaska, kam vložíme hlášku pre používateľa v prípade, že sa validácia nepodarila. Tú neskôr vypíšeme v HTML časti skriptu.

Spracovanie

Samotné odoslania emailu nie je zložité. Slúži na to funkcia mb_send_mail(), ktorá narozdiel od staršej funkcie mail() podporuje UTF-8 kódovanie. K funkciám s prefixom mb_ sa ešte dostaneme, teraz nám musí stačiť, že ak ich chceme používať, často musíme na úplnom začiatku súboru nastaviť kódovanie:

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

Prejdime dovnútra našej podmienky s validáciou a umiestnime tam odoslania emailu a nastavenia správy pre užívateľov:

$hlavicka = 'From:' . $_POST['email'];
$hlavicka .= "\nMIME-Version: 1.0\n";
$hlavicka .= "Content-Type: text/html; charset=\"utf-8\"\n";
$adresa = '[email protected]';
$predmet = 'Nová správa z mailformu';
$uspech = mb_send_mail($adresa, $predmet, $_POST['zprava'], $hlavicka);
if ($uspech)
{
    $hlaska = 'Email bol úspešne odoslaný, čoskoro vám odpovieme.';
}
else
    $hlaska = 'Email sa nepodarilo odoslať. Skontrolujte adresu.';

Do niekoľkých premenných si pripravíme hlavičku, adresu, kam sa má email odoslať (tú si samozrejme nastavte na svoju) a predmet. Ako vyzerá hlavička je dané a nemusíte nad tým premýšľať, podstatná je len premenná v prvom riadku, ktorá určuje odosielateľa emailu. Email potom vyzerá ako že prišiel z tejto adresy, aj keď ho odoslalo PHP z vašich stránok. Funkcia mb_send_mail() vracia true ak sa odoslanie podarilo a false ak zlyhalo. Túto hodnotu si uložíme do premennej $uspech a nastavíme podľa nej hlášku.

Úprava formulára

Vráťme sa k nášmu formulári a vložme tesne nad tag <form> ďalšie PHP sekvenciu, v ktorej vypíšeme premennú $hlaska, pokiaľ v nej niečo je:

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

Hotovo. Váš formulár by mal teraz odosielať emaily a zobrazovať chybové hlášky. Musíte to ale vyskúšať skôr tak, že si ho nahráte niekam na webhosting. V XAMPP v predvolenom nastavení nie je odosielanie emailov funkčný, aj keď ide nastaviť v konfiguračnom súbore. Ak máte s nastavením problémy, nevadí, proste si formulár niekam nahrajte (trebárs na webhosting OneBit) a vyskúšajte ho online.

Kontaktný formulár
localhost/mail­form.php

V budúcej lekcii, Vylepšenia kontaktného formulára v PHP , formulár dokončíme. Ak ste mali s nejakou časťou problém, nižšie sú zdrojové kódy k stiahnutiu.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 6338x (2.35 kB)
Aplikácia je vrátane zdrojových kódov v jazyku php

 

Predchádzajúci článok
Podmienky v PHP druhýkrát - pretypovania, skladanie a switch
Všetky články v sekcii
Základné konštrukcie jazyka PHP
Preskočiť článok
(neodporúčame)
Vylepšenia kontaktného formulára v PHP
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
1 hlasov
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 sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity