Zend's PHP 5 Coding Contest - wtcSQLite
Zend, spoleΦnost, kterß stojφ za enginem pohßn∞jφcφm PHP 5, uspo°ßdala sout∞₧ o nejlepÜφ aplikace v PHP 5, s cφlem p°iblφ₧it a popularizovat novΘ objektovΘ rysy tohoto jazyka. Cφlem nßsledujφcφch Φlßnk∙ je p°inΘst vßm pohled na novinky v PHP 5, a to tak, jak byly pou₧ity v praxi autory, kte°φ se "Zend's Coding Contest" z·Φastnili.
Co je novΘho v PHP 5
SpoleΦnost Zend, vyvφjejφcφ engine pohßn∞jφcφ PHP, se rozhodla zpopularizovat nov∞ uvedenΘ PHP 5, a to formou sout∞₧e s v∞cn²m dary (prvnφ cenou byl znaΦkov² notebook).
Sout∞₧ m∞la pomoci rozÜφ°it pov∞domφ o PHP 5, o jeho novΘ objektovΘ koncepci, a p°isp∞t k odpoutßnφ se (n∞kter²m programßtor∙m) od psanφ PHP k≤du ve stylu QBasicu pro MS-DOS. PHP verze 4.0.6 a ni₧Üφ k tomu n∞kdy docela svßd∞lo...
PHP 5 v podßnφ Zendu je skuteΦn∞ p°elomovΘ, proto₧e p°inßÜφ do tohoto skriptovacφho jazyka konstrukce, kterΘ dosud byly znßmΘ spφÜe z jazyk∙ jako je Java Φi C++.
PHP 5 p°inßÜφ nov∞ konstruktory a destruktory t°φd, protected, private a public prom∞nnΘ a metody t°φd, abstraktnφ a final t°φdy, statickΘ metody t°φdy, statickΘ prom∞nnΘ t°φd s p°i°azenou poΦßteΦnφ hodnotou, interface a jeho implementaci, funkce pro klonovßnφ objekt∙ a hlavn∞ v²jimky (try
, catch
, throw
), kterΘ rapidn∞ zjednoduÜφ a uΦinφ robustn∞jÜφm veÜker² k≤d, kter² zpracovßvß chybovΘ stavy.
Krom∞ t∞chto zm∞n objektovΘ koncepce je v PHP 5 nov∞ zahrnuta i podpora pro SQLite, co₧ je velice zajφmavß embedded databßze, o velikosti cca 200 kB, kterß umφ v podstat∞ to samΘ, co MySQL, a nemusφ se nijak instalovat. SQLite databßzi tvo°φ jeden soubor ve filesystΘmu a nad nφm se pracuje.
SQLite umφ dokonce i pohledy (views), triggery a transakce a mo₧nosti jejφho (omezenΘho) SQL repertoßru je mo₧nΘ rozÜi°ovat pomocφ callback funkcφ nad PHP.
Tento rozsßhlejÜφ ·vod je zde zßm∞rn∞, je toti₧ dobrΘ si uv∞domit, ₧e PHP 5 se posunulo od PHP 4 do oblasti, kde m∙₧e ji₧ konkurovat °ad∞ jin²ch modernφch programovacφch jazyk∙ a nep°ipadat si jako chud² p°φbuzn².
Podmφnky sout∞₧e a jejφ vφt∞zovΘ
┌Φastnφk∙m sout∞₧e bylo doporuΦeno n∞kolik typ∙ aplikacφ (nicmΘn∞ bylo mo₧no poslat libovoln² nßm∞t) a jednalo se o vcelku praktickΘ v∞ci:
- galerie obrßzk∙
- online systΘm pro prezentace
- online systΘm pro porovnßnφ cen
- agregace v²sledk∙ vyhledßvaΦ∙
- webovß administrace SQLite databßze
- webov² sprßvce soubor∙
Vφt∞zem se staly nejlΘpe bodovanΘ aplikace, kde 50% vßhu m∞lo hlasovßnφ ve°ejnostφ a 50% vßhu m∞lo hodnocenφ odborn²ch porotc∙. Preferovßny byly p°itom aplikace pou₧φvajφcφ v p°im∞°enΘ mφ°e novΘ objektovΘ funkce PHP 5, XML a s dobr²m a "Φist²m" k≤dem.
Vφt∞zovΘ Zend's PHP 5 Coding Contest:
wtcSQLite - webovß administrace SQLite databßze
V tomto Φlßnku bych se cht∞l podrobn∞ji v∞novat aplikaci, kterß skonΦila na druhΘm mφst∞, tedy wtcSQLite. Napsal ji Andrew Gallant a poskytuje SQLite obdobnΘ slu₧by jako phpMyAdmin databßzi MySQL. Umφ tedy provßd∞t vklßdßnφ, mazßnφ a zm∞nu tabulek, triger∙, index∙, pohled∙ a dat, vΦetn∞ podpory pro ALTER TABLE (kterou SQLite standardn∞ nemß - je pot°eba vytvß°et pomocnou tabulku s novou strukturou a kopφrovat do nφ data).
SQLite je databßze, kterß m∞ osobn∞ okouzlila. Nejde zde ani tak o to, ₧e SQLite umφ pßr v∞cφ navφc oproti MySQL (triggery, pohledy), v²bornß na SQLite databßzi je jejφ embedded koncepce a engine, kter² pro databßzi pou₧φvß jedin² soubor, v n∞m₧ jsou obsa₧eny veÜkerΘ struktury tabulek, indexy i data.
Na data nejsou v SQLite p°itom kladeny ₧ßdnΘ typovΘ nßroky Φi po₧adavky, co₧ se sice naprosto nehodφ pro jejich bezpeΦnΘ zpracovßnφ, ale nap°φklad pro uchovßnφ Üablon redakΦnφho systΘmu je to zcela ideßlnφ.
SQLite je navφc pro v²b∞rovΘ p°φkazy jeÜt∞ o n∞co rychlejÜφ ne₧ dosavadnφ p°ebornφk pro (jednoduchΘ) SELECTy, tedy MySQL.
wtcSQLite - koncepce a zajφmavΘ t°φdy
Aplikace wtcSQLite se rychle rozvφjφ, sout∞₧e se ·Φastnila verze 1.0.0, ale v dob∞ vzniku tohoto Φlßnku, tedy o pßr t²dn∙ pozd∞ji, byla ji₧ na serveru WebTricksCentral k dispozici verze 1.1.1.
Podφvßme se tedy podrobn∞ji na tuto nov∞jÜφ verzi - m²m cφlem nenφ p°itom popis instalace tΘto aplikace (Φφst readme.txt umφ ka₧d², navφc instalace spoΦφvß jen v rozbalenφ ZIP archivu), ale pohled na zajφmavΘ v∞ci v k≤du wtcSQLite z hlediska programßtora.
Pozoruhodn² databßzov² layer wtcSQLite
ZaΦal bych pohledem na t°φdu SQLiteEnhanced
, nejlepÜφ Φßst wtcSQLite aplikace, kterß je zßkladnφm objektem pro prßci s SQLite databßzφ. T°φda SQLiteEnhanced
je pozoruhodnß v tom, ₧e umφ zpracovßvat i SQL p°φkazy typu ALTER TABLE abc ADD name VARCHAR(255);, a to zcela automaticky - pokud zavolßte jejφ public function query($sql)
metodu s poΦßteΦnφm textem ALTER, p°edß se °φzenφ metod∞ alterTableQuery()
.
Je to to velice zajφmav² layer, publikovan² v licenci GNU GPL a tedy pou₧iteln² i pro vaÜe open-source projekty. Z mΘho pohledu tvo°φ nejhodnotn∞jÜφ Φßst wtcSQLite.
Novßtorsk² template systΘm wtcSQLite
Druhou novßtorskou v∞cφ na wtcSQLite je jejφ template systΘm. Ten by byl vcelku obyΦejn² a standardnφ (nenφ ani navr₧en pro obecnΘ pou₧itφ a pro rozsßhlΘ Üablony se evidentn∞ nehodφ, rovn∞₧ je psan² p°φliÜ "natvrdo" k danΘ aplikaci), neb²t jeho koncepce uklßdßnφ Üablon.
V archivu s wtcSQLite toti₧ dostanete i soubor templateSystem.sqlite.php, co₧ nenφ nic jinΘho, ne₧ napln∞nß SQLite databßze (ji₧ jsem se zmφnil, ₧e SQLite databßze je jen obyΦejn² soubor) se Üablonami, kterΘ potom wtcSQLite pou₧φvß pro zobrazovßnφ formulß°∙ pro vklßdßnφ, zm∞nu a mazßnφ tabulek, index∙ a trigger∙.
Tak₧e ji₧ ₧ßdnΘ soubory se Üablonami, jak je znßme z aplikace phpBB Φi phpMyAdmin, Φi spouÜt∞nφ install.php nebo ruΦnφ vklßdßnφ do databßze. Dodßvß se samotnß, napln∞nß SQLite databßze, s mo₧nostφ jejφ jednoduchΘ zm∞ny p°φmo p°es webovΘ rozhranφ wtcSQLite.
èablony je rovn∞₧ mo₧no exportovat do XML soubor∙, za pomoci t°φdy ExportXML
, a importovat z XML do SQLite databßze, za pomoci t°φdy ImportXML
.
Cel² systΘm je velice v²hodn², nemusφte nic instalovat nebo konfigurovat a aplikace je ihned funkΦnφ. SQLite by p°itom pro v²b∞rovΘ dotazy m∞la b²t jeÜt∞ rychlejÜφ ne₧ dosavadnφ p°ebornφk v tomto oboru, tedy MySQL, a zde jejφ koncepce zφskßvß pozoruhodn² smysl.
Co se mi na wtcSQLite nelφbφ, aneb programßtorskΘ chyby
Ka₧d² programßtor je p°i pohledu na k≤d n∞koho jinΘho schopen b∞hem 5 minut popsat alespo≥ 10 chyb, kter²ch se onen dotyΦn² neÜ¥astnφk dopustil. K≤d se Φasto pφÜe rychle, aby prost∞ "u₧" fungoval, nikoli pro krßsu k≤du samotnou. NicmΘn∞, nalΘzat nep°φliÜ efektivn∞ napsanΘ v∞ci smysl mß, minimßln∞ proto, aby se z toho jinφ programßto°i pouΦili.
Zde se tedy, rovn∞₧ na p°φkladu wtcSQLite, podφvßme na to, jak bychom svΘ aplikace psßt nem∞li.
Autorizace p°φstupu k databßzi je ve wtcSQLite °eÜena velice jednoduÜe, a bohu₧el i nedostateΦn∞, p°es soubor config.xml.php, tedy XML soubor s definicφ u₧ivatelskΘho jmΘna a hesla, v n∞m₧ je ale bohu₧el toto jmΘno a heslo ulo₧eno bez jakΘhokoli zaÜifrovßnφ, jako plain-text, bez pomoci funkce md5()
Φi sha1()
.
O p°φpadnΘ zpracovßnφ chyb se starß t°φda MyException
, co₧ je rozÜφ°enφ vestav∞nΘ t°φdy Exception
o specifickΘ zpracovßnφ normßlnφch a "fatal" v²jimek, a to mφsto dosavadnφho postupu p°es trigger_error()
a set_error_handler()
. Bohu₧el, zde je dalÜφ slabina aplikace, °ada v∞cφ, kterΘ by m∞ly b²t oÜet°eny pomocφ Exception
, oÜet°eny v∙bec nejsou. Pat°φ sem zejmΘna sada SQL dotaz∙ v aplikaci (SELECT, INSERT, DELETE) nad SQLite databßzφ, p°itom prßv∞ pomocφ Exception
by to Ülo v PHP 5 velice elegantn∞ °eÜit.
ProblΘmem ve verzi 1.0.0 bylo i zcela neoÜet°enΘ a p°φmΘ pou₧itφ $_GET
, $_POST
a dalÜφch polφ (nßsledujφcφ verze toto odstra≥uje hackem), bez ohledu na zapnutΘ get_magic_quotes_gpc()
, co₧ zp∙sobuje v n∞kter²ch p°φpadech nefunkΦnost Φi nedeterminovatelnΘ chovßnφ celΘ aplikace.
Mnohem lepÜφ, ne₧ p°istupovat k t∞mto polφm prom∞nn²ch "natvrdo", je nadefinovat si nap°φklad nßsledujφcφ funkce a ty potom pou₧φvat mφsto polφ:
return undoMagic($_GET[$name]);
}
function postVar($name) {
return undoMagic($_POST[$name]);
}
function cookieVar($name) {
return undoMagic($_COOKIE[$name]);
}
function requestVar($name) {
return undoMagic($_REQUEST[$name]);
}
function serverVar($name) {
return $_SERVER[$name];
}
function undoMagic($data) {
return get_magic_quotes_gpc() ? stripslashes($data) : $data;
}
Osobn∞ mi trochu vadφ i nadm∞rnΘ pou₧itφ if() ... else ... if() ... else
ve zdrojovΘm k≤du aplikace. Zde se mi zdß p°ehledn∞jÜφ pou₧itφ switch() ... case
nebo rovnou definice specifickΘ padesßti°ßdkovΘ funkce pro ka₧dou operaci, ne₧ 800 °ßdk∙ nestrukturovanΘho k≤du. Ale to je spφÜe otßzka osobnφho stylu, ne₧ vß₧nß v²hrada.
Zhodnocenφ wtcSQLite
Celkov∞ je ale nutno °φci, ₧e celß aplikace wtcSQLite je napsßna programßtorsky sluÜn∞, s ohledem na Φas, v jakΘm byla vytvo°ena, a s ohledem na novost PHP 5 a jeho koncepce.
Aplikace wtcSQLite pou₧φvß novß objektovß rozÜφ°enφ PHP (public static function
, protected function
, exception
), pou₧φvß XML, SQLite. A je to navφc mimo°ßdn∞ u₧iteΦnß utilita, na kterΘ se dßle pracuje, ji₧ nynφ pln∞ vyu₧itelnß p°i programovßnφ v PHP 5 s SQLite.
Zaslou₧en∞ zφskala v Zend's PHP 5 Coding Contest st°φbro.
Zend's PHP 5 Coding Contest
Tato sΘrie Φlßnk∙ dosud nebyla ukonΦena!
- Zend's PHP 5 Coding Contest - wtcSQLite (prßv∞ Φtete)