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ý):
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> (<%= 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> (<%= intSirka1 %>%)<br>
<a href="zapis.asp?ID=2"><%= rs("Odp2")%><br><img src="ank.gif" width=<%= intSirka2 %> height="5" border="0"></a> (<%= intSirka2 %>%)<br>
<a href="zapis.asp?ID=3"><%= rs("Odp3")%><br><img src="ank.gif" width=<%= intSirka3 %> height="5" border="0"></a> (<%= intSirka3 %>%)<br>
<a href="zapis.asp?ID=4"><%= rs("Odp4")%><br><img src="ank.gif" width=<%= intSirka4 %> height="5" border="0"></a> (<%= 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
|