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

    0

    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.

    Žádný příspěvek v diskuzi

    Odpovědět