<?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>Natodia blog</title>
	<atom:link href="http://blog.natodia.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.natodia.net</link>
	<description>Dev.</description>
	<lastBuildDate>Sat, 16 Apr 2011 18:36:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Całkowanie numeryczne &#8211; metoda Monte Carlo</title>
		<link>http://blog.natodia.net/calkowanie-numeryczne-metoda-monte-carlo/</link>
		<comments>http://blog.natodia.net/calkowanie-numeryczne-metoda-monte-carlo/#comments</comments>
		<pubDate>Sat, 16 Apr 2011 18:36:18 +0000</pubDate>
		<dc:creator>sznurek</dc:creator>
				<category><![CDATA[Metody numeryczne]]></category>
		<category><![CDATA[Programowanie]]></category>

		<guid isPermaLink="false">http://blog.natodia.net/?p=153</guid>
		<description><![CDATA[Każdy, kto spotkał się z całkami na pewno zna kilka sposobów ich liczenia. W najprostszych przypadkach możemy wyznaczyć całkę nieoznaczoną z danej funkcji analitycznie. Co z trudniejszymi przypadkami? Z nimi możemy sobie poradzić o ile chcemy znać wartość całki oznaczonej (&#8230;)</p><p><a href="http://blog.natodia.net/calkowanie-numeryczne-metoda-monte-carlo/">Przeczytaj całość &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>
Każdy, kto spotkał się z <a href="http://pl.wikipedia.org/wiki/Ca%C5%82ka">całkami</a> na pewno zna kilka sposobów ich liczenia. W najprostszych przypadkach możemy wyznaczyć całkę nieoznaczoną z danej funkcji analitycznie. Co z trudniejszymi przypadkami? Z nimi możemy sobie poradzić o ile chcemy znać wartość całki oznaczonej z pewną skończoną dokładnością.
</p>
<p><span id="more-153"></span></p>
<p>
Jest kilka niezwykle popularnych metod &#8211; metoda prostokątów (dzielimy całkowany przedział na n mniejszych podprzedziałów i przybliżamy ich pole prostokątem), metoda trapezów (jak w metodzie poprzedniej tylko tym razem przybliżamy pole trapezem), metoda parabol (to już chyba jasne?). Mają one kilka wspólnych cech: są deterministyczne, teoretycznie możemy przy ich pomocy uzyskać wartość całki z dowolną dokładnością (ogranicza nas &#8222;tylko&#8221; czas i szybkość procesora). Gdy czas jest dla nas kluczowy (i nie mamy go za dużo) a nasza funkcja jest wielowymiarowa, możemy spróbować szczęścia używając niedeterministycznej metody całkowania numerycznego &#8211; <a href="http://en.wikipedia.org/wiki/Monte_Carlo_integration">metody Monte Carlo</a>.
</p>
<p>
Aby ją zobrazować posłużę się przykładem zaczerpniętym z Wikipedii. Załóżmy, że chcemy wyznaczyć przybliżoną wartość liczby pi. Możemy wymyślić sobie następujący eksperyment: weźmy kwadrat o boku o znanej długości i wpiszmy w niego koło.
</p>
<p><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/MonteCarloIntegrationCircle.png/220px-MonteCarloIntegrationCircle.png" /></p>
<p>
Teraz możemy losować punkty w środku kwadratu i zliczać te, które &#8222;trafiły&#8221; w koło. Sprawdzamy to licząc odległość punktu od środka kwadratu i sprawdzając, czy jest ona mniejsza (bądź równa) promieniowi naszego koła. Oznaczmy liczbę wylosowanych punktów jako n i liczbę punktów znajdujących się w kole jako t. Możemy policzyć przybliżony stosunek pola koła do pola kwadratu: k = t / n. Wiedząc, że k = pi * r<sup>2</sup> / 4r<sup>2</sup> wyznaczamy pi. Możemy zwiększać dokładność naszego szacowania zwiększając liczbę losowanych punktów.
</p>
<p>
Mamy już właściwie wszystkie niezbędne informacje aby liczyć wartości całek oznaczonych metodą Monte Carlo. Załóżmy, że chcemy policzyć całkę oznaczoną na przedziale &lt;a, b&gt; z funkcji f(x). Na początku losujemy n wartości z przedziału całkowania (x<sub>1</sub>, x<sub>2</sub>, &#8230;, x<sub>i</sub>, &#8230;, x<sub>n</sub>) i liczymy średnią s z wartości f(x<sub>i</sub>). Wartość całki wynosi c = s * (b &#8211; a).
</p>
<p>
Skąd bierze się powyższy wzór? Intuicja jest następująca: licząc naszą średnią s wyznaczamy średnią &#8222;wysokość&#8221; funkcji. Znając ją liczymy pole prostokąta o bokach (b &#8211; a) oraz s.
</p>
<p>
Implementacja metody nie jest trudna. Przygotowałem <a href="http://sznurek.natodia.net/integral.c">przykładową implementację w języku C</a>. Zachęcam do zapoznania się z kodem. Porównuje on metody prostokątów, trapezów oraz Monte Carlo. Jak można zauważyć, w przypadku jednowymiarowym metody deterministyczne są szybsze i dokładniejsze.
</p>
<p>
Niniejszy wpis jest tylko krótkim wstępem do metody Monte Carlo, która jest wykorzystywana do granic możliwości przez fizyków (przykładem jest <a href="http://wng.ift.uni.wroc.pl/">Wrocławska Grupa Neutrinowa</a>, która używając tej metody symuluje oddziaływanie neutrin z materią). W następnym wpisie pokażę przykładowe zastosowanie tej metody do konkretnego problemu fizycznego.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.natodia.net/calkowanie-numeryczne-metoda-monte-carlo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Budowa prostego MVC w PHP (&gt;5.3), cz. 2 &#8211; warstwa Modelu</title>
		<link>http://blog.natodia.net/budowa-prostego-mvc-w-php-5-3-cz-2-warstwa-modelu/</link>
		<comments>http://blog.natodia.net/budowa-prostego-mvc-w-php-5-3-cz-2-warstwa-modelu/#comments</comments>
		<pubDate>Wed, 23 Mar 2011 16:46:24 +0000</pubDate>
		<dc:creator>Killavus</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Sieci]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[przydatne]]></category>

		<guid isPermaLink="false">http://blog.natodia.net/?p=143</guid>
		<description><![CDATA[W ostatnim artykule przybliżyłem trochę na czym polega model MVC, dlaczego jest przydatny i jest pożądanym wzorcem projektowym w wielu zastosowaniach. Django, czy Ruby on Rails używają tego modelu z bardzo dobrym skutkiem &#8211; znacząco zmniejsza to czas projektowania aplikacji (&#8230;)</p><p><a href="http://blog.natodia.net/budowa-prostego-mvc-w-php-5-3-cz-2-warstwa-modelu/">Przeczytaj całość &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>W ostatnim artykule przybliżyłem trochę na czym polega model MVC, dlaczego jest przydatny i jest pożądanym wzorcem projektowym w wielu zastosowaniach. Django, czy Ruby on Rails używają tego modelu z bardzo dobrym skutkiem &#8211; znacząco zmniejsza to czas projektowania aplikacji sieciowej. Pozwala to np. stworzyć bloga w 15 minut, wraz z pełnym panelem administracyjnym właśnie w RoR.</p>
<p>Dzisiaj zajmiemy się <strong>warstwą Modelu</strong> &#8211; niewątpliwie najbardziej skomplikowaną częścią tego modelu. Efektywne zaimplementowanie tej warstwy to tak naprawdę najważniejsza część &#8211; reszta jest dość prosta do napisania i tam raczej cudów nie ma. Stworzymy klasę abstrakcyjną, która pozwoli na rozszerzanie modeli w nieskończoność, korzystając z tego samego interfejsu. W następnej części zaimplementujemy także klasę potomną od naszego abstrakcyjnego modelu, która będzie pobierała dane z baz danych. Wykorzystamy w tym celu PDO, co będzie doskonałym ćwiczeniem w programowaniu z użyciem tego zestawu klas.</p>
<p><span id="more-143"></span></p>
<p>Nasz Model, z racji tego, że ma być prosty, nie będzie uwzględniał takich rzeczy jak połączenia między danymi, czy też szukanie po warunkach &#8211; przyjemność implementacji tych funkcji pozostawiam czytelnikowi. W razie problemów chętnie posłużę radą.</p>
<h2>Własności naszych danych:</h2>
<p>Aby efektywnie i prosto zaimplementować nasz Model, dane będą spełniały pewne właśności, które są dość powszechne i nie będą specjalnie zaskakujące. Prawdę mówiąc, wszystkie te własności spełnia każda dobrze stworzona baza danych. Przede wszystkim, <strong>każdy zestaw danych będzie jednoznacznie reprezentowany przez identyfikator liczbowy (ID)</strong>. Jest to ważne, ponieważ musimy mieć jakąś szansę na dostanie się do naszych danych i musi to być szansa niezależna od ich typu. ID jest najprostszym sposobem. Drugą własnością będzie to, że <strong>struktura danych będzie znana przed jakąkolwiek manipulacją nimi</strong>. Jest to dość oczywiste, gdyż musimy wiedzieć tak naprawdę co pobieramy. Teoretycznie możliwe jest także odrzucenie tej własności &#8211; w przypadku pobierania np. z pliku tekstowego w formacie:</p>

<div class="wp_syntax"><div class="code"><pre class="batch" style="font-family:monospace;">id = 2
foo = 'bar'
p = 12
x = 19.282</pre></div></div>

<p>Własność nie musi być spełniona, gdyż mamy podane etykiety danych. My jednak założymy, że strukturę danych znamy &#8211; ułatwi nam to w przyszłości np. używanie naszego modelu z bazą danych.</p>
<h2>Co chcemy zrobić z danymi?:</h2>
<p>Pytanie wydaje się trywialne, ale warto się nad nim zastanowić. To, co nasuwa się samo to oczywiście możliwość <strong>pobierania danych z naszego źródła</strong>. Po to w końcu tworzymy nasz model, prawda? Ale nie tylko. Przydałaby się także <strong>możliwość manipulacji danymi</strong> już pobranymi, a także <strong>zapis zmanipulowanych danych spowrotem do źródła danych</strong>, <strong>tworzenie nowych danych</strong> oraz <strong>usuwanie danych ze źródła</strong>. To wszystko będzie realizowane właśnie przez nas model. Warto mieć tą wiedzę jeszcze przed pisaniem czegokolwiek, pozwoli to nam na głębsze przemyślenie struktury kodu. Ogólnie, przed napisaniem czegokolwiek polecam najpierw rozplanować sobie program na kartce &#8211; piszemy wtedy kod zdecydowanie lepszy, bardziej przemyślany i przez to krótszy.</p>
<h2>Abstrakcyjny model klasy:</h2>
<p>Skoro już wiemy, czego pragniemy od naszej klasy, możemy zacząć ją powoli tworzyć. Wiemy, że każdy rekord jest reprezentowany przez ID. Skoro chcemy ładować dane, stwórzmy metodę <strong>load</strong>, przyjmując nasz <strong>ID</strong> jako argument. I tak, kod:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$model</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Załaduje nam rekord o ID równym 1 ze źródła danych. Nasze dane będziemy przechowywać w tablicy $data. Pozwoli nam to na prostą implementację manipulowania danymi (wprost) oraz pobierania ich. Aby korzystać z wygodnej składni w stylu:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> <span style="color: #000088;">$model</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">foo</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$model</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">foo</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'bar'</span><span style="color: #339933;">;</span></pre></div></div>

<p>Skorzystamy z <a href="http://www.php.net/manual/en/language.oop5.magic.php">magicznych metod PHP</a>: funkcji <strong>__get($key)</strong> oraz <strong>__set($key,$data)</strong>. Korzystając z tego, że mamy dane w tablicy, implementacja tych metod jest trywialna:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __get<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">isSet</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">data</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">data</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __set<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #339933;">,</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">data</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$value</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Oczywiście, nie uwzględniamy tutaj np. walidacji danych. Musimy to uwzględnić sami, nim jeszcze przypiszemy dane do modelu. Oczywiście, są też inne metody rozwiązania tego problemu, nie opiszę ich jednak w tym artykule z dwóch powodów &#8211; po pierwsze, model musi pozostać prosty, a po drugie, nie chce mi się.</p>
<p>Oczywiście, musimy mieć także strukturę daną w momencie tworzenia obiektu. Stwórzmy więc statyczną tablicę $structure, przechowującą naszą strukturę danych oraz structure(), metodę uruchamianą w konstruktorze, która będzie zwracała naszą strukturę danych do tablicy. Aby zapewnić także możliwość wstawiania nowych rekordów do źródła danych, stwórzmy także wartość logiczną $virtual. Dane będą <em>wirtualne</em>, gdy nie będą istniały w źródle danych &#8211; pojawią się tam dopiero, gdy je zapiszemy. Praktyczna implementacja takiego konstruktora może wyglądać następująco:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$id</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">NULL</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	istatic<span style="color: #339933;">::</span><span style="color: #000088;">$structure</span> <span style="color: #339933;">=</span> static<span style="color: #339933;">::</span><span style="color: #004000;">structure</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">virtual</span> <span style="color: #339933;">=</span> <span style="color: #990000;">is_null</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span>? <span style="color: #009900; font-weight: bold;">TRUE</span> <span style="color: #339933;">:</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">virtual</span> <span style="color: #009900;">&#41;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Jak widać, w momencie gdy tworzymy model, ładujemy statyczną metodę structure(), która zwraca nam tą strukturę. To bardzo praktyczne &#8211; w dzieciach tej klasy wystarczy jedynie nadpisać tą metodę.</p>
<h2>Podsumowanie:</h2>
<p>Reszta metod jest metodami abstakcyjnymi i nie będziemy się nimi zajmować. Poniżej zamieszczam gotową klasę, która będzie stanowić interfejs naszych modeli. Jak widać, nie jest to takie trudne. Jakiekolwiek funkcje, które są zależne od typu danych powinny być nadpisywane przez klasy potomne.</p>
<h3>Przykładowa klasa AbstractModel.php:</h3>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
abstract <span style="color: #000000; font-weight: bold;">class</span> AbstractModel <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">protected</span> static <span style="color: #000088;">$structure</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$data</span><span style="color: #339933;">,</span> <span style="color: #000088;">$virtual</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __get<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">isSet</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">data</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">data</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __set<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #339933;">,</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">data</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$value</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$id</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">NULL</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">isSet</span><span style="color: #009900;">&#40;</span>static<span style="color: #339933;">::</span><span style="color: #000088;">$structure</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> static<span style="color: #339933;">::</span><span style="color: #000088;">$structure</span> <span style="color: #339933;">=</span> static<span style="color: #339933;">::</span><span style="color: #004000;">structure</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">virtual</span> <span style="color: #339933;">=</span> <span style="color: #990000;">is_null</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span>? <span style="color: #009900; font-weight: bold;">TRUE</span> <span style="color: #339933;">:</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">virtual</span> <span style="color: #009900;">&#41;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	abstract <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> save<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$id</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">NULL</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	abstract <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> delete<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	abstract <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> load<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$id</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	abstract static <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> structure<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>To wszystko na dziś. Mam nadzieję, że poradnik będzie przydatny!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.natodia.net/budowa-prostego-mvc-w-php-5-3-cz-2-warstwa-modelu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Standardowe narzędzia PHP do filtrowania danych</title>
		<link>http://blog.natodia.net/standardowe-narzedzia-php-do-filtrowania-danych/</link>
		<comments>http://blog.natodia.net/standardowe-narzedzia-php-do-filtrowania-danych/#comments</comments>
		<pubDate>Fri, 18 Feb 2011 22:37:36 +0000</pubDate>
		<dc:creator>Killavus</dc:creator>
				<category><![CDATA[Narzędzia]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[narzędzia]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[przydatne]]></category>
		<category><![CDATA[walidacja]]></category>

		<guid isPermaLink="false">http://blog.natodia.net/?p=140</guid>
		<description><![CDATA[Filtrowanie danych to jedna z najważniejszych i często pomijanych przez początkujących web developerów aspektów budowania sprawnej aplikacji sieciowej. W dzisiejszych czasach, gdy posiadamy tak potężne narzędzia jak PDO (artykuł) często walidacja danych przychodzących od użytkownika uchodzi nam płazem. Niestety, nie (&#8230;)</p><p><a href="http://blog.natodia.net/standardowe-narzedzia-php-do-filtrowania-danych/">Przeczytaj całość &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Filtrowanie danych to jedna z najważniejszych i często pomijanych przez początkujących web developerów aspektów budowania sprawnej aplikacji sieciowej. W dzisiejszych czasach, gdy posiadamy tak potężne narzędzia jak PDO (<a href="http://blog.natodia.net/pdo-czyli-zabawa-z-php-i-baza-danych-obiektowo/">artykuł</a>) często walidacja danych przychodzących od użytkownika uchodzi nam płazem. Niestety, nie zawsze. Ataki XSS (Cross Site Scripting) potrafią być naprawdę niebezpieczne i sprawić, że zaufanie użytkowników do naszej strony spadnie dramatycznie.</p>
<p>Na przestrzeni wieków (brzmi dumnie) programiści sieciowi różnie radzili sobie z tym problemem. Czy to za pomocą <a href="http://pl.php.net/manual/pl/function.preg-match.php">wyrażeń regularnych</a>, czy za pomocą <a href="http://pl.php.net/manual/pl/function.strip-tags.php">wbudowanych</a> <a href="http://pl.php.net/manual/pl/function.htmlentities.php">w</a> <a href="http://pl.php.net/manual/pl/function.mysql-escape-string.php">język</a> funkcji niekoniecznie do tego służących. Od PHP 5.2 istnieją jednak dedykowane rozwiązania do radzenia sobie z tym problemem i o nich opowiemy w tym artykule.<br />
<span id="more-140"></span></p>
<h2>Dlaczego to jest fajne?</h2>
<p>Rodzina funkcji filter_* jest bardzo ciekawym narzędziem i jest ciekawa z kilku powodów. Przede wszystkim, posiada dość bogatą ofertę filtrów, które możemy zastosować. Działa także dwojako &#8211; pozwala na <strong>weryfikację</strong> danych jak również ich <strong>przetworzenie</strong> (<em>sanitizing</em>) do obowiązującego formatu. Wprowadza to pewną kulturę kodu &#8211; zamiast używać konstrukcji w stylu:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$foo</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strip_tags</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$foo</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Używamy wywołania funkcji, która automagicznie zamienia nam to co w zmiennej na przetworzony odpowiednik.</p>
<h2>No ok, ale o czym mowa?</h2>
<p>Sprawa jest dość prosta i spowadza się do kilku prostych funkcji, których używamy w naszej aplikacji. Są to, kolejno: <strong>filter_input</strong>, <strong>filter_val</strong>, <strong>filter_var_array</strong> i <strong>filter_input_array</strong>. Są to tak naprawdę dwie funkcje wraz z ich &#8222;tablicowymi&#8221; odpowiednikami, gdybyśmy chcieli filtrować kilka zmiennych na raz.</p>
<h2>filter_input:</h2>
<p><em>filter_input</em> służy do filtrowania danych, które zawarte są w supertablicach, które pobierają dane od użytkownika i maszyny &#8211; $_POST, $_GET, $_SERVER, $_COOKIE i $_ENV. Składnia jest następująca:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">filter_input</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$typDanych</span><span style="color: #339933;">,</span> <span style="color: #000088;">$klucz</span><span style="color: #339933;">,</span> <span style="color: #000088;">$u</span>żywaneFiltry<span style="color: #339933;">,</span> <span style="color: #000088;">$opcje</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>$typDanych wskazuje tablice, której klucz wpisujemy &#8211; jest to jedna ze stałych: FILTER_POST, FILTER_GET, FILTER_SERVER, FILTER_COOKIE lub FILTER_ENV. Myślę, że nazwy tłumaczą wszystko i nie trzeba się nad nimi specjalnie rozwodzić. $klucz wskazuje na daną, którą chcemy przefiltrować &#8211; przykładowo, gdy chcemy filtrować $_POST['foo'], $typDanych ustawiamy na FILTER_POST, a $klucz na &#8216;foo&#8217;. $używaneFiltry to zmienna stanowiąca tak naprawdę wszystko. Tutaj ustawiamy, jakie filtry mają zostać użyte, &#8216;scalając je&#8217; operatorem binarnej alternatywy (co pewnie zna każdy programujący w C) &#8222;|&#8221;. Ostatni argument $opcje jest używany, gdy ustawiamy flagę, która z takich opcji korzysta. Jest to tablica asocjacyjna  Myślę, że najlepiej zobrazuje to przykład (a nawet kilka):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$options</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'flags'</span> <span style="color: #339933;">=&gt;</span> FILTER_FLAG_ALLOW_HEX<span style="color: #339933;">,</span> <span style="color: #0000ff;">'min_range'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'max_range'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">200</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> filter_val<span style="color: #009900;">&#40;</span> FILTER_POST<span style="color: #339933;">,</span> <span style="color: #0000ff;">'foo'</span><span style="color: #339933;">,</span> FILTER_VALIDATE_INT<span style="color: #339933;">,</span> <span style="color: #000088;">$options</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">!==</span> <span style="color: #009900; font-weight: bold;">FALSE</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">// jeżeli $_POST['foo'] jest liczbą całkowitą w systemie dziesiętnym lub heksadecymalnym od 100 do 200 to wykonaj ifa.</span>
<span style="color: #009900;">&#125;</span>
filter_val<span style="color: #009900;">&#40;</span> FILTER_POST<span style="color: #339933;">,</span> <span style="color: #0000ff;">'foo2'</span><span style="color: #339933;">,</span> FILTER_SANITIZE_INT<span style="color: #339933;">,</span> <span style="color: #000088;">$options</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// podstawia NULL, jeżeli dana nie spełnia założeń...</span></pre></td></tr></table></div>

<p>Jak widać, użycie tych filtrów jest bardzo proste. Przede wszystkim jest także rozszerzalne &#8211; niektóre biblioteki dodają nowe filtry, których listę możemy sprawdzić za pomocą funkcji <strong>filter_list</strong>.</p>
<h2>Lista wszystkich filtrów</h2>
<p>Na oficjalnej stronie PHP jest poradnik dotyczący wszystkich funkcji z rodziny filter_. Możemy znaleźć go <a href="http://pl.php.net/manual/pl/book.filter.php">pod tym adresem</a>.</p>
<h2>Podsumowanie</h2>
<p>Rodzina tych funkcji stanowi kompleksowe rozwiązanie problemu filtrowania danych wysyłanych przez użytkownika do naszej aplikacji dla programistów PHP. Piszę o nich, gdyż rzadko kiedy widzę zastosowanie ich w praktyce &#8211; a szkoda, bo są to dopracowane i bardzo przydatne przy budowaniu stron funkcje.</p>
<p>Zatem, do napisania!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.natodia.net/standardowe-narzedzia-php-do-filtrowania-danych/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>lftp &#8211; lepszy pomysł na przesyłanie plików</title>
		<link>http://blog.natodia.net/lftp-lepszy-pomysl-na-przesylanie-plikow/</link>
		<comments>http://blog.natodia.net/lftp-lepszy-pomysl-na-przesylanie-plikow/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 14:19:27 +0000</pubDate>
		<dc:creator>sznurek</dc:creator>
				<category><![CDATA[Narzędzia]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[konsola]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.natodia.net/?p=113</guid>
		<description><![CDATA[Ostatnio potrzebowałem napisać skrypt, który automatycznie wrzucał pewne pliki na serwer korzystając z SSH (FTP nie było dostępne). Próbując rozwiązać ten problem natknąłem się na lftp, który okazał się świetnym programem. Chciałbym przybliżyć wam jego praktyczne zastosowania. Tryb interaktywny Jest (&#8230;)</p><p><a href="http://blog.natodia.net/lftp-lepszy-pomysl-na-przesylanie-plikow/">Przeczytaj całość &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Ostatnio potrzebowałem napisać skrypt, który automatycznie wrzucał pewne pliki na serwer korzystając z SSH (FTP nie było dostępne). Próbując rozwiązać ten problem natknąłem się na <a href="http://lftp.yar.ru/" rel="nofollow">lftp</a>, który okazał się świetnym programem. Chciałbym przybliżyć wam jego praktyczne zastosowania.<br />
<span id="more-113"></span></p>
<h2>Tryb interaktywny</h2>
<p>Jest wiele sposobów na przekazanie lftp serwera z którym pragniemy się połączyć, jednak dla mnie najwygodniejszy okazał się jeden z nich:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ lftp <span style="color: #7a0874; font-weight: bold;">&#91;</span>protocol<span style="color: #7a0874; font-weight: bold;">&#93;</span>:<span style="color: #000000; font-weight: bold;">//</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>username<span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #000000; font-weight: bold;">@</span><span style="color: #7a0874; font-weight: bold;">&#91;</span>server<span style="color: #7a0874; font-weight: bold;">&#93;</span>
$ lftp sftp:<span style="color: #000000; font-weight: bold;">//</span>user<span style="color: #000000; font-weight: bold;">@</span>myserver.com <span style="color: #666666; font-style: italic;"># tak, żeby podać konkretny przykład</span></pre></div></div>

<p>Po zatwierdzeniu jesteśmy pytani o hasło, po czym naszym oczom ukazuje się konsola interaktywna. Kilka cech, które szczególnie przypadły mi do gustu:</p>
<ul>
<li>uzupełnianie nazw plików,</li>
<li>nie wyświetla zbędnych wiadomości od serwera (chyba, że sobie tego zażyczymy),</li>
<li>zarządzanie zadaniami wykonującymi się w tle (analogicznie jak w shellu),</li>
<li>możliwość przekierowania wyjścia komendy do pliku bądź innej komendy,</li>
<li>możliwość wykonywania zewnętrznych programów (komenda <strong>!</strong>).</li>
</ul>
<p>Nie zagłębiałem się bardziej (ponieważ głównie zająłem się możliwością wykonywania skryptów, o czym niżej), ale w dokumentacji można się dowiedzieć, że możemy np. stosować zakładki, czy zrobić aliasy do najczęściej używanych komend.</p>
<p>Mi przydały się trzy komendy:</p>
<ul>
<li><strong>help</strong> &#8211; tego chyba nie muszę tłumaczyć :),</li>
<li><strong>cd folder</strong> &#8211; przejście do zdalnego folderu,</li>
<li><strong>put plik_lokalny</strong> &#8211; przesyła na serwer dany plik.</li>
</ul>
<p>Mimo iż nie planowałem używać lftp w trybie interaktywnym, okazał się on na tyle wygodnym programem, że teraz on będzie moim głównym klientem FTP i podobnych. Jako osobnik nie lubiący opuszczać konsoli (chociażby po to, żeby skorzystać z GFTP&#8230;) ten program bardzo mi się przyda.</p>
<h2>Skrypty</h2>
<p>Wracając do mojej automatyzacji &#8211; okazuje się, że nie muszę wiedzieć praktycznie nic więcej, żebym był w stanie wykonać swoje zadanie. Skrypty lftp są zwykłymi plikami tekstowymi z ciągiem komend jakie wydajemy w trackie sesji interaktywnej z komendą otwierającą połączenie na samym początku. Przykładowy skrypt mógłby wyglądać tak:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">open sftp:<span style="color: #000000; font-weight: bold;">//</span>user<span style="color: #000000; font-weight: bold;">@</span>server.pl<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #7a0874; font-weight: bold;">cd</span> dir1
put one.html
put two.html
<span style="color: #7a0874; font-weight: bold;">cd</span> dir2
put img.png</pre></div></div>

<p>Mając nazwy plików, które muszę wysłać na serwer, bez problemu generuję sobie skrypt analogiczny do powyższego. Potem korzystając z komendy:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ lftp <span style="color: #660033;">-f</span> skrypt</pre></div></div>

<p>wszystkie pliki są wysyłane na serwer (po uprzednim wpisaniu hasła).</p>
<h2>Słowa końcowe</h2>
<p>Program lftp zaoszczędził mi wiele nerwów &#8211; po części dlatego, że nie lubię wychylać nosa zza konsoli a po części dlatego, że lubię automatyzować nużące czynności. Do obu celów nadaje się idealnie &#8211; mam nadzieję, że i wam się przyda.</p>
<p>Do następnego,<br />
sznurek.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.natodia.net/lftp-lepszy-pomysl-na-przesylanie-plikow/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Budowa prostego MVC w PHP (&gt;5.3), cz. 1 &#8211; wprowadzenie do tematu</title>
		<link>http://blog.natodia.net/budowa-prostego-mvc-w-php-5-3-cz-1-wprowadzenie-do-tematu/</link>
		<comments>http://blog.natodia.net/budowa-prostego-mvc-w-php-5-3-cz-1-wprowadzenie-do-tematu/#comments</comments>
		<pubDate>Mon, 14 Feb 2011 19:47:02 +0000</pubDate>
		<dc:creator>Killavus</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.natodia.net/?p=96</guid>
		<description><![CDATA[MVC (Model-View-Controller) to jeden z najbardziej rozpowszechnionych wzorców projektowych wykorzystywanych przy projektowaniu front-endów aplikacji sieciowych. Jego niewątpliwą zaletą jest fakt, że możemy rozdzielić 3 najważniejsze &#8222;części&#8221; programu &#8211; prezentację, pobieranie danych, oraz manipulowanie nimi. Staje się to przydatne najbardziej, gdy (&#8230;)</p><p><a href="http://blog.natodia.net/budowa-prostego-mvc-w-php-5-3-cz-1-wprowadzenie-do-tematu/">Przeczytaj całość &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><strong>MVC</strong> (<em>Model-View-Controller</em>) to jeden z najbardziej rozpowszechnionych wzorców projektowych wykorzystywanych przy projektowaniu front-endów aplikacji sieciowych. Jego niewątpliwą zaletą jest fakt, że możemy rozdzielić 3 najważniejsze &#8222;części&#8221; programu &#8211; <em>prezentację</em>, <em>pobieranie</em> danych, oraz <em>manipulowanie</em> nimi. Staje się to przydatne najbardziej, gdy nad projektem pracuje kilka(naście) osób &#8211; graficy nie potrzebują zaawansowanej wiedzy programistycznej, by wyświetlać treść w swoich projektach, specjaliści od bezpieczeństwa nie muszą zajmować się wewnętrznymi szczegółami dotyczącymi pobierania danych, gdyż nieistotne jest dla nich, czy pochodzą one z pliku, bazy danych czy jeszcze innego źródła, zaś programiści mogą przygotować metody zbierania danych, zachowując przy tym taki sam interfejs niezależnie od ich źródła. Ponadto szukanie błędów w takiej aplikacji jest prostsze &#8211; dzięki rozdzieleniu warstw możemy szybko i sprawnie wyszukać która część odpowiada za problem i wydelegować do jego rozwiązania odpowiedni sztab ludzi.</p>
<p>Mimo tego, że napisanie aplikacji w oparciu o ten model wydaje się skomplikowane, wcale takie nie jest. Wystarczy wiedza z zakresu obiektowo-orientowanego programowania w dowolnym języku (my wybierzemy PHP) i trochę cierpliwości. W tym artykule postaram się odpowiedzieć na pytanie, jak stworzyć pierwszą część takiego wzorca &#8211; <strong>Model</strong> danych. Opowiem też o tym, za co odpowiada która część i dlaczego kod, który napiszemy nie działa na 90% polskich hostingów. Zatem do dzieła!</p>
<p><span id="more-96"></span><br />
<h2>Model&#8230; View&#8230; Controller? O co w tym wszystkim chodzi?</h2>
<p>Być może dziwne nazwy, które zawarte są w nazwie tego wzorca mogą odstraszać, ale nie jest to wcale trudna rzecz.  Przedstawię tutaj pomocniczy schemat, który na przykładzie bloga przybliży Wam, w czym rzecz.</p>
<p><a href="http://i51.tinypic.com/incxut.png"><img class="aligncenter" title="Schemat działania MVC" src="http://i51.tinypic.com/incxut.png" alt="Schemat działania MVC" width="500" height="400" /></a></p>
<p>Myślę, że powyższy schemat dość dobrze pokazuje, o co w tym wszystkim chodzi. Zapytanie przekazywane jest do kontrolera, kontroler przetwarza je,  pobierając z modeli te dane, które są mu potrzebne (być może nie tylko dane wpisu &#8211; może też dane autora, komentarzy itp.) i przekazuje wykonywanie dalej, do widoku (view).</p>
<p>Dla tych, do których przemawia jedynie kod, przedstawiam mały, poglądowy kod jak mogłoby to wyglądać (pomijam tutaj model):</p>
<p><strong>Kontroler:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> PostController <span style="color: #000000; font-weight: bold;">extends</span> ControllerHandler <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// ...</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> view<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$id</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$post</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Post<span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$post</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// wpis o tym ID nie istnieje.</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">error</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'404'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">viewVars</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post-content'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$post</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">content</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Potrzebujemy tresc wpisu</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">render</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Przekazujemy wykonanie do widoku.</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;">// ...</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p><strong>Widok:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&lt;h1&gt;Wpis na blogu:&lt;/h1&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$v</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post-content'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Jak widzimy, pobieranie danych i ich walidacja (przykładem jest tutaj wywalenie błędu, gdy nie ma wpisu o ID 12 jest realizowane w kontrolerze, zaś widok zajmuje się tylko wyświetleniem danych na ekran.</p>
<h2>Szczegóły implementacyjne</h2>
<p>Wiemy już, jak to powinno działać. Pozostaje pytanie &#8211; jak to zaimplementować? W następnych częściach naszego artykułu przejdziemy do konkretów, implementując każdy szczegół z osobna.</p>
<p>Do napisania!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.natodia.net/budowa-prostego-mvc-w-php-5-3-cz-1-wprowadzenie-do-tematu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PDO &#8211; czyli zabawa z PHP i bazą danych obiektowo!</title>
		<link>http://blog.natodia.net/pdo-czyli-zabawa-z-php-i-baza-danych-obiektowo/</link>
		<comments>http://blog.natodia.net/pdo-czyli-zabawa-z-php-i-baza-danych-obiektowo/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 23:22:34 +0000</pubDate>
		<dc:creator>Killavus</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[bazy danych]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.natodia.net/?p=35</guid>
		<description><![CDATA[Jako, że mnóstwo programistów (czy to garażowych, czy &#8222;profesjonalnych&#8221;) wciąż siedzi w zamierzchłych przedpotopowych czasach dziadka PHP 4.x jeżeli chodzi o połączenie z bazą danych, chciałbym przedstawić ciekawą alternatywę dla ich prehistorycznych narzędzi. Mowa tutaj o PDO &#8211; PHP Database (&#8230;)</p><p><a href="http://blog.natodia.net/pdo-czyli-zabawa-z-php-i-baza-danych-obiektowo/">Przeczytaj całość &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Jako, że mnóstwo programistów (czy to garażowych, czy <em>&#8222;profesjonalnych&#8221;</em>) wciąż siedzi w zamierzchłych przedpotopowych czasach dziadka PHP 4.x jeżeli chodzi o połączenie z bazą danych, chciałbym przedstawić ciekawą alternatywę dla ich prehistorycznych narzędzi. Mowa tutaj o <strong>PDO</strong> &#8211; <em>PHP Database Objects</em>.  Czymże to ustrojstwo jest? Niczym innym jak obiektową implementacją interakcji PHP z bazą danych &#8211; nowszą, oferującą ciekawe możliwości i o wiele bardziej przejrzystą od starego, proceduralnego podejścia.<br />
<span id="more-35"></span><br />
Oto, co w wielkim skrócie oferuje PDO:</p>
<ul>
<li>automatyczną ochronę przed atakami typu SQL Injection,</li>
<li>możliwość korzystania z każdego silnika bazodanowego transparentnie, przy użyciu tego samego API &#8211; to kwestia zmiany <strong>jednej</strong> linijki w konstruktorze!</li>
<li>mechanizmy transakcji (o ile obsługuje je nasza baza danych &#8211; MySQL, PostgreSQL i SQLite3 &#8211; obsługują) &#8211; możliwość cofnięcia dowolnych zmian w bazie danych do momentu przed manipulacją za pomocą jednej funkcji! Naprawianie błędów w bazie pozostawionych przez nieudane zapytania jeszcze nigdy nie była tak prosta!</li>
<li>przygotowane zapytania (ang. <em>prepared statements</em>) &#8211; zoptymalizowany sposób na wysyłanie dowolnej ilości identycznie skonstruowanych zapytań z różnymi argumentami,</li>
<li>pełny dostęp do informacji o aktualnym stanie bazy danych (błędy itd.) w każdej chwili,</li>
<li>możliwość denerwowania głównego webmajstra Natodii,</li>
<li>rozbudowany system wyjątków,</li>
<li>możliwość pozwolenia dziadkowi PHP4 spokojnie umrzeć;</li>
</ul>
<p>Pozwolę sobie skoncentrować się na kawałkach kodu wraz z objaśnieniem &#8216;o co chodzi&#8217; &#8211; opis całości biblioteki znajduje się <a title="tutaj" href="http://pl.php.net/manual/en/book.pdo.php" target="_blank" rel="nofollow">tutaj</a>.</p>
<h1><strong>1. Instalacja:</strong></h1>
<p>W przypadku Debiana, którego używam instalacja odbywa się poprzez zainstalowanie odpowiednych paczek do bazy danych:</p>
<pre style="padding-left: 30px;"># aptitude install php-mysql php-sqlite php-pgsql # i tak dalej</pre>
<p>Dla Windows polecam użycie <a href="http://www.wampserver.com/" rel="nofollow">WampServera</a> &#8211; ma on już wszystko, czego potrzeba do korzystania z PDO. Wymaga to jednak aktywacji. Aby aktywować PDO, należy kliknąć na ikonkę serwera w trayu i w menu PHP -&gt; PHP Extensions zaznaczyć potrzebne nam składniki i bazy danych (np. <em>php_pdo.dll</em>, <em>php_pdo_mysql.dll</em>) po czym zrestartować serwer.</p>
<h1>2. Nawiązywanie połączenia z bazą danych:</h1>
<p>Wszystko gotowe? Środowisko skonfigurowane? Czas więc zrobić pierwszy krok w manipulacji bazą danych &#8211; połączyć się z nią! Przykład będzie dla bazy MySQL:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">try <span style="color: #009900;">&#123;</span>
 <span style="color: #000088;">$db</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> PDO<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'mysql:host=localhost;dbname=nazwabazy'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$user</span><span style="color: #339933;">,</span> <span style="color: #000088;">$password</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
catch<span style="color: #009900;">&#40;</span> PDOException <span style="color: #000088;">$e</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #666666; font-style: italic;">// ewentualna obsługa wyjątku...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Jak wszyscy widzą, na argumenty konstruktora składają się (w tym wypadku):  łańcuch znaków deklarujący typ bazy z którą się łączymy i parametry, użytkownika i hasło. Uwaga! W przypadku baz takich jak np. SQLite3, gdzie logowania nie ma, po prostu pomijamy te parametry dot. użytkownika i hasła &#8211; są one opcjonalne. <strong>Sercem</strong> tego systemu jest właśnie ten string formatujący &#8211; za jego pomocą definiujemy bazę, z jaką mamy się połączyć. Reszta API jest identyczna &#8211; czy to MySQL, czy SQLite, czy PostgreSQL, czy MSSQL, czy cokolwiek sobie wymyślisz, a ma sterownik w PDO.</p>
<p>Jako czwarty argument konstruktor przyjmuje tzw. atrybuty Są to flagi, których postawienie pozwala uruchomić zaawansowane (i niekoniecznie działające wszędzie) funkcjonalności samej bazy danych, lub PDO. Wszystkie (oprócz PDO::ATTR_PERSISTENT, która jest chyba najprzydatniejszą) można potem ustawić za pomocą funkcji setAttribute.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$db</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> PDO<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'sqlite:file=file.sqlite'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> PDO<span style="color: #339933;">::</span><span style="color: #004000;">ATTR_PERSISTENT</span> <span style="color: #339933;">|</span> PDO<span style="color: #339933;">::</span><span style="color: #004000;">ATTR_FETCH_TABLE_NAMES</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setAttribute</span><span style="color: #009900;">&#40;</span> PDO<span style="color: #339933;">::</span><span style="color: #004000;">ATTR_ERRMODE</span><span style="color: #339933;">,</span> PDO<span style="color: #339933;">::</span><span style="color: #004000;">ERRMODE_SILENT</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// PDO nie sypie wyjątkami - wyświetla jedynie warningi</span>
<span style="color: #666666; font-style: italic;">// po więcej atrybutów odsyłam na: http://pl.php.net/manual/en/pdo.constants.php i strony konkretnych driverów w dokumentacji</span></pre></div></div>

<p>Jako, że PDO ma swoje destruktory, aby zerwać połączenie wystarczy usunąć referencję za pomocą funkcji <em>unset</em>:</p>
<pre>unset( $db ); // zrywa połączenie z bazą danych</pre>
<h1>3. Wykonywanie zapytań:</h1>
<p>Przechodzimy do najważniejszej części &#8211; wykonywania zapytań do naszej (połączonej już) bazy danych. Są dwa sposoby, dlatego rozdzielę ten podpunkt.</p>
<h2>3a. Surowe zapytania używając $db-&gt;query( &#8230; ):</h2>
<p>Jest to zdecydowanie najgorszy sposób z racji tego, że nie ma wbudowanej ochrony przeciwko SQL Injection. Niemniej jednak, czasem takie &#8222;surowe&#8221; zapytania są przydatne. <span style="color: #ff0000;"><strong>Pamiętaj tylko, aby pod ŻADNYM pozorem nie korzystać z tego sposobu w połączeniu z surowymi danymi z formularzy od użytkowników &#8211; powinny one zostać wcześniej przetworzone (może w tym pomóc rodzina funkcji ctype_, *val oraz PDO::quote)!!!</strong></span></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">try <span style="color: #009900;">&#123;</span>
 <span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'SELECT * FROM foo WHERE bar = 2'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$sql</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetch</span><span style="color: #009900;">&#40;</span> PDO<span style="color: #339933;">::</span><span style="color: #004000;">FETCH_ASSOC</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// PDO::FETCH_ASSOC sprawia, że kolejne wiersze tabeli są wrzucane do tablicy asocjacyjnej z nazwami kolumn.</span>
   <span style="color: #666666; font-style: italic;">// Domyślnie wrzucane są do tablicy numerowanej od 0 do x gdzie x-1 to liczba kolumn (w kolejnosci) + dorzucane sa odwolania jako nazwy kolumn. Aby zostawic same numerki - skorzystaj z PDO::FETCH_NUM</span>
   <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span> <span style="color: #0000ff;">'id'</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
catch<span style="color: #009900;">&#40;</span> PDOException <span style="color: #000088;">$e</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #666666; font-style: italic;">// ...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h2>3b. Zapytania przygotowane:</h2>
<p>Zdecydowanie lepszy sposób. Dlaczego? Chroni nas przed SQL Injection, pozwala się nam <a href="http://pl.wikipedia.org/wiki/DRY" rel="nofollow">nie powtarzać</a> i rozdziela budowanie zapytania na fazę budowy i wykonywania.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$sql_one</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prepare</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'SELECT * FROM foo WHERE bar = ? AND x = ?'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// to *nie* wykonuje jeszcze tego zapytania</span>
<span style="color: #000088;">$sql_one</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">12</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">13</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// wykonuje zapytanie, pod ? wstawiając kolejno: 12, 13</span>
<span style="color: #000088;">$sql_two</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prepare</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'SELECT * FROM foo WHERE :col = :val AND :coltwo = :valtwo'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$sql_two</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bindColumn</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">':col'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'bar'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// podstawia pod :col kolumnę bar</span>
<span style="color: #000088;">$sql_two</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bindColumn</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">':coltwo'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'x'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// podstawia pod :coltwo kolumnę x</span>
<span style="color: #000088;">$sql_two</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bindParam</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">':val'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">12</span><span style="color: #339933;">,</span> PDO<span style="color: #339933;">::</span><span style="color: #004000;">PARAM_INT</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// podstawia pod :val wartość 12. PDO::PARAM_INT jest &lt;strong&gt;opcjonalne&lt;/strong&gt;</span>
<span style="color: #000088;">$sql_two</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">':valtwo'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">13</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// wykonuje to samo polecenie co $sql_one</span>
<span style="color: #000088;">$res</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$sql_one</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetchAll</span><span style="color: #009900;">&#40;</span> PDO<span style="color: #339933;">::</span><span style="color: #004000;">FETCH_ASSOC</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// jeden ze sposobów pobierania wyników - wszystkie na raz są wrzucane do tablicy</span>
<span style="color: #666666; font-style: italic;">// można też skorzystać ze 'starego' sposobu:</span>
<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$sql_two</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetch</span><span style="color: #009900;">&#40;</span> PDO<span style="color: #339933;">::</span><span style="color: #004000;">FETCH_ASSOC</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #666666; font-style: italic;">// ...</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$sql_one</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">':val'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">14</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">':valtwo'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">18</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// wyślijmy jeszcze jedno takie samo zapytanie, z innymi argumentami</span></pre></div></div>

<p>Jak zauważyliśmy, możemy tutaj dowolnie manipulować wartościami i kolumnami wrzucanymi do zapytania jeszcze PRZED wysłaniem ich do bazy danych &#8211; to wielka wygoda. Ponadto możemy jedno przygotowane zapytanie wykonać n razy, zmieniając jedynie parametry.  I wszystkie wprowadzane dane są zabezpieczone przed SQL Injection, więc można tam wstawiać nawet surowe dane podane z formularzy. Czyż nie jest to raj programisty? :)</p>
<p>Mam nadzieję, że przekonałem Was do tego sposobu. Może jest odrobinę bardziej rozwlekły od pierwszego, ale nauczenie się korzystania z niego pozwoli Wam na pisanie bardzo dobrego i <strong>bezpiecznego</strong> kodu do interakcji z bazą danych. A o to chyba tutaj chodzi, prawda?</p>
<p>I, jeszcze aby do końca osłodzić Wam życie&#8230;</p>
<h1>4. Transakcje:</h1>
<p>Wyobraźmy sobie następującą sytuację. Mamy sobie ogromniastą bazę danych w formacie-koszmarze, przygotowaną przez programistę-troglodytę &#8211; powiedzmy, że w XMLu (sry, Javowcy, musiałem :(). Jako wspaniali, mądrzy i światli programiści korzystający z dobrodziejstw XXI wieku postanawiacie wrzucić to całe cholerstwo do jakiejś cywilizowanej bazy danych typu MySQL czy Postgre. Wyposażeni w nowo nabytą wiedzę dot. PDO postanawiacie skorzystać z tej wspaniałej technologii. Przygotowujecie zapytanie, przekazujecie argumenty &#8211; wszystko jest fajnie. Lecz nagle, <strong>BANG!</strong> Skrypt podawał złe dane! Dwa wątki się skrzyżowały i nastąpiła sytuacja wyścigu! Zrozpaczony tym, że aktualnie w Twojej bazie danych masz połowę niekoniecznie poparawnych rekordów spędzasz sporo czasu na znalezienie uszkodzonych, usunięcie bezsensownych itd. Wybacz, <em>time limit exceeded</em>, Ziemia została zjedzona przez Obcych. Zawiodłeś, stary.</p>
<p>Ale programiści baz danych przewidzieli coś specjalnie na takie okazje &#8211; mechanizm transakcji! Na czym to polega? Za pomocą metody przekazujesz do bazy danych, że zaczynasz transakcje &#8211; w tym momencie baza danych ustanawia punkt, do którego wróci, gdy coś pójdzie nie tak. Potem wykonujesz polecenia &#8211; nie są one jednak wykonywane w bazie danych. Dopiero, gdy zwolnisz transakcje za pomocą drugiej metody, wtedy zacznie się manipulacja danych. Co to daje?</p>
<ul>
<li>Masz pewność, że zostaną wykonane <strong>wszystkie </strong>zapytania, jakie znajdowały się w obrębie transakcji &#8211; w przeciwnym wypadku zostanie zgłoszony wyjątek,</li>
<li>W przypadku błędu lub z innego powodu będziesz w stanie za pomocą <strong>jednej metody</strong> powrócić do stanu bazy sprzed transakcji,</li>
<li>Baza danych optymalizuje zapytania na bieżąco &#8211; przez co wszystko jest szybsze.</li>
</ul>
<p>Co najlepsze, wykorzystanie dobrodziejstw transakcji jest w PDO bardzo proste. Zilustruje to poniższy przykład:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">try <span style="color: #009900;">&#123;</span>
 <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">beginTransaction</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// rozpoczynamy transakcje</span>
 <span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prepare</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'INSERT INTO foo VALUES( NULL, ?, ? )'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
 <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">1000000000</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span><span style="color: #000088;">$i</span> <span style="color: #009900;">&#41;</span> <span style="color: #000088;">$sql</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1000000000</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1000000000</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// wykonujemy miliard zapytań z losowymi danymi</span>
 <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">commit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// wykonujemy transakcje - w tym momencie zapytania zostaną wykonane</span>
<span style="color: #009900;">&#125;</span>
catch<span style="color: #009900;">&#40;</span> PDOException <span style="color: #000088;">$e</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">// coś poszło nie tak!</span>
 <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">rollBack</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// wracamy do stanu sprzed transakcji ...</span>
 <span style="color: #666666; font-style: italic;">// ...</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Jak widzimy, funkcja rollBack odpowiada za wrócenie do &#8216;stanu początkowego&#8217;. Oczywiście, w transakcjach możemy wykonywać zapytania typu SELECT &#8211; nie ma to jednak większego sensu. Mechanizm ten został wymyślony raczej do zapytań w stylu CALL, INSERT, UPDATE czy DELETE FROM &#8211; i przy takich okazjach należy go używać. Niestety, wadą tego rozwiązania jest fakt, że nie działa na każdej bazie danych &#8211; mogę potwierdzić z doświadczenia, że działa na nowszych MySQL, SQLite3 i PostgreSQL &#8211; w innych nie mam pojęcia. PDO jest jednak tak sprytnie skonstruowane, że w przypadku braku obsługi tego mechanizmu funkcje nie będą nic robić. Zapytacie się więc &#8211; jak sprawdzić, czy baza na pewno wróciła do stanu początkowego? Prosto &#8211; rollBack zwraca TRUE lub FALSE, jeżeli się nie udało.</p>
<h1>Podsumowanie:</h1>
<p>Uważam, że PDO jest jedną z lepszych technologii, które przyszły wraz z obsługą obiektowości w PHP. Dopiero od PHP 5.x rozwinęła ona skrzydła i jest teraz o wiele lepszą alternatywą dla proceduralnego podejścia. Zwalnia programistę od sporej ilości rzeczy, które miał do uczynienia w przypadku starszych technologii, a które były żmudne i niestety niezbędne, gdy chodziło o bezpieczeństwo strony &#8211; chodzi tutaj o zabezpieczenie przed atakami SQL Injection. W przypadku zapomnienia lub pomyłki taki atak mógłby mieć opłakane skutki &#8211; chociażby wykradnięcie całej bazy danych maili użytkowników to ogromna gratka dla wszelkiego rodzaju spambotów. Dzięki <em>prepared statements</em> ten problem znika &#8211; wewnętrzne mechanizmy PDO radzą sobie z bezpieczeństwem znakomicie.</p>
<p>Mam nadzieję, że tym artykułem zachęcę Was do używania PDO w swoich małych lub większych projektach!</p>
<p>Pozdrawiam</p>
<p>Killavus</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.natodia.net/pdo-czyli-zabawa-z-php-i-baza-danych-obiektowo/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>connect a sprawa sygnałów</title>
		<link>http://blog.natodia.net/connect-a-sprawa-sygnalow/</link>
		<comments>http://blog.natodia.net/connect-a-sprawa-sygnalow/#comments</comments>
		<pubDate>Mon, 24 Aug 2009 14:21:34 +0000</pubDate>
		<dc:creator>sznurek</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[socket]]></category>
		<category><![CDATA[Unix]]></category>

		<guid isPermaLink="false">http://blog.natodia.net/?p=15</guid>
		<description><![CDATA[Już śpieszę z wyjaśnieniem tytułu &#8211; chodzi o funkcję systemową dostępną w różnej maści Uniksach. Takich krótkich postów o podobnej tematyce, czyli programowanie niskopoziomowe w C pod Uniksem (dokładniej: Linuksem, choć w przyszłości może i pod FreeBSD), planuję napisać więcej, (&#8230;)</p><p><a href="http://blog.natodia.net/connect-a-sprawa-sygnalow/">Przeczytaj całość &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Już śpieszę z wyjaśnieniem tytułu &#8211; chodzi o funkcję systemową dostępną w różnej maści Uniksach. Takich krótkich postów o podobnej tematyce, czyli programowanie niskopoziomowe w C pod Uniksem (dokładniej: Linuksem, choć w przyszłości może i pod FreeBSD), planuję napisać więcej, ponieważ ostatnio mam z tym tematem do czynienia aż za dużo. Zdecydowanie za dużo.</p>
<p>Wracając do tematyki notki &#8211; co się stanie gdy wywołanie fukncji systemowej np. <i>write</i> przerwie nam sygnał który dotarł do programu? W większości przypadków funkcja wykona część lub nie wykona operacji w ogóle, ale bez problemowo można ją wywołać ponownie, a zmienna <i>errno</i> zostanie ustawiona na mistyczną juz wręcz wartość <i>EINTR</i>. Niestety funkcja <i>connect</i> tak nie działa. Gdy zwrócony zostanie niezwykle tajemniczy błąd <i>EINTR</i> to <strong>nie możemy wywołać jej ponownie</strong>. Logiczne, prawda?<br />
<span id="more-15"></span></p>
<p>Więc co możemy zrobić?</p>
<p>Tak naprawdę łączenie nie zostaje przerwane &#8211; odbywa się dalej, asynchronicznie. Musimy tylko wiedzieć kiedy się skończy. W sumie warto by było. </p>
<p>Jak?</p>
<p>To bardzo proste i intuicyjne: należy wywołać funkcję <i>select</i> lub <i>poll</i> i przekazać im zamiar odczytania naszego socketa (uważając na <i>EINTR</i>!), potem należy odczytać opcje <i>SO_ERROR</i> (<i>getsockopt</i>) i sprawdzić czy wynosi 0. Wtedy możemy być na 99% pewni, że nasz socket jest podłączony. Kawałek kodu, co by nie być gołosłownym:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>connect<span style="color: #009900;">&#40;</span>socket<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>addr<span style="color: #339933;">,</span> addrlen<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    fd_set rset<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> option<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> optionlen<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>errno <span style="color: #339933;">!=</span> EINTR<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #808080; font-style: italic;">/* Tu łączenie naprawdę się wywaliło. Serio. */</span>
        perror<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;connect&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    FD_ZERO<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>rset<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    FD_SET<span style="color: #009900;">&#40;</span>socket<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>rset<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>select<span style="color: #009900;">&#40;</span>socket <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>rset<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>errno <span style="color: #339933;">!=</span> EINTR<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            perror<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;select&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    optionlen <span style="color: #339933;">=</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>option<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>getsockopt<span style="color: #009900;">&#40;</span>socket<span style="color: #339933;">,</span> SOL_SOCKET<span style="color: #339933;">,</span> SO_ERROR<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>option<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>optionlen<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        perror<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;getsockopt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>option <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        fprintf<span style="color: #009900;">&#40;</span>stderr<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;connect: %s&quot;</span><span style="color: #339933;">,</span> strerror<span style="color: #009900;">&#40;</span>option<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* Hurra! jesteśmy połączeni! */</span></pre></div></div>

<p>Tak, powyższy kod robi dokładnie to samo co zwykły, stary, poczciwy, blokujący connect, który nie byłby przerwany sygnałem. </p>
<p>Miłego zagłębiania się w tajniki sztuki Uniksowej, życzy <b>Sznurek</b>.</p>
<p>Manual z wami.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.natodia.net/connect-a-sprawa-sygnalow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Natodia Project</title>
		<link>http://blog.natodia.net/natodia-project/</link>
		<comments>http://blog.natodia.net/natodia-project/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 14:28:22 +0000</pubDate>
		<dc:creator>Mat</dc:creator>
				<category><![CDATA[Natodia]]></category>
		<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://blog.natodia.net/?p=8</guid>
		<description><![CDATA[Projekt Natodia zakłada realizację: Blogu &#8211; z informacjami od developerów, ciekawostkami technologicznymi, programistycznymi, o sieciach, Sprawdzaczki &#8211; narzędzia, które umożliwi sprawdzenie poprawności algorytmów dla wielu zagadnień matematycznych, Prace nad większością jeszcze trwają, cierpliwości &#8211; już niedługo wszystko będzie działać. Nie (&#8230;)</p><p><a href="http://blog.natodia.net/natodia-project/">Przeczytaj całość &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p><strong>Projekt Natodia</strong> zakłada realizację:</p>
<p><strong>Blogu &#8211; </strong>z informacjami od developerów, ciekawostkami technologicznymi, programistycznymi, o sieciach,</p>
<p><strong>Sprawdzaczki &#8211; </strong>narzędzia, które umożliwi sprawdzenie poprawności algorytmów dla wielu zagadnień matematycznych,</p>
<p>Prace nad większością jeszcze trwają, cierpliwości &#8211; już niedługo wszystko będzie działać.</p>
<p>Nie zaprzeczamy, że w przyszłości projekt może zostać poszerzony o dodatkowe elementy &#8211; z pewnością tak się właśnie stanie.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.natodia.net/natodia-project/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

