Programátorská sociální síť a materiálová základna pro C#, Java, PHP, HTML, CSS, JavaScript a další.


Přihlásit se Registrace  

8. díl - Počítadlo přístupů

Zpět do sekce Jednoduchý dynamický web v PHP

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_as­soc(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(ta­bulka) - 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_a­rray(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(ta­bulka, čí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_row­s(tabulka) - řekne nám, kolik je v dané návratové tabulce řádků.
  • mysql_data_se­ek(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.


 

Autor: Mircosoft
Autor se věnuje amatérskému tvoření v Turbo Pascalu, Assembleru a PHP a profesionálnímu šťourání v jiném Assembleru, Rexxu, Cobolu a podobných obskurnostech.

Jak se vám líbí článek?
Celkem (4 hlasů):
4.75 4.75 4.75 4.75 4.75


 


Předchozí článek
Začínáme s databázemi
Další část seriálu o tvorbě dynamických stránek. Dozvíme se, co to je databáze MySQL a jak se do ní dostat.
Všechny články v sekci
Jednoduchý dynamický web v PHP
V seriálu nejprve v PHP vytvoříme jednoduché doplňky jako webové formuláře, počítadla, ankety a knihy návštev. Nakonec si vytvoříme redakční systém.
Další článek
Anketa - Tvoříme anketu
Další možnost využití databází. Vytvoříme si základ webové ankety a dozvíme se o nebezpečí zvaném SQL injection.


 

 

Vaše komentáře:

04.07.2012 07:22:16
Avatar
Dan
Moderátor
Skill: Core i7 extreme
DotDotDotDotDotDotDotDotDotDot

Ahoj,nevím,jak k tomu mám přičíst tu hodnotu...
To co si tam psal mi nefunguje :(


Odpovědět   i++; | i--;
Každý nějak začíná ;)
04.07.2012 07:47:17
Avatar
Dan
Moderátor
Skill: Core i7 extreme
DotDotDotDotDotDotDotDotDotDot

v PhpMyAdmin mi to hlásí "nebyl vytvořen žádný index"...??


Odpovědět   i++; | i--;
Každý nějak začíná ;)
04.07.2012 07:47:37
Avatar
Kit
Moderátor
Skill: Core i7 extreme
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Dan:

Nemůžeš ty příkazy jen opisovat, ale musíš u toho občas i přemýšlet. My nemůžeme tušit, co jsi napsal špatně. Nenapsal jsi, co ti nefunguje.


Odpovědět   i++; | i--;
Aplikace je hotova až tehdy, když z ní nelze nic odebrat.
04.07.2012 07:49:55
Avatar
Kit
Moderátor
Skill: Core i7 extreme
DotDotDotDotDotDotDotDotDotDot

Ty příklady jsou zvoleny trochu nešťastně, protože je taková zvyklost sloupec Id deklarovat jako "integer primary key auto_increment". V jiných případech doporučuji použít jiný název.

Všechny příkazy SQL musí být ukončeny středníky. Zapomíná se na ně proto, že ovladače v PHP tyto chybějící středníky doplňuje. V návodech by ale chybět neměly, protože s MySQL se pracuje i přímo, bez PHP.


Odpovědět   i++; | i--;
Aplikace je hotova až tehdy, když z ní nelze nic odebrat.
04.07.2012 07:52:35
Avatar
Kit
Moderátor
Skill: Core i7 extreme
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Dan:

Index není potřebný do cca 1000 položek. phpMyAdmin vykládá blbosti.


Odpovědět   i++; | i--;
Aplikace je hotova až tehdy, když z ní nelze nic odebrat.
01.09.2012 08:56:24
Avatar
NoName
Neregistrovaný

Dají se u mysql_num_rows dělat podmínky ? např. WHERE kategorie='moje' ??


Odpovědět
01.09.2012 09:10:19
Avatar
Kit
Moderátor
Skill: Core i7 extreme
DotDotDotDotDotDotDotDotDotDot
Odpovídá na NoName:

Zkus si to přečíst ještě jednou:

mysql_num_row­s(tabulka) - řekne nám, kolik je v dané návratové tabulce řádků.

a zkus si v článku najít, co je to návratová tabulka.


Odpovědět   i++; | i--;
Aplikace je hotova až tehdy, když z ní nelze nic odebrat.
23.02.2013 22:48:31
Avatar
albertpatera
Redaktor
Skill: 486 DX
DotDotDotDotDotDotDotDotDotDot

jak mam vypsat to, co je v tý databázi?? (zobrazit tu tabulku)

Editováno 23. února


Odpovědět   i++; | i--; ( -1 )
25.02.2013 09:50:38
Avatar
Mircosoft
Redaktor
Skill: Core 2 Duo
DotDotDotDotDotDotDotDotDotDot
Odpovídá na albertpatera:

Nejdřív načíst selectem, potom vytáhnout řádky přes mysql_fetch_... a nakonec vypsat echem. Příklad máš na konci odstavce "čtení z databáze", jestli se nemýlím ;).


Odpovědět   i++; | i--;
25.02.2013 12:12:07
Avatar
albertpatera
Redaktor
Skill: 486 DX
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Mircosoft:

jj díky pokusim se to nějak zprovoznit :D


Odpovědět   i++; | i--;

 

Zobrazeno 10 z 10 zpráv


Přidat novou zprávu

Avatar
Neregistrovaný

Pro výhody se přihlaš. Pokud ještě nemáš účet, zaregistruj se.

Jméno:
E-mail:
Web:

Šťastný Smutný S vyplazeným jazykem Mrkající Smějící se Plačící Cool Nemocný Naštvaný S brýlemi Stydící se On to nebyl Překvapený Hodně překvapený Šokovaný Srdce sdraco
Vložení obrázků Obrázky mohou nahrávat pouze registrovaní uživatelé
Vložení dlouhého zdrojáku Pouze pro registrované

 

Pro ověření prosím zaškrtněte pravdivá tvrzení:
Registrovaní uživatelé se tímto zdržovat nemusí. Zaregistrovat se

Jsem člověk
Píši zprávu i přesto, že nemá žádný význam
Nejsem člověk
Chci porušovat pravidla