Dnes se podíváme na implementaci hodnocení kvality stránek, jejichž odkazy jsou uloženy v našem katalogu. Myslím, že pro návštěvníky katalogu může být docela užitečné, když u každého odkazu budou mít zobrazené průměrné hodnocení ostatních návštěvníků. V druhé části se pak podíváme na testování dostupnosti stránek. U každého odkazu bude zobrazeno tedy jeho hodnocení a zdali je dostupný.
Hodnocení kvality
Nejprve si připravíme obrázky, které budou symbolizovat hodnocení 1 až 5 bodů. Asi to nejjednoduší, co vás napadne, je 1 až 5 hvězdiček. V nějakém grafickém programu si vyrobíme pět obrázků hodn1.gif až hodn5.gif. Vzhledem k tomu, že náš katalog může mít jakékoliv grafické pozadí, je vhodné tyto obrázky vytvořit jako GIFy s transparentní barvou jako pozadí.
Vzpomeňte si, jak jsme ve 3. díle programovali zobrazení seznamu odkazů v dané sekci. Uvedený kód budeme muset mírně modifikovat – přidáme tam právě zobrazení hodnocení odkazu a dále jeho dostupnost. Oba tyto údaje (jak hodnocení tak i dostupnost) máme u každého odkazu uloženo přímo v databázi. Připomeňme si, jak jsme vytvořili tabulku ODKAZ:
CREATE TABLE odkaz (id INTEGER NOT NULL, nazev VARCHAR(80) NOT NULL, popis VARCHAR(160), url VARCHAR(100) NOT NULL, ascii_text VARCHAR(240), kvalita_pocet INTEGER DEFAULT 0, kvalita_prum INTEGER DEFAULT 0, dostupnost CHAR(1) DEFAULT ‚A‘, sekce_id INTEGER NOT NULL, e_mail VARCHAR(30) NOT NULL, modifikovano DATE, heslo VARCHAR(20), PRIMARY KEY (id), FOREIGN KEY (sekce_id) REFERENCES sekce (id) ); |
|
Při tvorbě této tabulky jsem se dopustil menší neobezřetnosti. Sloupec KVALITA_PRUM musí být samozřejmě reálné číslo, protože do tohoto sloupce potřebujeme uložit desetinné číslo. Takže řádek se sloupcem KVALITA_PRUM bude vypadat takto:
kvalita_prum REAL DEFAULT 0, |
|
Nyní mírně zmodifikuji zobrazení seznamu odkazů v zadané sekci (skript index.php, 3. díl), tak, aby u každého odkazu bylo navíc zobrazeno hodnocení odkazu a jeho dostupnost.
$dotaz = „SELECT id, nazev, popis, url, kvalita_prum, dostupnost FROM odkaz WHERE sekce_id = $sekce“;
mysql_connect(„localhost“); $odkazy = mysql(„katalog“,$dotaz); $pocet = mysql_num_rows($odkazy); print „<BR>V této sekci bylo nalezeno: <B>$pocet</B> záznamů<BR>“; print „<UL>“; for ($i=0; $i<=$pocet; $i++) { $id = mysql_result($odkazy, $i, „id“); $nazev = mysql_result($odkazy, $i, „nazev“); $popis = mysql_result($odkazy, $i, „popis“); $url = mysql_result($odkazy, $i, „url“); $kvalita = mysql($odkazy, $i, „kvalita_prum“); $dostupnost = mysql($odkazy, $i, „dostupnost“); /* zjistime cele cislo nejblizsi tomu realnemu – urci, kolik hvezdicek se zobrazi */ $hodn = round($kvalita); $cele_cislo = floor($hodn); /* pripravime si odpovidajici obrazky */ $obrazek = ‚hodn‘.“$cele_cislo“.‘.gif‘; $dostupny = ‚not_avail.gif‘; if ($dostupnost == ‚A‘) { $dostupny = ‚is_avail.gif‘; } print „<LI> <A HREF=\“$url\“ TARGET=\“_top\“>$nazev</A>“; print „<A HREF=\“hodnoceni.php?id=$id\“><IMG SRC=\“$obrazek\“ BORDER=0></A>“; print „<IMG SRC=\“$dostupny\“>“; print „<BR>“; print „$popis<BR>“; print „<A HREF=\“$url\“ TARGET=\“_top\“>$url</A>“; } mysql_close; print „</UL>“; |
|
Co se tedy změnilo oproti původnímu kódu ze 3. dílu? V SQL dotazu kromě názvu, popisu a url potřebujeme vědět také ID odkazu, hodnotu KVALITA_PRUM a DOSTUPNOST. ID odkazu využijeme při předávání skriptu hodnoceni.php. Tento atribut definuje, jaký odkaz bude návštěvník hodnotit. Z hodnoty KVALITA_PRUM se zjistí zaokrouhlením celé číslo (1 až 5), které nám určí, jaký obrázek (hodn1.gif až hodn5.gif) se zobrazí u daného odkazu jako hodnocení. A nakonec je-li hodnota sloupce DOSTUPNOST rovna ‚A‘ zobrazíme obrázek označující dostupnou stránku, je-li rovna ‚N‘, pak zobrazíme obrázek pro nedostupnou stránku. Zdali nějaká stránka je nebo není dostupná, nebudeme testovat přímo ve skriptu index.php, ale naprogramujeme si skript over_odkazy.php, který se bude spouštět řekněme jednou v noci a bude aktualizovat hodnoty ‚A‘ a ‚N‘, dle dostupnosti stránek. Dá se tedy říci, že odkazy budou mít u sebe uvedenou dostupnost platnou k poslední půlnoci. O tom, jak bude tento skript vypadat, se zmíním níže. Nejprve se ale zastavme u skriptu hodnoceni.php.
Skript hodnoceni.php
Tento skript bude mít na vstupu ID daného odkazu, který chce návštěvník katalogu hodnotit. Zobrazíme základní informace o tomto odkazu (mohou být i podrobnější, např. od kdy je odkaz v databázi) a pod těmito informacemi bude zobrazen formulář, pomocí nějž návštěvník ohodnotí daný odkaz. Formulář bude mít tlačítko „Ohodnoť“. Stisk tlačítka „Ohodnoť“ bude indikovat parametr AKCE s hodnotou „Ohodnoť“.
<?php /* hodnoceni odkazu — skript hodnoceni.php */ if (($akce) && ($akce == ‚Ohodnoť‘)) { /* bylo stisknuto tlacitko formulare */ $dotaz = „SELECT kvalita_pocet, kvalita_prum FROM odkaz WHERE id = $id“;
mysql_connect(„localhost“); $h = mysql(„katalog“, $dotaz);
$pocet = mysql_result($h, 0, „kvalita_pocet“); $prumer = mysql_result($h, 0, „kvalita_prum“);
/* vypoceteme novou hodnotu kvalita_prum */ $kvalita_prum = (($pocet * $prumer) + $body) / ($pocet+1); $kvalita_pocet = $pocet+1; /* provedeme update v tabulce ODKAZ na nove hodnoty kvalita_pocet a kvalita_prum */ $prikaz = „UPDATE odkaz SET kvalita_prum = $kvalita_prum, kvalita_pocet = $kvalita_pocet WHERE id = $id“;
mysql(„katalog“, $prikaz);
if (mysql_errno() == 0) { print „Vaše hodnocení bylo úspěšně zapsáno do databáze“; }
mysql_close; print „<A HREF=“index.php“>Zpět</A> na katalog“; } else { /* skript je zavolan poprve, tj. parametr AKCE je prazdny */ $dotaz = „SELECT id, nazev, popis, url, dostupnost, modifikovano FROM odkaz WHERE id = $id“;
mysql_connect(„localhost“); $odkaz = mysql(„katalog“, $dotaz); $pocet = mysql_num_rows($odkaz);
if ($pocet == 1) { /* nasli jsem odpovidajici odkaz */
$id = mysql_result($odkaz, 0, „id“); $nazev = mysql_result($odkaz, 0, „nazev“); $popis = mysql_result($odkaz, 0, „popis“); $url = mysql_result($odkaz, 0, „url“); $dostupnost = mysql_result($odkaz, 0, „dostupnost“); $modif = mysql_result($odkaz, 0, „modifikovano“);
print „Název: $nazev<BR>“; print „Popis: $popis<BR>“; print „URL: $url<BR>“; print „Dostupný: $dostupnost<BR>“; print „Modifikováno: $modif<BR>“;
print „<FORM ACTION=\“hodnoceni.php\“ METHOD=\“GET\“>“;
/* uchovame si informaci o tom, ktery odkaz je hodnocen */ print „<INPUT TYPE=\“hidden\“ NAME=\“id\“ VALUE=\“$id\“>
/* zobrazime hodnotici stupnici */ print „<INPUT TYPE=\“radio\“ NAME=\“body\“ VALUE=\“5\“ CHECKED> 5 bodů – super<BR>“; print „<INPUT TYPE=\“radio\“ NAME=\“body\“ VALUE=\“4\“> 4 body – dobré<BR>“; print „<INPUT TYPE=\“radio\“ NAME=\“body\“ VALUE=\“3\“> 3 body – ujde to<BR>“; print „<INPUT TYPE=\“radio\“ NAME=\“body\“ VALUE=\“2\“> 2 body – nic moc<BR>“; print „<INPUT TYPE=\“radio\“ NAME=\“body\“ VALUE=\“1\“> 1 bod – děsné<BR>“; print „<INPUT TYPE=\“submit\“ NAME=\“akce\“ VALUE=\“Ohodnoť\“>“; print „</FORM>“; } else { print „Nastala chyba: neexistuje záznam daného čísla“; } mysql_close; } ?> |
|
Dostupnost stránek
Podívejme se stručně, jak to bude vypadat s dostupností stránek. V prvním uvedeném zdrojovém kódu (zobrazení seznamu odkazů) jsou uvedeny dva obrázky is_avail.gif a not_avail.gif. Ty mohou vypadat například takto:
Při zobrazování odkazů v dané sekci čteme rovnou údaj o dostupnosti stránek. Pokud je tedy hodnota rovna ‚A‘, pak zobrazíme první obrázek, jinak druhý. Na vlastní ověření dostupnosti použijeme funkci check_url($url), jejíž kód hned uvedu. Na základě otestované dostupnosti skript over_odkazy.php zaktualizuje hodnoty sloupce DOSTUPNOST (na hodnoty ‚A‘ nebo ‚N‘).
Skript over_odkazy.php
Nejprve uvedu kód funkce check_url, kterou ve skriptu použijeme. Je-li stránka zadaná pomocí URL dostupná, pak funkce vrátí znak ‚A‘, jinak vrátí ‚N‘:
function check_url ($url) { $f = @fopen(„$url“,“r“); $navrat = ‚A‘; if (!$f) { $navrat = ‚N‘; } fclose($f); return $navrat; } |
|
Následuje zdrojový kód skriptu, který zaktualizuje hodnoty atributu DOSTUPNOST všech odkazů podle aktuální situace:
$dotaz = „SELECT id, url, dostupnost FROM odkaz“; mysql_connect(„localhost“); $result = mysql(„katalog“, $dotaz); $pocet = mysql_num_rows($result); for ($i=0; $i<$pocet; $i++) { /* kazde URL overime, a pokud doslo ke zmene, zaktualizujeme */ $id = mysql_result($result, $i, „id“); $url = mysql_result($result, $i, „url“); $dst = mysql_result($result, $i, „dostupnost“);
$p = check_url($url);
if (!($p == $dst)) { /* zmenil se stav */ $prikaz = „UPDATE odkaz SET dostupnost = ‚$p‘ WHERE id = $id“; mysql(„katalog“, $prikaz); } } mysql_close; |
|
Tento skript pak vhodně zařadíme do plánovače úloh a v závislosti na tom, jak moc chceme mít tento údaj u odkazu aktuální, zvolíme, jak často se bude tento skript spouštět.
Starší komentáře ke článku
Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.