Vytvoříme-li seznam hodnocených článků na jedné stránce, vznikne něco jako hitparáda. Ukáži vám tedy, jak si na své stránce vytvořit hudební hitparádu. Nezůstaneme přitom pouze u základních funkcí. Když už hitparáda, tak pořádně.
Kromě hodnocení jednotlivých skladeb bude možné v hitparádě vyhledávat skladby nebo interprety, bude možné si nechat hitparádu seřadit podle názvu skladby, interpreta nebo úspěšnosti. Součástí bude i formulář, kterým mohou čtenáři zasílat své tipy na skladby, které administrátor (správce hitparády) může případně zahrnout do soutěže. Mechanismus hlasování i zabezpečení proti násobnému hlasování vychází z článku Hodnotenia článkov v PHP, proto budu popisovat hlavně funkce doplněné navíc.
V této aplikaci je použita řada technik a postupů – proto může posloužit i každému, kdo chce takovou techniku použít ve své aplikaci. Mimo principu ankety jde o umožnění více variant setřídění výstupu z databáze, vyhledávání v databázi, stránkování výpisu, barevné odlišení sudých a lichých řádků tabulky, práce s cookies a posílání e-mailu i s českými znaky, ale i jednoduchý admin na přidávání položek do databáze chráněný heslem..
Celou hitparádu si můžete prohlédnout. Ti zvídavější, kteří prostudují článek pozorněji, jistě přijdou na to, jak jako administrátor doplnit vlastní skladby i do této ukázky. Můžete vyzkoušet i zaslání vlastního tipu na email administrátora. Tato funkce je pouze simulována, žádný email se nikam neposílá.
Databázi si připravíme zadáním tohoto povelu:
CREATE TABLE hittip ( id int(11) NOT NULL auto_increment, track varchar(255) NOT NULL default “, author varchar(255) NOT NULL default “, date int(11) NOT NULL default ‚0‘, votes int(11) NOT NULL default ‚0‘, percvote int(3) NOT NULL default ‚0‘, PRIMARY KEY (id), UNIQUE KEY id (id) ) |
|
Předpokládá se, že skript hitparády bude vkládán pomocí include
a parametru pg
do nějaké hlavní stránky (ukážeme si v dalším dílu), která zajistí připojení k databázi. Základem hitparády je skript hittip.php:
<p><b><font size="4">Hit Tip</font></b></p> <fieldset> <legend>hledat Můj Hit Tip<br></legend> <table> <form> <tr><td> <input type="hidden" name="pg" value="hittip"> <input type="hidden" name="sby" value="<?PHP echo $sby ?>"> interpret <input type="text" name="author" size="15" value="<?PHP echo $author ?>" class="sform"> skladba <input type="text" name="track" value="<?PHP echo $track ?>" size="15" class="sform"> <input type="submit" class="tlac" value="vyhledat"> </td></tr> </form> </table> </fieldset> <p> <table border="0" cellspacing="0" cellpadding="3"> <tr><td align="center" width="100%"> <?PHP if ($sby==1) echo "interpret"; else echo "<a href=\"?pg=hittip&sby=1\">interpret</a>"; ?> </td><td align="center" width="100%"> <?PHP if ($sby==2) echo "skladba"; else echo "<a href=\"?pg=hittip&sby=2\">skladba</a>"; ?> </td><td align="center"> <?PHP if ($sby==0) echo "datum"; else echo "<a href=\"?pg=hittip&sby=0\">datum</a>"; ?> </td><td align="center"> <?PHP if ($sby==3) echo "hlasy"; else echo "<a href=\"?pg=hittip&sby=3\">hlasy</a>"; ?> </td></tr> <?PHP $sqlwhere=""; switch ($sby) { // možnosti setřídění databáze case 1: $sqlord = "author, percvote DESC"; break; case 2: $sqlord = "track, percvote DESC, author"; break; case 3: $sqlord = "percvote DESC, author"; break; default : $sqlord = "date DESC, percvote DESC"; } if ($start<1) $start=0; if (!empty($track)) $sqlwhere.=" AND track LIKE ‚%".AddSlashes($track)."%’"; if (!empty($author)) $sqlwhere.=" AND author LIKE ‚%".AddSlashes($author)."%’"; $result = mysql_query("SELECT id, track, author, votes, percvote, date FROM hittip WHERE id>0 $sqlwhere ORDER BY $sqlord LIMIT $start,$tipcount"); $count=MySQL_fetch_Row(mysql_query("SELECT COUNT(id) FROM hittip WHERE id>0 $sqlwhere")); // zjistit celkový počet záznamů pro stránkování while ($rdata = mysql_fetch_row($result)) { if ($bgartx == $bgart) { $bgartx = $bgart2; // střídání barvy řádků tabulky } else { $bgartx = $bgart; } echo "<tr bgcolor=\"$bgartx\"><td nowrap>$rdata[2]</td><td nowrap>$rdata[1]</td><td nowrap>".date("d.m.y",$rdata[5])."</td><td><font size=\"1\">"; // hodnoceni $htip=$rdata[0]; if ($rdata[4]>0) echo "<img src=\"img/vote4.gif\" width=\"$rdata[4]\" alt=\"Hlasů: $rdata[3]\" height=\"8\" border=\"0\"> $rdata[4]%<br>"; else echo "nehodnoceno<br>"; if ((isset($rat)) || (isset($rated[$htip]))) // ověřit, zda již nebylo hlasováno podle cookies echo "| 1 | 2 | 3 | 4 |& nbsp;5 |<br>"; else echo "| <a href=\"htipvote.php?htip=$rdata[0]&rat=4&sby=$sby&start=$start\" title=\"perfektní\"><font size=\"1\">1</font></a> | <a href=\"htipvote.php?htip=$rdata[0]&rat=3&sby=$sby&start=$start\" title=\"dobrý\"><font size=\"1\">2</font></a> | <a href=\"htipvote.php?htip=$rdata[0]&rat=2&sby=$sby&start=$start\" title=\"průměrný\"><font size=\"1\">3</font></a> | <a href=\"htipvote.php?htip=$rdata[0]&rat=1&sby=$sby&start=$start\" title=\"slabąí\"><font size=\"1\">4</a> | <a href=\"htipvote.php?htip=$rdata[0]&rat=0&sby=$sby&start=$start\" title=\"hrůza, uľ nikdy\"><font size=\"1\">5</font></a> |<br>"; echo "</font></td></tr>"; } echo "<tr><td colspan=4>"; if ($count[0]>0) echo "Nalezeno skladeb: $count[0]"; else { echo "Nebyla nalezena žádná odpovídající skladba – můžete nám však zaslat název a interpreta, abychom je mohli přidat do hlasování."; echo "<p><img src=\"img/b_rightg.gif\" width=\"19\" height=\"19\" align=\"absmiddle\"> <a href=\"?pg=sendhittip\">přidat Můj Hit Tip</a>"; } echo "</td></tr>"; echo "</table><br>\n"; echo "<table width=\"100%\"><tr><td nowrap>"; if (($start-$tipcount) >= 0) { // vypsání odkazů pro stránkování echo "<a href=\"?pg=hittip&sby=$sby&start=".($start-$tipcount)."\">předchozí</a>"; echo " | <a href=\"?pg=hittip&sby=$sby&start=0\">začátek</a> | "; } else { echo "předchozí"; echo " | začátek | "; } if ($count[0] > ($start+$tipcount)) echo "<a href=\"?pg=hittip&sby=$sby&start=".($start+$tipcount)."\">následující</a>"; else echo "následující"; echo "</td></tr></table>\n"; ?> |
|
Skript vygeneruje seznam skladeb hitparády. V posledním sloupci je na každém řádku vždy stupnice ukazující v procentech úspěšnost. V případě, že ještě nikdo skladbu nehodnotil, je vypsán jen text "nehodnoceno". Jako popisek alt je přidán údaj o počtu hlasujících, pod stupnicí jsou potom odkazy 1-5, kterým čtenář může hlasovat. Jakmile již hlasoval, odkazy nebudou pro danou skladbu aktivní, nepůjde na ně kliknout. Názvy sloupců tabulky jsou také odkazy, pomocí nich si může čtenář zvolit způsob seřazení hitparády. Pod tabulkou jsou potom odkazy na procházení hitparády: vpřed, na začátek, zpět.
Úplně nad tabulkou hitparády je formulář, který umožňuje vyhledávat v hitparádě. V případě, že nebyl nalezen žádný odpovídající výsledek, je vypsán formulář, kterým může čtenář zaslat svůj tip na skladbu, aby ji správce mohl přidat. Vyplněný formulář je pak zaslán mailem na adresu administrátora hitparády.
Další nutnou součástí je skript htipvote.php, který zajišťuje hlasování. Ten bude uložen v kořeni a nebude se nikam vkládat. Po provedeném hlasování přesměruje zpět na stránku, z které byl volán.
<?PHP include ("scripts/config.php"); $htip=AddSlashes($htip); // ošetřit nebezpečné znaky if (($rat<5) && ($rat>=0)) { // otestování, zda někdo nehlasuje "mimo rozsah" $rat=AddSlashes($rat); // ošetření možného nabourání databáze přes URL $rat=25*$rat; // výpočet procent z hlasovaného čísla $tqry="percvote=(percvote*votes+$rat)/(votes+1), votes=votes+1"; // vytvoření SQL mysql_query("update hittip set $tqry where id = $htip"); // zapsat nové hodnocení do databáze SetCookie("rated[$htip]",1, time()+86400*365,"/"); // nastavit cookie zhodnocené skladby s platností 1 rok } $path=SubStr($SCRIPT_NAME, 0, StrRPos($SCRIPT_NAME,"/")); // nastavit cestu pro přesměrování po hlasování $path.="/?pg=hittip&sby=$sby&start=$start"; Header("Location: http://$HTTP_HOST$path"); // přesměrovat na původní stránku odkud bylo hlasováno exit; ?> |
|
Potřebný je také soubor config.php, ve kterém je mimo připojení k databázi také nastavení různých možností naší hitparády:
<?php Header("Pragma: no-cache"); // hlavičky pro zamezení uložení do cache prohlížeče Header("Cache-Control: no-cache"); Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT"); $def_email = "admin@mojestranky.cz"; // adresa pro zasílání tipů čtenářů $bgart="#6B6DB5"; // barva lichých řádků tabulky hitparády $bgart2="#8096FF"; // barva sudých řádků tabulky hitparády $tipcount=60; // počet vypsaných skladeb hittip na jedné stránce $password="houba"; // heslo admina hitparády $conn = @mysql_connect("server", "uzivatel","heslo"); // připojení k databázi if (!@mysql_select_db("databaze", $conn)) { echo "<pre>Nelze otevřít databázi.<br> <br>Can not open database.</pre>"; exit; } ?> |
|
V dalším dílu si ukážeme, jak bude administrátor přidávat skladby do hitparády, jak budou čtenáři moci zasílat vlastní tipy na email administrátora a jak zakomponovat tuto aplikaci do našich stránek.