Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

Translate to English… Ins Deutsche übersetzen…

Experiment DibiTable

Knihovna se neustále vyvíjí, aktuální informace najdete na webu dibiphp.com.

Zkusil jsem do dibi přidat takovou hračku:

/*
CREATE TABLE [albums] (
[id] INTEGER  NOT NULL PRIMARY KEY,
[artist] VARCHAR(100) NOT NULL,
[title] VARCHAR(100) NOT NULL)
*/

class Albums extends DibiTable
{
}

Třída Albums reprezentuje databázovou tabulku (pokud jméno tabulky neurčíme, bude se detekovat z názvu třídy). Nad ní můžeme vykonávat třeba tyto operace:

$albums = new Albums;

// přečtení jednoho záznamu podle primárního klíče:
$key = 5;
$data = $albums->fetch($key);

// smazání záznamu č. 7
$albums->delete(7);

// smazání více záznamů
$count = $albums->delete(array(1, 2, 4));

// úprava záznamu č. 4
$data->title = 'new title';
$albums->update(4, $data);
// obdobně jako u delete lze měnit více záznamů

// vložení záznamu
$id = $albums->insert($data);

Dále lze provádět jednoduché výběry:

// řádky s klíčem 2, 3 a 5
foreach ($albums->find(2, 3, 5) as $row) {
   ...
}

// vypiš celou tabulku v HTML
$albums->findAll()->dump();

// výběr s řazením podle artist, title
$albums->findAll('artist', 'title');

Jde o velmi jednoduchého pomocníka (tzv. helper) pro rutinní operace nad tabulkou. Tedy žádné složité ORM nebo ActiveRecords. Tuším se tomu říká Table Data Gateway. Funkce je čerstvá a ve stádiu experimentování.

Ještě drobnost. Dibi je už ze své podstaty zcela imunní vůči SQL injection, takže se jich nemusíte obávat:

$key = '3 OR 1=1'; // podvrh
$albums->delete($key);
// --> DELETE FROM [albums] WHERE [product_id] = 3

Komentáře RSS 2.0 komentářů » přidat

#1 Jiří Knesl http://www.knesl.com nový

Pekne. :)

Dibi ma nabehnuto na to stat se taky ORM. I to ikdyz o to treba nestojis. :)

Posláno 15. 1. 2008 v 8.07 | Odpovědět
Na komentář reagoval [9] David Grudl
avatar

#2 johno http://johno@jsmf.net nový

Ano, ano. Uz sa zaciname blizit.

Posláno 15. 1. 2008 v 8.52 | Odpovědět
Na komentář reagoval [9] David Grudl

#3 finc http://finc.ic.cz nový

A ja si porad myslel, ze ORM nemas rad :)
Je to prvni krok k dalsimu rozsireni. Samozrejme je to pouzitelne pro mensi operace, spis bych to videl jako vrstvu na akcni dotazy (insert, update, detele). Kazdy, kdo nepouziva ORM vi, jake je to otravne skladat dane SQL dotazy.
Az doplnis metadata pro jednotlive sloupce, pridas vazby 1:1, 1:N, N:M, tak to bude takovy Hibernate v PHP ;) Dost prijemna je i Criteria API z Hibernate, ktere jsou pro dynamicke dotazy skutecne vyborne. Implementace takovych veci by mozna zmenilo vetsinovy nazor na ORM..

Jeste se zeptam, jak je to s transakcema v DIBI? Jsem schopen nejak delat atomicke operace pres nekolik dotazu?

Posláno 15. 1. 2008 v 9.04 | Odpovědět
Na komentář reagoval [4] Finwe [8] Keff [9] David Grudl

#4 Finwe http://weblog.finwe.info nový

No dobré! To je přesně ten drobný krok od Zend_Db_Table k dibi, který jsem potřeboval :)

#3 finc: Ad transakce: myslíš

dibi::begin();

try {
        dibi::query('insert...');
        dibi::query('update...');
} catch (DibException $e) {
        dibi::rollback();
}

?

Posláno 15. 1. 2008 v 10.00 | Odpovědět
Na komentář reagoval [6] finc

#5 veena nový

Supr, že to bereš z z CREATE TABLE. Lepší než xml nebo i yaml.

Posláno 15. 1. 2008 v 10.06 | Odpovědět
Na komentář reagoval [9] David Grudl

#6 finc http://finc.ic.cz nový

#4 Finwe:
Nene, mam na mysli napr. pres nekolik metod.
Pr.: Budu mit tridu
class UzivatelAction {

private Dibi dibi;
// nejake oznaceni, ze dibi se zde ma pouzit v transakci
}

Pote jde o to, ze dane akce muzu mit rozdelene do nekolika metod, kde provedu akcni dotazy. Pokud by metoda skoncila na exception (nemusi to byt jen z duvodu pri akcnim dotazu), tak by se dotaz neprovedl. Ale nevim, zda neco takoveho by slo zaridit :)

Posláno 15. 1. 2008 v 10.10 | Odpovědět
Na komentář reagoval [9] David Grudl
avatar

#7 enoice http://enoice.fialove.eu nový

Moc, moc pěkné.

Ještě jen malou poznámku k ukázce kódu, jen jsem si myslel že by bylo lepší kdyby tady

// přečtení jednoho záznamu podle primárního klíče:
$key = 5;
$data = $albums->fetch($key);

a tady

// úprava záznamu č. 4
$data->title = 'new title';
$albums->update(4, $data);

byl pouzit stejny $key, jen pro logiku update… Ne?

Posláno 15. 1. 2008 v 10.16 | Odpovědět
avatar

#8 Keff http://www.tomaskafka.com nový

#3 finc: A kdyz uz jsem si takovy ORM s vazbama v PHP napsal tak jsem king, nebo jen delam to co 10000 lidi prede mnou? Jen abych vedel jaky ramena mam delat :))

$album = AR::FindFirst('Album',AR::Prepare("name like '%s'",$jmeno));
$album->loadLinked('Song'); //layer vi ze je to relace 1:N a nahraje vsechny pisnicky z alba do array $album->song
//nektere pisnicky zmenime
$album->song[10]->title = "Ooo Ruuuzicko Vonava"
$album->song[8]->title = "Yeah baby!"
$album->save()
//ulozi se i zmenene pisnicky, ale jen ty zmene -> 2x sql update
Posláno 15. 1. 2008 v 19.24 | Odpovědět
Na komentář reagoval [11] veena
avatar

#9 David Grudl http://davidgrudl.com nový

#5 veena: to je skutečně jednoduchý helper, o struktuře tabulky nemá ani páru. Ale správně naznačuješ – implementaci je nejelegantnější řešit přes (snadnou) analýzu CREATE TABLE, než zavádět další jazyk a další duplicitní informace.

#6 finc: šlo, jen místo třídy dibi, což je „monostate“, se bude předávat objekt DibiConnection, který má stejný interface, pouze metody nejsou statické.

#1 Jiří Knesl: #2 johno: #3 finc: :-)

Budu se opakovat, ale prostě ORM jsem si v roce 2003 napsal, jmenovalo se to x.query a byl to perfektní odrazový můstek zpátky k SQL… Od té doby hledám kompromis.

Posláno 16. 1. 2008 v 1.54 | Odpovědět
avatar

#10 MiSHAK http://www.mishak.net nový

Použít u delete pole pro zápis více argumentů a u find prostě více argumentu za sebou je trochu matoucí ;-).

Ale díky díky díky všemocný :)

Posláno 16. 1. 2008 v 9.02 | Odpovědět

#11 veena nový

#8 Keff: Dobrý. Najdem to někde jako open source?

Posláno 16. 1. 2008 v 11.06 | Odpovědět
Na komentář reagoval [12] Keff
avatar

#12 Keff http://www.tomaskafka.com nový

#11 veena: To ne – what baketh in da house, stayeth in da house :) a navic to jeste dlouho potrva nez to bude v kvalite co by ustala release…

Posláno 16. 1. 2008 ve 13.08 | Odpovědět
avatar

#13 Milan Svoboda svobodai@centrum.cz nový

Jde v tomto dibitable nějak udělat, když potřebuji udělat select přes vícero tabulek?

Posláno 17. 1. 2008 v 10.31 | Odpovědět

#14 v6ak http://v6ak.profitux.cz/ nový

Na dibi je hlavně škoda, že nemám instance třídy, ale volám staticky. V praxi tedy používám PDO.

Posláno 18. 1. 2008 v 15.40 | Odpovědět
Na komentář reagoval [15] David Grudl
avatar

#15 David Grudl http://davidgrudl.com nový

#14 v6ak: samozřejmě že má. Celé je postavené na instancích, pouze jedna třída dibi je statická, která kopíruje interface DibiConnection a není nutné ji vůbec používat.

Posláno 19. 1. 2008 ve 2.04 | Odpovědět

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře ani hlasovat

Výtah na začátek článku na první komentář

Názory čtenářů v diskusích nejsou názory provozovatele webu, a ten za jejich obsah neodpovídá.

phpFashion © 2004, 2010 David Grudlo webu

Pokud není uvedeno jinak, podléhá obsah těchto stránek licenci Creative Commons BY-NC-ND Creative Commons License BY-NC-ND

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.