Pod pojmem Database Engine (tedy pod databázovým strojem) se obvykle rozumí jádro databázového serveru a základní obslužné programy tohoto jádra (například zajišťující vzdálené připojení uživatelů). Lze tedy říci, že databázový stroj je podmnožinou databázového serveru, přičemž pod pojmem databázový server je nutné vidět vybavení (typicky softwarové) pracující nad danou databází a zajišťující veškeré činnosti (včetně všech potřebných komunikací), které nad danou databází mají být zajišťovány.
Akce
Dynamická Datová Centra - na semináři se seznámíte s komplexním řešením a koncepcí Dynamických Datových Center od Fujitsu Siemens Computers se speciálním důrazem na řešení FlexFrame.
Prodejce reklamy - Hledáme schopného prodejce reklamního prostoru, možnost i externí spolupráce.
Moodle v ČR - LMS Moodle a e-learning profesionálně od společnosti PragoData Consulting
Přihlášený čtenář
Nepřihlášený čtenář
O portálu
Databázový svět ISSN: 1213-5933
Web je optimalizován pro rozlišení 1024x768, nicméně
kromě větších rozlišení podporujeme i 800x600. Podrobnosti najdete zde.
Chcete-li mít kdykoliv možnost zkontrolovat obsah našeho portálu, můžete využít podporu rss. Podrobnosti najdete zde.
Jak na ankety ve Firebirdu podruhé Vydáno dne 07. 11. 2005
[Vývoj] - Různé ankety na internetu jsou již běžnou záležitostí. Dovolují vám získat informace o tom, co si návštěvníci webu přejí, co je zajímá či v případě softwaru jakou funkci nejvíce postrádají. Stejně tak, jako jsou běžné ankety, jsou běžné i různé návody na jejich vytvoření. Nejčastější kombinace, kterou nalezneme v návodech je využití PHP a nějakého formátu souboru pro uložení dat, případně MySQL. My si v tomto krátkém seriálu ukážeme, jak vytvářet ankety za pomoci pouze databázové platformy Firebird. Dnes se mj. podíváme na možnost využití uložených procedur při ošetřování vícenásobného hlasování.
Jak jsme již řekli na začátku prvního dílu, pokusíme se celý systém anket realizovat pouze za pomoci standardních prostředků databázové platformy Firebird. V předchozím dílu jsme vytvořily pouze tabulky – tedy podklad pro ankety. Nebylo na tom nic, co by nešlo využít i na jiných databázích a zároveň jsme si řekli, že tabulky máme znormalizovány. Dnes si ukážeme některé další vlastnosti Firebirdu, které můžeme u anketního systému využít.
Asi základní operací v anketním systému – kromě vytvoření ankety a daných odpovědí – je zaznamenání hlasu uživatele. Zde je toto realizováno triviálním vložením záznamu do tabulky ANKETA_HLASOVANI. Jak již bylo řečeno, pro lepší budoucí využití si zaznamenáme čas a IP adresu účastníka. Vzhledem k faktu, že ankety jsou ve velké většině na webu, musíme IP adresu účastníka ošetřit přímo na straně skriptu (řešení na straně databáze není možné).
Uložení času již ovšem můžeme přímo na FB lehce realizovat. Stačí využít proměnnou current_timestamp, která nám dovoluje získat aktuální datum a čas serveru kde je FB v provozu. Vzhledem k tomu, že tato proměnná pracuje na úrovni sekund, pro velký počet vložení doporučuji využít techniky programovacího jazyka a pracovat na úrovní milisekund, hlavně kvůli pozdějšímu sčítání hlasů. Zbytek je velice jednoduchý. Insert příkaz by mohl vypadat například takto:
Parametry %cislo_odpovedi% a %ip% jsou dodány skriptem, který vložení provede.
Další akcí, která je neméně důležitá, je zcela určitě získání počtu hlasů u jednotlivých odpovědí – neboť k čemu by nám byla ankety, když bychom neměli její výsledky, případně je nemohli prezentovat. Patrně každého napadne, že někteří "chytří" uživatelé budou chtít kliknout vícekrát a zmanipulovat tím výsledek. Většinou se toto řeší různými cookies a blokováním hlasování nebo omezením hlasování z jedné IP na daný časový interval. Toto však vyžaduje spolupráci webové stránky a my se snažíme maximálně vystačit s prostředky serveru. Proto sice dovolíme víceré vložení záznamu do databáze, ale při výsledném sčítání tyto duplicitní hlasy budeme ignorovat.
My blokaci postavíme na principu IP a času (vida, jak se nám nyní tyto údaje hodí). Omezíme tedy hlasování na maximálně jeden hlas z jedné IP za jeden den. Nepochybně je toto možné omezit i na jiný časový interval, záleží jen na vás. Pro sečtení hlasů využijeme uložených procedur, které nám nabízí vysokou flexibilitu při získávaní výsledků z databáze.
SETTERM^;
CREATEPROCEDUREANKETA_HLASY_PRO_ODPOVED_MULTI(
ID_ODPOVEDINTEGER)
RETURNS(
SOUCETINTEGER)
AS
DECLAREVARIABLEPOCETINTEGER;
DECLAREVARIABLEDATUMDATE;
BEGIN
SOUCET=0;
/* pekne po castech */
FORSELECTDISTINCTCAST(casASDATE)FROManketa_hlasovani
WHEREid_odpoved=:ID_ODPOVED
INTO:DATUM
DO
BEGIN
POCET=0;
/* spocitame kolik je hlasu */
SELECTCOUNT(DISTINCTip)FROManketa_hlasovani
WHEREid_odpoved=:ID_ODPOVEDANDCAST(casASDATE)=:DATUM
INTO:POCET;
SOUCET=SOUCET+POCET;
END
SUSPEND;
END
^
SETTERM;^
Procedura nejprve vybere všechna (neopakující se) data (po dnech) pro danou odpověď a pro každé toto datum vypočítá počet unikátních odpovědí. Tyto jednotlivé počty jsou vždy přičítány k výsledku, který je nakonec navrácen.
Jak jste si jistě všimli, procedura umožňuje ve své podstatě hlasovat vícekrát pro různé odpovědi (a počítat je samozřejmě) – jedná se tedy o anketu, kde můžete vybrat i více odpovědí. Zajisté také někoho napadlo, proč toto řešíme tak složitě, když můžeme využít jiných postupů přímo na databázi. Více o rozhodnutí pro použití uložených procedur si povíme příště a ukážeme si také, jak modifikovat naši blokaci pouze pro jedinou možnou odpověď od uživatele.
Případné dotazy můžete napsat pod článek do diskuze nebo do našeho diskuzního fóra.
Na této stránce použité názvy programových produktů, firem apod. mohou být ochrannými známkami nebo registrovanými ochrannými známkami příslušných vlastníků.