V předchozím článku o tvorbě ankety jsem podrobně probral návrh databáze pro vytvoření aplikace, která umožní na vašich stránkách zobrazovat vlastní ankety. Dnes se podrobně podíváme, jak tuto databázi naplníme jednotlivými anketami.

Možnosti plnění databáze

Pro naplnění databáze se nabízejí dvě možnosti (uvažuji pouze o platformě Microsoft, na jiných platformách jsou možnosti principielně podobné):

  1. Naplnit databázi ručně pomocí prostředků pro správu databáze (v případě MS SQL serveru je to SQL Server Enterprise Manager) – Vhodná pro jednorázové zadání ankety. Tato možnost sebou nese několik značných nevýhod, které v zásadě vylučují její použití běžným uživatelem.
    • Je nutné mít nainstalován vývojový nástroj pro příslušnou databázi
    • Komunikace s cílovou databází je po Internetu velmi pomalá
    • Ten, kdo vkládá data tímto způsobem musí být seznámen se strukturou databáze a musí vědět jak jednotlivá zadaná data spolu souvisejí.
  2. Napsat si ASP aplikaci, pomocí které budeme mít možnost kompletně spravovat ankety – tato možnost má oproti předchozí množství výhod:
    • Možnost vkládat data odkudkoliv – bez ohledu na platformu.
    • Ten kdo vládá data, nemusí o vnitřní struktuře vědět naprosto vůbec nic.
    • Ke správě anket je použit prohlížeč a není tedy nutné instalovat jakýkoliv další software

Jak jistě sami vidíte, pro další použití je naprosto nejvhodnější použít variantu číslo 2, neboť jejím použitím získáte řešení, které je nezávislé na platformě a nevyžaduje nákup a instalaci dalšího programového vybavení.

Vkládání nové ankety

Pro vstup dat od uživatele a jejich následné vložení do databáze budeme potřebovat:

  1. Formulář, který bude obsahovat položky pro datum zahájení a konce ankety a také formulář pro vlastní anketní otázku
  2. ASP skript, který formulář zpracuje, uloží data do databáze a předá řízení stránce na které se budou vkládat možné odpovědi na anketní otázku.

Takto by měl vypadat formulář, pomocí kterého budeme vkládat ankety pro uložení do databáze:

 Datum zahájení ankety:
 Datum ukončení ankety:
 Anketní otázka:
  

Data z formuláře jsou odeslána pomocí metody POST skriptu, který je zpracuje (podrobně je zpracování formulářů popsáno v článku Zpracování formulářů pomocí ASP). Formulář se zpracujeme pomocí metody Request.Form a také provedeme kontrolu správného vyplnění jednotlivých položek. Kontrolu bude provádět u položek „datum_zahájeni“ a „datum_ukonceni“ a to tak, že otestujeme, zda-li jsou typu datum a a zároveň zda-li „datum_zahajeni“ je menší než datum_ukonceni. Dalším testem, který by neměl chybět, je kontrola toho, zda-li byla vyplněna anketní otázka (je zcela na vás, jakou si zvolíte minimální délku anketní otázky – já si zvolil 5 znaků).

Následující kód umístněte do souboru pridejanketu.asp.

<!–#include FILE=“connect.asp“–>
<%
dim sql,rs
datum_zahajeni=Request.Form(„datum_zahajeni“)
datum_ukonceni=Request.Form(„datum_ukonceni“)
anketni_otazka=Request.Form(„anketni_otazka“)
If IsDate(datum_zahajeni) and IsDate(datum_ukonceni) and len(anketni_otazka)>5 and DateDiff(„d“,datum_zahajeni,datum_ukonceni)>0 Then
   ‚tato část se provede v případě, že všechny položky jsou správně vyplněné
   If isConnectDB() Then‚ ‚Pomocí funkce isConnectDB() zkusíme otevřít databázi
   ‚kod pro databázi SQL, který se provede v případě úspěšného otevření databáze
      sql=“Set nocount on INSERT INTO redaction_anketa_otazky (datum_start,datum_konec,otazka) values(„&datum_zahajeni&“,“&datum_ukonceni&“,“‚&anketni_otazka&“‚) SELECT @@IDENTITY as idc “ ‚ Vytvoříme SQL dotaz
      set rs=ObjConn.Execute(sql) ‚Provedeme SQL dotaz
      idankety=rs(„idc“)‚zjistíme ID právě vložené ankety
      rs.close ‚Zavřeme výsledek dotazu
      disconnect()‚ukončíme spojení na databázi
      Response.Redirect(„odpovedi.ASP?id=“&idankety) ‚A přesměrujeme na vkládání odpovědí – konec kódu pro SQL databázi
   else
      ‚kod, který se provede v případě neúspěšného otevření databáze
      Response.Write(„Nepodařilo se otevřít databázi“)
    end if else
   ‚tato část kódu se provede v případě, že některá z položek není správně vyplněna, v našem případě zobrazíme formulář
%>
<form method=“POST“ action=““>
<table cellspacing=“0″ cellpadding=“1″ border=“0″ bgcolor=“black“>
<tr><td>
<table border=“0″ cellspacing=“0″ cellpadding=“2″ align=“center“ bgcolor=“white“>
<tr>
  <td class=“texttabulka“> Datum zahájení ankety: </td>
  <td><input type=“text“ name=“datum_zahajeni“></td>
</tr>
<tr>
  <td class=“texttabulka“> Datum ukončení ankety: </td>
  <td><input type=“text“ name=“datum_ukonceni“></td>
</tr>
<tr>
  <td class=“texttabulka“> Anketní otázka: </td>
  <td><input type=“text“ name=“anketni_otazka“></td>
</tr>
<tr>
  <td colspan=“2″><input type=“submit“ value=“Uložit“>  <input type=“reset“ value=“Vymazat“></td>
</tr>
</table>
</td></tr></table></center>
</form>
<%
end if
%>

Data z tohoto formuláře jsou zpracována pomocí souboru pridejanketu.asp, skript po odeslání formuláře tedy „volá“ sám sebe.

Výše uvedené funkce isConnectDB() a disconnect() nejsou standardními funkcemi, ale jedná se o pomocné funkce pro připojení do databáze. Popis této funkce najdete v článku ASP, databáze a objekt Connection.

Pozorný čtenář možná bude mít otázku „Co znamená konstrukce SELECT @@IDENTITY AS ‚Identity‘ v dotazu, pomocí kterého vkládáme data do databáze?“. Pokusím se na odpovědět. Pomocí této konstrukce lze v databázi SQL zjistit obsah položky, která má vlastnost IDENTITY. Bohužel tento postup nebude bez několika jednoduchých úprav fungovat v databázi MS Access a pro tuto databázi musíte použít tuto část zdrojového kódu a nahradit tu původní:

sql=“INSERT INTO redaction_anketa_otazky (datum_start,datum_konec,otazka) values(„&datum_zahajeni&“,“‚&datum_ukonceni&“‚,“‚&anketni_otazka&“‚)‚Vytvoříme SQL dotaz
Set rs=ObjConn.Execute(sql)‚Provedeme SQL dotaz
sql=“SELECT TOP 1 FROM redaction_anketa_otazky ORDER BY idanketa DESC‚Vytvoříme SQL dotaz
Set rs=ObjConn.Execute(sql)‚Provedeme SQL dotaz
idankety=rs(„idanketa“‚)‚zjistíme ID právě vložené ankety
rs.close‚Zavřeme výsledek dotazu
disconnect()‚ukončíme spojení na databázi
Response.Redirect(„odpovedi.ASP?id=“&idankety)‚A přesměrujeme na vkládání odpovědí

Dokončili jsme skript pro vkládání anketních otázek, skript nás vložení otázky automaticky přesměruje na stránku pro vkládání odpovědí, ale prohlížeč nám v této chvíli oznámí, že požadovanou stránku nenalezl. Ano, je to tak, tato stránka ještě neexistuje a proto to hned v následujícím odstavci napravíme.

Vkládání odpovědí pro anketu:

Na stránce pro vkládání odpovědí provedeme několik kroků, pomocí kterých dostaneme požadovaný výsledek:

  • Z databáze načteme a zobrazíme informace o anketě (datum zahájeni, datum ukončení a vlastní anketní otázku)
  • Z databáze načteme a zobrazíme případně již vložené odpovědi na anketní otázku
  • Zpracujeme data odeslaná formulářem pro vkládání odpovědí a vložíme je do databáze
  • Pokud je to požadováno, zobrazíme formulář pro vložení další odpovědi, v opačném případě přesměrujeme na stránku se souhrnem ankety.

Nyní si připravíme formulář pro vkládání odpovědí. Položku, do které budeme vkládat odpovědi nazveme „odpoved“ a stanovíme si podmínku, že při jejím nevyplnění ukončíme zadávání ankety.

 Číslo ankety:   
 Odpověd na otázku:   
  

Pole formuláře pro zadávání čísla ankety je pro názornost viditelné a pouze pro čtení (readonly), ale pro běžné použití doporučuji toto pole nastavit jako hidden (skryté). Pokud není odpověď vyplněna, ukončíme zadávání odpovědí a přesměrujeme na stránku se souhrnnými informacemi o anketě (soubor odpovedi.asp):

<!–#include FILE=“connect.asp“–>
<%
dim id,rs
id=Request.QueryString(„id“) ‚Z parametru předaného v URL si načteme číslo ankety
If isConnectDB() Then
   sql=“SELECT * FROM redaction_anketa_otazky WHERE idanketa=“&id
   Set rs=ObjConn.Execute(sql)
   if rs.eof and rs.bof then ‚Taková anketa neexistuje
      disconnect()
      Response.Redirect(„ankety.ASP“)
   end if
   response.write(rs(„datum_start“)&“ „&rs(„datum_konec“)&“ „&rs(„otazka“))
   Response.write(„<hr>“)
   rs.close
   sql=“SELECT * FROM redaction_anketa_odpovedi WHERE idanketa=“&id
   Set rs=ObjConn.Execute(sql)
   do while not rs.eof
      response.write(rs(„odpoved“))
      Response.write(„<br>“)
      rs.movenext
   loop
   disconnect()
end if
%>
<div align=“center“><form method=“POST“ action=“pridejodpoved.asp“>
<table cellspacing=“0″ cellpadding=“1″ border=“0″ bgcolor=“black“>
<tr><td>
<table border=“0″ cellspacing=“0″ cellpadding=“2″ width=“100%“ bgcolor=“white“>
<tr>
<td class=“texttabulka“> Číslo ankety: </td>
<td class=“texttabulka“><input type=“text“ name=“idankety“ readonly> </td>
</tr>
<tr>
<td class=“texttabulka“> Odpověd na otázku: </td>
<td class=“texttabulka“><input type=“text“ name=“odpoved“> </td>
</tr>
<tr>
<td colspan=“2″ lass=“texttabulka“><input type=“submit“ value=“Uložit“ id=submit1 name=submit1>  <input type=“reset“ value=“Vymazat“ id=reset1 name=reset1></td>
</tr>
</table>
</td></tr></form></table>

Skript pro zpracování údajů z formuláře

Formulář pro přidání odpovědí v anketě je zpracován pomocí souboru pridejodpoved.asp, který obsahuje tento uvedený kód:

<!–#include FILE=“connect.asp“–>
<%
id=Request.Form(„idankety“)
odpoved=trim(Request.Form(„odpoved“))
If Len(odpoved)> 0 Then
   If isConnectDB() Then
       sql=“insert into redaction_anketa_odpovedi (idanketa,odpoved,pocet) values („&id&“,“‚&odpoved&“‚,0)“
      Set rs=ObjConn.Execute(sql)
      disconnect()
      Response.Redirect(„odpovedi.ASP?id=“&id)‚A přesměrujeme na vkládání odpovědí
   End if
Else
   Response.redirect(„ankety.ASP?id=“&id)‚protože nebyla zadána žádná odpověď končíme s vkládáním dat
End If
%>

Zobrazení seznamu anket

Poslední ASP, které je potřeba pro dnešní díl naší ankety, je soubor ankety.ASP, který si nyní si nyní vytvoříme – ten bude hlavně sloužit pro zobrazení přehledu definovaných anket. Soubor ankety.asp má dva významy:

  • Pokud je „voláno“ bez parametru, zobrazí seznam anket v databázi
  • Pokud je „voláno“ s parametrem, zobrazí informace o anketě, která jejíž ID odpovídá příslušnému parametru
<!–#include FILE=“connect.asp“–>
<%
dim id,rs
id=Request.QueryString(„id“)‚Z parametru předaného v URL si načteme číslo ankety
if id>0 then
   If isConnectDB() Then
      sql=“SELECT * FROM redaction_anketa_otazky WHERE idanketa=“&id
      Set rs=ObjConn.Execute(sql)
      if rs.eof and rs.bof then ‚Taková anketa neexistuje
         disconnect()
         Response.Redirect(„ankety.ASP“)
      end if
      response.write(rs(„datum_start“)&“ „&rs(„datum_konec“)&“ „&rs(„otazka“))
      Response.write(„<hr>“)
      rs.close
      sql=“SELECT * FROM redaction_anketa_odpovedi WHERE idanketa=“&id
      Set rs=ObjConn.Execute(sql)
      do while not rs.eof()
         response.write(rs(„odpoved“))
         Response.write(„<br>“)
         rs.movenext
      loop
      disconnect()
   end if
else
   If isConnectDB() Then
      sql=“SELECT * FROM redaction_anketa_otazky
      Set rs=ObjConn.Execute(sql)
      do while not rs.eof()
         response.write(rs(„datum_start“)&“ „&rs(„datum_konec“)&“ „&rs(„otazka“))
         Response.write(„<hr>“)
         rs.movenext
      loop
      disconnect()
   end if
end if
%> <a href=“pridejanketu.asp“>Přidat novou anketu</a>

Tímto krokem jsme dokončili tvorbu modulu pro zadávaní anket a ke konci článku si nyní provedeme shrnutí všeho, co máme doposud hotovo. Máme tedy připraven soubor pridejanketu.asp, které zobrazí formulář pro přidání ankety a který také zpracuje obsah tohoto formuláře. Další je soubor odpovedi.asp – zobrazuje formulář pro přidání odpovědí pro anketu. Data z tohoto formuláře jsou zpracovávána pomocí souboru pridejodpoved.ASP. Ve zdrojových kódech je „includován“ soubor connect.ASP, který obsahuje funkci pro připojení k databázi a následnému uzavření spojení do databáze. Pokud nevíte, co má být jeho obsahe, čtete článek ASP, databáze a objekt Connection. Posledním souborem, jehož obsah jsem dnes popisoval, je soubor ankety.asp, pomocí kterého zobrazíme seznam definovaných anket.

Příště si ukážeme, jak anketu zobrazit na stránce a jak umožnit návštěvníkům hlasovat. Na závěr vám ještě nabídku kompletní zdrojové kódy ke stažení. Doufám, že se vám článek líbil.

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

Odpovědět