14. PHP a databáze

Pro spojení databáze a PHP je potřeba znát alespoň několik základních informací o databázích a především o jazyce MySQL.

Databáze MySQL

Dnešní PHP stránky už si bez spolupráce s nějakou databází prakticky nedovedeme představit. V největší míře se používá databáze MySQL. Další variantou může být také např. PostgreSQL a další. Pro základní operace a funkčnost se však zaměříme pouze na databázi MySQL. Jedná se o produkt, který je zdarma, i když ne úplně ve všech případech.

Nástroje pro práci s MySQL
Nejčastějším nástrojem je phpMyAdmin. Ten umožňuje prakticky jakékoliv operace s databází i se všemi daty v ní. Bývá také součástí většiny předpřipravených balíčků webových serverů (např. PHP Web Server, PHP Easy, WAMP Server apod.).

Dalším velmi zdařilým a přitom jednoduchým nástrojem je Adminer českého autora Jakuba Vrány. Jeho výhodou je především velmi jednoduchá instalace. Obsahuje totiž pouze jeden soubor, který nakopírujeme na webový server a spustíme v prohlížeči. Srovnání Adminera a PHPMyAdmin najdete také na stránce autora - http://www.adminer.org/cs/phpmyadmin/.

Připojení k databázi
Pro připojení k databázi potřebujeme tyto základní údaje:

  1. název hostitele (adresa serveru) – každá databáze běží na nějakém „stroji“ (virtuálním nebo běžném serveru). Název tohoto serveru může být buď název v podobě nějaké adresy typu mysql.server.cz (případně IP adresa tohoto serveru) a nebo v případě lokálního umístění databáze v podobě tvaru localhost (případně verze IP adresy – 127.0.0.1). Název hostitele obdržíme vždy od poskytovatele webhostingu
  2. název databáze – název je opět buď vytvořen poskytovatelem webhostingu nebo si ho sami můžeme vytvořit v administraci našeho webhostingového účtu
  3. uživatelské jméno – opět platí stejná pravidla, jako u názvu databáze.
  4. heslo – i zde platí stejná pravidla

Někdy bývá (opravdu jen výjimečně) potřeba zadat ještě port. MySQL naschlouchá na portu 3306, pokud není při konfiguraci serveru určeno jinak.

Práce s databází
Prvním krokem je vytvoření databáze. Přes rozhraní phpMyAdminu nebo Admineru to můžeme udělat velmi jednoduše přes formulářové pole (tzv. „na kliknutí“). Velmi často také bývá minimálně jedna databáze vytvořena již se vznikem webohostingového prostoru. Každá databáze (pokud není prázdná) obsahuje tabulky. Současně s tvorbou tabulky také vytváříme sloupce tabulky, u kterých musíme definovat jejich obsah. Tedy jaká data v nich budou obsažena, jejich datový typ. Můžeme také definovat, zda je v daném sloupci povolena nulová hodnota nebo zda je daný sloupec definován jako primární klíč.

Datové typy MySQL

Základní informace

  • pro omezení délky řetězce (maximální velikost je 255) používáme parametr "m", zápis je: datovy_typ(m) - např.: TINYINT(1), nebo VARCHAR(100)
  • u reálných čísel používáme navíc parametr "d" (maximální velikost je 30), tímto parametrem omezíme délku čísla za desetinou čárkou, zápis je: datovy_typ(m,d) - např.: FLOAT(5,3)
  • sloupce určené jako INDEXY (nebo i PRIMARY KEY) označíme na konci deklarace tabulky - např.: CREATE TABLE pokus (jm CHAR(20) NOT NULL, cis INT, PRIMARY KEY (jm), INDEX(cis));
  • název indexu (INDEX nazev (sloupec)) zadáváme pokud bude indexů více

Datové typy se nejčastěji dělí na tři základní skupiny:

  1. číselné
  2. textové (někdy označované jako znakové nebo řetězcové)
  3. datumové (datum a čas)

1. Číselné

Celočíselné typy

Typ Popis Atributy Rozsah
TINYINT velmi malá čísla AUTO_INCREMENT, UNSIGNED, SIGNED, ZEROFILL −128 až 127; UNSIGNED => 0 až 255
SMALLINT malá čísla AUTO_INCREMENT, UNSIGNED, SIGNED, ZEROFILL −32768 až 32767; UNSIGNED => 0 až 65535
MEDIUMINT střední celá čísla AUTO_INCREMENT, UNSIGNED, SIGNED, ZEROFILL −8388608 až 8388607; UNSIGNED => 0 až 16777215
INT nebo INTEGER běžné celé číslo AUTO_INCREMENT, UNSIGNED, SIGNED, ZEROFILL −2147483648 až 2147483647;UNSIGNED => 0 až 4294967295
BIGINT velká celá čísla AUTO_INCREMENT, UNSIGNED, SIGNED, ZEROFILL −9223372036854775808 až 9223372036854; UNSIGNED => 0 až 18446744073709551615

Reálné typy (s desetinnou čárkou)

Typ Popis Atributy Rozsah
FLOAT malá desetinná čísla UNSIGNED, SIGNED a ZEROFILL nejmenší nenulové hodnoty jsou ±1,175494351E−38; největší nenulové hodnoty jsou −±3,402823466E+38; UNSIGNED => záporné hodnoty jsou zakázány
DOUBLE velká desetinná čísla UNSIGNED, SIGNED a ZEROFILL nejmenší nenulové hodnoty jsou ±2,2250738585072014E-308; největší nenulové hodnoty jsou −±1,17976931348623157E+308; UNSIGNED => záporné hodnoty zakázané
DECIMAL velká desetinná čísla ukládaná jako řetězce UNSIGNED, SIGNED a ZEROFILL stejné jako DOUBLE

2. Textové typy

Používají se pro ukládání textu; některé typy dokáží rozlišovat i velká a malá písmena; lze do nich ukládat i čísla

Typ Popis Atributy
CHAR řetězec pevně dané délky 0-255; delší text bude oříznut, kratší bude doplněn mezerami do zadané délky BINARY, CHARACTER SET
VARCHAR stejné jako CHAR, ale kratší text není doplněn mezerami BINARY, CHARACTER SET
TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB klasické hodnoty BLOB -
TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT klasický text CHARACTER SET
ENUM výčtový typ -
SET množinový typ -

3. Typy pro datum a čas

Typ Popis Rozsah

DATE

datum ve formátu CCYY-MM-DD

1000-01-01' až '9999-12-31

TIME

čas ve formátu 'hh:mm:ss'; pro záporné hodnoty '-hh:mm:ss'; reprezentuje uplynulý čas nebo čas dne

-838:59.59' až '838:59:59

TIMESTAMP

časová značka, obsahuje datum a čas; pokud zadáme NULL vyplní se zde aktuální datum a čas

-

DATETIME

datum a čas ve formátu 'CCYY-MM-DD hh:mm:ss'

1000-01-01 00:00:00' až '999-12-31 23:59:59

Modifikátory

Modifikátory jsou nastavení tabulek, kterými určujeme chování jednotlivých záznamů.

  1. AUTO_INCREMENT - systém si sám ve sloupci generuje unikátní (jedinečné) číselné hodnoty
    - modifikátor lze použít pouze na celočíselný datový typ
    - za deklarací nové tabulky můžeme ještě navíc určit výchozí hodnotu: ...AUTO_INCREMENT=50;
  2. CHARACTER SET - znaková sada sloupce
  3. BINARY - pro CHAR a VARCHAR; tento typ bude brán jako binární a budou se tak rozlišovat malá a velká písmena
  4. DEFAULT vychozi_hodnota - pokud bude buňka prázdná, systém do ní automaticky přiřadí hodnotu "vychozi_hodnota"
    - řetězce nezapomeňte psát v uvozovkách
  5. FULLTEXT INDEX - platí pro sloupce typu CHAR, VARCHAR a TEXT
    - fultextový index slouží k rychlejšímu hledání dat v textových polích
    - hledání v takovýchto polích provádíme pomocí píkazů MATCH a AGAINST
    - př.: SELECT * FROM tabulka WHERE MATCH(sloupec) AGAINST("hledana_hodnota");
  6. INDEX - sloupec/sloupce označené jako INDEX umožní rychlejší přístup k datům která obsahují
  7. NOT NULL - pokud použijeme tento modifikátor, označený typ bude muset v každé buňce obsahovat nějakou hodnotu
  8. NULL - opak NOT NULL; buňka může být prázdná
  9. PRIMARY KEY - označený typ bude sloužit jako primární klíč - při jeho použití musíme zároveň použít UNIQUE - sloupec nám tedy jedinečným způsobem identifikuje záznamy v tabulce
  10. UNIQUE - v daném sloupci nesmějí být v buňkách stejné hodnoty, tedy co kus to unikát
  11. UNSIGNED - pokud použijeme modifikátor UNSIGNED, datový typ bude bez znaménka a posune se interval hodnot
    - u čísel s pohyblivou desetinou čárkou se interval použitím UNSIGNED neposunuje a berou se jen kladná čísla
    - př.: TINYINT má rozsah -118 až +127 a TINYINT UNSIGNED má rozsah 0 až 255
  12. ZEROFILL - použití u čísel, dotaz doplní před číslo nuly v celé jeho šířce
    - př.: pokud máme definováno MEDIUMINT(6) ZEROFILL a je v něm hodnota 123, tak se nám zobrazí 000123

Základní příkazy SQL

SQL příkazy můžete používat jak v prostředí Adminera (nebo phpMyAdminu), ale i následně v rámci PHP kódu (to je častější použití v praxi). Nejprve si ukažme práci v okně SQL příkazů:

Create table – tvorba tabulek

Pomocí tohoto příkazu vytvoříte tabulku v databázi. Zjednodušená syntaxe vypadá takto:

create table název tabulky (název sloupce datový typ null/not null)

Příklad:

create table knihy
(
CisloKnihy integer not null primary key,
NazevKnihy varchar(60) not null,
Autor varchar(60) not null
)

Tabulka nese název knihy a obsahuje celkem 3 sloupce:

  1. číslo knihy (CisloKnihy), datový typ integer, nesmí být nulový a je to primární klíč tabulky
  2. název knihy (NazevKnihy), datový typ varchar o maximální délce 60 znaků a nesmí být nulový
  3. autora knihy (Autor), datový typ varchar o maximální délce 60 znaků a nesmí být nulový

Insert – vložení dat

Příkazem insert se vkládají data do tabulky. Syntaxe:

insert into NazevTabulky values (hodnota,…)

Příklad:

insert into knihy values (1, 'Malý Bobeš','J.V.Pleva');
insert into knihy values (2, 'R.U.R.','Karel Čapek');
insert into knihy values (3, 'Bylo nás pět','Karel Poláček');

Select – načtení z tabulky

Příkaz select načte data z tabulky. Může být spojen i s nějakou podmínkou.

select NazevSloupce from NazevTabulky [where NazevSloupce=hodnota]

Příkaz v hranatých závorkách je volitelný

Příklad:

select CisloKnihy, NazevKnihy from knihy where Autor = 'Karel Čapek'

(vyber údaje ze sloupce CisloKnihy a NazevKnihy z tabulky Knihy, kde je uveden autor Karel Čapek)

Další příklady:

select * from knihy

- vypíše všechny položky záznamů

select NazevKnihy, Autor from knihy

- vypíše jen vybrané položky záznamů (název a autora)

select NazevKnihy, Autor from knihy order by NazevKnihy

- vypíše názvy a autory seřazené podle názvů knih

select NazevKnihy, Autor from knihy order by NazevKnihy desc

- vypíše názvy a autory seřazené podle názvů knih, ale v opačném abecedním pořadí (parametr "desc")

select NazevKnihy, Autor from knihy where NazevKnihy like "P%" or autor like "M%" 

- vypíše názvy a autory knih, jejichž názvy začínají písmenem P nebo pokud jméno autora začíná písmenem M

Delete – odstranění řádků

Příkazem delete se odstraní řádky tabulky. Syntaxe vypadá následovně:

delete from NazevTabulky [where NazevSloupce=hodnota]

Příklad:

delete from knihy where Autor = 'Karel Čapek'
(odstraní z tabulky knihy všechny knihy, které mají jako autora uvedeného Karla Čapka)

Update – změna hodnot

Příkazem update se změní hodnoty sloupce v tabulce. Zjednodušená syntaxe:

update NazevTabulky set NazevSloupce = NovaHodnota

Příklad:

update knihy set Autor = 'Božena Němcová' where CisloKnihy = 3

Tento příklad změní autora knihy s číslem 3 na novou hodnotu – Božena Němcová.

Drop Table – odstranění tabulky

Tímto příkazem odstraníte celou tabulku z databáze.

Syntaxe:

drop table NazevTabulky

Příklad:

drop table knihy

To je jen několik základních nejčastěji používaných příkazů. Existuje jich samozřejmě daleko více.