Kontaktní formulář v PHP
Na internetu je k dispozici mnoho mailerů od poskytovatelů typu Blueboard, Webber, Weblight a dalších. Tyto „prvky“ na stránky jsou však oproti mému skriptu značně stupidní, protože obsahují reklamu a nemají žádná jiná vylepšení.
Věřím, že pokud využíváte cizí odesílací form, tak ho zahodíte a dáte si místo něj ten můj. Nejen proto, že je to možnost nebýt závislý na někom jiném, ale také kvůli několika funkcím, které jinde nejsou.
Kód:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | <?php $jmeno=$_REQUEST['jmeno']; $email=$_REQUEST['email']; $predmet=$_REQUEST['predmet']; $zprava=$_REQUEST['zprava']; $send=$_REQUEST['send']; if ($email==""){ $email="@"; } $form="<form method=\"post\" action=\"$php_self\"> <p><table WIDTH=\"415\" BORDER=\"0\" CELLPADDING=\"1\" CELLSPACING=\"0\"> <tr valign=\"top\"> <td WIDTH=\"75\" class=\"text11px\">Vaše jméno:</td> <td WIDTH=\"75\"><input size=\"20\" type=\"text\" name=\"jmeno\" maxlength=\"100\" value=\"$jmeno\"></td> </tr> <tr valign=\"top\"> <td WIDTH=\"75\" class=\"text11px\">E-mail:</td> <td WIDTH=\"75\"><input size=\"20\" type=\"text\" name=\"email\" maxlength=\"100\" value=\"$email\"></td> </tr> <tr valign=\"top\"> <td WIDTH=\"75\" class=\"text11px\">Předmět:</td> <td WIDTH=\"75\"><input size=\"20\" type=\"text\" name=\"predmet\" maxlength=\"100\" value=\"$predmet\"></td> </tr> <tr valign=\"top\"> <td WIDTH=\"75\" class=\"text11px\">Zpráva:</td> <td WIDTH=\"75\"><textarea name=\"zprava\" rows=\"8\" cols=\"35\">$zprava</textarea></td> </tr> <tr> <td WIDTH=\"80\"></td> <td WIDTH=\"80\"><input type=\"hidden\" name=\"send\" value=\"submited\"><input type=\"submit\" value=\" Odeslat zprávu \"</td> </tr> </table> <p><em>Všechna pole jsou povinná.</em> </form>"; $jmeno_error=0; $email_error=0; $predmet_error=0; $zprava_error=0; if ($send!="submited"){ echo "$form"; }else{ if (empty($jmeno)){ echo "<strong>Musíte zadat vaše jméno.</strong><br />"; $predmet_error=1; } if (empty($email)){ echo "<strong>Musíte zadat existující e-mail.</strong><br />"; $email_error=1; }else{ if ((@!strpos ($email,"@")) || (@!strpos ($email,"."))){ echo "<strong>Musíte zadat existující e-mail.</strong><br />"; $email_error=1; }} if (empty($predmet)){ echo "<strong>Musíte zadat předmět.</strong><br />"; $predmet_error=1; } if (empty($zprava)){ echo "<strong>Musíte zadat zprávu.</strong><br />"; $zprava_error=1; } if (($jmeno_error) || ($email_error) || ($predmet_error) || ($zprava_error)){ echo "$form"; }else{ $zprava1="$zprava Odesílatel: $jmeno E-mail: $email"; $komu="tvuj@mail.cz"; mail ($komu,$predmet,$zprava1,"Content-Type: text/plain; charset=windows-1250\nReply-To: $email\nFrom: vydrus@vydrus.name"); echo "Zpráva byla úspěšně odeslána."; } } ?> |
Funkce:
- odeslání předmětu
- odeslání jména odesílatele
- odeslání emailu odesílatele
- odeslání zprávy
- kontrola vyplněných polí
- kontrola správně zadaného emailu
- volba odkud přijde mail – From (např. vydrus@vydrus.name)
- volba Odpovědět ve vaší schránce – Reply-To (email odesílatele)
Inputy, textareu a tlačítko si můžete libovolně ostylovat, s tím jsem se nepatlal, to je zcela na vás. Pokud se vám nelíbí chybové hlášky a ostatní texty, můžete si je libovolně změnit, ale nedoporučuji šahat na cokoli jiného, může se vám totiž stát, že to nebude fungovat.
Určitě si nezapomeňte nastavit vlastní kódování zprávy (charset) a změnit proměnnou $komu – na tuto adresu vám budou chodit maily.
Reklama: Netradiční čtení na téma půjčky naleznete na webu Bez půjčky
Dovolil jsem si trošku zpoužitelnit onen formulář, viz http://bradley.ic.cz/storage/mail-form.txt. Ještě by to chtělo do „základu“ vetřít kontrolu délek, pak by to bylo definitivně BFU odolné…
bradley
13. 09. 2008
No, jsem rád že ses v mym prasáckym kódu alespoň přehrabal.
Našel jsi nějaké určité vady na tom mym skriptu, když už ses na to díval?
Vydrus
15. 09. 2008
- No, je tak trošku prasárna používat globální systémové proměnné ($php_self). Vypnou ti register_globals a dojezdil si…, proto ono nahrazení za superglobální systémovou proměnnou $_SERVER['php_self'].
Nic ve zlém, ale psát je normálně a uložit soubor v daném kódování nic nezkazí.
- Když se posílá formulář metodou POST, je lepší hledat poslaná data v $_POST
- Vstupní data je potřeba zbavovat přebytečných mezer, ošetřovat
- Psát české znaky jako entity je taky docela síla.
Takže tak, no…
bradley
16. 09. 2008
Huh, s tim php_self máš asi pravdu… Skript jsem dělal narychlo, no
Co se týká entit, tak ty jsem tam dal pro všechny případy, aby se to zobrazilo správně…
Mohu ten tebou upravený skript použít místo dosavadního? Samozřejmě uvedu autora, takže to bude bod pro tebe
Vydrus
16. 09. 2008
Zdravím hoši,
skript je to pěkný, ale pořád nemůžu přijít na to aby zpráva byla kódována v UTF8 … vždy email, který má obsahovat české znaky obsahuje jiné klikyháky … nevíte co s tím?
Jack
28. 09. 2008
Zdar, zkus použít odkaz v 1. komentáři, kamarád to trošku zprovoznil… Snad ti to pomůže
Vydrus
28. 09. 2008
To je divný. Mě diakritika nezlobí. Mám kódování windows-1250 – zkus tam nastavit to, jaký je na tvym hostingu implicitní (na ic.cz je právě to windowsovský).
Vydrus
28. 09. 2008
Nejde mi to prostě
.. když jsem kódování změnil tak nebyl OK ani předmět …
Jack
28. 09. 2008
Dík, za rychlou odpověď, ano tento script jsem použil … radši jsem teď překontroloval, zda-li jsem scripty nezaměnil, ale ne .. stejně to nejde .. charset jsem změnil na UTF 8 ale ani předtím při tom windows to nešlo
… předmět v e-mailu je uplně v pohodě česky … ale ve zprávě na místo Č je např … Ä? … nevíš čím to může být
? Kódování webu mám též v UTF8 a script také …
Jack
28. 09. 2008
Ahoj, prosim, pro odesilani formulare pouzivas POST metodu, tak proc nepouzivas globalni pole POST, ale REQUEST?
Dalsi vec, ktera me teda hned uderila do oci jsou zpetne lomitka vsude. Proc nepouzivas kombinace uvozovek a apostrofu, vsechno potom vypada prehledneji.
Dale, kdyz podrzim F5, co se stane? Bude se stale odesilat a odesilat?
Hidden pole je tam uplne zbytecne, kdyz dat ten name do submit tak se prenese, ale lepsi by bylo treba udelat kontrolu na count( $_POST ), nebo jinak.
A spousta dalsich chyb…..
Priste nez neco takoveho uverejnis tak si to po sobe alespon precti.
zaachi
17. 10. 2008
Nu, dělal jsem to hodně narychlo. Příště se poučím
Vydrus
18. 10. 2008
TAk, jelikož používám wordpress tak jsem si nainstaloval ContatctForm7 .. a je to vyřešené
Jack
08. 11. 2008
Dobrý den. Používám tento formulář a jsem sním velmi spokojen.Jako jeden z mála je opravdu funkční.
Myslíte, že by se dal ještě trochu obohatit o odeslání IP a času odeslání. Docela by se to hodilo a já stím bohužel nemůžu hnout. Za případnou pomoc děkuji. K.V.
Karel
19. 10. 2009
Já dělal formulář s podporou UTF8. Není to žádná legrace a doporučuji přečíst toto:
http://diskuse.jakpsatweb.cz/?action=vthread&forum=9&topic=2111#3
Jde o to, v hlavičce mailu u každé položky napsat, v jakém je formátování (všude, kde bude něco v utf8, takže třeba subject), potom je tam třeba použít base64 a ještě takový menší skript na to, aby jakási délka nepřesáhla 79 kvůli SpamAssasinu. Info hledejte i na tom diskuzním fóru, tak i u nápovědy pro funkci mail. Držím palce.
Liborse
16. 11. 2009
Tenhle web mi hodně pomohl.
Antonín Rais
25. 02. 2010