Na navigaci | Klávesové zkratky

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

  1. Jiří Knesl #1

    Pekne. :)

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

    před 16 lety | reagoval [9] David Grudl
  2. johno #2

    avatar

    Ano, ano. Uz sa zaciname blizit.

    před 16 lety | reagoval [9] David Grudl
  3. finc #3

    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?

    před 16 lety | reagoval [4] Finwe [8] Keff [9] David Grudl
  4. Finwe #4

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

    #3 finci, Ad transakce: myslíš

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

    ?

    před 16 lety | reagoval [6] finc
  5. veena #5

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

    před 16 lety | reagoval [9] David Grudl
  6. finc #6

    #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 :)

    před 16 lety | reagoval [9] David Grudl
  7. enoice #7

    avatar

    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?

    před 16 lety
  8. Keff #8

    avatar

    #3 finci, 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
    před 16 lety | reagoval [11] veena
  9. David Grudl #9

    avatar

    #5 veeno, 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 finci, š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ří Knesle, #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.

    před 16 lety
  10. MiSHAK #10

    avatar

    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ý :)

    před 16 lety
  11. veena #11

    #8 Keffe, Dobrý. Najdem to někde jako open source?

    před 16 lety | reagoval [12] Keff
  12. Keff #12

    avatar

    #11 veeno, 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…

    před 16 lety
  13. Milan Svoboda #13

    avatar

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

    před 16 lety
  14. v6ak #14

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

    před 16 lety | reagoval [15] David Grudl
  15. David Grudl #15

    avatar

    #14 v6aku, 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.

    před 16 lety

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


phpFashion © 2004, 2024 David Grudl | o blogu

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