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

obsahuje podprahová sdělení

Experiment DibiTable

Upozornění: 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

Karma body: 16. Líbil se vám článek?

Komentáře » přidat

  1. [1] Jiří Knesl: 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
  2. avatar [2] johno: 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. [3] finc: 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
    Na komentář reagoval [8] Keff
    Na komentář reagoval [9] David Grudl
  4. [4] Finwe: 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. [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. [6] finc: 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
  7. avatar [7] enoice: 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
  8. avatar [8] Keff: 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
  9. avatar [9] David Grudl: 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
  10. avatar [10] MiSHAK: 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. [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
  12. avatar [12] Keff: 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
  13. avatar [13] Milan Svoboda: 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. [14] v6ak: 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
  15. avatar [15] David Grudl: 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á.

La Trine © 2004, 2008 David Grudl – o webu
provozuje Pachollini.

Jakékoliv užití obsahu, včetně převzetí článků nebo jejich částí, je bez předchozího písemného svolení autora zakázáno.

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