Facebook RSS feed
Zveme vás v pátek 31.10. na vánoční sraz komunity itnetwork.

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

Zpět do sekce Databáze v PHP pro začátečníky

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.


 

Článek pro vás napsal Mircosoft
Avatar
Autor se věnuje amatérskému tvoření v Turbo Pascalu, Assembleru a PHP a pár let se profesionálně šťoural v jiném Assembleru, Rexxu, Cobolu a podobných obskurnostech.

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


 


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
Databáze v PHP pro začátečníky
Sekce obsahuje tutoriály pro práci s nejen MySQL databází pro začátečníky. V seriálu vytvoříme jednoduchý redakční systém, knihu návštěv a anketu.
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:
Zobrazit starší komentáře (3)

Avatar
Kit
Redaktor
Avatar
Kit:

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 4.7.2012
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Kit:

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

Odpovědět 4.7.2012
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar


Avatar
:

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

 
Odpovědět 1.9.2012
Avatar
Kit
Redaktor
Avatar
Odpovídá na NoName
Kit:

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 1.9.2012
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
albertpatera
Redaktor
Avatar
albertpatera:

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

Editováno 23.2.2013
 
Odpovědět   -1 23.2.2013
Avatar
Mircosoft
Redaktor
Avatar
Odpovídá na albertpatera
Mircosoft:

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 25.2.2013
Avatar
albertpatera
Redaktor
Avatar
Odpovídá na Mircosoft
albertpatera:

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

 
Odpovědět 25.2.2013
Avatar
czubehead
Člen
Avatar
czubehead:

Mám problém s kódováním. Místo Novák se mi zobrazuje Novák (v phpMyAdmin). domnívám se, že tam ty data posílám v utf-8.

Odpovědět 12.9.2013
Nōn scholā magistrīsque, sed prō vītā discō.
Avatar
czubehead
Člen
Avatar
czubehead:

Už je to v pořádku. Zobrazovalo se to jen v phpMyAdmin, jinak jsou hodnoty normální.

Odpovědět 12.9.2013
Nōn scholā magistrīsque, sed prō vītā discō.
Avatar
arnie.one.hc
Člen
Avatar
arnie.one.hc:

Ahoj,

jen pár postřehů. Kroky jsou pro mě zmatečné, chybí vysvětlení proč se dělá každý krok, chybí kontrola kroků. Je to přeci návod pro "začatečníky".

a) vytvoření tabulky
b) vkládání řádků do tabulek
c) čtení z database
d) změny hodnot v tabulce "..finální sesypání do jednoho skriptu už nechám na vás."

Dle mě pro laika, jako jsem já.

index.php - zde použiji počítadlo
pocitadlo.php - odtud budu čerpat
1. část - pocitadlo.php
1) navázání spojení s SQL serverem
- echo - kontorla zda ANO/NE
2) vytvoření database, nebo načtení již exsistující ?
- echo - kontorla zda ANO/NE
3) vytvoření tabulky pro ukládání
- echo - kontorla zda ANO/NE
4)vložení hodnot do tabulky
- echo - kontorla zda ANO/NE

2. část - pocitadlo.php
5) navázání spojení s SQL serverem
- echo - kontorla zda ANO/NE
5) Načtení databáse
- echo - kontorla zda ANO/NE
6) Update tabulky, počítadlo +1
- echo - kontorla zda ANO/NE
7) Výběr z tabulky počítadla
- echo - kontorla zda ANO/NE
8 ) Práce s načtenou hodnotou
- echo - kontorla zda ANO/NE
9)Echo vysledek +1...atd.
index.php - odkaz na počítadlo

Chybí mě, jako např. u Sdraca na konci vždy možnost stánout hotoví script pro kontrolu.

Proč to píšu, neumím si, jako začátečník domyslet spoustu věcí, to očekávám od návodu. Já jsem si vše udělal s echem, abych věděl kde je případný problém a měl jistotu, zda se skutečně danná operace provedla.

Díky za návod, aspoň mě to donutilo myslet.

PS: Čekal jsem, že další díl, nebo doplnění bude třeba zápis IP adres návštěv.

Editováno 18.11.2013
 
Odpovědět 18.11.2013

 

Zobrazeno 10 z 13 zpráv

Zobrazit všechny komentáře k článku

Přidat novou zprávu

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlaš. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.