IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

13. diel - Objektové počítadlo návštev v PHP - dokončenie

V minulej lekcii, Objektové počítadlo návštev v PHP a PDO , sme začali programovať počítadlo návštev. Založili sme si databázovú tabuľku a naučili sa obsluhovať databázu pomocou ovládača PDO. V dnešnom PHP tutoriále si ukážeme, ako databázové spojenie udržiavať, odovzdávať a ako uľahčiť spúšťanie dotazov.

Databázový wrapper

Práca s databázou v PDO, ako sme si ju ukazovali, má jeden nedostatok. Určite totiž budeme chcieť používať databázu na viacerých miestach v aplikácii a takto by sme sa museli zakaždým znovu pripájať alebo si inštancii spojenie ručne odovzdávať. Keď si spomenieme na statiku, tak práve tá nám umožňuje zdieľať nejaké dáta v celej aplikácii. Vytvoríme si tzv. Databázový wrapper. Bude sa jednať o statickú, pomocnú triedu, ktorú obalíme volanie PDO. Z toho označenie wrapper, ako obal.

Vytvoríme si našu známu zložku pre triedy, opäť ju pomenujeme treba tridy. V zložke vytvoríme súbor Databaze.php s nasledujúcim obsahom:

<?php

class Databaze
{

    private static $spojeni;

    private static $nastaveni = array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
    );

    public static function pripoj($host, $uzivatel, $heslo, $databaze)
    {
        if (!isset(self::$spojeni))
        {
            self::$spojeni = @new PDO(
                "mysql:host=$host;dbname=$databaze",
                $uzivatel,
                $heslo,
                self::$nastaveni
            );
        }
        return self::$spojeni;
    }

    public static function dotaz($sql, $parametry = array())
    {
        $dotaz = self::$spojeni->prepare($sql);
        $dotaz->execute($parametry);
        return $dotaz;
    }

}

Trieda je veľmi krátka a obsahuje dva privátne statické atribúty. Jedným je nastavenie PDO, druhým je práve pripojená inštancia PDO, ktorú budeme v aplikácii zdieľať.

V triede ďalej nájdeme dve verejné statické metódy. Jednu pre pripojenie, ktorá vytvorí inštanciu PDO a tú uloží do statickej premennej $ spojení. Tam pripojená inštancie zostane až do skončenia skriptu. Druhá statická metóda nám umožňuje zadať dotaz a jeho parametre. Otázka je potom odovzdaný inštanciu PDO a metóda navráti to, čo navrátil dotaz. Wrapper je veľmi jednoduchý a počas tohto i ďalších seriálov ho budeme ešte vylepšovať. Zatiaľ nám však stačí.

Trieda SpravceNavstev

Logiku k správe návštev umiestnime do novej triedy SpravceNavstev. Určite budeme potrebovať metódu na zaznamenanie návštevy, presnejšie na uloženie zobrazenie. Ďalej sa nám bude hodiť metóda, ktorá vráti celkový počet zobrazení a unikátnych návštevníkov. Na koniec pridajme metódu, ktorá vráti návštevy a zobrazenia za posledných niekoľko dní.

Naša trieda bude vyzerať asi takto:

<?php

class SpravceNavstev
{

    public function zapocitej()
    {
        Databaze::dotaz('
            INSERT INTO `zobrazeni`
            (`ip`, `datum`)
            VALUES (?, ?)
        ', array($_SERVER['REMOTE_ADDR'], time()));
    }

    public function zobrazeniCelkem()
    {
        $vysledek = Databaze::dotaz('
            SELECT COUNT(*) AS `pocet`
            FROM `zobrazeni`
        ');
        $data = $vysledek->fetch();
        return $data['pocet'];
    }

    public function zobrazeniZa($dnu)
    {
        $vysledek = Databaze::dotaz('
            SELECT COUNT(*) AS `pocet`
            FROM `zobrazeni`
            WHERE `datum` > ?
        ', array(time() - $dnu * 86400));
        $data = $vysledek->fetch();
        return $data['pocet'];
    }

    public function uipCelkem()
    {
        $vysledek = Databaze::dotaz('
            SELECT COUNT(DISTINCT `ip`) AS `pocet`
            FROM `zobrazeni`
        ');
        $data = $vysledek->fetch();
        return $data['pocet'];
    }

    public function uipZa($dnu)
    {
        $vysledek = Databaze::dotaz('
            SELECT COUNT(DISTINCT `ip`) AS `pocet`
            FROM `zobrazeni`
            WHERE `datum` > ?
        ', array(time() - $dnu * 86400));
        $data = $vysledek->fetch();
        return $data['pocet'];
    }

    public function vypisStatistiky()
    {
        echo('<table>');
            echo('<tr>
                <td>Zobrazení celkem</td>
                <td>' . $this->zobrazeniCelkem() . '</td>
            </tr>');
            echo('<tr>
                <td>UIP celkem</td>
                <td>' . $this->uipCelkem() . '</td>
            </tr>');
            echo('<tr>
                <td>Zobrazení měsíc</td>
                <td>' . $this->zobrazeniZa(30) . '</td>
            </tr>');
            echo('<tr>
                <td>UIP mesíc</td>
                <td>' . $this->uipZa(30) . '</td>
            </tr>');
            echo('<tr>
                <td>Zobrazení týden</td>
                <td>' . $this->zobrazeniZa(7) . '</td>
            </tr>');
            echo('<tr>
                <td>UIP týden</td>
                <td>' . $this->uipZa(7) . '</td>
            </tr>');
        echo('</table>');
    }

}

V triede používame náš statický databázový wrapper. Obsahuje celkom 6 jednoduchých metód. Prvá je metóda pre uloženie nového zobrazenia. Tento dotaz sme si už uvádzali, teraz len používame náš wrapper. Ďalšie 2 metódy vracajú buď celkový počet zobrazení alebo počet zobrazení za posledných niekoľko dní. Podobne potom máme 2 metódy pre UIP. Všetky metódu sú verejné, keby sme si niekde v aplikácii chceli zistiť nejakú štatistiku samostatne.

Pokiaľ z výsledku dotazu potrebujeme prečítať nejakú hodnotu, je potrebné najprv zavolať na výsledku metódu fetch () alebo fetchAll ().

Fetch () vráti ďalší riadok výsledku (ako pole), fetchAll () vráti pole všetkých riadkov, ktoré dotaz vrátil. Fetch () budeme volať v prípade, kedy nás zaujíma len jeden riadok. FetchAll () potom vtedy, kedy nás zaujímajú všetky riadky. Na výsledku môžeme zavolať tiež ROWCOUNT (), ktorá vráti počet riadkov vo výsledku. Nepoužívajte ju však namiesto SQL príkazu COUNT! K zaisteniu počtu unikátnych IP adries sme použili klauzulu DISTINCT. Ak ste čítali tunajšie MySQL seriál, tak isto viac, že práve tá pracuje s unikátnymi riadkami.

V otázkach ďalej používame konštantu 86400, čo je počet sekúnd v dni :) Konštantu vynásobíme počtom dní a výsledok odpočítame od aktuálneho času, ktorý vracia funkcia time (). Máme potom dátum, od ktorého nás štatistiky zaujímajú. Takáto práca s dátumom a časom mi príde veľmi prehľadná, ale to je asi vec názoru. Pokojne môžete používať databázový DATETIME.

Sprevádzkovanie aplikácie

Poďme všetko sprevádzkovať. Vráťme sa do index.php, vložme doň HTML štruktúru, PHP autoloader (aby sme nemuseli triedy načítať ručne) a nekonec sa pripojme k databáze.

<!DOCTYPE html>

<html lang="cs-cz">
    <head>
            <meta charset="utf-8" />
            <title>OOP v PHP na ITnetwork</title>
    </head>

    <body>
    <h1>Návštěvnost webu</h1>
        <?php
        mb_internal_encoding("UTF-8");

        function nactiTridu($trida)
        {
            require("tridy/$trida.php");
        }

        spl_autoload_register("nactiTridu");

    Databaze::pripoj('localhost', 'root', '', 'pocitadlo_db');

    ?>
    </body>
</html>

Spojenie sa uložilo do statické premenné a už sa o neho nemusíme starať, zostane tam do skončenia skriptu.

Započítaní návštevy a výpis tabuľky návštev vložíme pre jednoduchosť oboje do indexu. V praxi je zistenie počtu návštev veľmi náročná operácia (kvôli COUNT vo veľkom počte záznamov) a preto ju budeme volať len niekde v administrácii, aby sme sa pozreli ako si stojíme. Naopak započítanie návštevy zavoláme na každej stránke webu.

$spravceNavstev = new SpravceNavstev();
$spravceNavstev->zapocitej();
$spravceNavstev->vypisStatistiky();

Výsledok sme nijako nestylovali, takže vyzerá skromne:

Tvoja stránka
localhost

Budúci lekcie, Riešené úlohy k 12.-13. lekciu OOP v PHP , bude o ďalších technikách v OOP, ktorých sme neprebrali ešte celý rad. Výsledok dnešného snaženia je k stiahnutiu pod článkom.

V nasledujúcom cvičení, Riešené úlohy k 12.-13. lekciu OOP v PHP, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 1119x (4.15 kB)
Aplikácia je vrátane zdrojových kódov v jazyku PHP

 

Predchádzajúci článok
Objektové počítadlo návštev v PHP a PDO
Všetky články v sekcii
Objektovo orientované programovanie (OOP) v PHP
Preskočiť článok
(neodporúčame)
Riešené úlohy k 12.-13. lekciu OOP v PHP
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity