Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:10.12.2012 10:03

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
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:10.12.2012 10:52

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
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:10.12.2012 12:54

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
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:10.12.2012 13:43

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
10.12.2012 13:43
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:10.12.2012 17:00

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
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:10.12.2012 18:51

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 Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:10.12.2012 19:02

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
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:10.12.2012 19:16

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
Odpovídá na David Hartinger
Drahomír Hanák:10.12.2012 19:22

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
Tvůrce
Avatar
Odpovídá na Drahomír Hanák
Kit:10.12.2012 19:32

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
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:10.12.2012 19:40

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
Odpovídá na Kit
Drahomír Hanák:10.12.2012 19:49

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
Tvůrce
Avatar
Odpovídá na Drahomír Hanák
Kit:10.12.2012 19:55

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 Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:11.12.2012 12:57

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
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:11.12.2012 13:26

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 Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:11.12.2012 14:12

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

Nahoru Odpovědět
11.12.2012 14:12
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:11.12.2012 14:22

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 Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:11.12.2012 14:24

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
You are the greatest project you will ever work on.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:11.12.2012 14:28

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
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:11.12.2012 14:34

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
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:11.12.2012 16:48

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 Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:11.12.2012 18:07

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
You are the greatest project you will ever work on.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:11.12.2012 19:43

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
You are the greatest project you will ever work on.
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.