Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

2. díl - První databázová tabulka a MySQL ovladače v PHP

PHP Databáze pro začátečníky První databázová tabulka a MySQL ovladače v PHP American English version English version

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.

V minulém dílu seriálu tutoriálů o databázích v PHP pro úplné začátečníky jsme si udělali krátký úvod do databází a vytvořili si databázi pro náš web. V dnešním dílu si vytvoříme tabulku uzivatele a vložíme do ni nějaká data.

Tabulka

Databázi si v levém sloupci otevřete. phpMyAdmin nám nabízí vytvoření tabulky. Vzpomeneme si na příklad tabulky uživatelů, co jsme si ukázali v minulém dílu. Měla sloupce jméno, příjmení, datum narození a počet článků. Již jsme nakousli, že by každá tabulka měla mít sloupec, jehož hodnota je pro každý řádek unikátní. Sloupců bude tedy dohromady 5, tabulka se bude jmenovat uzivatele. Hodnoty zadejme do phpMyAdmina:

Vytvoření tabulky v phpMyAdmin

Pozn.: Tabulky se někdy pojmenovávají i v jednotném čísle, tedy v našem případě uzivatel. Obě konvence používají velké firmy a obě mají svá pro a proti. Plurál je pro začátek příjemnější, v praxi se preferuje spíše jednotné číslo.

Otevře se nám opravdu hodně polí, ale těch se vůbec nelekejte. První sloupec jsou jména sloupců tabulky. Vyplníme pod sebe tedy názvy našich sloupců, což jsou: uzivatele_id, jmeno, prijmeni, datum_narozeni, a pocet_clanku. Id se mi osvědčilo pojmenovávat s prefixem tabulky, aby se předešlo následným kolizím názvů, ale není to nutné.

Přesuňme se k 2. sloupci, kde jsou datové typy jednotlivých sloupců tabulku. Přednastavený máme INT, což jsou celá čísla. Typů je opravdu mnoho, ale my si dlouho (asi až do konce seriálu) vystačíme jen s několika. uzivatele_id ponecháme na INT, jmeno a prijmeni nastavíme na VARCHAR, to je krátký text. Datum narození na DATE. Poslední, pocet_clanku, bude typu INT. Časem si popíšeme i další datové typy, ale teď vám s nimi nebudu motat hlavu :)

3. sloupec Délka/množina má smysl jen u VARCHARU a udává maximální počet jeho znaků, jméno i příjmení nastavíme na 60 znaků.

Dále máme další sloupce, které pro nás však nejsou tak důležité a nebudeme je vyplňovat. Poslední, co vyplníme, je sloupec Klíč u sloupce s uzivatele_id. Klíč zde nastavíme na PRIMARY a zaškrtneme pole vedle, které je nadepsáno A_I (jako Auto Increment). Tímto jsme sloupec uzivatele_id nastavili jako tzv. primární klíč tabulky. Klíče (někdy indexy) nám umožňují identifikovat položku v tabulce. Takový primární klíč by měla mít každá tabulka (i když teoreticky nemusí). Když budeme chtít uživatele např. vymazat, vymažeme ho podle tohoto klíče (tedy podle uzivatele_id). Kdybychom ho mazali podle jména, smazali bychom několik položek, protože třeba Janů Nováků tam může být více. Podle uzivatele_id vymažeme vždy jen toho jednoho. Zaškrtnutí Auto Increment způsobilo, že se bude hodnota uzivatele_id automaticky navyšovat a uživatelé se budou postupně číslovat.

Mimochodem, všimněte si možnosti Přidat pole, to je pokud jich na začátku zadáme málo a při návrhu tabulky zjistíme, že potřebujeme další. Tabulku uložíme.

Vytvoření tabulky v phpMyAdmin

Tabulka se nám objeví v levém sloupci, můžeme ji rozkliknout, ale zatím je prázdná. PhpMyAdmin nám opět vygeneroval SQL dotaz, který vypadá asi takto:

CREATE TABLE uzivatele (
  uzivatele_id int AUTO_INCREMENT,
  jmeno varchar(60),
  prijmeni varchar(60),
  datum_narozeni date,
  pocet_clanku int,
  PRIMARY KEY (uzivatele_id)
);

Opět si ho nemusíme pamatovat.

MySQL ovladač v PHP

K databázi se nyní připojíme z PHP a vložíme do ní nějaké uživatele. Abychom tak mohli učinit, potřebujeme databázový ovladač. To je v PHP překvapivě trochu problém a právě na tomto bodě ztroskotá většina začátečníků a od databází zbytečně odejde. Databázové ovladače jsou v PHP hned 3:

mysql

S databází ovladač mysql komunikoval pomocí funkce mysql_query(). Jelikož tento ovladač používal staré přístupy, které jsou poměrně nebezpečné (např. bylo nutné ručně ošetřovat parametry dotazů), byl od PHP 5.5 označen jako zastaralý a jeho použití vyvolá chybovou hlášku. Další verze PHP ho již nebudou obsahovat. Tento ovladač se bohužel stále učí v některých knihách a na některých školách, na což si dejte pozor. Používat byste ho rozhodně neměli.

mysqli

mysqli označuje MySQL Improved. Jedná se o hybridní ovladač, který šlo používat jak objektově, tak procedurálně (funkcemi). Procedurální funkce však z PHP manuálu nějak vymizely a používá se výhradně objektově. Parametry se do dotazů předávají velmi nepohodlně.

PDO

PDO je zkratka PHP Database Objects. Jedná se o nejnovější a velmi kvalitní objektový ovladač, který se jednoduše používá a podporuje kromě MySQL ještě několik databází. Funkcím, které začínají mysql, je již v PHP lepší se úplně vyhnout.

Wrapper

Jak je vidět, tak v PHP s databází neobjektově pracovat v podstatě nelze. Co však lze je použít tzv. wrapper. Wrapper by se dal přeložit jako obal. Někdo pro vás obalí objektové funkce ovladače PDO tak, abyste jim rozuměli a mohli je používat bez toho, aniž byste vůbec tušili co to objekt je. Právě tento přístup zvolíme v našem seriálu.

První příklad - vložení uživatele do databáze

Vytvořte si nějaký PHP projekt a pojmenujte ho například TestDatabaze. Stáhněte si přílohu dnešního článku a vytáhněte si z ní soubor s wrapperem (Db.php) a vložte ho do složky s projektem (aby byl ve stejné složce jako index.php). Svůj index.php nyní upravte do následující podoby:

// Načtení wrapperu
require_once('Db.php');
Db::connect('127.0.0.1', 'databaze_pro_web', 'root', '');
Db::query('
        INSERT INTO uzivatele (jmeno, prijmeni, datum_narozeni, pocet_clanku)
        VALUES ("Jan",  "Novák",  "1984-11-03", 17)
');
echo('OK');

Příklad načte databázový wrapper ze souboru Db.php. Všechny funkce wrapperu nám jsou nyní přístupné pod třídou Db a voláme je jako Db::nazevFunkce().

Jako první se k databázi připojíme pomocí funkce Db::connect(). Zde zadáme název hostitele, název databáze, uživatelské jméno a heslo. Na localhostu jsou většinou údaje jako v příkladu výše, na produkci vám tyto údaje sdělí webhosting.

Další funkcí wrapperu je Db::query(), která na databázi spustí dotaz v jazyce SQL. SQL dotaz se zadává jako textový řetězec a pro přehlednost jsem ho napsal na 2 řádky, obvykle se to tak dělá. Když dotaz přeložíme do češtiny, říkáme databázi: "Vlož do uživatelů do sloupců jmeno, prijmeni, datum_narozeni_po­cet_clanku hodnoty Jan Novák 1987-11-13 17". Anglicky (v jazyce SQL) to vypadá jak je uvedeno výše. Všimněte si, že textové řetězce píšeme do uvozovek (stejně jako v PHP) a datum zadáváme v americkém tvaru rok-mesic-den. Čísla píšeme jak jsou. Pozor! Nikdy nevkládejte PHP proměnné do textu dotazu! Vystavili byste se tak velkému bezpečnostnímu riziku, které si vysvětlíme příště.

Skript si spusťte a to klidně několikrát s různými daty. Nyní přejdeme do PHPMyAdmin, rozklikneme tabulku uzivatele a zobrazíme si je (tlačítko Projít nahoře). Vidíme, že jsou v databázi opravdu vložení:

Uživatelé v MySQL tabulce

Zatím to bylo jednoduché, že? Příště budeme pokračovat.


 

Stáhnout

Staženo 4916x (2.76 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
32 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (2)

 

 

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

Avatar
Jakub Žák
Člen
Avatar
Jakub Žák:13.12.2016 19:41

Kde je kořen webserveru? A kde máš soubory?

A neotevíráš náhodpu přímo soubory? Musíš k tomu přistupvat přes web server (localhost/sloz­ka/soubor.php).

Editováno 13.12.2016 19:43
Odpovědět  +1 13.12.2016 19:41
Kuba je ajťák. Buď jako Kuba.
Avatar
areedy
Člen
Avatar
areedy:14.12.2016 16:32

V netbeanse som zadal nech sa mi súbory ukladajú na plochu. A ten to otvára cez tvoj link. Nefunguje aj keď adresu zadám ručne do prehliadača.

 
Odpovědět 14.12.2016 16:32
Avatar
Miskyns
Člen
Avatar
Miskyns:14.12.2016 17:03

Pokud se nepletu, tak špatně vyplňuješ údaje :)
Tvůj kód:

Db::connect('sql.endora.cz:3309', 'databazeproweb', 'heslo', '');

Má to být :

Db::connect('sql.endora.cz:3309', 'databazeproweb', 'uzivatel', 'heslo');
Odpovědět 14.12.2016 17:03
Proč se to učit, když můžeš použít GOOGLE...
Avatar
jakubho
Člen
Avatar
Odpovídá na Miskyns
jakubho:14.12.2016 17:09

Jojo, to byl ten problém. Sice jsem to už dávno vyřešil, ale stejně děkuju za ochotu :-)

Odpovědět 14.12.2016 17:09
Chyba-Jediná jistota v životě programátora.
Avatar
areedy
Člen
Avatar
Odpovídá na Jakub Žák
areedy:14.12.2016 20:04

Podarilo sa mi to vyriešiť... síce moc neviem prečo mi to nešlo ale ďakujem za pomoc :)

 
Odpovědět 14.12.2016 20:04
Avatar
Martin Bušek:12. února 13:24

Ahoj, já řeším jiný problém

používám hostingové služby společnosti WEDOS, a po spuštění mi to hodí tohle:

** Warning: PDO::prepare(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'VALEUS ("Jan", "Novak", "200-01-22", 17)' at line 2 in /data/web/vir­tuals/131266/vir­tual/www/test/Db­.php on line 42

Fatal error: Call to a member function execute() on boolean in /data/web/vir­tuals/131266/vir­tual/www/test/Db­.php on line 43 **

Nic mi tohle neříká, poradíš kde je chyba ?

Editováno 12. února 13:25
 
Odpovědět 12. února 13:24
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na Martin Bušek
TomasGlawaty:12. února 14:34

Ahoj,
Syntax error.. mas tam VALEUS namísto VALUES.

Odpovědět  +2 12. února 14:34
Člověk může dosáhnout čeho si zamane. Jen musí chtít, případně něco obětovat ...
Avatar
Ondřej Kavan:2. dubna 10:30

Zdravím stáhnul jsem si ty soubory a zkusil to spustit na localhostu a vypsalo mi to tohle:
Fatal error: Undefined class constant 'PDO::MYSQL_AT­TR_INIT_COMMAN­D' in C:\Program Files (x86)\EasyPHP-Devserver-16.1\eds-www\Db.php on line 46

 
Odpovědět 2. dubna 10:30
Avatar
drabek
Člen
Avatar
drabek:8. července 13:41

postupuji podle vašich stránek a po spuštění php kódu se mi objevila tato chyba nevím si stím rady děkuji

Warning: PDO::prepare(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '15, "1984-11-03", 7311105690)' at line 2 in C:\xampp\htdoc­s\databaze\Db­.php on line 60

Fatal error: Uncaught Error: Call to a member function execute() on boolean in C:\xampp\htdoc­s\databaze\Db­.php:61 Stack trace: #0 C:\xampp\htdoc­s\databaze\Db­.php(71): Db::executeSta­tement(Array) #1 C:\xampp\htdoc­s\databaze\in­dex.php(20): Db::query('\r\n INSER...') #2 {main} thrown in C:\xampp\htdoc­s\databaze\Db­.php on line 61

 
Odpovědět 8. července 13:41
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Adam Ježek:8. července 21:31

Dejte sem ten dotaz který se snažíte spustit

Odpovědět 8. července 21:31
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
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 116. Zobrazit vše