Základním stavebním kamenem každé internetové aplikace jsou (většinou) formuláře, kam mohou uživatelé vkládat svá data, případně svá vyhledávací kritéria apod. Taková data je pak nutné zpracovat požadovaným způsobem. Přestože data jdou zpracovávat i na straně klienta, v drtivé většině se tak děje na straně serveru. My si ukážeme, jak s takovým daty z formuláře pracovat v ASP.

Formuláře se tvoří běžným HTML tagem <FORM> … </FORM>. Pro nás nejdůležitějšími parametry tagu FORM jsou ACTION a METHOD. Popíšeme si je:

ACTION

Obsahem tohoto parametru je jméno stránky (skriptu), kam budou data odeslána po stisknutí tlačítka Odeslat (Submit). Pokud chceme, aby se naše data odesílala např. do skriptu zpracuj.asp, uvedeme parametr v tomto tvaru: … ACTION=“zpracuj.as …“

METHOD

Tento parametr určuje, jakým způsobem budou data na server odeslána. Tyto způsoby (metody) existují dva:

GET odesílá data pomocí URL adresy. Tzn. data se zakódují určitým způsobem a takto zakódovaná jsou přidána za konec adresy stránky, kam je odesíláme. To jsou ony známé zdánlivé chaotické řetězce, které jsou v adresách stránek na zpravodajských serverech, v internetových obchodech apod. Pokud se podíváte na adresu tohoto článku na Intervalu, také uvidíte něco ve smyslu http://www.interval.cz/r-article.asp?id=505. Ta část za otazníkem jsou právě data předávaná metodou GET. Jak vidíte, data jsou od adresy oddělena znakem ?. Pokud předáváte více jak jeden parametr (více jak jedno políčko formuláře) jsou jednotlivé parametry od sebe odděleny znakem &. Řádek s parametry pak vypadá třeba takto: zpracuj.asp?param1=hodnota1&param2=hodnota2&param3=hodnota3 Param1, param2 a param3 by v našem případě byly názvy formulářových polí a za nimi je znaménko rovná se a text (hodnota) vyplněná do takového políčka. Množství předávaných dat je u metody GET omezena na přibližně 4 kB. Pochybuji ale, že by někdo chtěl, aby jeho aplikace generovala přes čtyři tisíce znaků dlouhé URL :) Pro takové aplikace je mnohem vhodnější metoda POST.

POST se od metody GET liší tím, že nepředává data nijak viditelně, ale přenáší je pomocí hlaviček, které předcházejí každému HTML dokumentu předanému prohlížeči. Data jsou předána „skrytě“. Délka dat předávaných metodou POST je čistě teoreticky neomezená.

Pokud nevíte, jako metodu předávání si máte vybrat, nezoufejte. Časem přijdete na to, která metoda je nejlepší pro vaše účely. Někdy je vhodnější GET někdy POST. GET má výhodu v tom, že předávaná data jsou součástí URL a tudíž jde takové URL zkopírovat a poslat třeba kamarádovi emailem. Pokud se vám tedy líbí na Intervalu nějaký článek, zkopírujete z adresního řádku prohlížeče jeho URL a vložíte do emailu pro kamaráda. Přestože takové URL ukazuje pořád na tu stejnou stránku http://www.interval.cz/r-article.asp, redakční systém z parametru za tím pozná, který článek chcete číst. Pokud je tedy na konci třeba ?id=515, vyzvedne redakční systém z databáze článek číslo 515 a zobrazí vám ho.

Tato výhoda metody GET je současně i její nevýhodou. Jde o to, že by si uživatel mohl takto zobrazit i údaje, které by vidět neměl. Může se pokusit podvrhnout vaší aplikaci falešné hodnoty. Představte si například systém pro správu osobních dat uživatelů. Uživatel si prohlíží svoje údaje a v adresním řádku vidí třeba takové URL:

http:/www.personalistika.cz/zobraz_uzivatele.asp?id=23

Chytrý uživatel si domyslí, že má pořadové číslo 23 a mohlo by ho začít zajímat, kdo je třeba číslo 25. Tak prostě přepíše v prohlížeči v adrese příslušnou hodnotu a je to. Aplikace mu zobrazí data, která mu nepatří. Pak je na aplikaci, aby takovýmto „podvrhům“ zabránila. Metoda GET je tedy vhodná pro jakousi parametrizaci stránky. Hodí se v místech, kde chcete, aby ASP stránka s takovými parametry šla volat nejenom pomocí odeslání dat z formuláře, ale například pouhým odkazem (třeba kliknutím na obrázek) nebo vypsáním celého URL do adresního řádku prohlížeče. V ostatních případech je podle mě vhodnější metoda POST, ale je to na zvážení každého z vás.

Jak získat data z formuláře

Pro každou z výše popsaných metod odesílání formulářových dat existuje v ASP různý způsob jejich získávání. V ASP existuje objekt Request. Tento objekt obsahuje celkem pět kolekcí, pro nás jsou však důležité zatím pouze dvě z nich. Jsou to kolekce Form a kolekce QueryString. Kolekce Form obsahuje data předaná metodou POST, kolekce QueryString data předaná metodou GET. Data získáme takovýmto způsobem:

pro metodu POST
strHodnota = Request.Form(„jmeno_formularoveho_pole“)
nebo pro metodu GET
strHodnota = Request.QueryString(„jmeno_formularoveho_pole“)

Tímto způsobem načteme do proměnné strHodnota obsah příslušného formulářového pole. Ukážeme si to na konkrétním a krátkém příkladu. Máme dvě stránky formular.htm a zpracuj.asp. První bude obsahovat formulář, kam uživatel zadá své jméno, druhá bude obsahovat ASP kód, který tato data načte a vypíše nám je na obrazovku.

formular.htm:

<html>
<head>
  <title>Zpracovani formulare v ASP</title>
  <meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<p><b>Zadej jmeno a prijmeni a stiskni tlacitko odeslat.</b></p>
<form name="formular" method="post" action="zpracuj.asp">
  Jmeno: <input type="text" name="jmeno"><br>
  Prijmeni: <input type="text" name="prijmeni"><br><br>
  <input type="submit" name="odeslat" value="Odeslat a zobrazit vysledek">
</form>
</body>
</html>

Druhá stránka bude obsah vlastní kód, který načte zadané hodnoty a vypíše je na obrazovku (resp. do prohlížeče):

zpracuj.asp:

<% Option Explicit %>
<html>
<head>
  <title>Zpracovani formulare</title>
  <meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<p>Hodnoty ziskane z formulare:</p>
<%
Dim strJmeno, strPrijmeni
strJmeno = CStr( Request.Form("jmeno") )
strPrijmeni = CStr( Request.Form("prijmeni") )
Response.Write "Jmeno: " & strJmeno & "<br>"
Response.Write "Prijmeni: " & strPrijmeni & "<br>"
%>
</body>
</html>

Pokud si tyto dvě stránky uložíte na svůj internetový server (s podporou ASP, samozřejmě) a vyzkoušíte, uvidíte, jak se hodnoty předávají pomocí formuláře mezi stránkami. Pokud byste chtěli na stránce formular.htm použít metodu GET pro předávání dat, musíte ve stránce zpracuj.asp nahradit Requet.Form za Request.QueryString.

Pokud vám připadá použití dvou různých způsobů čtení dat matoucí, můžete použít prostě jenom Request(„jmeno_prvku“), ale důrazně vám to nedoporučuji. Proč? Protože je to:

  • pomalé – ASP totiž v tomto případě neví, v jaké kolekci má hodnotu vyhledat a tudíž prohledává postupně všechny dostupné kolekce. Kolekce prohledává v pořadí QueryString, Form, Cookies, ClientCertifikate, ServerVariables. My jsme si zatím povídali pouze o prvních dvou, důležité však je, že víte, že je to pomalé a proto je lepší určit, zda chcete načítat data odeslaná pomocí POST nebo GET.
  • nebezpečné – právě proto, že se prochází nejprve kolekce QueryString a pak teprve Form, může vám někdo velmi jednoduše zfalšovat data, předaná aplikaci prostě tím, že do URL stránky dopíše třeba jmeno=Pepa_z_Depa. Protože data z URL dostanou přednost, naplní se vaše proměnná hodnotou z URL, přestože jste třeba ve formuláři používajícím POST vyplnili něco úplně jiného.

To bylo v krátkosti něco o zpracování formulářů. Příště si můžeme ukázat, jak se zpracovávají různé formulářové prvky (checkbox, radio-button a select atd.), jak nenutit uživatele neustále vyplňovat formuláře znovu a znovu, jak kontrolovat chyby ve formulářích a spoustu dalších užitečných věcí.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět