<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Internet Solutions &#187; Code snippets</title>
	<atom:link href="http://www.internet-solutions.si/category/code-snippets/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.internet-solutions.si</link>
	<description>Web development na sto in en način</description>
	<lastBuildDate>Fri, 03 Sep 2010 13:26:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Kako iz nule inštalirati Apache 2.2.8,  MySQL 5.0.51 in PHP 5.2.5 na Ubuntu Dapper (6.06)</title>
		<link>http://www.internet-solutions.si/2008/01/28/kako-iz-nule-instalirati-apache-228-mysql-5051-in-php-525-na-ubuntu-dapper-606/</link>
		<comments>http://www.internet-solutions.si/2008/01/28/kako-iz-nule-instalirati-apache-228-mysql-5051-in-php-525-na-ubuntu-dapper-606/#comments</comments>
		<pubDate>Sun, 27 Jan 2008 22:26:56 +0000</pubDate>
		<dc:creator>alesl</dc:creator>
				<category><![CDATA[Code snippets]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Ubuntu Dapper]]></category>

		<guid isPermaLink="false">http://www.internet-solutions.si/2008/01/28/kako-iz-nule-instalirati-apache-228-mysql-5051-in-php-525-na-ubuntu-dapper-606/</guid>
		<description><![CDATA[Pred dobrim tednom sem si omislil VPS (virtual private server). Potreba po VPS-ju izhaja predvsem po želji izboljšati znanje Linux-a in administracije strežnikov.
Izbira ponudnika spletnega gostovanja je kar teška odločitev, saj jih je kot gob po dežju. Izbral sem Host Europe, prvensteveno zaradi nizke cene 20 EUR. 
V drugem planu pa me je pritegnila dodatna [...]]]></description>
			<content:encoded><![CDATA[<p>Pred dobrim tednom sem si omislil <a href="http://en.wikipedia.org/wiki/Virtual_private_server" rel="nofollow" class="liwikipedia">VPS</a> (virtual private server). Potreba po VPS-ju izhaja predvsem po želji izboljšati znanje <a href="http://en.wikipedia.org/wiki/Linux" rel="nofollow" class="liwikipedia">Linux</a>-a in administracije strežnikov.<br />
Izbira ponudnika spletnega gostovanja je kar teška odločitev, saj jih je kot gob po dežju. Izbral sem <a href="http://www.hosteurope.de/" class="liexternal">Host Europe</a>, prvensteveno zaradi nizke cene <a href="http://www.hosteurope.de/produkt/Virtual-Server-Linux-XL" class="liexternal">20 EUR</a>. <br />
V drugem planu pa me je pritegnila dodatna ponudba: Hardware, lastna izbira operacijskega sistema (Debian, Ubuntu,  SUSE).  Do sedaj sem imel opravka z <a href="http://www.debian.org/" class="liexternal">Debianom</a> in <a href="http://www.ubuntu.com/" class="liexternal">Ubuntujem</a>.<br />
Ker sem slednjega malenkost več uporabljal, sem se odločil za <strong>Ubuntu brez <a href="http://www.swsoft.com/plesk/" class="liexternal">Pleska</a></strong>. Prvotno veselje je malce popustilo, ko sem pogruntal da je distribucija Ubuntuja, ki je inštalirana na VPS-ju trenutno še verzija 6.06  iz junija 2006, kar dejansko pomeni da so <a href="http://packages.ubuntu.com/dapper/" class="liexternal">softverski paketi</a> že malce zastareli. Next time read <a href="http://www.hosteurope.de/faq/index.php?cpid=11861" class="liexternal">FAQ</a>! :)<br />
<span id="more-57"></span><br />
<br />
Za povprečnega uporabnika je to zadovoljivo, saj  lahko z orodjem <strong><a href="http://www.webopedia.com/TERM/A/apt.html" class="liexternal">apt</a></strong> inštaliramo:</p>
<ul>
<li>Apache: 2.0.55</li>
<li>PHP HP 4.4.2 in 5.1.2</li>
<li>MySQL 5.0.22</li>
</ul>
<p>Zadnji moji projekti močno bazirajo na knjižicah <strong>Zend Frameworka</strong>, ki pa rabijo verzijo  PHP-ja vsaj <a href="http://framework.zend.com/manual/en/requirements.html" class="liexternal">5.1.4</a>  (priporočljiva je uporaba 5.2.3 naprej). Kar pomeni, da bi se lahko pod nosom obrisal, da bi VPS uporabljal kot platformo za razvoj, z samo predpripravljenimi paketi seveda.</p>
<p>Ostali sta mi dve opciji:</p>
<ul>
<li>building in compiling iz nule</li>
<li>download in usposobitev <a href="http://www.apachefriends.org/en/xampp-linux.html" class="liexternal">XAMPP</a>-a<sup>[1]</sup></li>
</ul>
<p><strong>Predvsem zaradi varnosti</strong> in dejstvu, da imam rad vajeti vedno v rokah, sem se odločil, da bom inštaliral veliko trojico iz nule. Pljunil sem v roke, ter zavihal rokave &#8230;  ./configure, make in make install so bili dva dni moji hardcore spremljevalci. Ker je bil to moj prvi podvig inštalacije apache, mysql in php-ja iz source datotek, je bilo veselje ko je vse skupaj zalaufalo brez napak toliko večje.</p>
<p>Za vse, ki bi kdaj želeli  ubosti podoben podvig, pa sem pripravil nekaj skript, da vam bo stvar lažje šla od rok.</p>
<p><a href="http://www.internet-solutions.si/wp-content/uploads/2008/01/apache_mysql_php.zip" title='How to build Apache 2.2.8, MySQL 5.0.51, PHP 5.2.5 on Ubuntu Dapper (6.06)' class="lizip">How to Build Apache 2.2.8,  MySQL 5.0.51, PHP 5.2.5 on Ubuntu Dapper (6.06)</a></p>
<p>Poglejmo <a href="http://www.celavi.org/info.php" class="liexternal">konfiguracijo</a>:</p>
<ul>
<li>Apache/2.2.8 mod_ssl/2.2.8 OpenSSL/0.9.7m DAV/2</li>
<li>MySQL 5.0.51 z SSL podporo</li>
<li>PHP 5.2.5 v večino dodatkov ki jih rabim pri razvoju: cURL, OpenSSL, PDO MySQL, IMAP, &#8230;</li>
</ul>
<p>Na kakšne večje težave nisem naletel. OpenSSL verzija 0.9.8 se nikakor ni hotela skompajlirat z MySQL-om, tako da sem potem ubodel eno minor verzijo niže. Nekatere skripte (imap, PDO_MySQL) so v configuracijskih datotekah narobe referencirale nekatere knjižice. To se najlažje reši z simboličnim linkanjem na zahtevane knjižice.</p>
<p><strong>Še kratka navodila.</strong> Skripte, ki jih najdete v zip-u prebirajte in zaganjajate v tem vrstem redu<sup>[2]</sup>:</p>
<ul>
<li>preberi apache2-pre-install.txt</li>
<li>zaženi apache2-download.sh</li>
<li>zaženi apache2-install.sh</li>
<li>preberi apache2-post-install.txt</li>
<li>enako storitze še za mysql ter php</li>
</ul>
<p>Apache laufa pod svojim userjem, prav tako MySQL. Ne pozabite še nastavit root gesla za MySQL uporabnika. V primeru da se compiler ustavi  in ne boste vedeli, kaj je narobe, sem vam na voljo :)</p>
<p>Še vpogled v  eno od shell skript &#8211; <strong>apache2-download.sh</strong></p>
<pre class="brush: bash;">
#!/bin/sh

#
# Downloads and unpacks apache2 with dependencies
#
# @author Ales Loncar &lt;ales.loncar@internet-solutions.si&gt;
# @copyright 	Copyright (c) 2008 Internet Solutions
# @license GNU Public License
# @link http://www.internet-solutions.si
# @version 1.0

echo
echo apache2-download.sh
echo - This script downloads and unpacks all prerequisite packages
echo - Run this script before apache2-install.sh
echo
read -p  &quot;(Press any key to continue)&quot; temp;
echo

# Abort on any errors
set -e

#source directory (/usr/local/src)
SRCDIR=/usr/local/src

# Set DISTDIR to somewhere persistent, if you plan to muck around with this
# script and run it several times!
DISTDIR=/usr/local/dist

# Update version information here.
# Zlib
ZLIB=&quot;zlib-1.2.3&quot;
# OpenSSL
OPENSSL=&quot;openssl-0.9.7m&quot;
# libiconv
LIBICONV=&quot;libiconv-1.12&quot;
# apache2
HTTPD=&quot;httpd-2.2.8&quot;

cd ${DISTDIR}

# Get all the required packages
echo
echo --- Downloading all required packages ---
echo

# Zlib
wget -c http://www.zlib.net/${ZLIB}.tar.gz
# OpenSSL
wget -c http://www.openssl.org/source/${OPENSSL}.tar.gz
# libiconv
wget -c http://ftp.gnu.org/pub/gnu/libiconv/${LIBICONV}.tar.gz
# apache2
wget -c http://www.apache.si/httpd/${HTTPD}.tar.gz

echo
echo --- Unpacking downloaded archives. This process may take several minutes! ---
echo

cd ${SRCDIR}
# Unpack them all
# Zlib
echo Extracting ${ZLIB}...
tar xzf ${DISTDIR}/${ZLIB}.tar.gz &gt; /dev/null
echo Done.
# OpenSSL
echo Extracting ${OPENSSL}...
tar xzf ${DISTDIR}/${OPENSSL}.tar.gz &gt; /dev/null
echo Done.
# libiconv
echo Extracting ${LIBICONV}...
tar xzf ${DISTDIR}/${LIBICONV}.tar.gz &gt; /dev/null
echo Done.
# apache2
echo Extracting ${HTTPD}...
tar xzf ${DISTDIR}/${HTTPD}.tar.gz &gt; /dev/null
echo Done.

echo --------------------------------------------------
echo -- Done downloading and unpacking prerequisites --
echo --------------------------------------------------
</pre>
<p>
Happy blogging(coding)!</p>
<ol class="footnotes"><li id="footnote_0_57" class="footnote">Uporabo XAMPP-a odsvetujejo v produksijskem okolju, zaradi prešibke varnosti nekaterih procesov, ki laufajo brez gesel</li><li id="footnote_1_57" class="footnote">Za zagon shell skript rabite root privilegije. Ne pozabite jim nastavit execute pravic: chmod +x</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.internet-solutions.si/2008/01/28/kako-iz-nule-instalirati-apache-228-mysql-5051-in-php-525-na-ubuntu-dapper-606/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Zakaj obožujem Zend Framework?</title>
		<link>http://www.internet-solutions.si/2007/11/13/zakaj-obozujem-zend-framework/</link>
		<comments>http://www.internet-solutions.si/2007/11/13/zakaj-obozujem-zend-framework/#comments</comments>
		<pubDate>Tue, 13 Nov 2007 21:26:08 +0000</pubDate>
		<dc:creator>alesl</dc:creator>
				<category><![CDATA[Code snippets]]></category>
		<category><![CDATA[Modrüvanje]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.internet-solutions.si/2007/11/13/zakaj-obozujem-zend-framework/</guid>
		<description><![CDATA[A je to framework?
Pred kratkim sem web programerjem iz podjetja Creatoor, predaval o Zend Frameworku. Prva stvar ki jo najprej izpostavim, ko govorim o Zend Frameworku je ta, da za mene to ni &#8220;framework&#8221;, vsaj ne po tistem kar pravi definicija. To najprej povzroči zmedenost in nerazumevanje kaj sploh Zend Framework je. Za mene je [...]]]></description>
			<content:encoded><![CDATA[<p><strong>A je to framework?</strong><br />
Pred kratkim sem web programerjem iz podjetja <a href="http://www.creatoor.com/" class="liexternal">Creatoor</a>, predaval o <a href="http://framework.zend.com/" class="liexternal">Zend Frameworku</a>. Prva stvar ki jo najprej izpostavim, ko govorim o Zend Frameworku je ta, da za mene to ni &#8220;framework&#8221;, vsaj ne po tistem kar pravi <a href="http://en.wikipedia.org/wiki/Software_framework" rel="nofollow" class="liwikipedia">definicija</a>. To najprej povzroči zmedenost in nerazumevanje kaj sploh Zend Framework je. Za mene je to le &#8220;knjižica&#8221;<sup>[1]</sup> skript. Med množico modulov, lahko enostavno izberemo in uporabimo le tistega, ki ga rabimo. Čeprav so določeni moduli med sabo odvisni, se da ta lastnost v večini primerih povoziti.<sup>[2]</sup> Zadevi, ki sta mene najbolj pritegnili oziroma &#8220;prisilili&#8221; da sem upokojil lastne napisane knjižice sta:</p>
<ul>
<li><a href="http://framework.zend.com/community/contributors/" class="liexternal">ekipa sodelujočih</a> pri razvoju iz vrst <a href="http://www.zend.com/" class="liexternal">Zend-a</a>, <a href="http://www.ibm.com/" class="liexternal">IBM-a</a>, <a href="http://www.omniti.com/" class="liexternal">OmniTI</a>, &#8230;</li>
<li>kvaliteta in testiranje &#8211; čez 4.000 unit testov. Vse knjižice so testirane z uporabo <a href="http://www.phpunit.de/" class="liexternal">PHPUnit</a>.</li>
</ul>
<p><span id="more-44"></span><br />
<strong>MVC &#8211; Model View Controller</strong><br />
Velika večina &#8220;frameworkov&#8221; se vedno znova vrti okrog lastne implementacije <a href="http://en.wikipedia.org/wiki/Model-view-controller" rel="nofollow" class="liwikipedia">MVC</a>-ja. Če želite uiti iz tega začaranega kroga, je boljše, da tak framework me uporabite. Seveda tudi Zend Framework vključuje module, ki vam pomagajo pri postavitvi MVC-ja in načinov kako to dosežemo je kar nekaj. Z malce programerskega znanja boste lahko vključili že obstoječe &#8220;third-party&#8221; knjižice kot so <a href="http://www.swiftmailer.org/" class="liexternal">SwiftMailer</a>, <a href="http://www.smarty.net/" class="liexternal">Smarty</a>, <a href="http://propel.phpdb.org/trac/" class="liexternal">Propel</a>, <a href="http://adodb.sourceforge.net/" class="liexternal">ADOdb</a>, &#8230; ali pa svoje knjižice zamenjali z Zendovimi:</p>
<ul>
<li>za delo z sejami &#8211; <a href="http://framework.zend.com/manual/en/zend.session.html" class="liexternal">Zend_Session</a></li>
<li>za keširanje podatkov, objektov, spletnih strani &#8211; <a href="http://framework.zend.com/manual/en/zend.cache.html" class="liexternal">Zend_Cache</a></li>
<li>&#8230;</li>
</ul>
<p><strong>A je za začetnike?</strong><br />
Možno, je da si bom s to izjavo nakopal kakšnega &#8220;sovražnika&#8221;, ampak Zend Framewok je profesionalen izdelek in ni ravno namenjen začetnikom, ki se šele spoznavajo s PHP-jem. Čeprav je glavna filozofija in moto frameworka &#8220;Extreme simplicity&#8221;, so določeni pogledi MVC-ja in ostalih modulov precej bolj kompleksni od ostalih frameworkov (<a href="http://codeigniter.com/" class="liexternal">CodeIgniter</a>, <a href="http://www.cakephp.org/" class="liexternal">CakePHP</a>, &#8230;). Če niste ravno naklonjeni, da občasno več ur namenite brskanju po izvorni kodi ali pa vam je uporaba <a href="http://en.wikipedia.org/wiki/API" rel="nofollow" class="liwikipedia">API</a>-ja tuja, vam svetujem da si omislite kaj drugega!</p>
<p><strong>Primer uporabe Zend Framework knjižic</strong><br />
Ostane nam še demo primer uporabe. Test case je vzet iz vsakdanjika. Preko URL-ja preberemo parameter id, če id ni nastavljen ali pa ni tipa int ga nastavimo na nulo. Če slučajno zaznamo metodo POST ustavimo skripto.</p>
<p><em>Stari način</em>:</p>
<pre class="brush: php;">
if (isset($_GET['id']) and $_GET['id'] != &quot;&quot;) {
	$id = (int) $_GET['id'];
} else {
	$id = 0;
}

if (strtolower($_SERVER['REQUEST_METHOD']) == 'post')
	die('POST detected');
</pre>
<p><em>Zend Framework</em>:</p>
<pre class="brush: php;">
/** Zend/Validate.php */
require_once 'Zend/Validate.php';

/** Zend/Controller/Request/Http.php */
require_once 'Zend/Controller/Request/Http.php';

/** request object */
$request = new Zend_Controller_Request_Http();

/** id */
$id = ( Zend_Validate::is($request-&gt;getQuery('id'), 'Int') ) ? (int) $request-&gt;getQuery('id') : 0;

if ($request-&gt;isPost())
	die('POST detected');
</pre>
<p>
Kakor vam drago :)</p>
<p>Happy blogging(coding)! </p>
<ol class="footnotes"><li id="footnote_0_44" class="footnote">Library</li><li id="footnote_1_44" class="footnote">overriding, subclassing</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.internet-solutions.si/2007/11/13/zakaj-obozujem-zend-framework/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>PHP tanač: pretvorba obvestil in opozoril v izjeme</title>
		<link>http://www.internet-solutions.si/2007/10/10/php-tanac-pretvorba-obvestil-in-opozoril-v-izjeme/</link>
		<comments>http://www.internet-solutions.si/2007/10/10/php-tanac-pretvorba-obvestil-in-opozoril-v-izjeme/#comments</comments>
		<pubDate>Wed, 10 Oct 2007 20:00:05 +0000</pubDate>
		<dc:creator>alesl</dc:creator>
				<category><![CDATA[Code snippets]]></category>
		<category><![CDATA[Tanači]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php exceptions]]></category>
		<category><![CDATA[php warnings]]></category>

		<guid isPermaLink="false">http://www.internet-solutions.si/2007/10/10/php-tanac-pretvorba-obvestil-in-opozoril-v-izjeme/</guid>
		<description><![CDATA[Obvestila, opozorila !?
Prav čudno zveni ta naslov v prevodu ;) Bom kar po domače povedal: pretvorba PHP &#8220;notices&#8221; in &#8220;warnings&#8221; v &#8220;Exceptions&#8221;. Najverjetneje je sedaj slika malce bolj jasna. Po planu nisem imel namena objavit tega prispevka, ker pa ravno delam &#8220;skeleton&#8221; za eno aplikacijo sem izkoristil priložnost. Namig o konvertiranju opozoril in obvestil sem [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Obvestila, opozorila !?</strong><br />
Prav čudno zveni ta naslov v prevodu ;) Bom kar po domače povedal: pretvorba PHP &#8220;notices&#8221; in &#8220;warnings&#8221; v &#8220;Exceptions&#8221;. Najverjetneje je sedaj slika malce bolj jasna. Po planu nisem imel namena objavit tega prispevka, ker pa ravno delam &#8220;skeleton&#8221; za eno aplikacijo sem izkoristil priložnost. Namig o konvertiranju opozoril in obvestil sem zasledil na <a href="http://www.alexatnet.com/node/23" class="liexternal">netu</a> že kar nekaj časa nazaj. Pred dnevi  sem med arhiviranje starih mailov naletel na &#8220;reminder&#8221; in sem na brzino pokukal na omenjeni post. Dobil sem idejo, da lahko zadevo uporabim s svojo <a href="http://en.wikipedia.org/wiki/Debug" rel="nofollow" class="liwikipedia">&#8220;debug&#8221;</a> funkcijo za &#8220;handlanje&#8221; <a href="http://www.php.net/manual/en/language.exceptions.php" class="liexternal">izjem &#8211; Exceptions</a>.<br />
<span id="more-4"></span><br />
Prednastavljen error reporting v PHP 4 in PHP 5 je E_ALL &amp; ~E_NOTICE, kar pomeni da ta nastavitev med izvajanjem ne prikazuje obvestil. Pametno je, da prikazovanje obvestil pri razvoju aplikacij vključimo.<br />
PHP 5 prinaša nov error level E_STRICT. Ker E_STRICT ni vključen v E_ALL error level, ga moremo vključiti eksplicitno. Vključitev E_STRICT levela pri razvoju prinaša nekaj koristi. PHP bo izpisoval run-time obvestila in sugestiral na potrebne popravke v kodi.  Z upoštevanjem obvestil si predvsem zagotovimo kompatibilnost kode za prihajajoče verzije PHP-ja.<br />
V PHP 5 programiram že kar nekaj časa. Držim se &#8220;strict coding standarda&#8221;, ki ga predpisuje <a href="http://framework.zend.com/manual/en/coding-standard.html" class="liexternal">Zend Framework</a><sup>[1]</sup>.  Tako pri vseh aplikacijah nastavim error reporting level na E_ALL|E_STRICT.</p>
<pre class="brush: php;">
error_reporting(E_ALL|E_STRICT);
</pre>
<p></p>
<pre class="brush: php;">
echo $x;
</pre>
<p>S tem error reporting levelom vsaka nedefinirana spremenljivka<sup>[2]</sup> sproži obvestilo<sup>[3]</sup><br />
<a href="http://www.internet-solutions.si/wp-content/uploads/2007/10/notice.png" rel="lightbox" title='PHP Notice - obvestilo'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/10/notice.thumbnail.png' alt='PHP Notice - obvestilo' /></a></p>
<pre class="brush: php;">
/**
 * Foo Bar application
 *
 * @category	Foo
 * @package    	Foo_Static
 * @copyright  	Copyright (c) 2007 Ales Loncar
 * @license 	GNU Public License
 * @link    http://www.internet-solutions.si
 */
class Foo
{
    /**
     *  Bar method
     */
    public function Bar()
    {
        // static method - not properly defined
    }
}

$fooBar = Foo::Bar();
</pre>
<p>Neupoštevanje standardov prav tako<sup>[4]</sup><br />
<a href="http://www.internet-solutions.si/wp-content/uploads/2007/10/strict_standards.png" rel="lightbox" title='PHP Strict Standards'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/10/strict_standards.thumbnail.png' alt='PHP Strict Standards' /></a></p>
<p><strong>try/catch</strong><br />
PHP 5 uporablja podoben model izjem &#8211; &#8220;Exceptions&#8221; kot ostali programski jeziki. Da ne bom preveč modruval, vse je lepo opisano v PHP &#8220;<a href="http://www.php.net/manual/en/" class="liexternal">manualu</a>&#8220;. Omeniti velja le, da ko se zgodi izjema &#8211; &#8220;exception is thrown&#8221;, se koda ki sledi ne izvede, PHP bo poiskusil najti prvi ustrezen block &#8220;catch&#8221;. V primeru da izjema ni ujeta &#8211; &#8220;catch&#8221;, PHP izvede Fatal Error z sporočilom &#8220;Uncaught Exception &#8230;&#8221;<sup>[5]</sup><br />
Veselo na delo, glavna ideja je taka:</p>
<ul>
<li>definiramo error handling funkcijo, ki vrže izjemo – exception z ustreznim sporočilom in kodo<sup>[6]</sup></li>
<li>definiramo exception handling funkcijo s katero lovimo &#8211; &#8220;catch&#8221; izjeme, tudi tiste, ki niso v bloku try/catch</li>
<li>stestiramo error/exception handler na nekaj primerih</li>
</ul>
<p><strong>set_error_handler</strong><br />
Nastavimo lastno funkcijo za rokovanje z napakami v skripti.</p>
<pre class="brush: php;">
/**
 * Global Error Handler
 *
 * Global error handler class
 *
 * @author		Ales Loncar
 * @license 	GNU Public License
 * @category	App
 * @package    	App_Error
 * @copyright 	Copyright (c) 2007 Ales Loncar
 */
class General_Error_Handler
{
/**
 * Global error handler.
 *
 * This should not be called by anything - only for uncaught errors.
 *
 *
 */
	public function globalErrorHandler($errno, $errstr, $errfile, $errline)
	{
		throw new Exception($errstr, $errno);
	}
}

/** set ErrorHannlder */
set_error_handler(array(new General_Error_Handler(), 'globalErrorHandler'));
</pre>
<p><strong>set_exception_handler</strong><br />
Nastavimo privzeto funkcijo za rokovanje z izjemami. S tem ujamemo izjeme katere nismo ujeli v blok try/catch. Izvajanje se ustavi takoj ko se izvede exception_handler.</p>
<pre class="brush: php;">
/**
 * Global Exception Handler
 *
 * Global exception handler class
 *
 * @author		Ales Loncar
 * @license 	GNU Public License
 * @category	App
 * @package    	App_Error
 * @copyright 	Copyright (c) 2007 Ales Loncar
 */
class General_Exception_Handler
 {
 	/**
	 * Global exception handler.
	 *
	 * This should not be called by anything - only for uncaught exceptions.
	 *
	 */
	public function globalExceptionHandler(Exception $exception)
	{
		$this-&gt;_throwException($exception);
	}

	/**
	 * Nice debugging info for Exception
	 *
	 * @param Exception $e
	 */
	private function _throwException($e)
   	{
		$o = create_function('$in','echo htmlspecialchars($in);');
                // celotno funkcijo najdete v zipu
               // totalno sjebe parser saj so v njej php tagi
        }
}

/** set Exception Handler */
set_exception_handler(array(new General_Exception_Handler(), 'globalExceptionHandler'));
</pre>
<p>Sedaj ko imamo oba handlerja, se bomo malce poigrali.<br />
Primer uporabe izjeme v bloku try/catch</p>
<pre class="brush: php;">
/** error reporting */
error_reporting(E_ALL|E_STRICT);

/** debug is true for development */
define('DEBUG', true);

/** let's try some of this stuff */
try {
    $x = 0;
    if (empty($x)) {
        throw new Exception('x is zero', 0);
    }
} catch(Exception $e) {
    if (DEBUG) {
        throw $e;
    } else {
        if ($e-&gt;getCode() == 0) {
            // notify about exception
			$errorCode	  = $e-&gt;getCode();
                        $errorMessage 	= $e-&gt;getMessage();
			// send mail or write log
			// ...
			echo &quot;&lt;b&gt;errorCode:&lt;/b&gt; $errorCode&lt;br /&gt;&quot;;
			echo &quot;&lt;b&gt;errorMessage:&lt;/b&gt; $errorMessage&lt;br /&gt;&quot;;
			echo &quot;&lt;br /&gt;&quot;;
        }
    }
}

// continue Execution
echo '&lt;b&gt;continue:&lt;/b&gt; Foo bar';

//$x = $y;
</pre>
<p>Mali komentarček:<br />
Celotna koda je v bloku &#8220;try/catch&#8221;. Če ne bi definirali exception handlerja in ima konstanta DEBUG vrednost true<sup>[7]</sup> bo PHP navrgel <a href="http://www.internet-solutions.si/wp-content/uploads/2007/10/exception_thrown.png" rel="lightbox" title='Fatal error: Uncaught exception ‘Exception’ with message ‘x is zero’' class="liexternal">Fatal Error</a><br />
Z vključenim exception handlerjem se izvede metoda _throwException() z zelo uporabnim &#8220;Stacktracom&#8221;, celotnim naborom &#8220;Request&#8221; metod  in &#8220;Response&#8221; headerjem. <strong>Izvajanje skripte se prekine</strong>.<br />
<a href="http://www.internet-solutions.si/wp-content/uploads/2007/10/exception_development.png" rel="lightbox" title='Exception making GET request to /test/'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/10/exception_development.thumbnail.png' alt='Exception making GET request to /test/' /></a><br />
Npr. da aplikacijo objavimo in nastavimo DEBUG vrednost na false<sup>[8]</sup>. Sedaj v primeru izjeme le te ne vržemo &#8211; &#8220;thrown&#8221;, ampak pogledamo do kakšne napake je prišlo ter obvestimo skrbnika aplikacije oziroma zapišemo vsebino izjeme v log.<sup>[9]</sup>. <strong>Skripta se izvaja normalno naprej.</strong><br />
<a href="http://www.internet-solutions.si/wp-content/uploads/2007/10/exception_production.png" rel="lightbox" title='Konstanta DEBUG je nastavljena na true. Skripta se izvede normalno.'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/10/exception_production.png' alt='Konstanta DEBUG je nastavljena na true. Skripta se izvede normalno.' /></a><br />
Če podamo še primer error handlerja, ki pretvori obvestila in opozorila v izjeme. Izven bloka &#8220;try/catch&#8221; naredimo eno amatersko:</p>
<pre class="brush: php;">
$x = $y;
</pre>
<p>Ker imamo definiran exception handler se bo koda ustavila na mestu, kjer PHP izpiše obvestilo o nedefinirani spremenljivki.<br />
<a href="http://www.internet-solutions.si/wp-content/uploads/2007/10/exception_caught_outside.png" rel="lightbox" title='Exception making … 8 Undefined variable: y'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/10/exception_caught_outside.thumbnail.png' alt='Exception making … 8 Undefined variable: y' /></a><br />
Poglejmo še samo, kaj se zgodi takrat če ne bi imeli definiran error handler. Skripta se izvede naprej, PHP pa izpiše obvestilo &#8220;Notice: Undefined variable: y in &#8230;&#8221; saj imamo nastavljen error_reporting na E_ALL|E_STRICT.<br />
<a href="http://www.internet-solutions.si/wp-content/uploads/2007/10/notice_variable.png" rel="lightbox" title='Notice: Undefined variable: y in …'><img src='http://www.internet-solutions.si/wp-content/uploads/2007/10/notice_variable.png' alt='Notice: Undefined variable: y in …' /></a></p>
<p>Vse skupaj sem zapakiral in lahko po mili volji &#8220;dol vlačite&#8221;: <a href="http://www.internet-solutions.si/wp-content/uploads/2007/10/error_exception_test.zip" title='Error &amp; Exception Handler' class="lizip">Error &amp; Exception Handler</a></p>
<p>Happy blogging(coding)!</p>
<ol class="footnotes"><li id="footnote_0_4" class="footnote">o samem frameworku in kupu uporabnih knjižic enkrat v prihodnosti</li><li id="footnote_1_4" class="footnote">kot primer</li><li id="footnote_2_4" class="footnote">Za ta čuden izpis je kriv <a href="http://www.xdebug.org/" class="liexternal">Xdebug</a> &#8211; PHP extension for debugging and profiling. Otom potom :)</li><li id="footnote_3_4" class="footnote">kot primer</li><li id="footnote_4_4" class="footnote">le v primeru da nimamo definiranega &#8220;custom handlerja&#8221; s funkcijo set_exception_handler()</li><li id="footnote_5_4" class="footnote">tukaj dejansko pretvorimo obvestila in opozorila v izjeme</li><li id="footnote_6_4" class="footnote">development</li><li id="footnote_7_4" class="footnote">production</li><li id="footnote_8_4" class="footnote">z karseda večimi informacijami &#8211; stacktrace &#8230;</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.internet-solutions.si/2007/10/10/php-tanac-pretvorba-obvestil-in-opozoril-v-izjeme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
