Na navigaci | Klávesové zkratky

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

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

    Pekne. :)

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

    před 9 lety | reagoval [9] David Grudl
  2. johno http://johno@jsmf.net #2

    avatar

    Ano, ano. Uz sa zaciname blizit.

    před 9 lety | reagoval [9] David Grudl
  3. finc http://finc.ic.cz #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 9 lety | reagoval [4] Finwe [8] Keff [9] David Grudl
  4. Finwe http://weblog.finwe.info #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 9 lety | reagoval [6] finc
  5. veena #5

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

    před 9 lety | reagoval [9] David Grudl
  6. finc http://finc.ic.cz #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 9 lety | reagoval [9] David Grudl
  7. enoice http://enoice.fialove.eu #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 9 lety
  8. Keff http://www.tomaskafka.com #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 9 lety | reagoval [11] veena
  9. David Grudl http://davidgrudl.com #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 9 lety
  10. MiSHAK http://www.mishak.net #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 9 lety
  11. veena #11

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

    před 9 lety | reagoval [12] Keff
  12. Keff http://www.tomaskafka.com #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 9 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 9 lety
  14. v6ak http://v6ak.profitux.cz/ #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 9 lety | reagoval [15] David Grudl
  15. David Grudl http://davidgrudl.com #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 9 lety

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