8. díl - Začínáme s databázemi

PHP Databáze pro začátečníky Začínáme s databázemi

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Vítejte u dalšího dílu seriálu o tvorbě dynamických doplňků na webové stránky v PHP. Dnes se podíváme na zoubek databázím.

Co je to databáze

Databáze je úložiště dat na serveru. Naše skripty z něj můžou jak číst, tak do něj i zapisovat. Obslužné programy se automaticky starají o to, aby nedocházelo ke kolizím při současném přístupu více uživatelů. Kromě toho poskytují nejrůznější pomocné funkce pro práci s daty.

V tomto seriálu se zaměříme na databázi MySQL, která se v současné době používá asi nejčastěji. Zkratka SQL znamená "structured query language", což se obvykle překládá jako "strukturovaný dotazovací jazyk" a pomocí něj s databází komunikujeme (po HTML a PHP je to tedy už třetí jazyk, který je potřeba se naučit). Termínem "dotaz" (query) se rozumí jakýkoli příkaz pro databázi, ne jenom skutečné otázky jako třeba "kolik je v téhle tabulce řádků?". V dalším textu ale tohle slovo stejně používat nebudu, takže je to jedno.

MySQL (a všechny ostatní databáze používající jazyk SQL) je tzv. relační databáze. Data jsou v ní uspořádána v tabulkách. Řádky představují jednotlivé záznamy a sloupce pak datové položky uvnitř záznamů. Představit si to můžete třeba takhle:

SPZ typ majitel
LNC 2022 Škoda 120 Jiří Nebozíz
1U0 8729 Tatra 815 Sopwith Camel
1P2 3230 Škoda Felicia Jarmila Nováková
PZA 4876 Fiat 500 Kuo Ču Nguyen

Řádky můžeme celkem jednoduše přidávat, mazat a přepisovat a jejich počet obvykle není nijak omezen. Strukturu tabulky, tedy počet a jména sloupců, si zvolíme jednou při vytváření tabulky a pak už s nimi většinou nehýbeme (teoreticky to sice jde, ale moc často se to nedělá).

Jinak než do tabulek data ukládat nejdou, takže i kdybychom potřebovali uložit třeba jenom jedno jediné číslo, musíme si na to vyrobit tabulku 1x1.

Slovo "relační" znamená, že mezi jednotlivými tabulkami můžou vznikat vztahy neboli relace. Pokud máme např. výše uvedenou tabulku automobilů a k ní třeba ještě tabulku lidí se jménem, adresou a datem narození, můžeme si mezi nimi představit vztah "člověk vlastní auto". Ale je to jenom pomyslné, mezi tabulkami nevedou žádné ukazatele nebo jiné fyzické vazby.

Práce s databází

Až na výjimky se dá databáze najít prakticky na každém serveru, včetně většiny freehostingů. Jediné, co potřebujete udělat, je databázi si nějak aktivovat a získat k ní přihlašovací údaje. Tohle je obecně na každém serveru jiné, proto vám nemůžu podrobně popsat každé kliknutí. Prostě zapátrejte v administračním rozhraní po slovech jako "databáze" nebo "MySQL" a postupujte podle pokynů, které tam najdete (jako příklady budu používat servery IC a Endora, které znám). Jakmile projdete touhle první fází, funguje všechno ostatní všude stejně.

Krok první: připojení k databázi

Každý skript, který chce pracovat s databází, se k ní nejdřív musí připojit. Když říkám každý, myslím tím opravdu úplně každý PHP soubor - nestačí to jenom jednou. Naštěstí známe příkazy include a require, takže připojovací kód nemusíme pokaždé opisovat. Funkce pro připojení vypadá takhle:

mysql_connect(jméno hostitele, přihlašovací jméno, heslo)
  • Jméno hostitele se dozvíte při aktivaci databáze. Např. na IC je to 'mysql.ic.cz', na Endoře 'localhost' (tohle jméno se používá poměrně často).
  • Přihlašovací jméno si při aktivaci databáze buď zvolíte nebo vám bude přiděleno. Např. na IC jsem dostal 'ic_mircosoft', na Endoře se dají zakládat uživatelské účty s libovolným jménem a různými přístupovými právy.
  • Heslo si při aktivaci databáze vždycky volíte jaké chcete. Doporučuji něco dlouhého, aby se to robotům špatně hádalo. Vám to vadit nebude, pamatovat si ho nemusíte - z administračního rozhraní si ho sem do zdrojáku můžete prostě zkopírovat.
  • Návratová hodnota funkce je buď proměnná, přes kterou budeme ve zbytku skriptu s databází komunikovat, nebo false, když se připojení nepovede.

V praxi to může vypadat třeba takhle:

$spojeni=mysql_connect('localhost','moje_jmeno','StrasneTajneHe5l0');
if (!$spojeni) die('Nepodařilo se připojit k databázi.');

Funkce die() vypíše hlášku v závorce (podobně jako třeba echo, můžete tam dát i HTML kód) a okamžitě ukončí skript. Teoreticky bychom to dělat nemuseli, mohli bychom jenom přeskočit všechny další přístupy k databázi a vykreslit aspoň zbytek stránky, ale jestli z databáze taháme "užitečný náklad" (to, kvůli čemu sem návštěvníci přišli), nestálo by to za námahu.

Ještě jedna důležitá věc. Jak vidíte, heslo k databázi se píše přímo do zdrojáku a nedá se nijak zamaskovat. Z toho vyplývají dvě věci: za a), zdroják je za normálních okolností naprosto bezpečně skrytý, server ho ven nepouští. A za b), dávejte si velký pozor na funkce pro přímé čtení a zobrazování obsahu souborů, jako jsou show_source(), highlight_file(), file(), file_get_conten­ts(), fread() a podobně. Jestli se nepojistíte proti PHP injekci, může se vám kdokoli dostatečně mazaný k heslu dostat.

Krok druhý: výběr databáze

Ať už máme databázi jednu nebo několik, musíme systému říct, se kterou z nich chceme pracovat:

mysql_select_db('jmeno_databaze',$spojeni);

$spojeni je proměnná, kterou nám vrátila funkce mysql_connect() (tohle jméno budu používat i v celém dalším textu). Jméno databáze jsme se dozvěděli při jejím vytváření - buď jsme si ho zvolili sami nebo nám ho server přidělil.

Tyhle dva kroky (připojení a výběr) je potřeba zopakovat na začátku každého skriptu, který má s databází pracovat. Nejlepší je dát si je do jednoho malého skriptu, který pak includneme, resp. requirneme (strašné slovo), na začátek všech ostatních. Hlavní výhoda je v tom, že když potřebujeme změnit přihlašovací údaje, nemusíme je pracně přepisovat na x místech.

Tím máme úvodní administrativu za sebou, odteďka můžeme používat příkazy jazyka SQL.

Poznámka: existuje ještě příkaz mysql_close(), který spojení s databází ukončí. Praktické využití má snad jedině v případě, kdybychom uprostřed skriptu potřebovali přelézt z jednoho databázového systému do jiného, protože normálně se spojení na konci skriptu ukončuje automaticky (stejně jako se třeba mažou proměnné a jiná pomocná data). Takže se tím vůbec nemusíme zabývat.

Krok třetí: práce

Konečně se dostáváme k onomu slavnému SQL. Příkazy (dotazy) se databázi zadávají pomocí následující funkce:

$vysledek = mysql_query('příkaz jazyka SQL',$spojeni);

$spojeni je naše známá návratová hodnota z mysql_connect, tady má význam vstupního parametru a určuje, pro kterou databázi je příkaz určen.

Do proměnné $vysledek se uloží to, co nám databáze vrátí. U příkazů typu "vytvoř tabulku" nebo "vymaž řádek" tam bude jenom jednoduché true/false podle toho, jestli se to povedlo, ale u dotazů jako "dej mi všechny řádky z téhle tabulky" tam najdeme data, která se z databáze přečetla (případně false, kdyby se operace nepovedla).

Základy jazyka SQL jsou popsány v sekci MySQL databáze krok za krokem , určitě se na ně podívejte, nejsou složité :) Zde budeme řešit pouze to, jak s databází pracovat v PHP. Stejně si však budeme i SQL příkazy podrobně popisovat.

Příště si vytvoříme počítadlo přístupů, samozřejmě s použitím databáze.


 

  Aktivity (1)

Článek pro vás napsal Mircosoft
Avatar
Autor je amatérský pascalista, assemblerista a bastlíř. Profesionálně psal nebo píše v HLASM, Rexxu, Cobolu, ST, LAD, FBD, PHP, SQL, JS, Basicu a pár dalších jazycích, které kupodivu stále existují a používají se :-).

Jak se ti líbí článek?
Celkem (9 hlasů) :
4.111114.111114.111114.11111 4.11111


 


Miniatura
Předchozí článek
NERS - Výpis článků v PHP
Miniatura
Všechny články v sekci
Databáze v PHP pro začátečníky
Miniatura
Následující článek
Počítadlo přístupů

 

 

Komentáře
Zobrazit starší komentáře (15)

Avatar
Filip Šohajek
Redaktor
Avatar
Filip Šohajek:

Nestahoval jsi náhodou XAMPP s PHP 7.0?

 
Odpovědět 10.2.2016 22:15
Avatar
Martin Dobiaš:

Hm teraz nechápem ako to myslíš .. každé jedno som sťahoval zvlášť.. XAMPP mám verziu v.3.2.2 a PHP 5.6.. ten XAMPP som si inštaloval a nastavoval podľa návodu čo je tu na sránke...

 
Odpovědět 11.2.2016 15:46
Avatar
Mircosoft
Redaktor
Avatar
Mircosoft:

Že by už opravdu definitivně zrušili podporu těchhle funkcí? Čekal jsem, že z nich udělají aliasy jako z celé řady jiných reliktů a ono ne...

Rychlé řešení: místo
$spojeni=mysql_con­nect('hostitel','jme­no','heslo');
mysql_select_db('jme­no_databaze',$spo­jeni);
napiš
$spojeni=mysqli_con­nect('hostitel','jme­no','heslo','jme­no_databaze');
a místo
$vysledek=mys­ql_query('pri­kaz',$spojeni);
piš
$vysledek=mys­qli_query($spo­jeni,'prikaz');

Zbytek by měl fungovat stejně, jenom za mysql připíšeš i.

 
Odpovědět 11.2.2016 21:26
Avatar
Šimon Rataj
Člen
Avatar
Odpovídá na Mircosoft
Šimon Rataj:

Není to úplně stejné, mysqli_query() má jako první parametr odkaz na spojení a pak teprve příkaz.

Editováno 2.6.2016 19:28
 
Odpovědět 2.6.2016 19:28
Avatar
Jan Zamecnik
Člen
Avatar
Jan Zamecnik:

Ahoj, moc nechápu, že jsou tu kapitoly 8.-15., který se zabývají mysql. Trochu mě to mate, když v 2.kapitole bylo napsané, že mysql je zastaralý a nebude nadále podporovám ve vyšším PHP. Jak to tedy je? Díky Honza

 
Odpovědět 6.9.2016 22:40
Avatar
mkub
Redaktor
Avatar
Odpovídá na Jan Zamecnik
mkub:

to, ze mysql je zastaraly, sa jedna o ovladac mysql v PHP a nie o databazu MySQL
namiesto ovladaca mysql tu je mysqli, ako aj PDO, treba lepsie si precitat danu kapitolu
a v PHP7 si myslim, ze ovladas mysql uz sa nenachadza, ako aj ine zastarale funkcie, aleovladac mysql sa da kludne nahradit za mysqli

 
Odpovědět 8.9.2016 0:22
Avatar
Jan Zamecnik
Člen
Avatar
Odpovídá na mkub
Jan Zamecnik:

Ten ovladač mysql jsem měl na mysli. Píše se, že ovladač mysql je zastaralý a pak je tu pokračování seriálu, které se zabývá ovladačem mysql. Je to popsané v 2. kapitole. Jde mi o to co se vlastně učit, pokud s tím začínám. Díky.

 
Odpovědět 8.9.2016 8:14
Avatar
mkub
Redaktor
Avatar
Odpovídá na Jan Zamecnik
mkub:

mal by si sa ucit s mysqli, nahradenie mysql funkciu funkciou mysqli nerobi az taky problem, funkcia mysqli v neobjektivnej podobe je velmi podobna funkcii mysql, mozes vyuzit aj php manual na php.net a takisto mozes skusit cerpat info aj odtial

 
Odpovědět 8.9.2016 13:22
Avatar
Jan Zamecnik
Člen
Avatar
 
Odpovědět 11.9.2016 21:31
Avatar
Odpovídá na Mircosoft
Vít Vohralík:

Děkuju.
Ale stále je v tom zmatek. Kdyby to šlo tak nejlepší varianta by byla opravit články.

 
Odpovědět 12. ledna 19:10
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řihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 25. Zobrazit vše