8. díl - Počítadlo přístupů
V minulém dílu našeho PHP seriálu jsme si řekli něco o databázích. Dnes si je vyzkoušíme v praxi, vytvoříme si počítadlo návštěvníků naší stránky.
Začít musíme vytvořením tabulky. Co všechno v ní budeme potřebovat? Určitě číslo, do kterého uložíme stav počítadla, to je jasné. Počty návštěv se u začínající stránky pohybují zhruba v řádu tisíců, později desetitisíců a jestli se rozjedete opravdu hodně, můžete se dostat třeba až k milionům. Jako datový typ tedy zvolíme něco dostatečně velkého, např. INT UNSIGNED.
Pro jedno počítadlo by tohle stačilo. Ale co kdybychom jich časem začali potřebovat víc, třeba kdybychom chtěli počítat přístupy na každé podstránce zvlášť? V takovém případě bude potřeba jednotlivá počítadla nějak odlišit. Můžeme jim přidělit číslo nebo třeba textové jméno, to je jedno, hlavně aby mělo každé svoje jedinečné označení. Pro ilustraci použijeme písmeno: CHAR(1). Příkaz pro vytvoření tabulky tedy bude vypadat takto:
CREATE TABLE pocitadla
(
id CHAR(1),
hodnota INT UNSIGNED
)
Tím nám vznikne tabulka jménem pocitadla, ve které budou dva sloupce: id a hodnota. Jméno id je víceméně tradice; pro identifikační klíče ho používají prakticky všichni, tak ho použijeme i my. Ale není to nutné - jestli chcete, pojmenujte si ho jinak.
Praktické provedení v PHP:
$OK=mysql_query("CREATE TABLE pocitadla (id CHAR(1), hodnota INT UNSIGNED)",$spojeni);
if ($OK) echo 'OK, tabulka je vytvořená';
else echo 'Pozor, chyba - tabulku se nepodařilo vytvořit!';
Při takovéhle jednorázové akci celkem nemá cenu se piplat s kontrolou úspěšnosti, protože si tabulku můžeme ručně zkontrolovat v administračním rozhraní, které servery obvykle poskytují. Vlastně i ten příkaz pro vytvoření můžeme pustit přímo tam a ne v PHP. Je to na vás.
Dobrá, máme tabulku, ale zatím prázdnou. Co dál?
Vkládání řádků do tabulek
Příkaz se jmenuje (překvapivě) INSERT, tedy "vlož". Syntaxe vypadá takto:
INSERT INTO tabulka VALUES (první, druhá, třetí, ... poslední)
vlož do hodnoty
V závorce vypíšeme požadované hodnoty pro všechny položky (sloupce) vkládaného řádku, ve stejném pořadí, v jakém byly uvedeny při CREATE TABLE.
V našem případě bude vložení počítadla vypadat takhle:
INSERT INTO pocitadla VALUES ('A',0)
Počítadlo jsem si pojmenoval "A" a dal mu počáteční hodnotu 0. Zápis v PHP už si domyslete sami, návratová hodnota z mysql_query() bude opět true (povedlo se) nebo false (chyba). Tabulka tedy dopadla takhle:
| id | hodnota |
|---|---|
| 'A' | 0 |
Tím je počítadlo připraveno k použití. Budeme s ním dělat celkem dvě věci: zobrazovat jeho aktuální hodnotu a zvyšovat ji o 1 při každém načtení stránky (filtrování opakovaných přístupů ze stejného počítače si necháme na jindy).
Čtení z databáze
SQL na to má příkaz SELECT ("vyber"), který z dané tabulky vybere podtabulku o zadaných rozměrech a vlastnostech. Možností, jak příkaz přesně nasměrovat na data, která chceme, je nepřeberně. Úplně nejzákladnější syntaxe vypadá takhle:
SELECT * FROM tabulka
vyber z
Takový příkaz nám dá kompletně celý obsah tabulky. Hvězdička znamená "všechny sloupce", nepřítomnost jakýchkoli omezujících podmínek znamená, že do výběru padnou úplně všechny řádky. Na jednořádkovou tabulku s počítadlem by nám už tohle teoreticky stačilo, ale podíváme se ještě na další možnosti.
SELECT * FROM tabulka WHERE podmínka
vyber z kde
Tím se výběr řádků zúží pouze na ty, které splňují danou podmínku. Pro naše počítadlo by podmínka mohla být WHERE id='A' (pozor: narozdíl od PHP, znak "=" tady znamená "rovná se" a ne "přiřaď"). To už by nám určitě stačilo, ale ještě to není úplně dokonalé. Identifikační kód z tabulky číst nepotřebujeme, protože ho nehodláme zobrazovat; stačit nám bude jenom sloupec s hodnotou. Sloupce se filtrují takto:
SELECT sloupec1, sloupec2, ... sloupecN FROM tabulka
Tím tedy máme všechno, co potřebujeme. Příkaz pro načtení hodnoty počítadla A by mohl vypadat takhle:
SELECT hodnota FROM pocitadla WHERE id='A'
Teď už je přístup přes PHP samozřejmě nezbytný, protože v něm budeme zpracovávat to, co z databáze vypadne:
$vysledek=mysql_query("SELECT hodnota FROM pocitadla WHERE id='A'",$spojeni);
Důležitá je proměnná $vysledek. Do té systém uloží data, která z databáze načetl, a to ve formě tabulky (my jsme sice přečetli jenom jedno jediné číslo, ale i tak ho PHP vidí jako tabulku o velikosti 1x1). Kdyby se nic nenačetlo (třeba kdyby byla tabulka prázdná nebo kdyby žádný řádek nesplňoval zadané podmínky), vrátí se false.
Z návratových tabulek se nedá číst přímo, ale je na to celá sada speciálních funkcí:
- mysql_fetch_assoc(tabulka) - dá nám jeden řádek dané návratové tabulky ve formě běžného pole, indexy jsou názvy sloupců (pozor, citlivé na velikost písmen). Při prvním zavolání dá první řádek, při dalším druhý atd. a když dojede za konec tabulky, vrátí false.
- mysql_fetch_row(tabulka) - skoro totéž jako mysql_fetch_assoc, ale výsledné pole má číselné indexy: první sloupec má index 0, druhý 1 atd.. Je to o nepatrný ždibec rychlejší, ale o dost méně přehledné, takže bych doporučoval používat spíš fetch_assoc.
- mysql_fetch_array(tabulka) - kombinace předchozích dvou, výsledky můžeme indexovat jak čísly, tak jmény sloupců. V dalších příkladech budu používat prakticky výhradně tuhle funkci.
- mysql_result(tabulka, číslo řádku, jméno sloupce) - dá přímo hodnotu z daného řádku (počítají se od 0) a sloupce. Z hlediska rychlosti jsou výhodnější výše uvedené funkce na čtení celých řádků, ale pokud máme dlouhou tabulku a chceme z ní třeba jenom jednu buňku, může se tohle hodit (lepší by ovšem bylo upravit Select tak, aby četl jenom to, co chceme).
- mysql_num_rows(tabulka) - řekne nám, kolik je v dané návratové tabulce řádků.
- mysql_data_seek(tabulka, číslo řádku) - posune interní "kurzor" na daný řádek (počítáno od nuly). Příští volání mysql_fetchněco pak přečte tenhle řádek. V praxi to asi vůbec nepoužijeme.
Plus pár dalších, které nebudeme potřebovat.
Takže pokračujeme: hodnotu počítadla máme načtenou v proměnné $vysledek, teď si ji vytáhneme do obyčejného čísla:
$radek=mysql_fetch_array($vysledek);
if ($radek) //Povedlo se? Kdyby ne, vyšla by logická nula.
$cislo=$radek['hodnota']; //OK, máme to - přečti číslo.
else $cislo='?'; //Nepovedlo se - dej tam nějakou chybovou hlášku.
echo 'Jsi náš '.$cislo.'. návštěvník!';
Mohli bychom použít i funkci mysql_fetch_row, v tom případě by třetí řádek vypadal takhle: $cislo=$radek[0] (jak vidíte, číslování se vztahuje na výslednou podtabulku, ne na původní tabulku, kde máme hodnotu na druhém místě).
Tím máme další krok hotový, zbývá už jenom připočítat tuhle návštěvu k uložené hodnotě.
Změny hodnot v databázi
Příkaz se jmenuje UPDATE (přeložitelné jako "změň", "uprav" nebo "aktualizuj"). Syntaxe:
UPDATE tabulka SET sloupec1=hodnota1, sloupec2=hodnota2 atd. WHERE podmínka
uprav nastav
Nová hodnota vybraného sloupce může být jakýkoli výraz kompatibilního typu a může se v něm objevit i původní hodnota, např. cislo=10*cislo-5.
Filtrovací část s WHERE funguje stejně jako u Selectu. Když ji neuvedete, změna se provede na všech řádcích tabulky.
Přičtení jedničky k počítadlu je celkem jednoduchá věc:
UPDATE pocitadla SET hodnota=hodnota+1 WHERE id='A'
Po zabalení do funkce mysql_query příkaz vrací buď true nebo false podle toho, jestli se úprava povedla.
Tím máme počítadlo hotové, finální sesypání do jednoho skriptu už nechám na vás.
Pro úplnost doplním ještě jednu věc:
Rušení tabulek
Kdyby vás nějaká tabulka omrzela a chtěli jste ji zlikvidovat (při počátečních experimentech se to stává celkem často), dělá se to tímhle příkazem:
DROP TABLE tabulka
zahoď tabulku
Samozřejmě je potřeba dávat pozor, co se maže - není tady žádný čudlík "zpět", takže případný přehmat by šel napravit jenom v případě, že databázi máte někde zálohovanou.
To by pro dnešek mohlo být asi tak všechno...
Moment, a co oficiální dokumentace k MySQL?
No jo, jasně - tady je: dev.mysql.com (nezaměňujte dev za www, tím byste se dostali na komerční část stránek, odkud se k manuálům dá dopídit snad jedině přes vyhledávací okénko). V tabulce uprostřed stránky si vyberte svůj oblíbený jazyk a datový formát, klikněte a jste tam.
A to už je opravdu všechno.
Komu to nestačilo, může se podívat na alternativní verzi tohoto trojčlánku s několika drobnostmi navíc.
Příště se do SQL ponoříme hlouběji a vytvoříme si webovou anketu.


Tisk




.