Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 50% výuky zdarma!
Pouze tento týden sleva až 80 % na e-learning týkající se Javy

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:

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ů.

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.

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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 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_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?

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 8160x (2.76 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

Předchozí článek
Úvod do databází v PHP pro úplné začátečníky
Všechny články v sekci
Databáze v PHP pro začátečníky
Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
58 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 let. Má rád Nirvanu, sushi a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (10)

 

 

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

Avatar
Zdeněk Jurák:15.4.2019 12:52

Ahoj. Jak by vypadal kod, kdyz bych potreboval do pripojeni k DB zadat port manualne (bezi mi dve DB na synology Maria 5 a 10). Dekuji

 
Odpovědět
15.4.2019 12:52
Avatar
Michal Martinec:26.9.2019 21:46

Ahojte. Mám problém. Vytvorím zložku test, do nej som vložil rovno aj index.php aj db.php, ale keď to otvorim cez localhost, tie subory tam nie su. Ako keby neexistovali. keď vytvorim inu zložku vlozim akykolvek php subor tak ho vidim. Nejaky hint? :)

Odpovědět
26.9.2019 21:46
Neporovnavaj sa s ostatnymi. Porovnavaj sa sam so sebou.
Avatar
Oto Dvorský
Člen
Avatar
Odpovídá na Michal Martinec
Oto Dvorský:27.9.2019 7:23

A co máš v tom index.php?
Adresa localhost/test ti vypisuje chybovou hlášku, nebo jen zobrazí bílou stránku?

 
Odpovědět
27.9.2019 7:23
Avatar
Odpovídá na Oto Dvorský
Michal Martinec:27.9.2019 7:41

Stiahol som to len cele nakolko ked som to vyplnoval sam tak to robilo to iste v oboch pripadoch. Hadze iba bielu stranku. Nazov databazy aj polozky v nej sedia. 5x som to kontroloval.

Odpovědět
27.9.2019 7:41
Neporovnavaj sa s ostatnymi. Porovnavaj sa sam so sebou.
Avatar
Víťa Š.
Člen
Avatar
Víťa Š.:25.11.2019 22:55

Nedaří spojit se s localhost databázi MySQL z PHP7 přes PDO. **
Vše běží: XAMPP 7.3.11-0-VC15 /Apache 2.4, MySQL/.
V C:\Windows\Sys­tem32\drivers\et­c\ přidáno 127.0.0.1 localhost.
V MySql mám vytvořenou na localhost databázi s názvem databazeproweb.
Chci přes index.php se k databázi připojit a vytvořit v ní tabulku s názvem **zamestnanci
.

<?php
$servername = "127.0.0.1";
$username = "root";
$password = "admin";
$dbname = "databazeproweb";

        try {
                $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);

                // setting the PDO error mode to exception
                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                // sql code to create table
                $sql = "CREATE TABLE zamestnanci (
                                id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                                firstname VARCHAR(30) NOT NULL,
                                lastname VARCHAR(30) NOT NULL,
                                email VARCHAR(50)
                                )";

                // using exec() because no results are returned
                $conn->exec($sql);
                echo "Tablulka OK !!!!";
                }
        catch(PDOException $e)
                {
                echo $sql . "
        " . $e->getMessage();
                }

        $conn = null;
        ?>

a výsledek v Mozzile verze 70.0.1

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // sql code to create table $sql = "CREATE TABLE zamestnanci ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL, lastname VARCHAR(30) NOT NULL, email VARCHAR(50) )"; // using exec() because no results are returned $conn->exec($sql); echo "Tablulka OK !!!!"; } catch(PDOException $e) { echo $sql . " " . $e->getMessage(); } $conn = null; ?>

Díky za radu :-)

Odpovědět
25.11.2019 22:55
Život by byl mnohem snazší, kdybychom k němu měli zdrojový kód.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
František Štěpnička:6.2.2020 11:35

Chlapi, hrdinou se asi nestanu (viz baner Na trhu chybí...), ale učitelé musejí taky updatovat znalosti, dovednosti a návyky :-)

 
Odpovědět
6.2.2020 11:35
Avatar
Tob027
Redaktor
Avatar
Tob027:5.5.2020 10:01

Problém se spouštěním php kódu bude v tom že pro spuštění php je potřeba web server. Na ten se program nahraje a spustí se to přes localhost. Já bych doporučoval abyss web server. Funguje to potom podobně jako když je program nahozený na 'velkém' serveru.

 
Odpovědět
5.5.2020 10:01
Avatar
Pavel Hortvik:6.8.2020 7:58

By mě jen zajímalo, proč si autor hraje na "chytrého" a namísto českých výrazů používá cizí, viz "Plurál".

 
Odpovědět
6.8.2020 7:58
Avatar
Petra Petty Kunzová:4. května 14:15

Jeee, :-D %P to byl teď hlavolam asi 3 hodiny :D . Vyskakovali my fattal hlášky . Koukám, kde jsem udělala v chybu. Tak to nakonec kopíruji a pořád stejně... A kde myslíte že jsem tu chybu našla? :-? %P :-D

Odpovědět
4. května 14:15
Kam míří naše pozornost, tam energie a tam se i objeví naše výsledky .
Avatar
Odpovídá na Petra Petty Kunzová
Petra Petty Kunzová:4. května 14:22

Jeee, :-D %P to byl teď hlavolam asi 3 hodiny :D . Vyskakovali mi fattal hlášky . Koukám, kde jsem udělala v chybu. Tak to nakonec kopíruji a pořád stejně... A kde myslíte že jsem tu chybu našla? :-? %P :-D

Odpovědět
4. května 14:22
Kam míří naše pozornost, tam energie a tam se i objeví naše výsledky .
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 138. Zobrazit vše