<meta http-equiv='pics-label' content='(pics-1.1 "http://www.icra.org/ratingsv02.html" comment "ICRAonline EN v2.0" l gen true for "http://interval.cz" r (nz 1 vz 1 lz 1 oz 1 cz 1) "http://www.rsac.org/ratingsv01.html" l gen true for "http://interval.cz" r (n 0 s 0 v 0 l 0))' />
<p id='prepend'>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.</p>
<h3>Co je novΘho v PHP 5</h3>
<p>SpoleΦnost <a href='http://zend.com'>Zend</a>, vyvφjejφcφ engine pohßn∞jφcφ PHP, se rozhodla zpopularizovat nov∞ uvedenΘ PHP 5, a to formou <a href='http://zend.com/php5/contest/contest.php'>sout∞₧e s v∞cn²m dary</a> (prvnφ cenou byl znaΦkov² notebook).</p>
<p>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...</p>
<p>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++.</p>
<p>PHP 5 p°inßÜφ nov∞ konstruktory a <a href='http://hulan.info/blog/?item=co-je-noveho-v-php-5-dil-1-5'>destruktory</a> t°φd, protected, private a public prom∞nnΘ a metody t°φd, abstraktnφ a final t°φdy, statickΘ metody t°φdy, <a href='http://hulan.info/blog/?item=co-je-noveho-v-php-5-dil-4-5'>statickΘ prom∞nnΘ t°φd</a> s p°i°azenou poΦßteΦnφ hodnotou, <a href='http://hulan.info/blog/?item=co-je-noveho-v-php-5-dil-3-5'>interface</a> a jeho implementaci, funkce pro klonovßnφ objekt∙ a hlavn∞ <a href='http://hulan.info/blog/?item=co-je-noveho-v-php-5-dil-2-5'>v²jimky</a> (<code>try</code>, <code>catch</code>, <code>throw</code>), kterΘ rapidn∞ zjednoduÜφ a uΦinφ robustn∞jÜφm veÜker² k≤d, kter² zpracovßvß chybovΘ stavy.</p>
<p>Krom∞ t∞chto zm∞n objektovΘ koncepce je v PHP 5 nov∞ zahrnuta i podpora pro <a href='http://sqlite.org'>SQLite</a>, co₧ je velice zajφmavß <em>embedded</em> 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.</p>
<p>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.</p>
<p>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².</p>
<h3>Podmφnky sout∞₧e a jejφ vφt∞zovΘ </h3>
<p>┌Φ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:</p>
<div class='list'>
<ul>
<li>galerie obrßzk∙</li>
<li>online systΘm pro prezentace</li>
<li>online systΘm pro porovnßnφ cen</li>
<li>agregace v²sledk∙ vyhledßvaΦ∙</li>
<li>webovß administrace SQLite databßze</li>
<li>webov² sprßvce soubor∙</li>
</ul>
</div>
<p>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.</p>
<li><a href='http://www.zend.com/php5/contest/contest.php?id=36&single=1'>PRADO</a> - komponent framework, obdoba vizußlnφch komponent pro PHP, kterΘ jsou inspirovßny podobn²mi komponentami v Delphi, vΦetn∞ jejich nßzv∙</li>
<p>V tomto Φlßnku bych se cht∞l podrobn∞ji v∞novat aplikaci, kterß skonΦila na druhΘm mφst∞, tedy <a href='http://www.zend.com/php5/contest/contest.php?id=74&single=1'>wtcSQLite</a>. Napsal ji Andrew Gallant a poskytuje SQLite obdobnΘ slu₧by jako <a href='http://interval.cz/serial.asp?serial=77' title='Interval.cz: Sprßvce pro databßze MySQL - phpMyAdmin'>phpMyAdmin</a> 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 <samp>ALTER TABLE</samp> (kterou SQLite standardn∞ nemß - je pot°eba vytvß°et pomocnou tabulku s novou strukturou a kopφrovat do nφ data).</p>
<p>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φ <em>embedded</em> koncepce a engine, kter² pro databßzi pou₧φvß jedin² soubor, v n∞m₧ jsou obsa₧eny veÜkerΘ struktury tabulek, indexy i data.</p>
<p>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φ.</p>
<p>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.</p>
<h3>wtcSQLite - koncepce a zajφmavΘ t°φdy</h3>
<p>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 <a href='http://www.webtrickscentral.com'>WebTricksCentral</a> k dispozici verze 1.1.1.</p>
<p>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 <em>readme.txt</em> 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.</p>
<h4>Pozoruhodn² databßzov² layer wtcSQLite</h4>
<p>ZaΦal bych pohledem na t°φdu <code>SQLiteEnhanced</code>, nejlepÜφ Φßst wtcSQLite aplikace, kterß je zßkladnφm objektem pro prßci s SQLite databßzφ. T°φda <code>SQLiteEnhanced</code> je pozoruhodnß v tom, ₧e umφ zpracovßvat i SQL p°φkazy typu <samp>ALTER TABLE abc ADD name VARCHAR(255);</samp>, a to zcela automaticky - pokud zavolßte jejφ <code>public function query($sql)</code> metodu s poΦßteΦnφm textem <samp>ALTER</samp>, p°edß se °φzenφ metod∞ <code>alterTableQuery()</code>.</p>
<p>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.</p>
<h4>Novßtorsk² template systΘm wtcSQLite</h4>
<p>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.</p>
<p>V archivu s wtcSQLite toti₧ dostanete i soubor <em>templateSystem.sqlite.php</em>, 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∙.</p>
<p>Tak₧e ji₧ ₧ßdnΘ soubory se Üablonami, jak je znßme z aplikace phpBB Φi phpMyAdmin, Φi spouÜt∞nφ <em>install.php</em> 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.</p>
<p>èablony je rovn∞₧ mo₧no exportovat do XML soubor∙, za pomoci t°φdy <code>ExportXML</code>, a importovat z XML do SQLite databßze, za pomoci t°φdy <code>ImportXML</code>.</p>
<p>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.</p>
<h4>Co se mi na wtcSQLite nelφbφ, aneb programßtorskΘ chyby</h4>
<p>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.</p>
<p>Zde se tedy, rovn∞₧ na p°φkladu wtcSQLite, podφvßme na to, jak bychom svΘ aplikace psßt nem∞li.</p>
<p>Autorizace p°φstupu k databßzi je ve wtcSQLite °eÜena velice jednoduÜe, a bohu₧el i nedostateΦn∞, p°es soubor <em>config.xml.php</em>, 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 <code>md5()</code> Φi <code>sha1()</code>.</p>
<p>O p°φpadnΘ zpracovßnφ chyb se starß t°φda <code>MyException</code>, co₧ je rozÜφ°enφ vestav∞nΘ t°φdy <code>Exception</code> o specifickΘ zpracovßnφ normßlnφch a "fatal" v²jimek, a to mφsto dosavadnφho postupu p°es <code>trigger_error()</code> a <code>set_error_handler()</code>. Bohu₧el, zde je dalÜφ slabina aplikace, °ada v∞cφ, kterΘ by m∞ly b²t oÜet°eny pomocφ <code>Exception</code>, 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φ <code>Exception</code> by to Ülo v PHP 5 velice elegantn∞ °eÜit.</p>
<p>ProblΘmem ve verzi 1.0.0 bylo i zcela neoÜet°enΘ a p°φmΘ pou₧itφ <code>$_GET</code>, <code>$_POST</code> a dalÜφch polφ (nßsledujφcφ verze toto odstra≥uje hackem), bez ohledu na zapnutΘ <code>get_magic_quotes_gpc()</code>, co₧ zp∙sobuje v n∞kter²ch p°φpadech nefunkΦnost Φi nedeterminovatelnΘ chovßnφ celΘ aplikace.</p>
<p>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φ:</p>
<p>Osobn∞ mi trochu vadφ i nadm∞rnΘ pou₧itφ <code>if() ... else ... if() ... else</code> ve zdrojovΘm k≤du aplikace. Zde se mi zdß p°ehledn∞jÜφ pou₧itφ <code>switch() ... case</code> 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.</p>
<h4>Zhodnocenφ wtcSQLite</h4>
<p>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.</p>
<p>Aplikace wtcSQLite pou₧φvß novß objektovß rozÜφ°enφ PHP (<code>public static function</code>, <code>protected function</code>, <code>exception</code>), 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.</p>