Grafika publishing webtip.cz grafika.cz mujiPod.cz mujmac.cz fotografovani.cz printing.cz builder.cz galerie
webtip.cz
adresář  | práce  | diskuse  | redakce  | inzerce
 
 


  ASP v praxi, 4. díl - Anketa
o autorovi 
poslat mailem 
tisknout článek 
aktuální rubrika 
Ve čtvrtém pokračování seriálu ASP v praxi vytvoříme již "plnohodnotnou" anketu. Návštěvník bude mít možnost si vybrat odpověď na zobrazenou anketní otázku.

Liška Adam - 03.01.2003 - clanek - Rubrika: ASP
Předchozí díl: ASP v praxi, 3. díl - Hodnotíme články
Seriál: 
Následující díl: ASP v praxi, 5. díl - Anketa (2.)

Nedílnou součástí mnoha webů je také - vedle možnosti hodnocení článků - anketa s otázkou a několika možnými odpověďmi. V tomto díle tuto anketu vytvoříme. Představit si ji určitě dokážete - jako funkční příklad můžete použít anketu v pravém sloupci zde na Webtipu.

Nejdříve navrhneme tabulku. Bude se jmenovat ankety a uložíme ji do stejné databáze jako tabulku s hodnocením článků. Struktura tabulky bude následující:

Název pole Datový typ Poznámka
ID automatické číslo primární klíč
otazka text Zde budeme uchovávat text otázky
odp1 text Text první odpovědi
odp2 text Text druhé odpovědi
odp3 text Text třetí odpovědi
odp4 text Text čtvrté odpovědi
poc1 číslo Počet hlasujících pro odpověď 1
poc2 číslo Počet hlasujících pro odpověď 2
poc3 číslo Počet hlasujících pro odpověď 3
poc4 číslo Počet hlasujících pro odpověď 4

Ze struktury tabulky vyplývá, že otázky budou vždy čtyři.

Aplikace se bude skládat ze dvou souborů - anketa.asp a zapis.asp. Začneme tím prvním, který anketu zobrazuje. Po zpracování bude v prohlížeči vypadat takto:

Hlavní částí souboru je zobrazení červeného pruhu. Vytvoříme jej pomocí obrázku o velikosti 1x1px, který budeme dle podílu počtu hlasujících pro jednotlivé odpovědi zvětšovat. Jako maximální délku pruhu (u tagu img značena jako šířka - width) si určíme 100px. Je-li tedy podíl odpovědi např. 0,5, bude délka příslušného pruhu 50px.

Prvním krokem při vytváření délky tohoto pruhu je součet všech hlasujících:

celkem = rs("Poc1") + rs("Poc2") + rs("Poc3") + rs("Poc4")

Podíl první odpovědi na celkovém počtu hlasů se zjistí takto (u dalších odpovědí je postup zcela identický):

rs("Poc1"))/celkem

Získali jsme číslo od nuly do jedničky. Toto číslo vynásobíme stovkou, což je maximální délka pruhu v pixelech (tuto délku má odpověď jen v případě, že pro ní hlasovali všichni návštěvníci). Tím dostaneme délku pruhu pro první odpověď:

(rs("Poc1"))/celkem) * 100

Jelikož výsledkem bude číslo desetinné, zaokrouhlíme jej pomocí funkce Int:

int((rs("Poc1")/celkem) * 100)

Vše nakonec přiřadíme příslušné proměnné:

intSirka1 = int((rs("Poc1")/celkem) * 100)

Neboť jsme si maximální délku pruhu určili 100px, bude proměnná intSirka1 zastupovat i počet procent pro příslušnou odpověď.

Následujícím způsobem zobrazíme pruh pomocí obrázku ank.gif, kde jako výšku dosadíme 5px a jako délku (délku) proměnnou intSirka1:

<img src="ank.gif" width=<%= intSirka1 %> height="5" border="0">

Teď musíme z pruhu vytvořit odkaz, pomocí kterého budou návštěvníci hlasovat:

<a href="zapis.asp?ID=1"><%= rs("Odp1")%><br>
<img src="ank.gif" width=<%= intSirka1 %> height="5" border="0"></a>&nbsp;&nbsp;(<%= intSirka1 %>%)<br>

Celý zdrojový kód souboru anketa.asp je následující:

<%
' Nastavení platnosti stránky
response.expires = -1000
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "ankety"
' Vybrání ankety - jako aktuální je brána anketa
' s nejvyšším ID
rs = conn.execute("SELECT * FROM ankety ORDER BY ID Desc")
celkem = rs("Poc1") + rs("Poc2") + rs("Poc3") + rs("Poc4")
If celkem > 0 Then
' Pokud někdo hlasoval...
intSirka1 = int((rs("Poc1")/celkem) * 100)
Else
' Nikdo nehlasoval, hodnotu nastavíme automaticky...
intSirka1 = 0
End If
If celkem > 0 Then
intSirka2 = int((rs("Poc2")/celkem) * 100)
Else
intSirka2 = 0
End If
If celkem > 0 Then
intSirka3 = int((rs("Poc3")/celkem) * 100)
Else
intSirka3 = 0
End If
If celkem > 0 Then
intSirka4 = int((rs("Poc4")/celkem) * 100)
Else
intSirka4 = 0
End If
%>

<html>
<head>
<title>Anketa</title>
</head>
<body>
<b><%= rs("otazka")%></b>
<p>
<!-- Vypsání odkazů a pruhů -->
<a href="zapis.asp?ID=1"><%= rs("Odp1")%><br><img src="ank.gif" width=<%= intSirka1 %> height="5" border="0"></a>&nbsp;&nbsp;(<%= intSirka1 %>%)<br>
<a href="zapis.asp?ID=2"><%= rs("Odp2")%><br><img src="ank.gif" width=<%= intSirka2 %> height="5" border="0"></a>&nbsp;&nbsp;(<%= intSirka2 %>%)<br>
<a href="zapis.asp?ID=3"><%= rs("Odp3")%><br><img src="ank.gif" width=<%= intSirka3 %> height="5" border="0"></a>&nbsp;&nbsp;(<%= intSirka3 %>%)<br>
<a href="zapis.asp?ID=4"><%= rs("Odp4")%><br><img src="ank.gif" width=<%= intSirka4 %> height="5" border="0"></a>&nbsp;&nbsp;(<%= intSirka4 %>%)<br>
</body>
</html>

<%
conn.close
Set conn = nothing
Set rs = nothing
%>

Odkazy, pomocí kterých se hlasuje, směřují na soubor zapis.asp. Ten se nijak výrazně neliší od souboru zapis.asp, který jsme používali v aplikaci na hodnocení článků v minulém díle:

<%
response.expires = -1000
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "ankety"
rs = conn.execute("SELECT * FROM ankety ORDER BY ID Desc")
' Zjištění aktuální ankety
intZnamka = request("id")
id_ankety = rs("ID")
If len(intZnamka)>0 Then
' Pokud je předáván parametr ID, tak...

Select Case intZnamka
Case 1
strSQL = "UPDATE ankety SET Poc1 = Poc1 + 1 WHERE ID=" & id_ankety
Case 2
strSQL = "UPDATE ankety SET Poc2 = Poc2 + 1 WHERE ID=" & id_ankety
Case 3
strSQL = "UPDATE ankety SET Poc3 = Poc3 + 1 WHERE ID=" & id_ankety
Case 4
strSQL = "UPDATE ankety SET Poc4 = Poc4 + 1 WHERE ID=" & id_ankety
End Select

conn.execute(strSQL)
End If
conn.close
Set conn = nothing
Set rs = nothing
Response.Redirect "anketa.asp"
%>

Aplikace je teď zcela funkční, má však jednu malou nevýhodu. Návštěvník může hlasovat, kolikrát chce. Abychom mu v tom zabránili, použijeme cookie (malý textový soubor uložený na počítači návštěvníka, ve kterém můžeme uchovávat data):

' Response.Cookie("jmeno") = hodnota
Response.Cookies("anketa") = "hlasovano"

Pokud zadáme jen jméno anketa, znemožníme návštěvníkovi hlasovat v dalších, nových anketách, neboť bude mít na počítači cookie stále uloženou. Proto pro každou anketu vytvoříme cookie s jedinečným názvem, např.:

Response.Cookies("anketa" & id_ankety) = "hlasovano"

Platnost cookie, tj., jak dlouho bude na počítači uložena, musíme také určit:

Response.Cookies("anketa" & id_ankety).Expires = Dateadd("yyyy",+1,now)

Datum platnosti cookie určíme pomocí funkce Dateadd, kterou nám VBScript nabízí. Pomocí ní přičteme k datu, kdy návštěvník hlasoval, jeden rok.

Po doplnění práce s cookie vypadá soubor zapis.asp takto:

<%
response.expires = -1000
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "ankety"
rs = conn.execute("SELECT * FROM ankety ORDER BY ID Desc")
intZnamka = request("id")
id_ankety = rs("ID")
If Request.Cookies("anketa" & id_ankety) <> "hlasovano" AND len(intZnamka)>0 Then

' Pokud neexistuje cookie a je předáván parametr ID,...
Select Case intZnamka
Case 1
strSQL = "UPDATE ankety SET Poc1 = Poc1 + 1 WHERE ID=" & id_ankety
Case 2
strSQL = "UPDATE ankety SET Poc2 = Poc2 + 1 WHERE ID=" & id_ankety
Case 3
strSQL = "UPDATE ankety SET Poc3 = Poc3 + 1 WHERE ID=" & id_ankety
Case 4
strSQL = "UPDATE ankety SET Poc4 = Poc4 + 1 WHERE ID=" & id_ankety
End Select

conn.execute(strSQL)
' Vytvoření cookie
Response.Cookies("anketa" & id_ankety) = "hlasovano"
' Vložení data, kdy cookie vyprší
Response.Cookies("anketa" & id_ankety).Expires = dateadd("yyyy",+1,now)
End If
conn.close
Set conn = nothing
Set rs = nothing
Response.Redirect "anketa.asp"
%>

Aplikace je nyní hotova k nasazení na internet. V příštím díle se bude zabývat druhou možností, jak vytvořit anketu tohoto typu. Všechny zdrojové kódy a soubor ank.gif si můžete stáhnout zde.

Liška Adam


Hodnocení článku: -1- -2- -3- -4- -5-  Aktuální hodnocení: 2.74 (1981)

Relevantní články
Žádné články


Příspěvky do diskuse o aktuálním článku
Sherman28.01.0:09DOTAZ
Lukas03.02.14:54pekne ankety
  

 

  O vydavateli | Kontakt | Ceník reklamy | Ochrana osobních dat
©2002 Grafika Publishing. Všechna práva vyhrazena!