Navigace

Hlavnφ menu

 

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:

  1. PRADO - komponent framework, obdoba vizußlnφch komponent pro PHP, kterΘ jsou inspirovßny podobn²mi komponentami v Delphi, vΦetn∞ jejich nßzv∙
  2. wtcSQLite - kompletnφ administrace SQLite databßzφ p°es webovΘ rozhranφ
  3. LIMB - framework pro sprßvu obsahu webu

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φ:

function getVar($name) {
    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)
Hulßn, Radek (26. 11. 2004)
internetov² autor a vydavatel webu WELL.DONE