Diskuze: PHP - PDO CRUD wrapper

PHP PHP PHP - PDO CRUD wrapper American English version English version

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Zdravím, chci si napsat wrapper nad PDO ovladačem. Rád bych, aby to vypadalo asi takhle:

$db->query('SELECT * FROM `tabulka` WHERE `sloupec` = ?', 'hodnota');

Skvělé by bylo, kdyby to umělo i toto:

$db->insert('tabulka', array('klic' => 'hodnota', ...));

Přemýšlím nad tím, jak to uvnitř zaonačit. Dá se spolehnout na pouhé volání $pdo->prepare($pole) nebo bych měl bindovat a určovat datový typ parametrů?

Někde jsem viděl, že mohou nastat problémy s interpretací hodnoty parametru, pokud explicitně neurčím dat. typ, bylo to u klauzule LIMIT.

Díky :)

Odpovědět 10.12.2012 10:03
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Tohle jsi už zkoušel?
http://www.itnetwork.cz/…-a-modularne

$pdo->prepare($query) funguje bezvadně. Bindování se mi nelíbí, proto používám pole jako parametr metody execute().

Nahoru Odpovědět 10.12.2012 10:52
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Nejsem moc velkým příznivcem SQL wrapperů. Dělá si snad někdo wrapper na zápis programů v C#, Javě nebo PHP? Je to jen o lenosti řádně se naučit SQL. Pokud SQL dotaz napíšu na 20 řádcích, ve wrapperu by těch řádků bylo snad 50 a ještě nepřehledných.

Nahoru Odpovědět 10.12.2012 12:54
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Zkouším ten svůj wrapper trochu vylepšit.
http://www.itnetwork.cz/dev-lighter/40

Zatím to však nemám odladěno. Přidal jsem tam líné otvírání databáze. Pokud budeš chtít, přidám tam i ten insert.

Nahoru Odpovědět  +1 10.12.2012 13:43
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Ahoj, jo, tohle přesně hledám, chci tím nahradit DiBi. Wrapper bude sloužit jen ke zjednodušení práce s výsledky a parametry, SQL tím nezotročuji :) Chci to jak pro sebe, tak do toho objektového PHP seriálu, který chystám. Insert by byl super :)

Nahoru Odpovědět 10.12.2012 17:00
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Dopsal jsem tam metodu insert(). Je nutné, aby v poli byl alespoň jeden parametr. Jestli chceš, tak si to ošetři, ale obvykle to není nutné. Pokud odkazovaný sloupec neexistuje, vyhodí to PDOException.

Netestoval jsem to na databázi, ale předpokládám, že by to mělo šlapat.

Nahoru Odpovědět 10.12.2012 18:51
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Pecka, díky moc :)

Ještě se chci zeptat ohledně výjimek, četl jsem, že prý v ní klidně může být heslo, je to tam nějak ošetřeno?

Nahoru Odpovědět 10.12.2012 19:02
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Ano, může tam být i heslo, pokud výjimku nezachytíš. Právě jsem to vyzkoušel neúspěšným spojením s DB a bylo tam. Ovšem pokud ho zachytíš a vypíšeš jen $e->getMessage(), tak tam obsaženo není.

Proto je také dobré v hlavním modulu provést catch na třídu Exception, které zachytí vše, co nebylo zachyceno v modulech.

Nahoru Odpovědět 10.12.2012 19:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na David Čápka
Drahomír Hanák:

To se mi ještě nestalo, ale možné to je. I kdyby, na produkčním serveru výjimky vůbec nezobrazuji. Místo toho nechám error 500, chybu (v tomhle případě výjimku) uložím a nechám si poslat oznámení o chybě na email. Návštěvník webu pak vidí krásnou stránku "500" a já hned o chybě vím. Rozhodně bych nenechal zobrazovat výjimky nebo chyby uživatelům. Používám na to celkem pěkný FTP deployment skript v PHPčku, který mi to i automaticky při uploadu přepne do produkčního režimu, ale to už se netýká vůbec tohohle tématu :)

Můžeš se taky podívat na NotORM a třeba se inspirovat. Je to taky takový wrapper nad PDO, který ještě zajišťuje věci jako Lazy Loading atp.

 
Nahoru Odpovědět 10.12.2012 19:22
Avatar
Kit
Redaktor
Avatar
Odpovídá na Drahomír Hanák
Kit:

Testy dělám přes CLI a nechávám si zobrazovat i warningy a noticky. Na produkčním serveru úspěšné testy nezobrazují nic.

Nahoru Odpovědět 10.12.2012 19:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Vrána kdysi popsal, že je dobré výjimky PDO nepropagovat do vyšších vrstev, ale nahradit je vlastní výjimkou, např. DataException. Při té příležitosti se dají odfiltrovat i tyto úniky dat. Do třídy MyPDO jsem to nedával, aby se nesnížila její přehlednost. V produkci to však mám.

Nahoru Odpovědět 10.12.2012 19:40
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na Kit
Drahomír Hanák:

Taky řešení. Musel bych ale poctivě testovat, což nedělám :D Většinou jen web testy (pomocí Selenia). Unit testy jen když musím (u větších projektů, kde je větší modelová logika - píšu to zatím v PHPUnitu a s tím jsem se ještě nesmířil. Chtěl bych najít nějaký jednodušší testovací framework).

To s těmi výjimkami je dobrý nápad. Odstíní to přímou práci s PDO.

 
Nahoru Odpovědět 10.12.2012 19:49
Avatar
Kit
Redaktor
Avatar
Odpovídá na Drahomír Hanák
Kit:

Přiznám se, že mi PHPUnit také nesedl a píši si vlastní testy zcela po svém. Na rozdíl od PHPUnit mé testy při úspěchu nevypisují vůbec nic.

Nahoru Odpovědět 10.12.2012 19:55
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Já bych to pro začátek potřeboval co nejvíce ořezat, bude to první objektová aplikace v PHP zde na devbooku. Chtěl bych udělat nějakou první verzi, tu zprovoznit a poté vylepšovat. Časem před to budu muset i vložit nějaké úplné základy OOP, ale to teď oželím.

Když nastavím:

PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING

Bude to fungovat v pořádku? Ještě ti z toho asi udělám statickou třídu, doufám, že to ve zdraví přežiješ :D Vysvětlovat najednou OOP, MVC a ještě DI mi přijde náročné, vezmu to postupně.

Pokud to takhle půjde, brzy bych to zprovoznil a nahodil sem nějaký balík zdrojáků.

Nahoru Odpovědět 11.12.2012 12:57
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

PDO::ERRMODE_WAR­NING jsem nezkoušel, ale fungovat by to mělo. Asi budeš muset před volání každé metody dát @ a pak zkoumat stav. Zabývat se tím nebudu, mně plně vyhovuje PDO::ERRMODE_EX­CEPTION. Jestli do toho chceš jít, budiž.

Statickou třídu snad přežiju, když se na ni nebudu moc dívat :) Jenom z toho nedělej Singleton.

Nejsem si jist, zda je pro začátečníky vhodné ponechávat líné otvírání databáze, ale nechám to na zvážení.

Také zde nemám podchycenu ztrátu spojení s databází. Prostě to vyhodí výjimku, kterou si musíš zpracovat ve vyšších vrstvách, což může být při potřebě opakování problematické. Začátečníci to však potřebovat nebudou.

Nahoru Odpovědět 11.12.2012 13:26
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Já to dnes nějak spatlám a hodím to sem, uvidíme :)

Nahoru Odpovědět 11.12.2012 14:12
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Pokud bys to chtěl procedurálně, tak by mohlo stačit vyndat metody z třídy, prohlásit je za funkce a interní proměnné udělat jako globální.

Nahoru Odpovědět 11.12.2012 14:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Udělám to ošklivě objektově a v dalších dílech vylepším :)

Editováno 11.12.2012 14:24
Nahoru Odpovědět 11.12.2012 14:24
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Možná by se ta statická třída ale dala použít i v těch prvních PHP tutoriálech.

Nahoru Odpovědět 11.12.2012 14:28
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Napadlo mě, že tu třídu rozšířím ještě o pár metod (např. o update), ale pak jsem si uvědomil, že čím víc se to rozšíří, tím víc je to omezující. Vím, že to zní jako paradox, ale už teď to omezuje v tom, že na jedno prepare() je jen jedno execute(), neřeší to transakce a jistě mnoho dalších důležitých vlastností, které mě v tuto chvíli nenapadají.

Nahoru Odpovědět 11.12.2012 14:34
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Ani nevím, kde se ve mně vzal ten odpor ke čtyřtečkám. Možná je to jeden z důvodů, proč statické třídy nemusím. Přitom když jsem s objekty začínal, tak jsem měl největší problémy právě s klasickými objekty a všechno jsem dělal staticky.

Pravděpodobnější však bude, že statické třídy mě nějakým způsobem svazují a to mi vadí.

Nahoru Odpovědět 11.12.2012 16:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Tak jsem to zprovoznil, málem jsem u toho umřel a to je to docela chabý :D Půjdu se nějak zkulturnit (najíst, oholit a tak) a pak smažu ty nejhorší work-aroundy a hodím to sem :)

Nahoru Odpovědět 11.12.2012 18:07
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

No, tak jsem to už moc nepředělával, ale hodím to sem, odkládal jsem to již dost dlouho. Mělo by to fungovat, je tam i export databáze, použil jsem tu z MySQL seriálu.

https://dl.dropbox.com/…3/mvc_01.zip

Zajímaly by mě tvé připomínky, ideálně kdybychom to mohli nějak vyčistit a začal bych o tom něco psát :)

Editováno 11.12.2012 19:44
Nahoru Odpovědět 11.12.2012 19:43
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 23 zpráv z 23.