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

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

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

Dostali jste se k článkům, které čekají na úpravu. Toto byl dříve jediný seriál o databázích, nyní byl nahrazen tím, co jste již četli a tato stará část zde byla ponechána pro budoucí aktualizaci, abyste měli více příkladů. Není v ní ovšem nic nového, co byste již nečetli v lekcích dříve a proto prosím přejděte zatím na další PHP kurz Děkujeme.

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.


 

 

Článek pro vás napsal Mircosoft
Avatar
Jak se ti líbí článek?
12 hlasů
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 :-).
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ů
Aktivity (2)

 

 

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

Avatar
Lubomír Pařil:29.8.2017 3:20

V článku by mělo být alespoň upozornění, že nebyl dlouho aktualizován. Předešlo by se tak případným nedorozuměním vůči současným praktikám v PHP a vůči článkům, na které série navazuje. Třeba nějaké doplňující informace pod <hr /> čarou o tom, čím jsou dnes tyto zastaralé příkazy nahrazovány ;)

Editováno 29.8.2017 3:21
Odpovědět 29.8.2017 3:20
Tradiční mostecký střídač pracovních zkušeností, který má zájem o internetovou tvorbu.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lubomír Pařil
David Čápka:29.8.2017 9:57

Je to jen zbytek staršího kurzu, který již není potřeba, ale nechceme jej mazat. Dal jsem tam upozornění :)

Odpovědět  +1 29.8.2017 9:57
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Lubomír Pařil:31.8.2017 14:28

Dobrá práce 8-)

Odpovědět 31.8.2017 14:28
Tradiční mostecký střídač pracovních zkušeností, který má zájem o internetovou tvorbu.
Avatar
Martin Zbirovský:5.10.2017 18:47

Jako amatér bych uvítal tento díl jako 2 nebo 3 drive než jsem se k tomuto dílu dostal už jsem to věděl a o to těžší byl začátek ale jinak zase pěkně napsané díky.

 
Odpovědět 5.10.2017 18:47
Avatar
maxijoey
Člen
Avatar
maxijoey:20.11.2017 16:44

Zdravím přátelé, je tu někdo kdo by mi mohl poradit s SQL dotazem? Mám tabulku:

sloupec1 sloupec2 sloupec3
karel kratky 11
josef orct 25
petr novak 25
lukas tucny 27
marek dlouhy 27

a výsledek potřebuji tento zhruba, to je vynechat duplicity:

sloupec1 sloupec2 sloupec3
karel kratky 11
josef orct 25
lukas tucny 27

Potřebuji napsat SQL dotaz aby mi to vrátilo výpis celých řádků ale vyjma těch které by se už vyskytovali se stejnou hodnotou ve sloupci 3. To znamená od každého jeden - ale vynechat další rádky s duplicitami v posledním sloupci. Nějak nad tím laboruju celý den už a nikam jsem se nedostal. Podotýkám ještě že využívám DB.PHP psaný někým od tud. Děkuji za pomoc

 
Odpovědět 20.11.2017 16:44
Avatar
Jiří Charousek:20.11.2017 17:07

Ahoj, co třeba SELECT sloupec1, sloupec2, sloupec3 FROM tab GROUP BY sloupec3

 
Odpovědět 20.11.2017 17:07
Avatar
maxijoey
Člen
Avatar
Odpovídá na Jiří Charousek
maxijoey:20.11.2017 17:17

To asi nebude uplně ono, to se dle mého rovná zápisu SELECT * FROM tabulka GROUP BY sloupec3 a nic to nevyřeší, je je to seřadí dle sloupce tři ale furt mi je nevyfiltruje.

 
Odpovědět 20.11.2017 17:17
Avatar
Jiří Charousek:20.11.2017 17:29

GROUP BY sloupec3 ti vypíše každou hodnotu ve sloupci 3 pouze 1x

 
Odpovědět 20.11.2017 17:29
Avatar
maxijoey
Člen
Avatar
Odpovídá na Jiří Charousek
maxijoey:20.11.2017 17:33

Ježis sorry, máš pravdu to vypadá. Moc dík. Já si to spletl s ORDER BY

 
Odpovědět 20.11.2017 17:33
Avatar
mixxy
Člen
Avatar
mixxy:22.11.2017 23:56

No fuj teda, říct, že databáze je uložiště na serveru... :-) To je jako říct, že televize zobrazuje obraz a my si je pomocí ovladačky přepínáme.

Odpovědět 22.11.2017 23:56
Neni dulezite mnoho vedet a znat. Dulezite je vedet, co je treba.
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 36. Zobrazit vše