Hudební hitparáda – hodnocený seznam v PHP a MySQL 1.

29. dubna 2002

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 ?>">
&nbsp;interpret <input type="text" name="author" size="15" value="<?PHP echo $author ?>" class="sform">
&nbsp;&nbsp;&nbsp;skladba <input type="text" name="track" value="<?PHP echo $track ?>" size="15" class="sform">
&nbsp;&nbsp;<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\">&nbsp;$rdata[4]%<br>";
else
echo "nehodnoceno<br>";
if ((isset($rat)) || (isset($rated[$htip]))) // ověřit, zda již nebylo hlasováno podle cookies
echo "|&nbsp;1&nbsp;|&nbsp;2&nbsp;|&nbsp;3&nbsp;|&nbsp;4&nbsp;|&
nbsp;5&nbsp;|<br>";
else
echo "|&nbsp;<a href=\"htipvote.php?htip=$rdata[0]&rat=4&sby=$sby&start=$start\" title=\"perfektní\"><font size=\"1\">1</font></a>&nbsp;|&nbsp;<a href=\"htipvote.php?htip=$rdata[0]&rat=3&sby=$sby&start=$start\" title=\"dobrý\"><font size=\"1\">2</font></a>&nbsp;|&nbsp;<a href=\"htipvote.php?htip=$rdata[0]&rat=2&sby=$sby&start=$start\" title=\"průměrný\"><font size=\"1\">3</font></a>&nbsp;|&nbsp;<a href=\"htipvote.php?htip=$rdata[0]&rat=1&sby=$sby&start=$start\" title=\"slabąí\"><font size=\"1\">4</a>&nbsp;|&nbsp;<a href=\"htipvote.php?htip=$rdata[0]&rat=0&sby=$sby&start=$start\" title=\"hrůza, uľ nikdy\"><font size=\"1\">5</font></a>&nbsp;|<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 "&nbsp;|&nbsp;<a href=\"?pg=hittip&sby=$sby&start=0\">začátek</a>&nbsp;|&nbsp;";
}
else {
echo "předchozí";
echo "&nbsp;|&nbsp;začátek&nbsp;|&nbsp;";
}
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>&nbsp;<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.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *