<?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/category/programowanie-2/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>Od XLS do CSV &#8211; szybki wsad do bazy danych MySQL</title>
		<link>http://www.mancando.pl/od-xls-do-csv-szybki-wsad-do-bazy-danych-mysql/</link>
		<comments>http://www.mancando.pl/od-xls-do-csv-szybki-wsad-do-bazy-danych-mysql/#comments</comments>
		<pubDate>Fri, 04 Oct 2013 12:21:28 +0000</pubDate>
		<dc:creator><![CDATA[Piotrek]]></dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[bazy danych]]></category>
		<category><![CDATA[CSV]]></category>
		<category><![CDATA[MyAdmin]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[xls]]></category>

		<guid isPermaLink="false">http://www.mancando.pl/?p=359</guid>
		<description><![CDATA[Są takie sytuacje gdy wymagane jest wykonanie szybkiego wsadu danych do tabeli. Oczywiście można na prędce stworzyć odpowiedni skrypt PhP, który przetworzy dane wsadowe do postaci zapytań SQL. Jednak nie zawsze ma to uzasadnienie i nie zawsze ilość czasu jest &#8230; <a href="http://www.mancando.pl/od-xls-do-csv-szybki-wsad-do-bazy-danych-mysql/">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-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" />Są takie sytuacje gdy wymagane jest wykonanie szybkiego wsadu danych do tabeli. Oczywiście można na prędce stworzyć odpowiedni skrypt PhP, który przetworzy dane wsadowe do postaci zapytań SQL. Jednak nie zawsze ma to uzasadnienie i nie zawsze ilość czasu jest wystarczająca na stworzenie takiego mechanizmu.</p>
<p>Właśnie w takich sytuacjach przydatna może być <img class="alignright size-full wp-image-44" style="border: 0px none;" alt="komputerek" src="http://www.mancando.pl/wp-content/uploads/2013/01/komputerek.png" width="70" height="50" />kombinacja dwóch narzędzi: phpMyadmin i &#8230; to nie żart Ms Excel. Arkusz kalkulacyjny posłuży nam jako narzędzie do preparowania odpowiednio sformatowanego pliku CSV. Phpmyadmin posłuży nam natomiast do wykonania natychmiastowego wsadu do bazy.</p>
<p><span id="more-359"></span></p>
<p style="text-align: center;"><img class="size-full wp-image-358 aligncenter" alt="wsad1" src="http://www.mancando.pl/wp-content/uploads/2013/10/wsad1.jpg" width="408" height="695" /></p>
<p>Na potrzeby tego tutorialu stworzę wirtualną potrzebę wykonania wsadu do tabeli o poniższym wyglądzie</p>
<p><code>id_kw (int) AUTO_INCREMENT<br />
name (varchar)<br />
cond (int)</code></p>
<p>Jako wsad wykorzystany będzie plik xls zwierający kilkaset słów kluczowych.<br />
W pierwszej kolejności wymagane jest odpowiednie sformatowanie pliku xls, do takiej postaci odzwierciedlającej strukturę tabeli. Pierwsza kolumna musi pozostać pusta &#8211; jest to kolumna odpowiadająca polu identyfikatora id_kw. W trzeciej kolumnie możemy dodać wartość początkową pola cond, lub pozostawić ją pustą w przypadku, gdy w strukturze tabeli określona jest wartość domyślna. Ja pozostawiam to pole puste.</p>
<p>Kolejnym etapem jest dodanie obrysu do wszystkich komórek arkusza odpowiadających wartościom pól tabeli. Zaznaczcie w Excelu &#8222;zawartość&#8221; tabeli a następnie zwykły obrys, efekt powinien być taki jak poniżej.</p>
<p style="text-align: center;"><img class="size-full wp-image-357 aligncenter" alt="wsad2" src="http://www.mancando.pl/wp-content/uploads/2013/10/wsad2.jpg" width="407" height="708" /></p>
<p>Na tym etapie może Was nieco dziwić to postępowanie jednak za chwilę zrozumiecie sens takiego działania. Zapiszcie bieżącą postać jako plik csv rozdzielany przecinkami (czytajcie uważnie pytania zadawane przez Excel i odpowiadajcie mądrze :D).</p>
<p>Otrzymany plik otwórzcie za pomocą jakiegoś edytora (najlepiej takiego który pozwala kontrolować kodowanie znaków). Pierwsze co pewnie zauważycie to fakt, że CSV rozdzielany przecinkami &#8230; jest rozdzielany średnikami (szczegół <img src="http://www.mancando.pl/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /> ). Obrysowanie dodatkowej pustej kolumny spowodowało, że po słowach kluczowych pojawił się dodatkowy średnik, który odpowiada polu cond.</p>
<p>Plik w obecnej postaci nie pozwoli Wam wykonać prawidłowego wsadu, jego kodowanie jest w ANSI. Przy bazie danych z kodowaniem UTF spowoduje oczywiście błędne wyświetlanie polskich krzaczków. Zmieńcie kodowanie znaków w pliku i zapiszcie go ponownie.</p>
<p>Przejdźmy teraz do phpMyadmina w którym wykonamy właściwy import danych. Wybierzcie odpowiednią tabele z bazy danych a następnie naciśnijcie zakładkę Import. W polu format wybierzcie CSV. Następnie musicie zmienić dolne opcje &#8211; Kolumny oddzielone: ustawcie ; . Pozostałe opcje możecie zostawić bez zmian. Naciśnijcie przycisk wykonaj &#8230; tabela zostanie wypełniona danymi. I gotowe … prawda, że szybko!</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/od-xls-do-csv-szybki-wsad-do-bazy-danych-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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[<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 Unfiltered [count: 5 is not less than 5] -->]]></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>MySQL &#8211; Zliczenie ilości rekordów w miesięcznym zestawieniu</title>
		<link>http://www.mancando.pl/mysql-zliczenie-ilosci-rekordow-w-miesiecznym-zestawieniu/</link>
		<comments>http://www.mancando.pl/mysql-zliczenie-ilosci-rekordow-w-miesiecznym-zestawieniu/#comments</comments>
		<pubDate>Fri, 02 Aug 2013 08:42:42 +0000</pubDate>
		<dc:creator><![CDATA[Piotrek]]></dc:creator>
				<category><![CDATA[Programowanie]]></category>

		<guid isPermaLink="false">http://www.mancando.pl/?p=280</guid>
		<description><![CDATA[Opracowanie zbiorczych podsumowań oraz generowanie statystyk zawartości danej tabeli to jedno z bardziej żmudnych zadań do wykonania. Pewnie nie raz zastanawialiście się jak w szybki sposób zliczyć ilość rekordów wpisanych w danym miesiącu w danym roku. Funkcję zliczenia ilości rekordów &#8230; <a href="http://www.mancando.pl/mysql-zliczenie-ilosci-rekordow-w-miesiecznym-zestawieniu/">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://www.mancando.pl/wp-content/uploads/2013/01/komputerek_mysql.png" width="70" height="68" />Opracowanie zbiorczych podsumowań oraz generowanie statystyk zawartości danej tabeli to jedno z bardziej żmudnych zadań do wykonania. Pewnie nie raz zastanawialiście się jak w szybki sposób zliczyć ilość rekordów wpisanych w danym miesiącu w danym roku. Funkcję zliczenia ilości rekordów zapisanych do tabeli w podziale na miesiące można wykonać za pomocą PHP, wykonując stosowne działania w oparciu o wynik zapytania zwracającego pełną zawartość tabeli. Nie jest to jednak zbyt optymalny sposób na uzyskanie wyniku.<br />
<span id="more-280"></span><br />
W bazie danych MySQL (wykonując tylko jedno zapytanie), można bardzo szybko uzyskać zestawienie prezentujące liczbę rekordów zapisanych do tabeli w danym miesiącu danego roku. Poniżej prezentuję przykładowe zapytanie SQL zwracające taki wynik:</p>
<p><code>SELECT COUNT(*), DATE_FORMAT(date,'%Y-%m') as y_m FROM `page` GROUP BY y_m ORDER BY y_m DESC</code></p>
<p>Zapytanie to operuje na tabeli o następującej strukturze:</p>
<p><code>id_page (int 6)<br />
title (varchar 32)<br />
content (text)<br />
date (datetime)</code></p>
<p>Zwrócony wynik będzie mieć następującą postać:</p>
<p><code>y_m liczba</code></p>
<p><code>2013-07 10<br />
2013-06 5<br />
2013-05 12</code></p>
<p>Powyższe zapytanie wykorzystuję funkcję <code>DATE_FORMAT()</code>, która pozwala na sformatowanie daty wedle określonych kryteriów. W tym przypadku wykorzystałem format %Y &#8211; rok w postaci 4 cyfr, %m &#8211; miesiąc w postaci 2 cyfr. Dodatkowo wykonane jest pogrupowanie oraz zliczenie rekordów dla tak zwróconej daty wpisu.</p>
 <!-- Easy Plugin for AdSense Unfiltered [count: 5 is not less than 5] -->]]></content:encoded>
			<wfw:commentRss>http://www.mancando.pl/mysql-zliczenie-ilosci-rekordow-w-miesiecznym-zestawieniu/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>Odrobinę lewy LEFT JOIN z NULL</title>
		<link>http://www.mancando.pl/odrobine-lewy-left-join-z-null/</link>
		<comments>http://www.mancando.pl/odrobine-lewy-left-join-z-null/#comments</comments>
		<pubDate>Mon, 29 Apr 2013 08:47:51 +0000</pubDate>
		<dc:creator><![CDATA[Piotrek]]></dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[JOIN]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[null]]></category>

		<guid isPermaLink="false">http://mancando.pl/?p=133</guid>
		<description><![CDATA[Dziś zauważyłem kolejną ciekawą właściwość MySQL, którą warto odnotować. W przypadku wykonywania złożonych zapytań na &#8222;nierównych&#8221; tabelach z zastosowaniem złączenia typu LEFT (lub RIGHT) JOIN w wynikach możemy uzyskać rekordy w których część pól jest równa NULL. Jest to oczywista &#8230; <a href="http://www.mancando.pl/odrobine-lewy-left-join-z-null/">Czytaj dalej <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><img class="size-full wp-image-51 alignright" style="border: 0px none;" alt="komputerek_mysql" src="http://mancando.pl/wp-content/uploads/2013/01/komputerek_mysql.png" width="70" height="68" />Dziś zauważyłem kolejną ciekawą właściwość <strong>MySQL</strong>, którą warto odnotować. W przypadku wykonywania złożonych zapytań na &#8222;nierównych&#8221; tabelach z zastosowaniem złączenia typu <strong>LEFT</strong> (lub <strong>RIGHT</strong>) <strong>JOIN</strong> w wynikach możemy uzyskać rekordy w których część pól jest równa <strong>NULL</strong>. Jest to oczywista konsekwencja niepełnych danych w jednaj (lub obu) tabelach. Nie zawsze jest to normalny i pożądany stan bazy danych, ale ten temat pomińmy. <span id="more-133"></span></p>
<p>Poniżej znajdziecie najprostszą postać zapytanie z LEFT JOIN:</p>
<p><code>SELECT * FROM t1 LEFT JOIN t2 ON (column1)</code></p>
<p>Wynik tego zapytania zwrócony przez bazę danych to lista rekordów z pełnymi danymi oraz takimi w których część pól jest równa NULL. Lista obejmuje więc rekordy występujące w obu tabelach oraz w tabeli t1. Właściwością MySQL którą chciałem opisać jest to, że w przypadku takich zapytań <strong>dodanie warunku WHERE na kolumnie, która zawiera wartości NULL spowoduje usunięcie również tych rekordów w których dane pole jest równe NULL</strong>.</p>
<p><code>SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2 NOT LIKE 'clause';</code></p>
<p>Wykonanie powyższego zapytania uszczupli zwrócone wyniki nie tylko o te spełniające warunek WHERE, ale również usunie wszystkie rekordy w których przypadku wartość t2.column2 jest NULL. Taki sposób działania bazy danych nieco mnie zaskoczył. Osobiście oczekiwałem, że w wyniku działania warunku WHERE otrzymam listę zawierającą również te rekordy które występowały jednostronnie.</p>
<p>Jedynym sensownym rozwiązaniem w takim przypadku jest dodanie dodatkowego warunku zdefiniowanego w następujący sposób:</p>
<p><code>SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2 NOT LIKE 'clause' OR t2.column2 IS NULL';</code></p>
<p>Kolejny raz potwierdza się to, że baza <strong>MySQL traktuje NULL dosyć wyjątkowo</strong>, więc lepiej uważać jeśli jesteście zmuszeni programować zapytania na tabelach (lub wynikach zapytań), które będą zwracać rekordy zawierające takie wartości.</p>
 <!-- Easy Plugin for AdSense Unfiltered [count: 5 is not less than 5] -->]]></content:encoded>
			<wfw:commentRss>http://www.mancando.pl/odrobine-lewy-left-join-z-null/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>PDO &#8211; PHP Data Objects &#8211; łatwe początki</title>
		<link>http://www.mancando.pl/pdo-php-data-objects-latwe-poczatki/</link>
		<comments>http://www.mancando.pl/pdo-php-data-objects-latwe-poczatki/#comments</comments>
		<pubDate>Thu, 07 Feb 2013 08:28:31 +0000</pubDate>
		<dc:creator><![CDATA[Piotrek]]></dc:creator>
				<category><![CDATA[Programowanie]]></category>

		<guid isPermaLink="false">http://mancando.pl/?p=65</guid>
		<description><![CDATA[&#160; Od wersji PHP 5.5.0 tworzenie nowego kodu wykorzystującego rozszerzenie Mysql nie jest zalecane. Co więcej rozszerzenie to uzyskało status &#8222;deprecated&#8221; i (prawdopodobnie) zgodnie z zapowiedzią w dalekiej nieoznaczonej przyszłości zostanie usunięte. Jeśli w dalszym ciągu korzystasz z funkcji takich &#8230; <a href="http://www.mancando.pl/pdo-php-data-objects-latwe-poczatki/">Czytaj dalej <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Od wersji PHP 5.5.0 tworzenie nowego kodu wykorzystującego <img class="alignright size-full wp-image-50" style="border: 0px none; clear: right;" alt="komputerek_php" src="http://mancando.pl/wp-content/uploads/2013/01/komputerek_php.png" width="70" height="73" /> rozszerzenie Mysql nie jest zalecane. Co więcej rozszerzenie to uzyskało status &#8222;deprecated&#8221; i (prawdopodobnie) zgodnie z zapowiedzią w dalekiej nieoznaczonej przyszłości zostanie usunięte. Jeśli w dalszym ciągu <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" /> korzystasz z funkcji takich jak mysql_connect i mysql_query to chyba najwyższy czas abyś zaczął korzystać z biblioteki <strong>PDO</strong>. Od wersji PHP 5.1 jest ona nowym integralnym interfejsem przeznaczonym do obsługi komunikacji z bazą danych. Specjalnie nie piszę z jakiego typu bazą danych gdyż jedną z wielkich zalet tego interfejsu jest jego uniwersalność. <strong>PDO</strong> daje możliwość podłączenia się z praktycznie każdą popularną bazą danych obecną na naszym rynku, warto wspomnieć choćby o takich bazach danych jak: MySQL, MS SQL, Oracle, PostgreSQL, SQLite.<br />
<span id="more-65"></span><br />
Rozwinięcie skrótu PDO, czyli <strong>PHP Data Objects</strong>, od razu sugeruje nam (zgodnie z prawdą), że interfejs ten jest w pełni OOP. Połączenie z bazą definiowane jest już na etapie tworzenia obiektu klasy PDO. Przykładowy kod prezentujący taką akcję znajdziecie poniżej:</p>
<p><code>define("DBHOST", "nazwa.hosta.pl");<br />
define("DBNAME", "nazwa_bazy");<br />
define("USER", "nazwa_uzytkownika");<br />
define("PASS", "haslo_uzytkownika");</code></p>
<p><code>try {<br />
$dsn = "mysql:host=" . DBHOST . "; dbname=".DBNAME ;<br />
$pdo = new PDO($dsn,USER,PASS);<br />
} catch (PDOException $e) {<br />
print $komunikat;<br />
}</code></p>
<p>Oczywiście nie musicie trzymać się takiej konwencji. Jeśli nie chcecie korzystać ze stałych, nic nie stoi na przeszkodzie by zamienić je na zmienne. Warto zwrócic uwagę na pierwszy paramtr $dsn. W zmiennej tej zawarty jest skrót nazwy bazy danych (DSN &#8211; Data Source Name) wykorzystanej jako źródło danych. W zależności od typu bazy danych wykorzystywany jest odpowiedni sterownik niezbędny do wykonania połączenia z dana bazą. Przykładowe skróty DSN popularnych baz danych znajdziecie poniżej:</p>
<p>sqlsrv &#8211; MS SQL, Azure<br />
pgsql &#8211; PostgreSQL<br />
mysql &#8211; MySQL<br />
oci &#8211; Oracle<br />
sqlite &#8211; SQLite</p>
<p>Ważne jest przechwycenie wyjątku przy podłączeniu, gdyż domyślny komunikat o błędzie wygenerowany przez PHP ujawni nazwę użytkownika oraz nazwę bazy, co nie jest zbyt pożądanym rozwiązaniem. Warto by w takich wypadkach pojawiał się zdefiniowany przez nas własny komunikat.</p>
<p>Wykonywanie zapytań PDO.</p>
<p>Wykonanie zapytań SQL jest bardzo proste i wymaga jedynie wywołania odpowiedniej metody utworzonego obiektu PDO. Poniższy kod prezentuje pobranie danych z tabeli:</p>
<p><code>$usersRes = $pdo-&gt;query('SELECT * FROM `user`');<br />
$usersCount = $usersRes-&gt;rowCount();<br />
$users = $usersRes-&gt;fetchAll(PDO::FETCH_ASSOC);</code></p>
<p>Wykonanie metody query spowoduje utworzenie nowego obiektu klasy PDOStatement. W powyższym przykładzie wykorzystano dwie metody z tej klasy: rowCount(), oraz fetchAll(). Pierwszy z nich pozwala uzyskać liczbę wierszy zwróconych przez zapytanie (w przypadku zapytań typu INSERT, UPDATE, DELETE metoda ta zwróci liczbę wierszy objętych modyfikacją). Uwaga metoda rowCount może nie działać w przypadku niektórych baz danych.</p>
<p>Metoda <code>fetchAll($fetch_style)</code> zwraca tablicę z wynikami. Domyślny argumentem $fetch_style tej metody jest FETCH_BOTH, co powoduje, że zwracana tablica zawiera dane w postaci asocjacyjnej (indeksy odpowiadają nazwom pól tabeli) oraz liczbowej (liczby odpowiadające kolejności pól tabeli z zapytania). PDO::FETCH_ASSOC &#8211; pozwala ograniczyć zwracaną tablicę jedynie do stylu asocjacyjnego. Więcej informacji na temat różnych sposobów zwracania wyników znajdziecie na tej stronie: http://php.net/manual/en/pdostatement.fetch.php</p>
<p>Myślę, że te informacje będą wystarczające na dobry początek. Gorąco zachęcam do stosowania PDO. Szczególnie w przypadku gdy tworzony lub rozwijany projekt ma się cechować uniwersalnością i elastycznością w obsłudze różnego rodzaju baz danych.</p>
 <!-- Easy Plugin for AdSense Unfiltered [count: 5 is not less than 5] -->]]></content:encoded>
			<wfw:commentRss>http://www.mancando.pl/pdo-php-data-objects-latwe-poczatki/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
