Diskuze: PHP - PDO CRUD wrapper
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Vlastník

Zobrazeno 23 zpráv z 23.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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().
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.
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.
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
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.
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?
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.
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.
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.
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.
Taky řešení. Musel bych ale poctivě testovat, což nedělám 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.
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.
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š 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ů.
PDO::ERRMODE_WARNING 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_EXCEPTION. 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.
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í.
Udělám to ošklivě objektově a v dalších dílech vylepším
Možná by se ta statická třída ale dala použít i v těch prvních PHP tutoriálech.
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í.
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í.
Tak jsem to zprovoznil, málem jsem u toho umřel a to je to docela chabý
Půjdu se nějak zkulturnit
(najíst, oholit a tak) a pak smažu ty nejhorší work-aroundy a hodím to sem
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
Zobrazeno 23 zpráv z 23.