Lekce 2 - První databázová tabulka a MySQL ovladače v PHP
V minulé lekci, Úvod do databází 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:
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 VARCHAR
a udává
maximální počet jeho znaků, jmeno
i prijmeni
nastavíme na 60 znaků.
Od verze MySQL 5.7 je důležité si dávat pozor na 4. sloupec
Výchozí. Pokud jste ve starších verzích při vkládání dat do tabulky
nezadali data pro všechny sloupce, MySQL automaticky vložila nějakou
výchozí hodnotu. V nových verzích spadne s chybovým stavem:
Warning: PDOStatement::execute(): SQLSTATE[HY000]: General error: 1364 Field 'xxx' doesn't have a default value
a dotaz se neprovede. Pokud tedy vytváříte sloupec, který nemusí mít vždy
zadanou hodnotu, je vhodné mu nastavit nějakou výchozí. Všimněte si, že v
našem případě nemusí být při vkládání nového uživatele zadán počet
jeho článků právě proto, že výchozí hodnota je nastavena na
NULL
, která označuje nezadáno.
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.
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 NOT NULL AUTO_INCREMENT, jmeno VARCHAR(60) NOT NULL, prijmeni VARCHAR(60) NOT NULL, datum_narozeni DATE NOT NULL, pocet_clanku INT NULL DEFAULT NULL, PRIMARY KEY (uzivatele_id) );
Pokud by v dotazu nebyly uvedené parametry NULL
,
NOT NULL
nebo DEFAULT
, které specifikují, zda
sloupec může obsahovat hodnotu NULL
, která označuje
"nezadáno", nebo jakou má případně výchozí hodnotu, MySQL všem nastaví
automaticky výchozí hodnotu NULL
a označí je jako
nullovatelné. Příklad takového dotazu by byl:
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_pocet_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.
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í:
Zatím to bylo jednoduché, že?
V příští lekci, Formulář a výpis dat z databáze do tabulky v PHP, budeme vkládat data do databáze pomocí HTML formuláře a naučíme se bránit proti SQL injekci a XSS.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 9432x (2.97 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP