Jak na vlastní katalog stránek v PHP – hodnocení odkazů a jejich dostupnost

19. dubna 2001

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í.

hodn1.gif hodn2.gif hodn3.gif hodn4.gif hodn5.gif

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:

is_avail.gif not_avail.gif

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.

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 *