12. diel - Objektové počítadlo návštev v PHP a PDO
V predchádzajúcom cvičení, Riešené úlohy k 9.-11. lekciu OOP v PHP, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.
V minulej lekcii, Riešené úlohy k 9.-11. lekciu OOP v PHP , sme dokončili statiku. Na dnešnej PHP tutoriál máme sľúbený opäť nejaký reálny príklad. Pôjde o objektovú prácu s databázou pomocou ovládača PDO, s ktorým sa v tomto dieli zoznámime.
Pôvodne som chcel vytvoriť anketu, ale tá už je vysvetlená v tutoriálu sa začiatky PHP a iste by ste si ju do objektov dokázali previesť. Dnes si teda skúsime naprogramovať webové počítadlo návštev.
Metodika počítanie prístupov
Pri počítaní návštev webu sa väčšinou rozlišuje medzi tromi termíny:
- Zobrazenie - Počet všetkých zobrazení webu. Započíta sa pri každom prístupe. Ak teda nejaký používateľ zobrazí na webe 10 stránok za hodinu, pripočíta sa 10 zobrazenie.
- Návšteva - Návštevník sa započíta len raz asi za 30 minút. Ak si teda za hodinu 1 užívateľ prečíta 10 článkov, berie sa to ako že web 2x navštívil.
- UIP - Unikátny návštevníci, presnejšie počet unikátnych IP adries za určité obdobie. Pokiaľ si užívateľ prečíta za mesiac 1000 článkov, berie sa to len ako 1 unikátny zobrazenie.
Zobrazenie sú samozrejme najvyššie a UIP najnižšie. UIP majú najvyššiu výpovednú hodnotu. Návštevy sú niečo medzi a v našom prípade je ukladať nebudeme, pretože ich nie je úplne jednoduché rozlíšiť. Budeme ukladať iba zobrazení stránok a počet UIP z nich neskôr jednoducho zistíme tak, že si vyberieme len unikátny zobrazenie za určitý časový úsek.
Databázy
Zobrazenie teda budeme ukladať do databázy. Pri každom zobrazení stránky na našom webe vložíme do databázy riadok s aktuálnym dátumom a IP adresou návštevníka. Dali by sa ukladať aj ďalšie veci, ako prehliadač alebo jazyk, ale to zanedbáme.
U veľa navštevovaných webov sa návštevnosť neukladá do databázy pri každom zobrazení stránky, pretože by to databázu príliš zaťažovalo. Zobrazenie sa logujú do textového súboru a za nejaký čas sa spustí skript, ktorý je zo súboru uložia do databázy. K DB teda nie je pristupované tak často a záťaž je nižšia. V našom prípade toto môžeme určite zanedbať a budeme ukladať zobrazenie rovno do databázy.
Zakladacia skripty
Vytvorme si databázovú tabuľku zobrazeni, ktorá bude mať 3 stĺpce:
- zobrazeni_id (int, AI, primárny kľúč)
- ip (varchar 40)
- dátum (int)
Dátum a čas tu uložíme ako celé číslo. Je to druhá alternatíva oproti databázovému typu DATETIME. Ja osobne ju používam viac, tak si aspoň skúsime zas niečo iné. Dátum uložíme ako počet sekúnd od roku 1970. Robí sa to tak často a rok 1970 nie je náhodný, jedná sa o začiatok Unixové epochy. PHP na to má samozrejme funkcie.
Tabuľku si pokojne naklikajte v PHPMyAdmin:
Prípadne tu máte zakladacia skripty:
CREATE TABLE IF NOT EXISTS `zobrazeni` ( `zobrazeni_id` int(11) NOT NULL AUTO_INCREMENT, `ip` varchar(40) COLLATE utf8_czech_ci NOT NULL, `datum` int(11) NOT NULL, PRIMARY KEY (`zobrazeni_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1 ;
Databáze máme pripravenú.
Prvé zoznámenie s PDO
Minule sme si vysvetlili, že sa v PHP pre prácu s databázou používa
takmer výhradne objektový ovládač PDO. PDO je trieda, ktorá je súčasťou
jazyka PHP. Ukážme si, ako by vyzeralo pripojenie sa k databáze a vloženie
nového riadku do tabuľky zobrazeni
pomocou tohto ovládača.
Pripojenie
Vytvoríme si úplne nový projekt (novú zložku, napríklad s názvom pocitadlo) a dovnútra umiestnime index.php. Do indexu vložíme nasledujúce riadky:
<?php $nastaveni = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' ); $spojeni = new PDO("mysql:host=localhost;dbname=pocitadlo_db", 'root', '', $nastaveni);
Najprv si vytvoríme pole s nastavením pre PDO. Prvý kľúč je spôsob, akým chceme, aby boli spracovávané chyby. Zvolili sme výnimky (exceptions), k tým sa dostaneme ďalej v seriáli. Ten druhý určuje, že nechceme, aby PDO emuloval prepared statements pre staršie verzie MySQL, ktoré ho nepodporovali. Bez tohto nastavenia by sme nemohli používať napr. Parametre v klauzule LIMIT. Tretí kľúč je inicializačné príkaz pre databázu, tu chceme nastaviť kódovanie na UTF-8.
Kľúčové je vytvorenie spojenie, čo prevedieme ako vytvorenie inštancie PDO. Prvý parameter konstruktoru PDO je reťazec obsahujúci pripojovacie údaje. Prvým je hosť (localhost), druhým názov databázy (u mne pocitadlo_db). Ďalšie 2 parametre konstruktoru sú užívateľské meno (u mňa root) a heslo (u mňa prázdne). Ako posledný parameter odovzdáme naše nastavenie. Ak vám to po zapísaní tohto riadku nevypísala žiadnu chybu, ste úspešne pripojení k DB. Ak nie, opravte si pripojovacie údaje.
Dotazy
Akonáhle máme inštanciu PDO spojenie, môžeme na ňu volať databázové dotazy. Na rozdiel od zastaraných ovládačov podporuje PDO tzv. Prepared statements. Ide o oddelenie vkladaní samotného dotazu a parametrov do tohto dotazu. Keďže je dotaz od svojich parametrov oddelený, nemôže dôjsť k SQL injekciu. Databáza si prijaté parametre sama ošetruje. V minulosti sa v PHP pre podobnú ochranu používali funkcie ako mysql_real_escape_string (), na ktoré už môžete zabudnúť
Pripíšte do index.php ďalšie riadky:
$dotaz = $spojeni->prepare('INSERT INTO `zobrazeni` (`ip`, `datum`) VALUES (?, ?)'); $parametry = array($_SERVER['REMOTE_ADDR'], time()); $dotaz->execute($parametry);
Kód si popíšme. Najprv si vytvoríme inštanciu dotazu. Tú nám vráti metóda prepare () na inštanciu PDO spojenie. Do parametra metódy napíšeme normálne SQL dotaz ako textový reťazec. Namiesto parametrov dopytu však vložíme otázniky. Nikdy nebudeme vkladať premenné alebo hodnoty priamo do dotazu! Ide o bezpečnostné riziko.
Parametre potom vložíme do nového poľa v tom poradí, v akom sú otázniky v dotaze. $ _SERVER [ 'REMOTE_ADDR'] obsahuje IP adresu (na lokálnom počítači budete mať dosť možno hodnotu: 1 alebo niečo podobné). Funkcia time () vráti aktuálny čas ako UNIX timestamp (počet sekúnd od 1.1.1970).
Vytvorený dotaz nakoniec spustíme metódou execute (), ktoré odovzdáme polia s parametrami, ktoré sa do dopytu majú vložiť. Skúste index.php navštíviť a pozrieť sa do tabuľky, bude tam nový riadok.
POZOR! Ak máte v PHP zapnuté chybové hlášky a máte nejakú chybu v dotaze, vypíše sa chybové hlásenie. Ovládač PDO vyhadzuje pri chybách výnimky (čo je správne) a keďže sa tie vypisujú spolu so stopou stacku, môžu zobraziť spolu s časťou kódu aj vaše heslo k databáze! Je veľmi dôležité, aby ste o tom vedeli a mali vypnuté chyby na produkčnom serveri (kde samozrejme vypnuté byť majú).
To by bolo pre dnešok všetko. V budúcej lekcii, Objektové počítadlo návštev v PHP - dokončenie , budeme v počítadle pokračovať a vytvoríme si objekt, ktorý bude návštevy zaznamenávať, analyzovať a vypisovať. Dnešné zdrojový kód vrátane exportu DB je ako vždy pripojený pod článkom na stiahnutie.
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é 956x (1.97 kB)
Aplikácia je vrátane zdrojových kódov v jazyku PHP