Ahoj, vypadá to, že používáte AdBlock... :-)

Usilovně jsme pracovali na zakomponování reklamy, aby nebyla pro čtenáře rušivá. Příjmy z reklam tento web živí, bez nich bychom jej nemohli provozovat. Budeme moc rádi, když to s námi zkusíte a přidáte si nás do výjimek. Děkujeme!

MENU

Kontaktní formulář s CAPTCHA v PHP

Rádi byste si dali na své webové stránky kontaktní formulář a ideálně ještě s ochranou proti spamu CAPTCHA, ale nevíte jak na to? Rozhodl jsem se jeden takový pro Vás připravit. A když už CAPTCHA, tak proč ne přímo taková, jakou má Google?

Kontaktní formulář má 4 políčka – Jméno, E-mail, Text a kontrolu proti spamu. Nijak jsem jej nestyloval, protože vzhled si asi každý upraví následně podle svého gusta.

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
<?php
session_start();
if (!empty($_REQUEST['captcha']))
{
    if (empty($_SESSION['captcha']) || trim(strtolower($_REQUEST['captcha'])) != $_SESSION['captcha'])
    {
        $oznameni= 'Opište prosím správně text z obrázku';
    }
    else
    {
    if($_SERVER["REQUEST_METHOD"] == "POST")
{
// promenne
$jmeno = $_POST["jmeno"];
$email = $_POST["email"];
$txt = $_POST["txt"];
$moje_adresa = "info@pcdays.cz"; // zmente na svoji adresu
$predmet = "Nastavte_svuj_predmet"; // zde nastavite co bude uvedeno v predmetu
$zprava = ("Jméno: " . $jmeno . "\n\n" . "Text: \n" . $txt . "\n\nOdesílatel: " . $email);
// odeslani emailu
mail($moje_adresa,$predmet,$zprava);
 
$oznameni= 'Zpráva byla odeslána';
}
    }
    unset($_SESSION['captcha']);
}
?>
 
<!DOCTYPE HTML>
<html>
<head>
<title>Formulář</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
 
<body>
<div style="margin:20px ">
<form method="post">
<fieldset>
  <legend>Kontaktní formulář</legend>
<table>
    <tr><td colspan="2"><div style="width:300px;background:#ff99ff; margin-bottom:20px"><?php echo $oznameni; ?></div></td>
    <tr><td>Jméno:</td><td><input type="text" name="jmeno" /></td></tr>
    <tr><td>E-mail:</td><td><input type="email" name="email" /></td></tr>
    <tr><td>Zpráva:</td><td><textarea name="txt" cols="50" rows="5"></textarea></td></tr>
    <tr><td colspan="2"><b>Pro zabránění spamu opište prosím text z následujícího obrázku:</b></td></tr>
    <tr><td><input type="text" name="captcha" id="captcha-form" /></td><td><img src="captcha.php" id="captcha" /></td></tr>
    <tr><td colspan="2"><a href="#" onclick="document.getElementById('captcha').src='captcha.php?'+Math.random();
        document.getElementById('captcha-form').focus();"id="change-image">Je obrázek nečitelný? Zkuste jiný!</a></td></tr>
</table>
<input type="submit" value="Odeslat"/>
</fieldset>
</form>
</div>
</body>
</html>
<?php
session_start();
if (!empty($_REQUEST['captcha']))
{
    if (empty($_SESSION['captcha']) || trim(strtolower($_REQUEST['captcha'])) != $_SESSION['captcha'])
	{
        $oznameni= 'Opište prosím správně text z obrázku';
    }
	else
	{
	if($_SERVER["REQUEST_METHOD"] == "POST")
{
// promenne
$jmeno = $_POST["jmeno"];
$email = $_POST["email"];
$txt = $_POST["txt"];
$moje_adresa = "info@pcdays.cz"; // zmente na svoji adresu
$predmet = "Nastavte_svuj_predmet"; // zde nastavite co bude uvedeno v predmetu
$zprava = ("Jméno: " . $jmeno . "\n\n" . "Text: \n" . $txt . "\n\nOdesílatel: " . $email);
// odeslani emailu
mail($moje_adresa,$predmet,$zprava);

$oznameni= 'Zpráva byla odeslána';
}
    }
    unset($_SESSION['captcha']);
}
?>

<!DOCTYPE HTML>
<html>
<head>
<title>Formulář</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

<body>
<div style="margin:20px ">
<form method="post">
<fieldset>
  <legend>Kontaktní formulář</legend>
<table>
	<tr><td colspan="2"><div style="width:300px;background:#ff99ff; margin-bottom:20px"><?php echo $oznameni; ?></div></td>
	<tr><td>Jméno:</td><td><input type="text" name="jmeno" /></td></tr>
    <tr><td>E-mail:</td><td><input type="email" name="email" /></td></tr>
    <tr><td>Zpráva:</td><td><textarea name="txt" cols="50" rows="5"></textarea></td></tr>
    <tr><td colspan="2"><b>Pro zabránění spamu opište prosím text z následujícího obrázku:</b></td></tr>
    <tr><td><input type="text" name="captcha" id="captcha-form" /></td><td><img src="captcha.php" id="captcha" /></td></tr>
    <tr><td colspan="2"><a href="#" onclick="document.getElementById('captcha').src='captcha.php?'+Math.random();
		document.getElementById('captcha-form').focus();"id="change-image">Je obrázek nečitelný? Zkuste jiný!</a></td></tr>
</table>
<input type="submit" value="Odeslat"/>
</fieldset>
</form>
</div>
</body>
</html>

Toto samotné vám ale vlastně k ničemu nebude. K plné funkčnosti totiž budete potřebovat také soubory, které se budou využívat k vytváření CAPTCHA.

Stáhněte si tedy proto raději celou složku s tímto kontaktním formulářem.

Stáhnout

Po stažení si budete muset v souboru index.php upravit na lince 17. vaši emailovou adresu a pak na 18. lince předmět zprávy, která vám bude na email zasílána.

Formulář vypadá takto: 

Kód na ověření proti spamu byl použit z: http://code.google.com/p/cool-php-captcha/

Written by:

Published on: 6.4.2012

Filled Under: Hlavní strana, Vývoj webu

  • Dena

    Prosím o pomoc s tímhle formulářem. Mail odešle, ale chybí v něm písmena s diakritikou. Zkoušela jsem si poradit sama, ale nezvládla jsem to. Poradí mi někdo jak udělat aby maily chodili i s diakritikou? Děkuju

    • Petr Vocelka

      Pokusím se poradit :) Bude to nejspíš chyba někde v kódování, své webové stránky máte na placeném hostingu, nebo využíváte nějaké alternativy zdarma (ic.cz, endora, webzdarma, atd.)?

      • Dena

        Na vyzkoušení to mam na webzdarma a až to bude fungovat s tou diakritikou tak to dam na hosting-zdarma.cz.

        • Petr Vocelka

          Na Webzdarma mají evidentně problém i s emaily od nich samotných, tak asi nemá smysl to zkoušet opravovat :) :
          http://imageshack.us/photo/my-images/825/webzdarma.jpg/
          Doporučil bych používat modernější řešení free hostingů, dovoluji si říct, že Webzdarma je jejich nabízenými službami tak 6 let zpět. Dobré zkušenosti mám třeba s hostováním u Endora.cz.
          Tam mi to funguje bez jediné úpravy kódu a problémů :) :
          http://img195.imageshack.us/img195/4363/endora.jpg

          Snad ti to pomůže ;). Vážně, na Webzdarma se vykašli, jsou s ním akorát nervy, věčně tam něco nefunguje a ještě máš malý prostor. ;)

          • Dena

            Dobře děkuju:-) zkusim to nahrát na to hosting-zdarma.cz a dam vědět jestli se to dobře pošle.

          • Dena

            Nahrála jsem to na hosting-zdarma.cz a zkusila odeslat mail a žádnej nepřišel tak já nevim :-(

          • Petr Vocelka

            Tak to je pech… :( Po pár minutách stále nic nedorazilo? :/

          • Dena

            Pořád nic:-( nechápu to na tom webzdarma to přišlo a na hosting-zdarma.cz nic.

          • Petr Vocelka

            Chvilku jsem „googlil“ a našel možná důvod, proč se Vám email neodeslal. Nemáte náhodou ten nejnižší tarif Start? Ten totiž nepodporuje ani funkci PHP Mail, ani odesílání přes SMTP. :(
            http://www.hosting-zdarma.cz/cz/napoveda-odesilani-e-mailu-z-php

          • Dena

            Je to ten start, ale teď tam mam jinej formulář a ten funguje normálně posílá maily, ale taky bez diakritiky. Tak nechápu proč tenhle tam nejde :-(

          • Petr Vocelka

            Tento je postaven na funkci PHP Mail(), je dost možné, že ten tvůj využívá nějaké jiné metody ;). Zkus změnit kódování na UTF-8 a vyplňovat předmět emailu bez diakritiky (s ní se to pak musí kódovat myslím zas na nějaký base64, nebo tak nějak). ;)

          • Tomáš

            Ahojky prosí pordíš mě také ohledně tohoto formuláře?

  • dena

    kódování mam v UTF-8 a ten formulář co jsem tam měla předtim tak tam fungovala funkce Mail() tak nechápu proč tenhle nejde:-(

    • Petr Vocelka

      Můžeš sem hodit ten kód toho formuláře, co ti tam funguje prosím? :D Takhle se docela špatně radí :D…

  • Dena

    Váš e-mail:

    Předmět:

    Kontrolní otázka:
    = 1 + 1

    <?
    $predmet = $_POST['predmet'];
    $email = $_POST['email'];
    $spam = $_POST['spam'];
    $zprava = $_POST['zprava'];

    if ($predmet!="" and $email!="" and $zprava!="" and $spam=="2")
    {
    Mail("vvvvv@seznam.cz", $predmet, $zprava, "From: " . $email);
    echo "Váše objednávka byla úspěšně odeslána.„;
    }
    else
    {
    echo „Vaší objednávku se nepodařilo odeslat pravděpodobně jste nevyplnili všechny údaje, nebo jste nevyplnili kontrolní otázku.“;
    }
    ?>

  • Dena

    to nahoře je jen formulář, špatně se to zobrazilo :-(

    • Zkus ještě kódování CP1250 (Windows), někdy taky označováno jako „středoevropské jazyky“ a ten předmět bez háčků a čárek, pak už nevidím jediný důvod, proč by ti to nemělo ty české znaky odesílat ;)

      • Dena

        Děkuju za rady:-) já tam právě chtěla dát tenhle formulář, protože tamten je jen s kontrolou 1 + 1, ale zas tenhle tam neodesílá maily:-(

        • Petr Vocelka

          Tak v podstatě se liší jen tou ochranou a pak ve funkci pro odeslání. V tom tvém navíc kolonka FROM:, zkus ji nějak implementovat do toho mého kódu ;).

          tzn. mail($moje_adresa,$predmet,$zprava, „From: “ . $email);

          a do proměnných přidej: $email = „cizi@email.cz“
          – nebo si pak do formuláře hoď nějaké okýnko, které ti pak pošle ten cizí mail. To by asi vypadalo takhle: $email = $_POST[‚email‘];

          Jinak promiň za dlouhé čekání, nějak časově nestíhám :)

  • Lenka Urban Bortlikova

    Ahojte, zaujal mne kontaktni formular s captcha, rada bych si ho vlozila na sve webove stranky. Muzete mi prosim poradit, jak ho aktivovat? HTML jsem vlozila do sve stranky urcene pro kontaktni formular, ale uz nevim, kam mam ulozit index.php a captcha.php a resources. Jestli primo do hlavniho adresare sablony nebo do nejakeho specifickeho adresare? Kdyz by to bylo primo do adresare sablony, tak bych musela prepsat stavajici index.php, coz je asi blbost… Predem dekuji za radu :)

    • pcdays

      Dobrý den, pokud Vám běží stránka pod nějakým redakčním systémem, nemusí být implementace tak snadná.

      Jinak si stačí stáhnout všechny soubory ve složce z odkazu uvedeného ve článku a rozbalit ji. Soubor index.php si klidně přejmenujte třeba na formular.php. Název tohoto souboru nemá na funkčnost vliv.

      Přeji hezký den,

      Petr Vocelka

      • Lenka Urban Bortlikova

        Dekuji za radu, prejmenovala jsem, ale nepomohlo to. Nic se neposila, ani kdyz opisu spatne text pro kontrolu, tak to nezahlasi chybu, ani mi to nenapise, ze zprava byla odeslana. Mail mi neprijde. Jeste jsem se chtela zeptat, kdyz vkladam kontaktni formular do sve stranky v HTML kodu, vkladam tam cely text tak, jak je uvedeny v originalnim index.php? Kdyz to udelam, tak se mi tam zobrazi cast textu z php, viz obrazek…
        Dekuji za Vas cas a trpelivost :)

        • pcdays

          Můžu se prosím zeptat, co používáte za editor?

          • Lenka Urban Bortlikova

            PS Pad. Ale je vse vyreseno. Dekuji za podporu! :)

          • pcdays

            Nemáte vůbec zač :)

  • Dobrý den, poradíte? Zkoušel jsem využít tento kód, ale i po nahrání celé složky se obrázek stále nezobrazuje. Je potřeba upravit nějak i soubor captcha.php? V textu jsem nic nenašl. Díky moc.

  • Pingback: The Jewelry Store()

  • Dzen Chi

    Dobrý den, měl bych dotaz: Jaký je potřeba napsat kód pro přidání povinného souhlasu s osobními údaji nebo smluvními podmínkami. Zkrátka potřebuji, aby se formulář nedal odeslat bez kliknutí na souhlas… Děkuji

    • Dobrý den,

      do formuláře si přidáte checkbox
      http://www.w3schools.com/tags/att_input_checked.asp

      Označíte jej jako required (HTML5), popřípadě pro starší prohlížeče ještě můžete dopsat podporu přes JavaScript. (testováni na straně klienta)

      Po odeslání jej ještě ověříte pomocí PHP (testování na straně serveru). V případě, že nebude souhlas v pořádku, vrátíte uživatli zprávu, aby si políčko zaškrtnul. :-)

      Přeji Vám pěkný den!

      Petr Vocelka