2. diel - Prvý databázová tabuľka a MySQL ovládače v PHP
V minulej lekcii, Úvod do databáz v PHP pre úplných začiatočníkov , sme si urobili krátky úvod do databáz a vytvorili si databázu pre náš web. V dnešnom dieli si vytvoríme tabuľku uzivatele a vložíme do nej nejaké dáta.
Tabuľka
Databázu si v ľavom stĺpci otvorte. phpMyAdmin nám ponúka vytvorenie tabuľky. Spomenieme si na príklad tabuľky užívateľov, čo sme si ukázali v minulom dieli. Mala stĺpce meno, priezvisko, dátum narodenia a počet článkov. Už sme načali, že by každá tabuľka mala mať stĺpec, ktorého hodnota je pre každý riadok unikátne. Stĺpcov bude teda dokopy 5, tabuľka sa bude volať uzivatele. Hodnoty zadajte do phpMyAdmina:
Pozn .: Tabuľky sa niekedy pomenúvajú aj v jednotnom čísle, teda v našom prípade uzivatel. Obe konvencie používajú veľké firmy a obe majú svoje pre a proti. Plurál je pre začiatok príjemnejšie, v praxi sa preferuje skôr jednotné číslo.
Otvorí sa nám naozaj veľa polí, ale tých sa vôbec neľakajte. Prvý stĺpec sú mená stĺpcov tabuľky. Vyplníme pod seba teda názvami našich stĺpcov, čo sú: uzivatele_id, mena, priezviska, datum_narozeni, a pocet_clanku. Id sa mi osvedčilo pomenovávať s prefixom tabuľky, aby sa predišlo následným kolíziám názvov, ale nie je to nutné.
Presuňme sa k 2. stĺpci, kde sú dátové typy jednotlivých stĺpcov tabuľku. Prednastavený máme INT, čo sú celé čísla. Typov je naozaj veľa, ale my si dlho (asi až do konca seriálu) vystačíme len s niekoľkými. uzivatele_id ponecháme na INT, meno a priezvisko nastavíme na VARCHAR, to je krátky text. Dátum narodenia na DATE. Posledný, pocet_clanku, bude typu INT. Časom si popíšeme i ďalšie dátové typy, ale teraz vám s nimi nebudem motať hlavu
3. stĺpec Dĺžka / množina má zmysel len pri VARCHAR a udáva maximálny počet jeho znakov, meno aj priezvisko nastavíme na 60 znakov.
Od verzie MySQL 5.7 je dôležité si dávať pozor na 4.
stĺpec "Predvolené". Ak ste v starších verziách pri vkladaní dát do
tabuľky nezadali dáta pre všetky stĺpce, MySQL automaticky vložila nejakú
predvolenú hodnotu. V nových verziách spadne s chybovým stavom:
Warning: PDOStatement::execute(): SQLSTATE[HY000]: General error: 1364 Field 'xxx' doesn't have a default value
a otázka sa nevykoná. Ak teda vytvárate stĺpec, ktorý nemusí mať vždy
zadanú hodnotu, je vhodné mu nastaviť nejakú predvolené. Všimnite si, že
v našom prípade nemusí byť pri vkladaní nového užívateľa zadaný počet
jeho článkov práve preto, že východisková hodnota je nastavená na
NULL
, ktorá označuje nezadané.
Ďalej máme ďalšie stĺpce, ktoré pre nás však nie sú tak dôležité a nebudeme ich vypĺňať. Posledné, čo vyplníme, je stĺpec Kľúč u stĺpce s uzivatele_id. Kľúč tu nastavíme na PRIMARY a zaškrtneme pole vedľa, ktoré je napísané A_I (ako Auto Increment). Týmto sme stĺpec uzivatele_id nastavili ako tzv. Primárny kľúč tabuľky. Kľúče (niekedy indexy) nám umožňujú identifikovať položku v tabuľke. Taký primárny kľúč by mala mať každá tabuľka (aj keď teoreticky nemusí). Keď budeme chcieť užívateľa napr. Vymazať, vymažeme ho podľa tohto kľúča (teda podľa uzivatele_id). Keby sme ho mazali podľa mena, zmazali by sme niekoľko položiek, pretože treba Janů Novákov tam môže byť viac. Podľa uzivatele_id vymažeme vždy len toho jedného. Začiarknutie Auto Increment spôsobilo, že sa bude hodnota uzivatele_id automaticky navyšovať a užívatelia sa budú postupne číslovať.
Mimochodom, všimnite si možnosti Pridať poľa, to je ak ich na začiatku zadáme málo a pri návrhu tabuľky zistíme, že potrebujeme ďalšie. Tabuľku uložíme.
Tabuľka sa nám objaví v ľavom stĺpci, môžeme ju rozkliknúť, ale zatiaľ je prázdna. PhpMyAdmin nám opäť vygeneroval SQL dotaz, ktorý vyzerá 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) );
Ak by v dotaze neboli uvedené parametre NULL
,
NOT NULL
alebo DEFAULT
, ktoré špecifikujú, či
stĺpec môže obsahovať hodnotu NULL
, ktorá označuje
"nezadané", alebo akú má prípadne predvolenú hodnotu, MySQL všetkým
nastaví automaticky predvolenú hodnotu NULL
a označí ich ako
nullovatelné. Príklad takéhoto dotazu by bol:
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äť si ho nemusíme pamätať.
MySQL ovládač v PHP
K databáze sa teraz pripojíme z PHP a vložíme do nej nejakej používateľa. Aby sme tak mohli urobiť, potrebujeme databázový ovládač. To je v PHP prekvapivo trochu problém a práve na tomto bode stroskotá väčšina začiatočníkov a od databáz zbytočne odíde. Databázové ovládače sú v PHP hneď 3:
Mysql
S databázou ovládač mysql komunikoval pomocou funkcie mysql_query (). Keďže tento ovládač používal staré prístupy, ktoré sú pomerne nebezpečné (napr. Bolo nutné ručne ošetrovať parametre otázok), bol od PHP 5.5 označený ako zastaraný a jeho použitie vyvolá chybovú hlášku. Ďalšie verzie PHP ho už nebudú obsahovať. Tento ovládač sa bohužiaľ stále učí v niektorých knihách a na niektorých školách, na čo si dajte pozor. Používať by ste ho rozhodne nemali.
Mysqli
mysqli označuje MySQL Improved. Jedná sa o hybridný ovládač, ktorý išlo používať tak objektovo, tak procedurálne (funkciami). Procedurálne funkcie však z PHP manuálu nejako vymizli a používa sa výhradne objektovo. Parametre sa do otázok odovzdávajú veľmi nepohodlne.
PDO
PDO je skratka PHP Database Objects. Jedná sa o najnovšie a veľmi kvalitné objektový ovládač, ktorý sa jednoducho používa a podporuje okrem MySQL ešte niekoľko databáz. Funkciám, ktoré začínajú mysql, je už v PHP lepšie sa úplne vyhnúť.
Wrapper
Ako je vidieť, tak v PHP s databázou neobjektové pracovať v podstate nemožno. Čo však možno ich použiť tzv. Wrapper. Wrapper by sa dal preložiť ako obal. Niekto pre vás obalí objektové funkcie ovládača PDO tak, aby ste im rozumeli a mohli ich používať bez toho, aby ste vôbec tušili čo to objekt je. Práve tento prístup zvolíme v našom seriáli.
Prvý príklad - vloženie užívateľa do databázy
Vytvorte si nejaký PHP projekt a pomenujte ho napríklad TestDatabaze. Stiahnite si prílohu dnešného článku a vytiahnite si z nej súbor s Wrapper (Db.php) a vložte ho do zložky s projektom (aby bol v rovnakom priečinku ako index.php). Svoj index.php teraz upravte do nasledujúcej 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');
Príklad načíta databázový wrapper zo súboru Db.php. Všetky funkcie Wrapper nám sú teraz prístupné pod triedou Db a voláme ich ako Db :: nazevFunkce ().
Ako prvý sa k databáze pripojíme pomocou funkcie Db :: connect (). Tu zadáme názov hostiteľa, názov databázy, užívateľské meno a heslo. Na localhost sú väčšinou údaje ako v príklade vyššie, na produkciu vám tieto údaje oznámia webhosting.
Ďalšou funkciou Wrapper je Db :: query (), ktorá na databázu spustí dotaz v jazyku SQL. SQL dotaz sa zadáva ako textový reťazec a pre prehľadnosť som ho napísal na 2 riadky, zvyčajne sa to tak robí. Keď dotaz preložíme do slovenčiny, hovoríme databázu: "Vlož do užívateľov do stĺpcov Meno, priezvisko, datum_narozeni_pocet_clanku hodnoty Jan Novák 1987-11-13 17". Anglicky (v jazyku SQL) to vyzerá ako je uvedené vyššie. Všimnite si, že textové reťazce píšeme do úvodzoviek (rovnako ako v PHP) a dátum zadávame v americkom tvare rok-mesiac-deň. Čísla píšeme ako sú. Pozor! Nikdy nevkladajte PHP premenné do textu dotazu! Vystavili by ste sa tak veľkému bezpečnostnému riziku, ktoré si vysvetlíme nabudúce.
Skript si spustite a to pokojne niekoľkokrát s rôznymi dátami. Teraz prejdeme do PHPMyAdmin, rozkliknite tabuľku uzivatele a zobrazíme si ich (tlačidlo Prejst hore). Vidíme, že sú v databáze naozaj vloženia:
Zatiaľ to bolo jednoduché, že? V budúcej lekcii, Formulár a výpis dát z databázy do tabuľky v PHP , budeme pokračovať.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 9434x (2.97 kB)
Aplikácia je vrátane zdrojových kódov v jazyku PHP