<?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>ManCanDo - PhP, MySQL, DIY, porady i triki &#187; &#187; programowanie</title>
	<atom:link href="http://www.mancando.pl/tag/programowanie/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mancando.pl</link>
	<description>Co kupować a czego nie? Ciekawostki z zakresu programowania w PHP. Sztuczki i kruczki MySQL. Zagadnienia z zakresu grafiki komputerowej. Opisy ciekawych rzeczy, które można wykonać samodzielnie.</description>
	<lastBuildDate>Thu, 05 Dec 2013 18:50:19 +0000</lastBuildDate>
	<language>pl-PL</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.0.38</generator>
	<item>
		<title>PHP &#8211; operacje na ciągach znaków &#8211; zamiana liter na małe</title>
		<link>http://www.mancando.pl/php-operacje-na-ciagach-znakow-zamiana-liter-na-male/</link>
		<comments>http://www.mancando.pl/php-operacje-na-ciagach-znakow-zamiana-liter-na-male/#comments</comments>
		<pubDate>Wed, 18 Sep 2013 11:57:09 +0000</pubDate>
		<dc:creator><![CDATA[Piotrek]]></dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programowanie]]></category>

		<guid isPermaLink="false">http://www.mancando.pl/?p=350</guid>
		<description><![CDATA[Operacje na ciągach znaków to jedne z popularniejszych zadań programistycznych  realizowanych w typowym projekcie serwisu internetowego tworzonego przy pomocy PhP. Jedną z popularnych operacji wykonywanych na ciągach znaków to konwersja na ciągi złożone jedynie z małych liter. Realizacja tego zadania &#8230; <a href="http://www.mancando.pl/php-operacje-na-ciagach-znakow-zamiana-liter-na-male/">Czytaj dalej <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[
<!-- Easy Plugin for AdSense V7.51 -->
<!-- [leadin: 2 urCount: 2 urMax: 0] -->
<div class="ezAdsense adsense adsense-leadin" style="text-align:center;margin:20px 0px;"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- mancando-poziomy -->
<ins class="adsbygoogle"
     style="display:inline-block;width:728px;height:90px"
     data-ad-client="ca-pub-2234288553315702"
     data-ad-slot="2233930472"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script></div>
<!-- Easy Plugin for AdSense V7.51 -->
<p><img class="alignright size-full wp-image-50" style="border: 0px none;" alt="komputerek_php" src="http://www.mancando.pl/wp-content/uploads/2013/01/komputerek_php.png" width="70" height="73" />Operacje na ciągach znaków to jedne z popularniejszych zadań programistycznych  realizowanych w typowym projekcie serwisu internetowego tworzonego przy pomocy PhP. Jedną z popularnych operacji wykonywanych na ciągach znaków to konwersja na ciągi złożone jedynie z małych liter. Realizacja tego zadania jest raczej trywialna. Wystarczy, że użyjecie dostępną w PhP <img class="alignright size-full wp-image-51" style="border: 0px none;" alt="komputerek_mysql" src="http://www.mancando.pl/wp-content/uploads/2013/01/komputerek_mysql.png" width="70" height="68" />funkcję <strong>strtolower()</strong> lub w przypadku zamiany pierwszej litery <strong>lcfirst()</strong>.</p>
<p>Zadanie robi się już nieco trudniejsze gdy przyjedzie Wam pracować z ciągami znaków wśród których znajdą się litery odpowiadające znakom diakretycznym charakterystycznym dla danego narodowego alfabetu. Użycie funkcji <strong>strtolower</strong> oraz <strong>lcfirst</strong> nie spowoduje że tego typu duże litery będą zamienione na małe. Znaki wykraczające poza zakres liter ‚alphabetic’ są pomijane przez te funkcję.</p>
<p><span id="more-350"></span></p>
<p>W takich sytuacjach z pomocą przyjdzie Wam funkcja <strong>mb_strtolower($string, $encoding)</strong> dostępna w ramach rozszerzenia <strong>Multibyte String Functions</strong>. Drugi (opcjonalny) argument tej funkcji określa kodowanie znaków konwertowanego ciągu znaków. Pozwala to na obsłużenie praktycznie każdego języka jaki jest obecnie używany w internecie. Warto dodać, że rozszerzenie to nie jest domyślnym rozszerzeniem PhP a co za tym idzie, nie każdy na każdym hostingu możliwe będzie skorzystanie z funkcji <strong>mb_strtolower()</strong>.</p>
<p>W ramach uzupełnienia tematu dodam jeszcze mały tutorial z zakresu <strong>MySQL</strong> odpowiadający na pytanie: A co zrobić w przypadku, gdy to w bazie danych w jednej z kolumn tabeli mam ciąg znaków, który w trwały sposób chciałbym zamienić na wyrazy składające się tylko z małych liter. Oczywiście można tę operację wykonać po stronie PhP za pomocą funkcji wymienionych wyżej. Jednak znacznie bardziej optymalnym i szybszym rozwiązaniem będzie wykonanie tej operacji za pomocą pojedynczego zapytania UPDATE. Poniżej znajdziecie przykład tego typu zapytania SQL:<br />
<code>UPDATE `tabela` SET `nazwa_kolumny`=LOWER(`nazwa_kolumny`);</code><br />
Po wykonaniu tego zapytania, we wszystkich rekordach w kolumnie `nazwa_kolumny` znajdą się ciągi znaków składające się tylko z małych liter.</p>

<!-- Easy Plugin for AdSense V7.51 -->
<!-- [leadout: 3 urCount: 3 urMax: 0] -->
<div class="ezAdsense adsense adsense-leadout" style="text-align:center;margin:12px;"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- mancando-poziomy -->
<ins class="adsbygoogle"
     style="display:inline-block;width:728px;height:90px"
     data-ad-client="ca-pub-2234288553315702"
     data-ad-slot="2233930472"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script></div>
<!-- Easy Plugin for AdSense V7.51 -->
]]></content:encoded>
			<wfw:commentRss>http://www.mancando.pl/php-operacje-na-ciagach-znakow-zamiana-liter-na-male/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cache-Control w .htaccess, czyli jak polepszyć wynik w google PageSpeed Insight</title>
		<link>http://www.mancando.pl/cache-control-w-htaccess-czyli-jak-polepszyc-wynik-w-google-pagespeed-insight/</link>
		<comments>http://www.mancando.pl/cache-control-w-htaccess-czyli-jak-polepszyc-wynik-w-google-pagespeed-insight/#comments</comments>
		<pubDate>Fri, 23 Aug 2013 11:13:55 +0000</pubDate>
		<dc:creator><![CDATA[Piotrek]]></dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programowanie]]></category>

		<guid isPermaLink="false">http://www.mancando.pl/?p=293</guid>
		<description><![CDATA[Ostatnio z ciekawości zajrzałem do aplikacji PageSpeed Insight (PSI). Wynik mojej strony o Krecie oscylował w okolicy 75 punktów dla tradycyjnych przeglądarek dla komputerów i 61 punktów dla urządzeń mobilnych. Postanowiłem przyjrzeć się jaki element miał największy wpływ na osiągnięty &#8230; <a href="http://www.mancando.pl/cache-control-w-htaccess-czyli-jak-polepszyc-wynik-w-google-pagespeed-insight/">Czytaj dalej <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><img class="alignright" style="border: 0px none;" alt="komputerek" src="http://www.mancando.pl/wp-content/uploads/2013/01/komputerek.png" width="70" height="50" />Ostatnio z ciekawości zajrzałem do aplikacji PageSpeed Insight (PSI). Wynik mojej <a title="Kreta" href="http://www.crete.pl" target="_blank">strony o Krecie</a> oscylował w okolicy 75 punktów dla tradycyjnych przeglądarek dla komputerów i 61 punktów dla urządzeń mobilnych. Postanowiłem przyjrzeć się jaki element miał największy wpływ na osiągnięty wyniki. Okazało się że największym czynnikiem wpływającym negatywnie na punktację było pominięcie ustawienia maksymalnego wieku (daty wygaśnięcia) dla większości statycznych zasobów wykorzystywanych na stronie. W moim przypadku obejmowało to wszystkie pliki graficzne, js i css. Postanowiłem przeszukać internet pod kątem znalezienia sposobu na dołączenia do nagłówków tych elementów odpowiedniej wartości max-age.<span id="more-293"></span></p>
<p>Oczywiście wykonanie takiego zadania jest możliwe na poziomie odpowiedniej konfiguracji serwera. Jednak w przypadku zdecydowanej większości hostingów, zrealizowanie takiego zadania nie jest możliwe. W przypadku typowego wirtualnego hostingu jedynym sensownym rozwiązaniem jest wykorzystanie dobrodziejstwa pliku konfiguracyjnego .htaccess serwera Apache dla danego podkatalogu.</p>
<p>Poniżej znajdziecie odpowiedni kod dzięki któremu apache do każdego nagłówka określonego pliku doda deklarację wieku danego pliku:</p>
<pre>&lt;IfModule mod_headers.c&gt;
 &lt;FilesMatch "\.(jpg|jpeg|png|gif|swf|JPG)$"&gt;
 Header set Cache-Control "max-age=4838400, public"
 &lt;/FilesMatch&gt;
 &lt;FilesMatch "\.(css|js)$"&gt;
 Header set Cache-Control "max-age=4838400, private"
 &lt;/FilesMatch&gt;
 &lt;/IfModule&gt;</pre>
<p>W zasobach internetu znajdziecie inne podobnego rodzaju rozwiązania, warto jednak zwrócić uwagę, że w przypadku plików typu css i js Cache-Control musi mieć atrybut Private a nie Public. W przeciwnym wypadku aplikacja PSI w dalszym ciągu będzie wykazywać Wam te pliki jako takie, które nie mają określonej żywotności.</p>
<p>Pewnie niektórzy z Was zrodzi się pytanie: Czy te zmiany mają wpływ tylko i wyłącznie na punktację w PSI?</p>
<p>Oczywiście wprowadzanie tych zmian tylko i wyłącznie w celu uzyskania lepszego wyniku nie ma większego sensu (poza satysfakcją). Zdecydowanie ważniejszą korzyścią jest to, że dzięki tym zmianom Apache instruuje przeglądarkę, aby w pierwszej kolejności starała się ładować pobierane zasoby z lokalnego dysku komputera użytkownika, a nie z sieci. Oczywiście przy pierwszym wywołaniu danego elementu (np. obrazka jpg) musi on zostać pobrany, jednak każde kolejne wywołanie tego elementu będzie powodowało odwołanie do pliku znajdującego się w cache przeglądarki. Zdecydowanie skraca to czas ładowania się stron, oraz zmniejsza ilość danych przesyłanych między serwerem a komputerem użytkownika.</p>
<p>A jak zmieniło to wynik uzyskiwany przez moją stronę w PSI? Poniżej znajdziecie zrzut:<br />
<img class=" wp-image-295 alignnone" style="border: 0px none;" alt="wynik w google PageSpeed Insight" src="http://www.mancando.pl/wp-content/uploads/2013/08/PSI_wynik.jpg" width="600" height="203" /></p>
<p>Jak widać naprawdę niezły skok :).</p>
 <!-- Easy Plugin for AdSense Unfiltered [count: 5 is not less than 5] -->]]></content:encoded>
			<wfw:commentRss>http://www.mancando.pl/cache-control-w-htaccess-czyli-jak-polepszyc-wynik-w-google-pagespeed-insight/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Osadzanie dodatkowych czcionek na stronach</title>
		<link>http://www.mancando.pl/osadzanie-dodatkowych-czcionek-na-stronach/</link>
		<comments>http://www.mancando.pl/osadzanie-dodatkowych-czcionek-na-stronach/#comments</comments>
		<pubDate>Tue, 13 Aug 2013 12:22:03 +0000</pubDate>
		<dc:creator><![CDATA[Piotrek]]></dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[programowanie]]></category>

		<guid isPermaLink="false">http://www.mancando.pl/?p=290</guid>
		<description><![CDATA[Czasami zdarza się, że zaawansowany projekt graficzny strony wymaga użycia niestandardowego kroju czcionek, który dodatkowo na stronie musi być wyświetlany jako tekst. W takich przypadkach wykluczone jest zastąpienie tego tekstu przez adekwatny element graficzny. Jedynym sensownym rozwiązaniem jest wskazanie przeglądarce &#8230; <a href="http://www.mancando.pl/osadzanie-dodatkowych-czcionek-na-stronach/">Czytaj dalej <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.mancando.pl/wp-content/uploads/2013/08/css.png" rel="lightbox[290]"><img class="alignright size-full wp-image-287" style="border: 0px none;" alt="css" src="http://www.mancando.pl/wp-content/uploads/2013/08/css.png" width="70" height="62" /></a>Czasami zdarza się, że zaawansowany projekt graficzny strony wymaga użycia niestandardowego kroju czcionek, który dodatkowo na stronie musi być wyświetlany jako tekst. W takich przypadkach wykluczone jest zastąpienie tego tekstu przez adekwatny element graficzny. Jedynym sensownym rozwiązaniem jest wskazanie przeglądarce użytkownika pliku z fontami.</p>
<p>W pliku css możliwe jest to za pomocą @fotn-face. W przypadku większości przeglądarek wystarczający jest plik TTF, niestety Internet Explorer jest tu wyjątkiem wymagającym specjalnego traktowania. Od wersji 6 do wersji 8 operacja ta obsługiwana jest za pomocą pliku z EOT (Embedded OpenType).</p>
<p><span id="more-290"></span><br />
Dosyć dużym problemem jest wygenerowanie prawidłowo działającego pliku EOT. Teoretycznie pomoc powinno stanowić narzędzie WEFT dostarczane przez Microsoft. Niestety program ten jest bardzo stary i w większości wypadków mówiąc delikatnie działa mało zadowalająco (bardzo często zawiesza się oraz wypuszcza nieprawidłowe pliki). Obecnie jedynym w pełni działającym narzędziem (jakie znalazłem) umożliwiającym utworzenie sprawnego pliku EOT jest konwerter online dostępny pod wskazanym adresem:<br />
<a href="http://www.kirsle.net/wizards/ttf2eot.cgi">http://www.kirsle.net/wizards/ttf2eot.cgi</a></p>
<p>IE9 wnosi kolejną zmianę do obsługi ładowanych czcionek. W tej wersji przeglądarki obsługa opiera się na nowym formacie plików WOFF (Web Open Font Format) opracowanym przez W3C. Najprawdopodobniej w przyszłości będzie to ogólny standard przyjęty przez wszystkie popularne przeglądarki.</p>
<p>Stosowanie @font-face w pliku CSS, wymaga bardzo starannej deklaracji, szczególnie istotna jest kolejność formatów plików. Poniżej znajdziecie prawidłową kolejność, która powinna działać poprawnie na wszystkich popularnych przeglądarkach (również mobilnych):</p>
<p>@font-face {<br />
font-family: ‚MyWebFont';<br />
src: url(‚/katalog/nazwaPliku.eot’);<br />
src: url(‚/katalog/nazwaPliku.eot?#iefix’) format(‚embedded-opentype’),<br />
url(‚/katalog/nazwaPliku.woff’) format(‚woff’),<br />
url(‚/katalog/nazwaPliku.TTF’)  format(‚truetype’)<br />
font-weight: normal;<br />
font-style: normal;<br />
}</p>
<p>&nbsp;</p>
 <!-- Easy Plugin for AdSense Unfiltered [count: 5 is not less than 5] -->]]></content:encoded>
			<wfw:commentRss>http://www.mancando.pl/osadzanie-dodatkowych-czcionek-na-stronach/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache &#8211; Ładowanie pliku CSS przez linkowanie HTTP w nagłówku</title>
		<link>http://www.mancando.pl/apache-ladowanie-pliku-css-przez-linkowanie-http-w-naglowku/</link>
		<comments>http://www.mancando.pl/apache-ladowanie-pliku-css-przez-linkowanie-http-w-naglowku/#comments</comments>
		<pubDate>Thu, 08 Aug 2013 11:07:56 +0000</pubDate>
		<dc:creator><![CDATA[Piotrek]]></dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[programowanie]]></category>

		<guid isPermaLink="false">http://www.mancando.pl/?p=285</guid>
		<description><![CDATA[Jedną z ciekawszych właściwości jakie daje Apache to linkowanie przez nagłówek dokumentu. Dodając poniższą linię kodu w pliku .htaccess: Header add Link ";rel=stylesheet;type=text/css" spowodujemy, że w nagłówku każdego wywołanego dokumentu (który znajduje się pod &#8222;wpływem&#8221; tego pliku .htacces) zostanie dodane &#8230; <a href="http://www.mancando.pl/apache-ladowanie-pliku-css-przez-linkowanie-http-w-naglowku/">Czytaj dalej <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-287" style="border: 0px none;" alt="css" src="http://www.mancando.pl/wp-content/uploads/2013/08/css.png" width="70" height="62" />Jedną z ciekawszych właściwości jakie daje Apache to linkowanie przez nagłówek dokumentu. Dodając poniższą linię kodu w pliku <strong>.htaccess</strong>:<br />
<code>Header add Link ";rel=stylesheet;type=text/css"</code><br />
spowodujemy, że w nagłówku każdego wywołanego dokumentu (który znajduje się pod &#8222;wpływem&#8221; tego pliku <strong>.htacces</strong>) zostanie dodane odwołanie do wskazanego arkusza<strong> main.css</strong>.</p>
<p>Pewnie w tym momencie zaświecą się oczy wielu osobom, które chciały by ukryć w ten sposób arkusz stylów przed &#8222;przeciętnymi&#8221; użytkownikami. Niestety muszę ostudzić Wasz zapał, gdyż ta metoda linkowania ma również jedną bardzo dużą wadę dyskwalifikującą ją z powszechnego użycia &#8230; w tej chwili metoda ta jest obsługiwana jedynie przez Operę i Firefoxa.</p>
<p>W dalszym ciągu tego sposobu ładowania pliku CSS można użyć jeśli chcemy dodać &#8222;spersonalizowane&#8221; style dla przeglądarek obsługujących tę metodę linkowania. Na chwilę obecną to chyba jedne sensowne zastosowanie dla tej metody.</p>
 <!-- Easy Plugin for AdSense Unfiltered [count: 5 is not less than 5] -->]]></content:encoded>
			<wfw:commentRss>http://www.mancando.pl/apache-ladowanie-pliku-css-przez-linkowanie-http-w-naglowku/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Text do PNG &#8211; czyli jak korzystać z GD2</title>
		<link>http://www.mancando.pl/text-do-png-czyli-jak-korzystac-z-gd2/</link>
		<comments>http://www.mancando.pl/text-do-png-czyli-jak-korzystac-z-gd2/#comments</comments>
		<pubDate>Thu, 25 Jul 2013 14:04:29 +0000</pubDate>
		<dc:creator><![CDATA[Piotrek]]></dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programowanie]]></category>

		<guid isPermaLink="false">http://www.mancando.pl/?p=271</guid>
		<description><![CDATA[Biblioteka GD2 to jedno z ciekawszych narzędzi, które są dostępne w PHP znacznie poszerzając jego możliwości. Od dłuższego czasu biblioteka ta jest dostępna w ramach prawie każdego hostingu oferowanego na rynku. Warto więc zapoznać się z możliwościami GD2, gdyż jego &#8230; <a href="http://www.mancando.pl/text-do-png-czyli-jak-korzystac-z-gd2/">Czytaj dalej <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-50" style="border: 0px none;" alt="komputerek_php" src="http://www.mancando.pl/wp-content/uploads/2013/01/komputerek_php.png" width="70" height="73" /><strong>Biblioteka GD2</strong> to jedno z ciekawszych narzędzi, które są dostępne w PHP znacznie poszerzając jego możliwości. Od dłuższego czasu biblioteka ta jest dostępna w ramach prawie każdego hostingu oferowanego na rynku. Warto więc zapoznać się z możliwościami GD2, gdyż jego znajomość pozwala na wykonywanie bardzo ciekawych operacji. Z bardziej popularnych można wymienić choćby takie, jak: skalowanie rozmiaru pliku graficznego, tworzenie zupełnie nowych obrazów, zmiana typu pliku, konwersja koloru do przeźroczystości, nakładanie napisów na zdjęcia, odczyt danych EXIF &#8230; i wiele, wiele innych.</p>
<p>Jednym z popularnych zadań jakie może realizować GD to konwersja tekstu do pliku graficznego. Poniżej znajdziecie przykładowy listing w którym przestawiam realizację takiej operacji. Oczywiście należy potraktować ten kod bardziej jako przykład możliwości niż samo rozwiązanie tego zagadnienia.<br />
<span id="more-271"></span><br />
<code>&lt;?php<br />
header('Content-Type: image/png');</p>
<p>$text = intval($_GET['text']);</p>
<p>switch ($text) {<br />
case 1:<br />
$text = 'text1';<br />
break;<br />
case 2:<br />
$text = 'text2';<br />
break;<br />
case 3:<br />
$text = 'text3';<br />
break;<br />
default:<br />
$text = 'text0';<br />
break;<br />
}</p>
<p>$im = imagecreatetruecolor(100, 30);</p>
<p>$bg_color = imagecolorallocate($im, 255, 255, 255);<br />
$shadow_color = imagecolorallocate($im, 128, 128, 128);<br />
$tekst_color = imagecolorallocate($im, 140, 20, 20);</p>
<p>imagefilledrectangle($im, 0, 0, 99, 29, $bg_color);</p>
<p>putenv('GDFONTPATH=' . realpath('.'));<br />
$font='arial.ttf';</p>
<p>imagettftext($im, 20, 0, 14, 26, $shadow_color, $font, $text);<br />
imagefilter($im, IMG_FILTER_SMOOTH, 1);<br />
imagettftext($im, 20, 0, 12, 24, $tekst_color, $font, $text);</p>
<p>imagepng($im);<br />
imagedestroy($im);<br />
?&gt;</code></p>
<p>Omawianie początkowego kodu zawierającego definicję tekstów poddawanych konwersji pomijam, właściwe wykorzystanie GD2 rozpoczyna się na etapie tworzenia zasobu zawierającego obrazek. Za działanie to odpowiada funkcja: <code>imagecreatetruecolor()</code>. Argumenty tej funkcji to szerokość oraz wysokość utworzonego obrazka. Funkcja zwraca identyfikator zasobu lub &#8222;false&#8221; w przypadku błędnego działania. Utworzony obrazek będzie miał założone wymiary oraz zostanie wypełniony czarnym kolorem.</p>
<p>W kolejnym kroku definiowane są kolory przypisane do utworzonego obrazka. Operację tę realizuje funkcja <code>imagecolorallocate(resource $image , int $red , int $green , int $blue )</code>. Argumenty tej funkcji to: $image &#8211; identyfikator zasobu, $red &#8211; poziom wartości koloru czerwonego 0-255, $blue &#8211; poziom wartości koloru niebieskiego 0-255, $green &#8211; poziom wartości koloru zielonego 0-255. Jeśli zależy Wam aby przypisany kolor odpowiadał konkretnej barwie, to w celu uzyskania wartości jego składowych w przestrzeni barw RGB, najlepiej skorzystać z jednego z programów graficznych (GIMP, Photoshop) lub innego narzędzia, gdzie możecie podejrzeć te wartości.</p>
<p>Tak jak pisałem wcześniej, utworzony obrazek będzie w całości wypełniony czarnym kolorem. Korzystając w funkcji<code> imagefilledrectangle()</code> wypełnimy go w całości białym kolorem. Funkcja ta ma następujące argumenty: resource $image &#8211; identyfikator zasobu , int $x1 &#8211; wartość współrzędnej x punktu początkowego , int $y1 &#8211; wartość współrzędnej y punktu początkowego  , int $x2 &#8211; wartość współrzędnej x punktu końcowego, int $y2  &#8211; wartość współrzędnej y punktu końcowego, int $color &#8211; identyfikator koloru wykorzystanego do wypełnienia. Warto zwrócić uwagę, że wartości współrzędnych punktu początkowego i końcowego operują od 0, co oznacza że w przypadku naszego obrazka zakres wartości x mieści się w przedziale &lt;0,99&gt; a współrzędnej y w przedziale &lt;0,29&gt;.</p>
<p>Kolejna operacja jaką musimy wykonać, to podanie miejsca w którym znajdują się kroje czcionek jakie chcemy wykorzystać przy pomocy biblioteki GD2. Za wykonanie tej operacji odpowiada funkcja <code>putenv('GDFONTPATH=' . realpath('.'))</code>. Wynikiem działania tej funkcji jest przypisanie danej wartości do zmiennej środowiskowej serwera. Warto zauważyć, że wykonane działanie ma jedynie zasięg lokalny i jest widoczne jedynie dla danego skryptu PHP w którym funkcja została użyta. W naszym przypadku do zmiennej środowiskowej <strong>GDFONTPATH</strong> została przypisana wartość funkcji <code>realpath('.')</code>, czyli ścieżka do bieżącego katalogu w którym znajduje się skrypt. W przypadku, gdy plik z krojem czcionki znajduje się w innym katalogu, musicie wskazać poprawny adres do właściwego  katalogu.</p>
<p>W kolejnym kroku utworzymy cień do napisu. Budując tego typu obrazki musicie rozdzielić je na poszczególne warstwy składowe, które będą tworzone w odpowiedniej kolejności. Cień znajduje się nad tłem ale pod finalnym tekstem, więc musi być on utworzony między tymi warstwami.</p>
<p>Do transformacji tekstu na obraz posłużymy się funkcją <code>imagettftext()</code>. Funkcja ta ma następujące argumenty: $image &#8211; identyfikator zasobu , $size &#8211; wielkość textu , $angle &#8211; kąt pod jakim tekst będzie pisany , $x &#8211; wartość współrzędnej x początkowego punktu , $y &#8211; wartość współrzędnej y punktu , $color  &#8211; identyfikator koloru, $fontfile &#8211; ścieżka do pliku z krojem czcionki , $text &#8211; tekst przeznaczony do konwersji. W celu uzyskania bardziej rzeczywistego wyglądu cienia, stosując funkcję <code>imagefilter($im, IMG_FILTER_SMOOTH, 1)</code> &#8211; wykonamy rozmycie obrazka. Oczywiście rozmycie będzie dotyczyły bieżącego stanu w jakim znajduje się grafika, zastosowanie filtru nie ma wpływu na kolejne warstwy i efekty stosowane na dany obrazek.</p>
<p>Korzystając znów z funkcji <code>imagettftext()</code> dodamy właściwy tekst, który będzie przesunięty o 2 piksele w górę i w lewo w stosunku do cienia. W ostatnim kroku z uzyskanego zasobu $im uzyskamy finalny obrazek w postaci PNG. Działanie to realizowane jest za pośrednictwem polecenia <code>imagepng($im)</code>. Na samym końcu niszczymy utworzony zasób $im &#8211; <code>imagedestroy($im)</code>.</p>
<p>Wywołanie w przeglądarce pliku zawierającego powyższy kod, spowoduje wyświetlenie się utworzonego obrazka. Warto zauważyć, że w przypadku gdy nie prześlemy w nagłówku informacji o formacie pliku &#8211; <code>header('Content-Type: image/png')</code>; &#8211; po wywołaniu pliku w w oknie przeglądarki plik będzie prezentowany jako plik tekstowy a nie plik graficzny. Mam nadzieję że zachęciłem Was do nauki i zabawy z biblioteką GD2.</p>
 <!-- Easy Plugin for AdSense Unfiltered [count: 5 is not less than 5] -->]]></content:encoded>
			<wfw:commentRss>http://www.mancando.pl/text-do-png-czyli-jak-korzystac-z-gd2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Szybki eksport danych do CSV</title>
		<link>http://www.mancando.pl/szybki-eksport-danych-do-csv/</link>
		<comments>http://www.mancando.pl/szybki-eksport-danych-do-csv/#comments</comments>
		<pubDate>Thu, 14 Feb 2013 12:32:13 +0000</pubDate>
		<dc:creator><![CDATA[Piotrek]]></dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[CSV]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programowanie]]></category>

		<guid isPermaLink="false">http://mancando.pl/?p=74</guid>
		<description><![CDATA[Są takie sytuacje, gdy użytkownik korzystający ze strony internetowej, chce pozyskać zawartość tabeli lub też raportu, celem dalszej pracy z danym (np: wykorzystania danych w celu wykonania tradycyjnej papierowej korespondencji seryjnej). Do niedawna wymagało to od programisty pełnego oprogramowania funkcji &#8230; <a href="http://www.mancando.pl/szybki-eksport-danych-do-csv/">Czytaj dalej <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-50" style="border: 0px none;" alt="komputerek_php" src="http://mancando.pl/wp-content/uploads/2013/01/komputerek_php.png" width="70" height="73" />Są takie sytuacje, gdy użytkownik korzystający ze strony internetowej, chce pozyskać zawartość tabeli lub też raportu, celem dalszej pracy z danym (np: wykorzystania danych w celu wykonania tradycyjnej papierowej korespondencji seryjnej). Do niedawna wymagało to od programisty pełnego oprogramowania funkcji eksportujących dane do pliku. Od wersji PHP 5.1.0 jest to znacznie łatwiejsze gdyż udostępniono nowa funkcję<strong> fputcsv ($handle, $fields)</strong>, której zadaniem jest “wpychanie” danych tablicy do plików <strong>CSV</strong>.</p>
<p><span id="more-74"></span></p>
<h2>Przykład</h2>
<p>Od jakiegoś czasu bardzo chętnie stosuję tę funkcję. Muszę przyznać, że jest ona wygodna i znacznie ułatwia implementację eksportu danych do pliku. Poniżej znajdziecie przykładowy kod PHP w którym wykonano prosty eksport danych pozyskanych z bazy MySQL do pliku <strong>CSV</strong>, który ma być wykorzystywany w programach z pakietu MS Office.</p>
<p><code>$usersRes = $pdo-&gt;query('SELECT * FROM `user`');<br />
$users = $usersRes-&gt;fetchAll(PDO::FETCH_ASSOC);</code></p>
<p><code>$data = array();<br />
$data[0]['id_user'] = 'Id';<br />
$data[0]['f_name'] = 'Imię';<br />
$data[0]['s_name'] = 'Nazwisko';<br />
$data[0]['email'] = 'Email';<br />
$data[0]['city_c'] = 'Miejscowość';<br />
$data[0]['post_c'] = 'Kod pocztowy';<br />
$data[0]['phone_c'] = 'Telefon';<br />
$data[0]['add_date'] = 'Data rejestracji';</code></p>
<p><code>$datas = array_merge($data,$users);</code></p>
<p><code>foreach($datas as $key =&gt; $data){<br />
foreach($data as $key_s =&gt; $single_data){<br />
    $datas[$key][$key_s] = iconv("UTF-8","cp1250", $single_data);<br />
}<br />
}</code></p>
<p><code>$filename = 'users.csv';</code></p>
<p><code>$FileHandle = fopen($filename, 'w+') or die("can't open file");</code></p>
<p><code>foreach($datas as $key =&gt; $data) {<br />
fputcsv($FileHandle, $data, ';', '"');<br />
}</code></p>
<p><code>fclose($FileHandle);<br />
</code></p>
<h2>Omówienie kodu</h2>
<p>Idąc od góry &#8211; pobranie danych za pomocą <strong>PDO</strong> w postaci tablicy asocjacyjnej. Utworzenie tablicy $data zawierającej nagłówek dla tabeli. Złączenie tablicy (<code>array_merge</code>) z nagłówkami kolumn z tablicą z danymi. Kolejnym ważnym krokiem jest konwersja kodowania w pozyskanych danych w celu prawidłowego wyświetlania danych w programach uruchamianych w Windowsie. W pętli pojedyncze pola rekordów konwertowane są na kodowanie <strong>cp1250</strong> (właściwe dla MS Windows). W dalszej części tworzony jest uchwyt do podanego pliku csv (w+ &#8211; wskaźnik ustawiany na początku pliku, jeśli plik nie istnieje to będzie podjęta próba stworzenia go). Ostatnia część kodu odpowiada za wsad danych do pliku. I tyle :).</p>
<p>Bardzo szybkie i efektywne rozwiązanie wszelkiego rodzaju eksportów danych. Oczywiście można powyższy kod jeszcze uprościć, np dokonywać konwersji znaków na poziomie bazy danych (wykonanie zapytania: <code>SET NAMES CP1250;</code> przed właściwym zapytaniem pozyskującym dane) &#8230; ale takie zmiany pozostawiam już w Waszych rękach.</p>
 <!-- Easy Plugin for AdSense Unfiltered [count: 5 is not less than 5] -->]]></content:encoded>
			<wfw:commentRss>http://www.mancando.pl/szybki-eksport-danych-do-csv/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Duża liczba użytkowników = krótki czas trwania sesji</title>
		<link>http://www.mancando.pl/duza-liczba-uzytkownikow-krotki-czas-trwania-sesji/</link>
		<comments>http://www.mancando.pl/duza-liczba-uzytkownikow-krotki-czas-trwania-sesji/#comments</comments>
		<pubDate>Thu, 24 Jan 2013 15:01:29 +0000</pubDate>
		<dc:creator><![CDATA[Piotrek]]></dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programowanie]]></category>
		<category><![CDATA[session]]></category>

		<guid isPermaLink="false">http://mancando.pl/?p=38</guid>
		<description><![CDATA[Jednym z bardziej oczywistych sposobów na obsługę sytemu autoryzacji w PHP jest korzystanie ze zmiennych sesyjnych. Jest to w miarę proste i eleganckie rozwiązanie. Schody zaczynają się jednak w momencie, gdy liczba użytkowników rozbudowanego serwisu zwiększa się do tak dużej &#8230; <a href="http://www.mancando.pl/duza-liczba-uzytkownikow-krotki-czas-trwania-sesji/">Czytaj dalej <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-50" style="border: 0px none;" alt="komputerek_php" src="http://mancando.pl/wp-content/uploads/2013/01/komputerek_php.png" width="70" height="73" />Jednym z bardziej oczywistych sposobów na obsługę sytemu autoryzacji w PHP jest korzystanie ze zmiennych sesyjnych. Jest to w miarę proste i eleganckie rozwiązanie. Schody zaczynają się jednak w momencie, gdy liczba użytkowników rozbudowanego serwisu zwiększa się do tak dużej liczby, że dane utrzymywane w zmiennych sesyjnych będą zajmować maksymalne ilości pamięci zapisane w konfiguracji serwera. W takich sytuacjach długość trwania sesji ulegnie drastycznemu skróceniu a użytkownicy będą notorycznie wylogowywani z serwisu.</p>
<p>Wyczerpywanie limitu pamięci spowoduje, że zwiększanie wartości <code>session.gc_maxlifetime </code> w ini_set nie będzie dawało żadnych wymiernych korzyści. <code>Garbage collection</code> i tak notorycznie będzie niszczył najstarsze nieaktywne sesje. Ciągła rotacja powracających wylogowanych użytkowników będzie powodowała krótkie trwanie pozostałych sesji.<br />
<span id="more-38"></span><br />
W niektórych przypadkach można dokonać optymalizacji kodu źródłowego witryny, przez rezygnację z utrzymywania niektórych danych jako zmienne sesyjne. Będzie to jednak dosyć trudne do wykonania w przypadku obszernych istniejących już projektów. W takich przypadkach modyfikacja kodu będzie pracochłonna</p>
<p>Oczywiście można zwiększyć zasoby fizyczne serwera, lub też zmienić jego konfigurację. Jest to możliwe jedynie w sytuacjach, gdy masz pełną kontrolę nad serwerem. W większości wypadków, rozpatrując typowy hosting, rozwiązania te nie są możliwe do wykonania. W takich sytuacjach najlepszym i najprostszym sposobem będzie przeniesienie zawartości sesji z pamięci serwera do plików.</p>
<p>Wykonanie tej operacji jest stosunkowo proste. Można to zrobić na kilka sposobów. Dwa najprostsze to:<br />
umieszczenie w kodzie PHP następującego polecenia:<br />
<code>session_save_path('/sciezka/nazwa_katalogu');</code></p>
<p>lub umieszczenie w pliku .htaccess następującego wpisu:<br />
<code>php_value session.save_path /sciezka/nazwa_katalogu/</code></p>
<p>Same zmiany po stronie użytkownika witryny nie będą zauważalne (oczywistym poza wydłużeniem trwania sesji). Dodatkowymi korzyściami jakie możesz wyciągnąć z tych zmian to kontrola nad zalogowanymi użytkownikami. W katalogu, który przeznaczyłeś do przechowywania zawartości sesji, znajdziesz pliki, których nazwy wyglądają mniej więcej w ten sposób:</p>
<p><code>sess_004a0196f6d57c622454e5f0cb19678b</code></p>
<p>Część nazwy pliku po znaku &#8222;_&#8221; to identyfikator sesji. We wnętrzu pliku znajdziesz zserializowaną zawartość tej sesji. Dzięki w miarę prostej aplikacji napisanej w PHP można zbudować raport, który pozwoli na sprawdzenie którzy użytkownicy mają aktywne sesje, oraz podejrzenie zawartości ich sesji. Skasowanie pliku sesji jest równoznaczne z wylogowaniem użytkownika z witryny (zniszczeniem jego sesji). Pozwala to w łatwy sposób wylogować, pojedynczego użytkownika, grupę lub wszystkich użytkowników danego serwisu.</p>
<p>Dzięki znajomości identyfikatora sesji użytkownika możliwe jest również wykonanie operacji podszycia się pod dane zalogowane konto. Wystarczy skorzystać choćby z firefoxa wzbogaconego o dodatek firebug, który pozwala edytować wartości przechowywanych w cookies. Ta korzyść to jednak bardziej ciekawostka niż przydatna właściwość <img src="http://www.mancando.pl/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /> (być może jednak są osoby które skorzystają z tej opcji).</p>
<p>Osobiście korzystam z utrzymywania sesji w plikach, od ponad roku i jak na razie nie spotkałem się z sytuacją, aby rozwiązanie to miało jakiś niekorzystny wpływ na działanie serwisu. Od tamtej pory nie spotkałem się z uwagami co do działania sesji oraz długości ich trwania. Sesje trwają dokładnie tyle na ile ustawiony jest parametr session.gc_maxlifetime. Z czystym sumieniem mogę polecić to rozwiązanie :).</p>
 <!-- Easy Plugin for AdSense Unfiltered [count: 5 is not less than 5] -->]]></content:encoded>
			<wfw:commentRss>http://www.mancando.pl/duza-liczba-uzytkownikow-krotki-czas-trwania-sesji/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kaskadowe usuwanie rekordów w MySQL (mechanizm składowania InnoDB)</title>
		<link>http://www.mancando.pl/kaskadowe-usuwanie-rekordow-w-mysql-mechanizm-skladowania-innodb/</link>
		<comments>http://www.mancando.pl/kaskadowe-usuwanie-rekordow-w-mysql-mechanizm-skladowania-innodb/#comments</comments>
		<pubDate>Fri, 18 Jan 2013 11:43:20 +0000</pubDate>
		<dc:creator><![CDATA[Piotrek]]></dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[bazy danych]]></category>
		<category><![CDATA[InnoDB]]></category>
		<category><![CDATA[MyISAM]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programowanie]]></category>

		<guid isPermaLink="false">http://mancando.pl/?p=15</guid>
		<description><![CDATA[Wielu programistów korzystających w swoich projektach z tandemu złożonego z PHP i MySQL poświęca swój czas na programową obsługę integralności danych znajdujących się w bazie. Jest oczywiście całkiem duże grono osób, które zupełnie nie zaprzątają sobie tym głowy. Śmietnik w &#8230; <a href="http://www.mancando.pl/kaskadowe-usuwanie-rekordow-w-mysql-mechanizm-skladowania-innodb/">Czytaj dalej <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-51" style="border: 0px none;" alt="komputerek_mysql" src="http://mancando.pl/wp-content/uploads/2013/01/komputerek_mysql.png" width="70" height="68" />Wielu programistów korzystających w swoich projektach z tandemu złożonego z <strong>PHP</strong> i <strong>MySQL</strong> poświęca swój czas na programową obsługę integralności danych znajdujących się w bazie. Jest oczywiście całkiem duże grono osób, które zupełnie nie zaprzątają sobie tym głowy. Śmietnik w bazie danych oczywiście nie zaszkodzi prostym małym projektom i może najwyżej zaszkodzić reputacji programisty tworzącemu tego typu serwisy. W przypadku rozbudowanych aplikacji w których baza danych składa się z dziesiątek tabel rozrastających się w trakcie życia projektu do rozmiarów liczonych w gigabajty, porządek jest już rzeczą niebagatelną i relatywnie wpływającą na szybkość działania witryny. Właśnie w takich przypadkach warto skorzystać z mechanizmów jakie oferują relacyjne bazy danych.</p>
<p><span id="more-15"></span></p>
<p>Kilka lat temu w <strong>MySQL</strong> domyślnym typem tabel był <strong>MyISAM</strong> i chociaż <strong>InnnoDB</strong> było wtedy już dostępne to jednak niewiele osób korzystało z tego rozwiązania. Szkoda, bo mimo pewnych wad, niewątpliwą zaletą <strong>InnoDB</strong> jest możliwość zrzucenia utrzymywania integralności danych na <strong>MySQL&#8217;a.</strong> Poświęcając odpowiednią ilość czasu na wykonanie prawidłowego projektu relacyjnej bazy danych opartej na tabelach typu <strong>InnoDB,</strong> nie będziemy tracić czasu na kodowanie odpowiednich metod utrzymujących integralność danych w bazie.</p>
<p>Jedną z podstawowych zalet mechanizmu składowania <strong>InnoDB,</strong> której nie posiada My<strong>I</strong>SAM to możliwość definiowania kluczy obcych w tabelach. W przypadku <strong>MyISAM</strong> klucze obce mogły być jedynie indeksowane, co oczywiście wpływało na na szybkość wykonywania zapytań jednak nie miało przełożenia na utrzymywanie integralności danych. Osobiście uważam, że w obecnej chwili poza wyjątkowymi sytuacjami praktycznie nie ma uzasadnienia by w swoich projektach wciąż kurczowo trzymać się <strong>MyISAM.</strong> Część osób w tym momencie powie, że <strong>InnoDB</strong> nie ma wyszukiwania pełno-tekstowego (<strong>Full-text search indexes</strong>) &#8230; <strong>no cóż od wersji 5.6.4 już ma</strong>, więc jeśli dysponujesz taką lub wyższą wersją MySQL, to wtedy pada ostatni bastion by nie używać <strong>InnoDB.</strong></p>
<p>Warto zauważyć, że w przypadku istniejących tabel, zmiana mechanizmu składowania nie wymaga ponownego tworzenia tabel. Zmianę można dokonać wykonując poniższe zapytanie:</p>
<p><code>ALTER TABLE `nazwa_tabeli` ENGINE = InnoDB</code></p>
<p>Metodę definiowania kluczy obcych opiszę na podstawie przykładów opartych na poniższym schemacie ERD prostej bazy danych:<img class="alignleft size-full wp-image-16" alt="Schemat tabel" src="http://mancando.pl/wp-content/uploads/2013/01/fk_pk.png" width="800" height="107" /></p>
<p>Baza składa się z dwóch tabel w których przechowywane są dane oraz jednej tabeli asocjacyjne, która je wiąże ze sobą. Po utworzeniu tabel i nadaniu odpowiednich indeksów na klucze można przejść do definiowania kluczy obcych.</p>
<p><code>ALTER TABLE `uzytkownik_typ` ADD FOREIGN KEY ( `id_uzytkownik` ) REFERENCES `uzytkownik` (`id_uzytkownik`) ON DELETE CASCADE ON UPDATE CASCADE ;</code></p>
<p><code>ALTER TABLE `uzytkownik_typ` ADD FOREIGN KEY ( `id_typ` ) REFERENCES `typ` (`id_typ`) ON DELETE CASCADE ON UPDATE CASCADE ;</code></p>
<p><strong>I już! Dzięki tym prostym zabiegom uzyskaliśmy pełną integralność danych w bazie, oraz kaskadowe usuwanie rekordów.</strong> Oznacza to, że każdorazowe usunięcie rekordu z tabeli `typ` lub też `uzytkownik` spowoduje usunięcie wszystkich wystąpień kasowanego klucza obcego w tabeli `uzytkownik_typ`. Przykład:</p>
<p><code>DELETE FROM `uzytkownik` WHERE `uzytkownik`.`id_uzytkownik` = 1</code></p>
<p>Wykonanie powyższego zapytania spowoduje usunięcie z tabeli `uzytkownicy` rekordu o identyfikatorze 1. Mechanizmy bazy danych, dążące do utrzymania integralności danych w tabelach wykonaja jednak również usunięcie wszystkich typów przypisanych do kasowanego użytkownika. Usnięte zostaną wszystkie rekordy z tabeli `uzytkownik_typ` w których wartość klucza obcego `id_uzytkownik` są równe 1.</p>
<p>Analogiczna sytuacja będzie występować w przypadku zmiany wartości klucza głównego w tabeli, `uzytkownik` lub `typ`. Każda z takich zmian będzie kaskadowo przenoszona na tabelę asocjacyjną `uzytkownik_typ`.</p>
<p>Jedna uwaga odnośnie modyfikacji istniejących tabel. Sama <strong>zmiana mechanizmów składowania na InnoDB nie wymaga zachowania integralności, jednak zdefiniowanie kluczy obcych wymaga doprowadzenia tabel do porządku</strong>. Sytuacja gdy tabela będzie  zwiera rekordy w których występują klucze obce, których nie ma w macierzystej, spowoduje zablokowanie możliwości ich zdefiniowania. W takich przypadkach przed definiowaniem kluczy obcych, dane w tabeli muszą być w pełni uporządkowane względem pozostałych tabel. Musisz samodzielnie przeprowadzić integrację tabel.</p>
 <!-- Easy Plugin for AdSense Unfiltered [count: 5 is not less than 5] -->]]></content:encoded>
			<wfw:commentRss>http://www.mancando.pl/kaskadowe-usuwanie-rekordow-w-mysql-mechanizm-skladowania-innodb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL NULL == (decimal) 0.00</title>
		<link>http://www.mancando.pl/mysql-null-decimal-0-00/</link>
		<comments>http://www.mancando.pl/mysql-null-decimal-0-00/#comments</comments>
		<pubDate>Thu, 17 Jan 2013 18:26:42 +0000</pubDate>
		<dc:creator><![CDATA[Piotrek]]></dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[bazy danych]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programowanie]]></category>

		<guid isPermaLink="false">http://mancando.pl/?p=8</guid>
		<description><![CDATA[Dziś MySQL zapewnił mi dość ciekawe doświadczenie. Spotkałem się z dziwną właściwością tej bazy danych. Jedna z tabel jaką wykorzystuję w pracy ma zdefiniowane pole WYNIK jako: decimal(3,2) a domyślna wartość tego pola to NULL. Tabela ta jest wykorzystywana jako &#8230; <a href="http://www.mancando.pl/mysql-null-decimal-0-00/">Czytaj dalej <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-50" style="clear: right; border: 0px none;" alt="komputerek_php" src="http://mancando.pl/wp-content/uploads/2013/01/komputerek_php.png" width="70" height="73" />Dziś MySQL zapewnił mi dość ciekawe doświadczenie. Spotkałem się z dziwną właściwością tej bazy danych. Jedna z tabel jaką wykorzystuję w pracy ma zdefiniowane pole WYNIK jako: <code>decimal(3,2)</code> a domyślna <img class="alignright size-full wp-image-51" style="border: 0px none; clear: right;" alt="komputerek_mysql" src="http://mancando.pl/wp-content/uploads/2013/01/komputerek_mysql.png" width="70" height="68" />wartość tego pola to NULL. Tabela ta jest wykorzystywana jako miejsc w którym trzymane są wyniki testów punktowanych lub zapisywany jest bieżący stan odpowiedzi.</p>
<p>W zależności od zawartości pola WYNIK test traktowany jest jako zapisany (wartość NULL) lub wysłany (wartość liczbowa decimal z uzyskanym wynikiem). W ostatnim czasie spotkałem się z dziwnym zachowaniem tego mechanizmu testów punktowanych. Korzystając z formularza otwartego w kilku oknach, można było nadpisać pierwotnie wysłane dane z odpowiedziami testu. Błąd ten wynikał z faktu, że mechanizm nie rozpoznawał w prawidłowy sposób statusu wysłanego testu. Było to o tyle dziwne, że patrząc od strony rekordów znajdujących się w bazie danych wyglądało to całkowicie prawidłowo.</p>
<p><span id="more-8"></span></p>
<p>Za brak prawidłowego rozpoznania odpowiedzialny był MySQL, dla którego wartość pola WYNIK = NULL jest równoważne z wartością pola WYNIK = 0.00.</p>
<p>W celu sprawdzenia statusu danego testu wykonywane było sprawdzenie liczby rekordów zwracanych przez poniższe zapytanie:<br />
<code>SELECT *FROM `test`<br />
WHERE `id_uzytkownika` =1<br />
AND `punkty` != NULL</code><br />
w obu przypadkach zwróci ten sam wynik, czyli <strong>0 rekordów</strong>.</p>
<p>Sposób na szybkie sprawdzenie rzeczywistego statusu testu to pobranie rekordu danego użytkownika a następnie <strong>sprawdzenie wartości pola już po stronie PHP</strong>. Można to zrealizować choćby w ten sposób:</p>
<p><code>$test_wyslany=0;<br />
if (!empty($test['WYNIK'])) {<br />
$test_wyslany=1;<br />
}</code></p>
<p>$test &#8211; tablica z wynikiem powyższego zapytania SQL</p>
<p>Ot taka ciekawostka ze styku programowania i właściwości baz danych.<br />
ddd</p>
 <!-- Easy Plugin for AdSense Unfiltered [count: 5 is not less than 5] -->]]></content:encoded>
			<wfw:commentRss>http://www.mancando.pl/mysql-null-decimal-0-00/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
