V předcházejícím druhémn článku o tvorbě ankety jsme si vytvořili aplikaci, která umožňuje vkládat definované ankety do databáze. Dnes nastane nejdůležitější část tvorby ankety a to vlastní zobrazení ankety a možnost hlasovat.

Těm čtenářům, kteří nečetli předchozí dva díly tohoto seriálu, doporučuji nejprve přečíst články „Anketa pro www stránky krok za krokem“ a „Anketa pro www stránky krok za krokem – druhá část„.

Nejprve musíme z databáze vybrat anketu, kterou budeme zobrazovat. Jak již víme z předcházejících článků, budeme mít v databázi několik anket, které budou mít určeny datum začátku a datum konce. Na základě těchto údajů vybereme příslušnou anketu. Pro jednoduchost nepředpokládám, že by se jednotlivé ankety mohly časově překrývat.

SQL dotaz, pomocí kterého vybereme anketu, bude vypadat následovně:

SELECT idanketa,otazka FROM redaction_anketa_otazky WHERE DATEDIFF(day,datum_start,GETDATE())>=0 AND DATEDIFF(day,datum_konec,GETDATE())=<0

Co vlastně tento dotaz udělá? Z tabulky vybere anketní otázku, která má datum zahájení stejný nebo menší než aktuální datum a současně datum ukončení není menší než aktuální datum. Protože pro další práci nepotřebujeme všechny položky z tabulky provedeme v dotazu výčet požadovaných položek.

Nyní máme k dispozici anketní otázku a idankety, ale co nám stále chybí, jsou odpovědi na anketní otázku a počty hlasů. Možné odpovědi na anketní otázku získáme následujícím dotazem:

SELECT idodpovedi,odpoved,pocet FROM redaction_anketa_odpovedi WHERE idanketa=idanketa

V části WHERE je za rovnítkem použito číslo anketní otázky, které jsme získali v předchozím dotazu.

Pro zobrazení ankety budeme ještě potřebovat vědět, jaký je největší počet odpovědí na otázky. Tuto informaci můžeme získat dvěmi různými způsob:

  1. V cyklu „projet“ vybrané záznamy a zjistit maximum
  2. maximum zjistit přímo v dotazu

První způsob všichni určitě zvládnete a proto uvedu pouze ten druhý, který je podle mě mnohem rychlejší. Následující dotaz nám poskytne množinu záznamů, kde je kromě položek idopovedi, odpovedi a počtu hlasů také hodnota maximálního počtu hlasů:

select max(pocet) as maximum, idodpovedi,odpoved,počet from redaction_anketa_odpovedi group by idodpovedi,odpoved,počet having idankety=“&anketa

Význam jednotlivých příkazů v SQL dotazu najdete v článku „Dotazy v SQL s agregací„.

Takže dost teorie kolem SQL dotazů a hurá na anketu ať nám ještě dneska funguje. Pro otevření práci s databází opět použijeme stejné funkce jako v minulém článku. Následující ASP kód umístěte do například do souboru anketa.asp, který potom pomocí INCLUDE vložíte do ASP astránky, ve které chcete použít anketu. Zobrazení ankety je provedeno jako funkce, která má jeden parametr, pomocí kterého určíte URL, kam má být návštěvník po hlasování přesměrován:

<% Function anketa(URL)
   If IsConnectDB() then
      Sql=“ SELECT idanketa,otazka FROM redaction_anketa_otazky WHERE DATEDIFF(day,datum_start,GETDATE())>=0 AND DATEDIFF(day,datum_konec,GETDATE())=<0″
      Set rs=objconn.execute(sql)
      If not rs.eof then
         Otazka=rs(„otazka“)
         Idanketa=rs(„idanketa“)
         Rs.close
         Sql= „select max(pocet) as maximum, idodpovedi,odpoved,počet from redaction_anketa_odpovedi group by idodpovedi,odpoved,počet having idankety=“&anketa“
         Set rs=objconn.execute(sql)
         Maximum=rs(„maximum“)
         Konstanta=1
         Obrazek=“/images/anketa.gif“
         if maximum>0 then
            konstanta=100/maximum
         end if
         If not rs.eof then
            ‚ hlavicka ankety
            anketa=“<table><tr><td>“&otazka&“</td></tr>“
            do while not rs.eof
               ‚zpracovani ankety
               soucet=soucet+rs(„hlasy“)
               sirka=rs(„hlasy“)*konstanta
               anketa=anketa&“<tr><td class=““texttabulka““><a href=““hlas-anketa.asp?ID=“&rs(„idodpovedi“)&“&URL=“&URL&“““ class=““odkazyvlevo““>“&trim(rs(„odpoved“))&“<br><img src=“““&obrazek&“““ width=“““&sirka&“““ height=““10″“ border=““0″“></a> („&rs(„hlasy“)&“)</td></tr>“
               rs.movenext
            loop
            anketa=anketa&“<tr><td>V anketě hlasovalo celkem „&soucet&“ lidí</td></tr></table>“
            rs.close
         Else
            Anketa=““ ‚ neni definována žádná odpověd – definovaná anketa postrádá smysl
         End if
      Else
         Anketa=““‚není k dispozici žádná anketa
      End if
   Else
      Anketa=““‚ nepodarilo se otevrit databázi a proto není k dispozici žádná anketa
   End if
End function
%>

Mnozí z vás si asi položí otázku jakým způsobem je provedeno „natažení obrázku“ v anketě. Před vlastní zpracováním ankety provedeme na základě maximálního počtu hlasů určení konstanty pomocí které zpětně určíme, jak má být široký konkrétní obrázek. V našem případě je určeno, že obrázek bude široký maximálně 100 pixelů. Při zpracování ankety podle vypočtené šířky dynamicky měníme velikost příslušného obrázku (viz následující kód):

<img src=“““&obrazek&“““ width=“““&sirka&“““ height=““10″“ border=““0″“>

Anketu na www stránku na které ji chcete mít vložíte pomocí následujícího kódu:

Response.write(anketa(„/default.asp“))

Po hlasování v takto definované anketě je návštěvník přesměrován na stránku default.asp, která se nachází v koření web aplikace.

Nyní máme hotové vlastní zobrazení ankety na libovolné stránce a zbývá nám udělat ASP skript, který zajistí počítání jednotlivých hlasů a přesměrování na námi definovanou stránku. Následující kód umístěte do souboru hlas-anketa.asp:

<!–#include FILE=“connect.asp“–> <%
ULR=Request.QueryString(„URL“)
odpoved=Request.QueryString(„ID“)
if isconnectDB() then
sql=“update redaction_anketa_odpovedi set hlasy=hlasy+1 where idodpovedi=“&odpoved
rshlasuj=objconn.Execute(sql)
end if
Response.Redirect(URL)
%>

Jak sami vidíte, hlasovací mechanismu je velice primitivní a nedělá nic jiného než aktualizaci záznamu v databázi a následné přesměrování na stránku, která byla předána jako parametr spolu s číslem odpovědi.

Předem předpokládám, že se najde spousta čtenářů, kteří mi budou psát ohledně možnosti návštěvníků v anketě neomezeně hlasovat. Existuje způsob, jak toto vícenásobné hlasování omezit, ale bohužel neexistuje způsob, jak tomuto „nešvaru“ čtenářů zcela zabránit. O tom, jak zakázat vícenásobné hlasování, budu psát (podle zájmu čtenářů) v některém z příštích dílů tohoto seriálu.

Nakonec samozřejmě máte možnost stáhnout prezentované kódy.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět