Nejnovější stabilní verzi Dibi instalujte pomocí Composeru příkazem:
composer require dibi/dibi
Přehled verzí najdete na stánce Releases.
Vyžaduje PHP 8.0 nebo vyšší.
Připojení k databázi
Databázové spojení je reprezentováno objektem Dibi\Connection:
Alternativně můžete používat statický registr dibi
, který udržuje v globálně dostupném úložišti
objekt spojení a nad ním volá všechny funkce:
V případě chyby připojení se vyhodí Dibi\Exception
.
Dotazy
Databázové dotazy pokládáme metodou query()
, která vrací Dibi\Result. Řádky jako objekty Dibi\Row.
Všechny příklady si můžete zkoušet online na hřišti.
Metoda fetchAssoc() umí vracet i složitější asociativní pole.
Do dotazu lze velmi snadno přidávat i parametry, všimněte si otazníku:
$database->query('SELECT * FROM users WHERE id = ' . $id); // ŠPATNĚ!!!
Místo otazníku lze používat i tzv. modifikátory.
V případě selhání query()
vyhodí buď Dibi\Exception
, nebo některého z potomků:
- ConstraintViolationException – porušení nějakého omezení pro tabulku
- ForeignKeyConstraintViolationException – neplatný cizí klíč
- NotNullConstraintViolationException – porušení podmínky NOT NULL
- UniqueConstraintViolationException – koliduje unikátní index
Dotazy lze pokládat také pomocí zkratek:
Modifikátory
Kromě zástupného symbolu ?
můžeme používat i modifikátory:
%s | string |
%sN | string, ale '' se přeloží jako NULL |
%bin | binární data |
%b | boolean |
%i | integer |
%iN | integer, ale 0 se přeloží jako NULL |
%f | float |
%d | datum (očekává DateTime, string nebo UNIX timestamp) |
%dt | datum & čas (očekává DateTime, string nebo UNIX timestamp) |
%n | identifikátor, tedy název tabulky či sloupce |
%N | identifikátor, považuje tečku za běžný znak |
%SQL | SQL – přímo vloží do SQL (alternativou je Dibi\Literal) |
%ex | expanduje pole |
%lmt | speciální – doplní do dotazu LIMIT |
%ofs | speciální – doplní do dotazu OFFSET |
Příklad:
Pokud $name
je null
, vloží se do SQL příkazu NULL
.
Pokud proměnná je pole, tak se modifikátor aplikuje na všechny jeho prvky a ty se vloží do SQL oddělené čárkami:
Modifikátor %n
využijete v případě, že název tabulky nebo sloupce je proměnnou. (Pozor, nedovolte
uživateli manipulovat s obsahem takové proměnné):
Pro operátor LIKE jsou k dispozici čtyři speciální modifikátory:
%like~ | výraz začíná řetězcem |
%~like | výraz končí řetězcem |
%~like~ | výraz obsahuje řetězec |
%like |
výraz je řetězec |
Hledej jména začínající na určitý řetězec:
Modifikátory polí
Parameterem vkládaným do SQL dotazu může být i pole. Tyto modifikátory určují, jak z něj sestavit SQL příkaz:
%and | key1 = value1 AND key2 = value2 AND ... |
|
%or | key1 = value1 OR key2 = value2 OR ... |
|
%a | assoc | key1 = value1, key2 = value2, ... |
%l %in | list | (val1, val2, ...) |
%v | values | (key1, key2, ...) VALUES (value1, value2, ...) |
%m | multi | (key1, key2, ...) VALUES (value1, value2, ...), (value1, value2, ...), ... |
%by | řazení | key1 ASC, key2 DESC ... |
%n | názvy | key1, key2 AS alias, ... |
Příklad:
V klauzuli WHERE lze použít modifikátory %and
nebo %or
:
Viz také Složitější dotazy.
Modifikátor %by
slouží k řazení, v klíčích uvedeme sloupce a hodnotou bude boolean určující, zda
řadit vzestupně:
Insert, Update & Delete
Data vkládáme do SQL dotazu jako asociativní pole. Modifikátory ani zástupný znak ?
není nutné v těchto
případech uvádět.
Vícenásobný INSERT:
Mazání:
Úprava záznamů:
Vložení záznamu, nebo úprava, pokud již existuje:
Transakce
Pro práci s transakcemi slouží čtveřice metod:
Testování
Abyste si mohli trošku s Dibi hrát, je tu připravena metoda test()
, které předáte parametry stejně jako
query()
, ovšem místo provedení SQL příkazu se tento barevně vypíše na obrazovku.
Výsledky dotazu je možné vypsat jako tabulku pomocí $result->dump()
.
K dispozici jsou dále proměnné:
Složitější dotazy
Parametrem může být také objekt DateTime
.
Nebo SQL literál:
Nebo výraz, ve kterém lze používat zástupné znaky ?
nebo modifikátory:
Při update lze modifikátory uvádět přímo v klíčích:
V podmínkách (tj. u modifikátorů %and
a %or
) není nutné uvádět klíče:
V položkách lze používat i modifikátory nebo zástupné znaky:
Modifikátor %ex
vloží do SQL všechny prvky pole:
Podmínky v SQL příkazu
Podmíněné SQL příkazy se ovládají pomocí tří modifikátorů %if
, %else
a %end
.
První z nich %if
se musí nacházet zcela na konci řetězce představujícího SQL a za ním následuje
proměnná:
Podmínku lze doplnit o část %else
:
Podmínky můžete zanořovat do sebe.
Identifikátory a řetězce v SQL
Samotné SQL prochází zpracováním, aby vyhovovalo konvencím dané databáze. Identifikátory (jména tabulek a sloupců) lze uvozovat do hranatých závorek nebo zpětných uvozovek, dále řetězce jednoduchými či dvojitými uvozovkami, nicméně na server se pošle vždy to, co databáze žádá. Příklad
Uvozovka se uvnitř řetězce v SQL zapisuje zdvojením.
Výsledek jako asociativní pole
Příklad: vrátí výsledky jako asociativního pole, kde klíčem bude hodnota políčka id
:
Největší síla funkce fetchAssoc()
se projeví u SQL dotazu spojujícího několik tabulek s různými typy
vazeb. Databáze z toho udělá plochou tabulku, fetchAssoc jí vrátí tvar.
Příklad: Mějme tabulku zákazníků a objednávek (vazba N:M) a položíme dotaz:
A rádi bychom získali vnořené asociativní pole podle ID zákazníka a poté podle ID objednávky:
Asociativní deskriptor má obdobnou syntax, jako když pole píšete pomocí přiřazení v PHP. Tedy
'customer_id|order_id'
představuje sérii přiřazení $all[$customerId][$orderId] = $row;
, postupně
pro všechny řádky.
Někdy by se hodilo, aby se asociovalo podle jména zákazníka namísto jeho ID:
Co když ale existuje více zákazníků se stejným jménem? Tabulka by měla mít spíš tvar:
Rozlišujeme tedy více možných Rimmerů pomocí klasického pole. Asociativní deskriptor má opět formát podobný
přiřazování, s tím, že sekvenční pole představuje []
:
Vrátíme se k příkladu s deskriptorem 'customer_id|order_id'
a zkusíme vypsat objednávky jednotlivých
zákazníků:
Bylo by hezké místo ID zákazníka vypsat jeho jméno. Jenže to bychom museli dohledávat v poli $orders
.
Výsledky si proto necháme upravit do takovéhoto tvaru:
Tedy mezi $customerId
a $orderId
vložíme ještě mezičlánek. Tentokrát ne číslované indexy,
jaké jsme použili pro odlišení jednotlivých Rimmerů, ale rovnou databázový záznam. Řešení je velmi podobné, jen si
stačí zapamatovat, že záznam symbolizuje šipka:
Prefixy & substituce
Názvy tabulek a sloupců mohou obsahovat proměnné části. Ty si nejprve nadefinujeme:
a poté použijeme v SQL. Všimněte si, že v SQL jsou uvozeny dvojtečkama:
Datové typy buňek
Dibi automaticky detekuje typy jednotlivých sloupců dotazu a převádí buňky na nativní typy PHP. Typ můžeme určit i manuálně. Možné typy najdete ve třídě Dibi\Type.
Logování
Dibi má v sobě zabudovaný logger, kterým můžete sledovat všechny vykonané SQL příkazy a měřit délku jejich trvání. Aktivace:
Šikovnější profiler je panel pro Tracy, který se aktivuje při propojení s Nette.
Připojení do Nette
V konfiguračním souboru zaregistrujeme DI rozšíření a přidáme sekci dibi
– tím se vytvoří
potřebné objekty a také databázový panel v Tracy debugger baru.
Poté objekt spojení získáme jako službu z DI kontejneru, např.:
Komunitní rozšíření
Nad Dibi staví nejrůznější knihovny, ORM a rozšíření. Celý jejich seznam najdete na Packagistu.
Našli jste chybu? Pošlete prosím pull request do dokumentace.