Článek vytištěný ze serveru WebTip

Název článku: ASP v praxi, 6. díl - Anketa (3.)
Datum publikování: 24.01. 2003
URL článku: http://www.webtip.cz/art/wt_tech_asp/asp_v_praxi_6.html (kliknětě pro návrat)

Všechna práva vyhrazena (c) 2000 Grafika Publishing s.r.o.
Doslovné ani částečně přebírání tohoto materiálu není povoleno bez předchozího písemného svolení vydavatele - společnosti Grafika Publishing s.r.o.


ASP v praxi, 6. díl - Anketa (3.)

Pokud se počet anket rozroste, vyžádají si nutně svojí správu. Nejlépe přes webové rozhraní, čímž získáme několik výhod - administrátor se nebude muset zabývat vnitřní strukturou databáze, k administrační části se dostane odkudkoliv, kde bude mít přístup na internet, a mnoho dalších. Přístup bude samozřejmě možný jen pro administrátora - použijeme zdrojové kódy z dílu Přihlašování na stránky II.

A jaké možnosti správy se nabízejí? Přidávat a mazat ankety, nastavovat aktivní anketu.

Hlavní stránka administrační části aadmin.asp bude vypadat následovně:

Stránka se skládá z nadpisu, dále jsou vypsány všechny ankety, odkaz na vytvoření nové ankety a formulář, pomocí kterého se určuje aktivní anketa. A právě jím začnu. Aktivní anketa je ta anketa, jež má v poli zobrazovat (nachází se v tabulce ank_otazky) jedničku - neboli ta, co se návštěvníkům zobrazí. Výběr aktivní ankety je řešen pomocí elementu Select:

<select>
<option>První prvek</option>
<option>Druhý prvek</option>
<option selected>Předem vybraný prvek</option>
</select>

Jako základní, předem vybraný prvek bude aktivní anketa (na obrázku to je nalada). Formulář bude mít tento zdrojový kód:

<form action="aadmin.asp" method="get">
<table border=0>
<tr>
<td><b>Aktivní anketa:</b></td>
<td>

<%
Set Zobr = conn.execute("select * from ank_otazky where zobrazovat = 1")
' Pokud není vybrána žádná aktivní anketa,...
If Zobr.eof OR Zobr.bof Then
response.write "<b>Není žádná aktivní anketa.</b>"
End If
Set Zobr = Nothing
%>

<select name="aktivni" size="1">

<%
' Celým následujícím ASP kódem naplníme seznam prvky - anketami
rs.MoveFirst
Do While NOT rs.EOF
' Pokud je anketa aktivní, tak do proměnné strZobr uložíme
' řetězec, který pak níže vypíšeme
If rs("zobrazovat")=1 Then
strZobr = "selected"
Else
strZobr=""
End If
' Samotné vypsání všech anket jako prvků seznamu - element option
response.write "<option value=" & rs("idankety") & " " & strZobr & ">" & rs("jmeno") & "</option>"
rs.MoveNext
Loop
%>

<!-- Aktivní anketa však nemusí být žádná... -->
<option value="neni">Není</option>
</select>
</td>
<td><input type="submit" value="Aktualizovat"></td>
</tr>
</table>
</form>

A takto formulář zpracujeme:

' Pokud je předáván parametr...
If len(request.querystring("aktivni")) Then

' Pokud je hodnotou parametru číslo...
If isNumeric(request.querystring("aktivni")) Then
conn.execute("UPDATE ank_otazky SET zobrazovat=0 WHERE zobrazovat=1")
conn.execute("UPDATE ank_otazky SET zobrazovat=1 WHERE idankety = " & request.querystring("aktivni"))

' Pokud je hodnotou parametru řetězec "neni"...
ElseIF request.querystring("aktivni") = "neni" Then
conn.execute("UPDATE ank_otazky SET zobrazovat=0 WHERE zobrazovat=1")
End IF

response.redirect "aadmin.asp"
Else
...

Celý kód stránky aadmin.asp je pak následující:

<%
response.buffer = true
response.expires = -1000
If Session("prihlaseny") = "" Then
Response.Redirect ("login.html")
End If

Set conn = Server.CreateObject("ADODB.Connection")
' Otevření spojení
conn.open "ankety"

' Nastavování aktvní ankety...
If len(request.querystring("aktivni")) Then
If isNumeric(request.querystring("aktivni")) Then
conn.execute("UPDATE ank_otazky SET zobrazovat=0 WHERE zobrazovat=1")
conn.execute("UPDATE ank_otazky SET zobrazovat=1 WHERE idankety = " & request.querystring("aktivni"))
ElseIF request.querystring("aktivni") = "neni" Then
conn.execute("UPDATE ank_otazky SET zobrazovat=0 WHERE zobrazovat=1")
End IF
response.redirect "aadmin.asp"

Else
' Vybrání všech anket...
Set rs = conn.execute("SELECT * FROM ank_otazky")
%>

<html>
<head>
<title>Úprava anket</title>
</head>

<body>
<h2>Administrace anket</h2>
<% ' Pokud nějaké ankety jsou...
If not rs.bof or not rs.eof Then %>
<table border="0">
<tr>
<td><b>ID</b></td>
<td><b>Název</b></td>
<td><b>Otázka</b></td>
</tr>
<%
' Vypsání všech anket spolu s odkazem "Vymaž"...
Do Until rs.EOF
Response.write "<tr><td>" & rs("idankety") & "</td>"
Response.write "<td>" & rs("jmeno") & "</td>"
Response.write "<td>" & rs("otazka") & "</td>"
Response.write"<td><a href='delete.asp?id=" & rs("idankety") & _
"'>Vymaž</a></td></tr>"
rs.MoveNext
Loop
%>
</table>
<!-- Formulář na vybrání aktivní ankety -->
<form action="aadmin.asp" method="get">
<table border=0>
<tr>
<td><b>Aktivní anketa:</b></td>
<td>
<%
Set objZobr = conn.execute("select * from ank_otazky where zobrazovat = 1")
If objZobr.eof OR objZobr.bof Then
response.write "<b>Není žádná aktivní anketa.</b>"
End If
Set objZobr = Nothing
%>
<select name="aktivni" size="1">
<%
' Ukazatel ve vrácených záznamech z databáze musí umístit znovu
' na začátek - už jednou jsme je všechny projeli...
rs.MoveFirst
Do While NOT rs.EOF
If rs("zobrazovat")=1 Then
strZobr = "selected"
Else
strZobr=""
End If
response.write "<option value=" & rs("idankety") & " " & strZobr & ">" & rs("jmeno") & "</option>"
rs.MoveNext
Loop
%>
<option value="neni">Není</option>
</select>
</td>
<td><input type="submit" value="Aktualizovat"></td>
</tr>
</table>
</form>

<%
' Pokud žádně ankety v databázi nejsou...
Else
response.write "<b>V databázi není žádná anketa.</b><br>"
End If
%>

<p><a href="nova.asp">Nová anketa</a></p>
</body>
</html>

<%
End If
' Uvolnění paměti po objektech...
conn.close
Set rs = Nothing
Set conn = Nothing
%>

Další funkcí v pořadí je přidání nové ankety. V prvním z celkem tří kroků (soubor nova.asp) se zadává název ankety, otázka a počet odpovědí (obrázek):

<%
response.buffer = true
response.expires = -1000
If Session("prihlaseny") = "" Then
Response.Redirect ("login.html")
End If
%>

<html>
<head>
<title>Untitled</title>
</head>

<body>
<form action="nova2.asp" method="post">
<table>
<tr><td width="150">Název ankety</td><td><input type="text" name="jmeno" maxlength="20" value=<%= request.querystring("jmeno") %>></td></tr>
<tr><td>Otázka</td><td><input type="text" name="otazka" value=<%= request.querystring("otazka") %>></td></tr>
<tr><td>Počet odpovědí</td><td><input type="text" name="pocet" maxlength="2" size=1 value=<%= request.querystring("pocet") %>></td></tr>
</table>
<input type="submit" value="Další krok">
</form>
</body>
</html>

Data se odesílají souboru nova2.asp. Pokud nejsou správně vyplněna, administrátor je vrácen zpět na první krok. V kladném případě se pokračuje. Data z prvního kroku jsou uložena do skrytých polí a zobrazí se vstupní pole pro odpovědi. Jejich počet závisí na čísle zadaném v kroku prvním (pole Počet odpovědí). (obrázek):

<%
response.buffer = true
response.expires = -1000
If Session("prihlaseny") = "" Then
Response.Redirect ("login.html")
End If

' Pokud byly informace v prvním kroku správně zadané...
If len(request.form("jmeno"))>0 AND len(request.form("otazka"))>0 AND isNumeric(request.form("pocet")) Then
%>
<html>
<head>
<title>Untitled</title>
</head>
<body>
<form action="nova3.asp" method="post">
<table>

<%
' Pomocí cyklu For...Next vypíšeme vstupní pole.
' Jejich počet závisí na číslu zadaném v prvním kroku - pole "Počet odpovědí"
For pocitadlo = 1 To request.form("pocet")
response.write "<tr><td>Odpověď " & pocitadlo & "</td><td><input type='text' name='odp" & pocitadlo & "'></td></tr>"
Next
%>
</table>
<input type="hidden" value='<%= request.form("pocet") %>' name="pocet">
<input type="hidden" value='<%= request.form("jmeno") %>' name="jmeno">
<input type="hidden" value='<%= request.form("otazka") %>' name="otazka">
<input type="submit" value="Uložit">
</form>
</body>
</html>
<% ' Pokud byly informace v prvním kroku špatně zadané...
Else
' Aby administrátor nemusel dobře vložené informace znovu zadávat, vložíme je tam...
response.redirect "nova.asp?jmeno=" & request.form("jmeno") & "&otazka=" & request.form("otazka") & "&pocet=" & request.form("pocet")
End If %>

Posledním, třetím krokem se vkládají data do databáze:

<%
response.buffer = true
If len(request.form("pocet")) Then
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "ankety"

' Vložení dat do tabulky ank_otazky...
conn.execute("INSERT INTO ank_otazky(jmeno, otazka, zobrazovat) VALUES('" & request.form("jmeno") & "', '" & request.form("otazka") & "', 0)")
' Zjištění ID ankety - pomocí příkazu "SELECT TOP 1" vybereme
' jen jeden záznam, příkaz "DESC" určí, že to bude ten posledně vložený - má největší ID
Set rs = conn.execute("SELECT TOP 1 idankety FROM ank_otazky ORDER BY idankety DESC")

idank = rs("idankety")
Set rs = Nothing

' Vložení všech odpovědí...
For pocitadlo = 1 To request.form("pocet")
conn.execute("INSERT INTO ank_odpovedi(idankety, odpoved, pocet) VALUES (" & idank & ", '" & request.form("odp" & pocitadlo) & "', 0)")
Next

conn.close
Set conn = Nothing
End If
response.redirect "aadmin.asp"
%>

Administrátorská část dále nabízí možnost vymazat anketu - a to pomocí souboru delete.asp:

<%
If Session("prihlaseny") = "" Then
Response.Redirect ("login.html")
End If

If len(Request.QueryString("ID"))>0 Then
intID = Request.QueryString("ID")
Set Conn = Server.CreateObject("ADODB.Connection")
conn.Open "ankety"
' vymazání odpovědí...
conn.Execute ("DELETE FROM ank_odpovedi WHERE IDankety=" & intID)
' vymazání otázky...
conn.Execute ("DELETE FROM ank_otazky WHERE IDankety=" & intID)
conn.Close
Set conn = Nothing
End If
response.redirect "aadmin.asp"
%>

Tím máme základní funkce administrátorské části hotovy. Zde si můžete stáhnout všechny zdrojové kódy.


Autor: Liška Adam
E-mail: liskovi@quick.cz