Představte si, že byste používali anketu z minulého dílu a chtěli například změnit počet odpovědí ze čtyř na tři. V takové situaci je třeba změnit tabulku v databázi (smazat příslušná pole). Stránka anketa.asp by místo čtyř odkazů vypisovala jen tři, vypočítávala pouze tři šířky apod. To je zbytečná práce a lze se jí vyhnout, když již od prvotního návrhu necháte aplikaci jakousi "volnost".
Hlavní změnou projde tabulka v databázi. Rozdělíme ji na dvě samostatné části. Ty však budou provázané. Jedna bude obsahovat otázky, druhá odpovědi. Tabulka s otázkami má tuto strukturu:
| Název pole |
Datový typ |
| idankety |
automatické číslo - primární klíč |
| jmeno |
text |
| otazka |
text |
| zobrazovat |
číslo |
V druhé tabulce, ank_odpovedi, budou, jak již bylo řečeno, uloženy odpovědi. Každý záznam (odpověď) obsahuje i informaci, ke které anketě patří - její ID (pole idankety):
| Název pole |
Datový typ |
| idodpovedi |
automatické číslo - primární klíč |
| idankety |
číslo |
| odpoved |
text |
| pocet |
číslo |
Počet odpovědí na otázku závisí na počtu záznamů v tabulce ank_odpovedi, které mají v poli idankety ID příslušné ankety. Jednou jich může být pět, podruhé jen dvě.
Teď začneme vytvářet samotné soubory s ASP kódem. Ty budou, jako v minulém díle, dva - anketa.asp a zapis.asp. Zdrojový kód prvního je následující:
<%
response.expires = -1000
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "ankety"
' vybrání aktivní ankety
Set rs = conn.Execute("SELECT idankety, otazka FROM ank_otazky WHERE zobrazovat = 1")
' pokud nějaká je, ...
If NOT rs.eof OR NOT rs.bof Then
idank = rs("idankety")
otazka = rs("otazka")
' pomocí tzv. agregační funkce SUM zjistíme celkový počet hlasujících
Set rs = conn.execute("SELECT SUM(pocet) AS celkem FROM ank_odpovedi WHERE idankety = " & idank)
celkem = rs("celkem")
' vybrání odpovědí, které přísluší k aktivní anketě
strSQL = "SELECT * FROM ank_odpovedi WHERE idankety = " & idank
Set rs = conn.execute(strSQL)
' pokud nějaké jsou, ...
If NOT rs.eof OR NOT rs.bof Then
%>
<html>
<head>
<title>Anketa</title>
</head>
<body>
<%
' vypsání otázky
response.write "<b>" & otazka & "</b><br><br>"
Do While NOT rs.EOF
' vypočítání šířky
If rs("pocet")>0 Then
intSirka = int(((rs("pocet"))/celkem) * 100)
Else
intSirka = 0
End If
' vypsání odkazu s odpovědí a s pruhem
response.write "<a href='zapis.asp?ID=" & rs("idodpovedi") & "'>" & rs("odpoved") & "<br><img src='ank.gif' width='" & intSirka & "' height='5' border='0'></a> (" & intSirka & "%)<br>"
rs.MoveNext
Loop
%>
</body>
</html>
<%
End If
' uvolnění paměti
conn.close
Set rs = Nothing
Set conn = Nothing
End If
%>
|
Doufám, že díky okomentování nemusím kód nijak blíže popisovat - až na tzv. agregační funkce. To jsou speciální příkazy v SQL, pomocí kterých můžeme zjišťovat např. celkový počet záznamů v tabulce, součet všech hodnot ve sloupci apod.
Soubor zapis.asp se od minulého dílu moc nezměnil:
<%
response.expires = -1000
response.buffer = true
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "ankety"
intID = int(Request.QueryString("id"))
strSQL = "SELECT idankety FROM ank_otazky WHERE zobrazovat = 1"
set rs = conn.execute(strSQL)
id_ankety = rs("idankety")
If Request.Cookies("anketa" & id_ankety) <> "hlasoval" AND isNumeric(intID) Then
strSQL = "UPDATE ank_odpovedi SET pocet = pocet + 1 WHERE idodpovedi=" & intID
conn.execute(strSQL)
Response.Cookies("anketa" & id_ankety)="hlasoval"
Response.Cookies("anketa" & id_ankety).Expires = dateadd("YYYY", +1, now)
End If
conn.close
Set conn = nothing
Set rs = nothing
Response.Redirect "anketa.asp"
%>
|
Nyní máme tuto vylepšenou anketu hotovu. Samozřejmě, že si můžete stáhnout všechny použité soubory. V příštím díle vytvoříme administrační část, pomocí které budete moci spravovat všechny vaše ankety.
Liška Adam
|