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.
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.