Příklad webového formuláře odesílaného na mail metodou POST
Ukázka webového formuláře, obsahujícího běžné položky sloužící k identifikaci odesílatele (mail, event. jméno), předmět a vlastní text zprávy. Mimoto má pisatel možnost zatrhnout si políčko, díky němuž dostane kopii své zprávy i na svou zadanou mailovou adresu.
V tomto provedení je kontrola správnosti vyplněných polí ošetřena pouze pomocí PHP - tj. bez prvotního ověření Javascriptem. Při pokusu o odeslání např. prázdného formuláře se nevypsaná a přitom nutná políčka obarví červeně a nad nimi se zobrazí vysvětlující text, taktéž červenou barvou. Formulář si pamatuje již vyplněná pole a dožaduje se doplnění pouze chybějících - možno níže vyzkoušet a na zdrojový kód se podívat »sem«.
Je maximálně důležité, aby tzv. session byla nastartována ještě před jakýmkoli výpisem na stránce, což je i např. vypsání Doctype. Mimoto je potřeba konkrétně u statických stránek (kdy každá obsahuje Doctype) vložit php kód vypisující obsah session až kamkoli do těla Body pod Doctype, aby nebyl opuštěn standardní režim prohlížeče. Při vkládání stránek pomocí parametrů je výpis pod Doctype vždy.
<?php
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
a další meta tagy, podmíněné komentáře, připojení stylu apod.
...
...
</head>
<body>
<?php
if (isset($_SESSION["zprava"]))
{
echo $_SESSION["zprava"];
unset ($_SESSION["zprava"]);
}
?>
<form name="webovy" action="formular-zpracuj.php" method="post">
...
...
</body>
</html>
Ukázku zpracujícího php skriptu najdete »zde«. Protože je požadováno zadat několik nezbytných údajů (bez mailové adresy by se těžko odpovídalo), jsou chybové hlášky o nevyplněných anebo nesprávně vyplněných políčkách ukládány do pole: každé nutné vyplňovací políčko má své vlastní chybové oznámení a to se při pokusu o odeslání zobrazí u příslušného formulářového prvku INPUT. Odesilatel se tak lépe orientuje, kde se třeba ukliknul.
Protože je ale nadmíru užitečné kontrolovat vstupní hodnoty zadané uživatelem ještě před odesláním na server, přihlásí se o své slovo JavaScript. Kontrola pomocí tohoto klientského skriptovacího jazyka je snadná a příklad jeho aplikace na ověřování formuláře se nachází »tady«.
Zdrojový kód zpracujícího skriptu
<?php
session_start();
/* *************** diskuse.jakpsatweb.cz *** PHP FAQ ********************** */
function autoUTF($s)
{
// detect UTF-8
if (preg_match('#[\x80-\x{1FF}\x{2000}-\x{3FFF}]#u', $s))
return $s;
// detect WINDOWS-1250
if (preg_match('#[\x7F-\x9F\xBC]#', $s))
return iconv('WINDOWS-1250', 'UTF-8', $s);
// assume ISO-8859-2
return iconv('ISO-8859-2', 'UTF-8', $s);
}
function cs_mail ($to, $predmet, $zprava, $head = "")
{ $predmet = "=?utf-8?B?".base64_encode(autoUTF ($predmet))."?=";
$head .= "MIME-Version: 1.0\n";
$head .= "Content-Type: text/plain; charset=\"utf-8\"\n";
$head .= "Content-Transfer-Encoding: base64\n";
$zprava = base64_encode (autoUTF ($zprava));
return mail ($to, $predmet, $zprava, $head); }
/* ********************************************************************** ** */
$nick = $_POST["nick"];
$email = $_POST["email"];
$predmet = $_POST["predmet"];
$zprava = $_POST["zprava"];
$spam = $_POST["spam"];
$poslano = $_POST["poslano"];
$predmet2 = "Neodpovídejte prosím";
$nick = stripslashes($nick); /*odstraní zpětná lomítka*/
$email = stripslashes($email);
$predmet = stripslashes($predmet);
$zprava = stripslashes($zprava);
$nick = htmlspecialchars($nick);
$email = htmlspecialchars($email);
$predmet = htmlspecialchars($predmet);
$zprava = htmlspecialchars($zprava);
if ($_POST["poslano"])
//kontrola všech vložených údajů
{
$chyba = array();
if(!isset($_POST["email"]) || preg_match("/^[\s]*[a-zA-Z]+[0-9]*[\.]?[^\s\.@]
+@[^\s\.@]+[.][a-zA-Z]{2,4}$/", $_POST["email"]) == 0)
$chyba[0] = "Zadejte prosím emailovou adresu ve správném tvaru:";
if ($predmet == "" || preg_match("/^[\s]+$/", $_POST["predmet"]))
$chyba[1] = "Napište prosím předmět zprávy:";
if ($spam != 12)
$chyba[2] = "Vyplňte prosím správné číslo:";
if ($zprava == "" || preg_match("/^[\s]+$/", $_POST["zprava"]))
$chyba[3] = "Nezapomněli jste napsat samotnou zprávu?";
if (mb_strlen($_POST["zprava"], 'utf-8') > 300)
$chyba[4] = "Zpráva se odešle v této maximální délce.
Jestli Vám vyhovuje, klikněte prosím na \"Odeslat zprávu\"";
if ((empty($chyba)) and (strlen($_POST["zprava"] <= 300)))
{
cs_mail("moje_jmeno@email.cz", $predmet, "$nick\n".$zprava, "From: $email\n");
header("location: http://www.psikusy.zlatberry.cz/php/formular-zpracuj/");
$_SESSION["zprava"] = "<h4 id='vysledek'>Zpráva byla úspěšně odeslána</h3>";
}
if (isset($_POST["kopie"]) == "ano"
and (empty($chyba)) and (strlen($_POST["zprava"] <= 300)))
{
cs_mail($email, $predmet2, "Z formuláře na webu moje_domena.cz jste odeslali
tuto zprávu:\n----------------\n\n $zprava", "From: no-reply@moje_domena.cz\n");
header("location: http://www.psikusy.zlatberry.cz/php/formular-zpracuj/");
$_SESSION["zprava"] = "<h4 id='vysledek'>Zpráva byla úspěšně odeslána<br>
Zpráva byla odeslána i na Vaši adresu</h3>";
exit;
}
}
if (!$poslano || $chyba)
{
?>
<form name="webovy" action="/php/formular-zpracuj/" method="post">
<h2 id="napiste">Webový formulář:</h2>
<span id="omez">
(do zprávy je povoleno vepsat nebo vložit maximálně 300 znaků!)</span>
<label for="nick">
Vaše jméno nebo přezdívka:</label>
<input type="text" size=25 name="nick" id="nick" value="<?php echo $nick ?>"><br>
<?php if(!empty($chyba[0]))
echo "<span class='error'>".$chyba[0]."</span>"; ?>
<label for="email"><font color=red>*</font>
Váš email:</label>
<input <?php if(!empty($chyba[0]))
echo "style='background-color: #ffcc99;'"?> type="text" size=25 name="email" id="email"
value="<?php echo $email ?>"><br>
<?php if(!empty($chyba[1]))
echo "<span class='error'>".$chyba[1]."</span>"; ?>
<label for="predmet"><font color=red>*</font>
Předmět zprávy:</label>
<input <?php if(!empty($chyba[1]))
echo "style='background-color: #ffcc99;'" ?> type="text"
size=25 id="predmet" name="predmet" value="<?php echo $predmet ?>"><br>
<p id="spambot">Ochrana před spambotem - doplňte prosím výsledek (číslo):</p>
<?php if(!empty($chyba[2]))
echo "<span class='error'>".$chyba[2]."</span>"; ?>
<label for="spam"><font color=red>*</font>čtyři krát tři</font></label>
<input <?php if(!empty($chyba[2])) echo "style='background-color: #ffcc99;'"?>
type="text" size=10 name="spam" id="spam" value="<?php echo $spam ?>"><br>
<p id="psani"><label for="zprava"><font color=red>*</font>
Text Vaší zprávy:</label><br>
<?php if(!empty($chyba[3]))
echo "<span class='error'>".$chyba[3]."</span>";?>
<?php if(!empty($chyba[4]))
echo "<span class='error-zpr'>".$chyba[4]."</span>";?><br>
<textarea name="zprava" id="zprava"><?php if(isset($_POST["zprava"]))
echo mb_substr($_POST["zprava"], 0, 300, 'utf-8'); ?></textarea></p><br>
<p><input type="checkbox" name="kopie" id="checked"
<?php if(isset($_POST["kopie"]))
echo "checked" ?>>Poslat si zprávu i na zadaný email</p><br>
<input type ="submit" name="poslano" id="poslano" value="Odeslat zprávu"><br>
<h5 class="hvezdicka">
Políčka s <font color=red>červenou *</font> je nutné vyplnit</h5>
</form>
<?php
}
?>