6. diel - Založenie databázy a prístupy k nej v PHP
V minulej lekcii, Kontaktný formulár , sme vytvorili kontaktný formulár. Myšlienku MVC sme si už osvojili a mali by sme sa pohnúť smerom dopredu. V dnešnom dieli založíme databázu pre užívateľov a ich články.
Databázy
V nasledujúcich niekoľkých odsekoch si vytvoríme databázu v nástroji phpMyAdmin. Ak preferujete SQL alebo používate iný nástroj, bude na konci uvedený aj kompletné zakladací kód, ktorý stačí len spustiť.
Prejdite do PHPMyAdmin a vytvorte si nejakú novú databázu, ja si ju pomenoval mvc_db. Nezabudnite nastaviť porovnávanie na utf8_czech_ci.
Databázu si otvoríte. Teraz si vytvoríme tabuľky, budú len dve.
Užívatelia
Vytvorte si novú tabuľku uzivatele. Bude mať spolu 4 stĺpce (polia):
- uzivatele_id - typ int - primárny kľúč, autoincrement
- jmeno - typ varchar - dĺžka 255
- heslo - typ varcha - dĺžka 255
- admin - typ int, predvolené: 0 (vyberte možnosť "Podľa zadania" a potom zadajte 0, viď obrázok nižšie)
Stĺpec admin určuje či je používateľ administrátor (0/1).
Naklikaná tabuľka by mala vyzerať takto:
(Nezabudnite na primárny kľúč a AI u polia uzivatele_id. Na screenshotu to nie je vidieť.)
Potvrdíme tlačidlom Uložiť.
Hotové tabuľke naklikne kľúč UNIQUE na stĺpec jmeno. To aby v nej nemohli byť 2 užívatelia s rovnakým menom:
Články
Pridáme ešte tabuľku clanky. Tá bude obsahovať 6 stĺpcov (polí).
- clanky_id - typ int - primárny kľúč, autoincrement
- titulok - typ varchar - dĺžka 255
- obsah - typ text
- url - varchar - dĺžka 255
- popis - varchar - dĺžka 255
- klicova_slova - varchar - dĺžka 255
Naklikaná tabuľka:
(Opäť nezabudnite na primárny kľúč a autoinkrementácie u polia clanky_id)
Stĺpec URL je url adresa, cez ktorú budeme k článku pristupovať. Napr. pre článok s titulkom "Úvodná článok" by URL mohlo vypísať ako "uvodni-clanek". Niektoré systémy články zobrazujú len podľa číselného ID, čo je však nepríjemné ako pre užívateľov, tak pre vyhľadávače. Uložíme.
Medzi články si vložíme ten úvodný, aby sme mali systém na čom testovať:
Ak preferujete radšej SQL, databázu spolu s tabuľkami založíte nasledujúcim skriptom:
CREATE DATABASE IF NOT EXISTS mvc_db DEFAULT CHARACTER SET utf8 COLLATE utf8_czech_ci; USE mvc_db; CREATE TABLE IF NOT EXISTS clanky ( clanky_id int(11) AUTO_INCREMENT, titulek varchar(255), obsah text, url varchar(255), popisek varchar(255), klicova_slova varchar(255), PRIMARY KEY (clanky_id) ); CREATE TABLE IF NOT EXISTS uzivatele ( uzivatele_id int(11) AUTO_INCREMENT, jmeno varchar(255), heslo varchar(255), admin int(11) NOT NULL DEFAULT '0', PRIMARY KEY (uzivatele_id) ); ALTER TABLE uzivatele ADD UNIQUE (jmeno); INSERT INTO clanky ( clanky_id, titulek, obsah, url, popisek, klicova_slova ) VALUES ( NULL , 'Úvod', '<p>Vítejte na našem webu!</p> <p>Tento web je postaven na <strong>jednoduchém MVC frameworku v PHP</strong>. Toto je úvodní článek, načtený z databáze.</p>', 'uvod', 'Úvodní článek na webu v MVC v PHP', 'úvod, mvc, web' );
Než sa pustíme do práce s databázou v PHP, spomenieme si na to trochu teórie.
Prístupy pre prácu s databázou v PHP
Objektový svet a svet relačných databáz (svet relačná) sú veľmi rozdielne. Jedná sa o 2 odlišné filozofie, o ktorých si tu trúfam vyhlásiť, že sú nezlučiteľné.
Relačné databázy sú overený spôsob ako pracovať s dátami. I keď existujú aj databázy plne objektovej, firmám sa do nich teraz neoplatí investovať peniaze a preto sa zatiaľ nepresadili. Po revolúcii v programovaní a príchode objektov samozrejme nastal problém s ukladaním dát, keďže relačné databázy objektovo nefungujú a objekty ukladať nevie. Existuje niekoľko možností, ako sa s týmto vysporiadať.
1. neobjektové programovanie
Prvou možnosťou je samozrejme programovať úplne bez objektov. Tým by sme však išli proti prúdu, nemohli by sme používať žiadne komponenty 3. strán a náš kód by bol veľmi nekvalitné. Bol by problém vôbec vytvoriť aplikáciu nejakú architektúru. Určite tu teraz nemá zmysel vysvetľovať prínosy OOP, záujemcov odkazy na článok Objektovo orientované programovanie a evolúcie vývoja softvéru.
2. CRUD Wrapper
Prístup tzv. Wrapper nám umožňuje s databázou pracovať ako s objektom, však komunikujeme s ňou stále v jej jazyku SQL. Miešame teda objektový a relačná kód. Prístup je akýmsi kompromisom a vyžaduje filozofiu OOP trochu ohnúť. Výhodou je zachovanie výkonu a schopností databázy za cenu miernej degradácie myšlienok OOP.
Dáta z databázy vidíme najčastejšie ako hodnoty v poli a prichádzame o možnosť prideliť entitám nejakú funkcionalitu. Tú namiesto toho združujeme do tzv. Manažérov. Možno aj čiastočne mapovať dáta na existujúce triedy, však plnohodnotného konceptu objektového modelu nedosiahneme.
Databázové wrappery sa často píšu ako tzv. CRUD, sú teda predpripravené pre vykonávanie 4 základných databázových operácií (Create, Read, Update, Delete).
3. Objektovo relačné mapovanie
Objektovo relačné mapovanie (ORM) ide ortodoxne za myšlienkou OOP. Z databázy teda miesto pole hodnôt dostávame rovno objekty a tie na sebe majú metódy. V jazyku SQL vôbec nekomunikujeme, tabuľky v databáze vidíme ako kolekcia objektov, s ktorými môžeme pracovať bežnými prostriedkami jazyka. Sme vlastne úplne odtienené od toho, že pracujeme s relačné databáz. Znie to skvele, že?
Háčik je samozrejme v tom, že na pozadí dochádza k určitej degradácii výkonu databázy, otázky sa generujú automaticky a sú často neefektívne. Ďalším problémom ORM je, že je veľmi zložité. Musíme siahnuť po hotovom riešenie, ktoré PHP ako také neobsahuje a je potrebné použiť nejaké riešenie 3. strany, ktoré často nie je jednoduché vôbec sprevádzkovať, nieto používať.
Názory na ORM sú veľmi kontroverzné, niekto hovorí, že je to moderný spôsob práce s dátami a že písať otázky v SQL je zastarané. Niekto zas, že už samotná myšlienka ORM je nesprávna, pretože generovaný SQL kód skrátka nemôže byť efektívna a je nutné pomýšľať na jeho konečnú podobu, odtienenie teda nie je úplné. Osobne mám k ORM neutrálny postoj a ak mi niekto spolu s jazykom poskytne štandardizované a odladené ORM, rád ho použijem. Keďže PHP nič také neposkytuje, vyhýbam sa mu. Nepríde mi totiž, že je jeho pridaná hodnota taká vysoká, aby sa s ním tu oplatilo zaťažovať.
4. Objektové databázy
Okrem databáz relačných existujú aj už spomínané databázy objektové. Tie rieši problém nezlučiteľnosti objektového a relačného prístupu. Poskytujú rovnaký komfort, ako ORM, ale vnútorne netreba dáta prevádzať do tabuliek, ukladajú sa rovno ako objekty. Teoreticky neexistuje výkonnostný ani iný dôvod, prečo by nemali nahradiť databázy relačnej. V praxi sa ale bohužiaľ takmer nepoužívajú a môžeme len dúfať, že sa to časom zmení. Záujemcovia sa môžu pozrieť napr. Na projekt MongoDB.
My budeme využívať 2. prístupu - Wrapper, ktorý sa hodí do seriálu, kde tvoríme minimalistický a zároveň prehľadný kód. Nabudúce, v lekcii Databázový wrapper , si ho vytvoríme.