<?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>IT blog &#187; PHP</title>
	<atom:link href="http://szj.cz/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://szj.cz</link>
	<description>internet, linux, novinky, programování</description>
	<lastBuildDate>Sat, 12 Sep 2015 11:14:32 +0000</lastBuildDate>
	<language>cs-CZ</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.2.2</generator>
	<item>
		<title>Ubuntu: Odesílání emailů na localhostu</title>
		<link>http://szj.cz/ubuntu-odesilani-emailu-na-localhostu/</link>
		<comments>http://szj.cz/ubuntu-odesilani-emailu-na-localhostu/#comments</comments>
		<pubDate>Sun, 25 Aug 2013 05:51:07 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[Gmail]]></category>
		<category><![CDATA[localhost]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[vývoj]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=828</guid>
		<description><![CDATA[Ve své podstatě tento článek volně navazuje na můj předchozí text, kde jsem prozradil, jak během vývoje webové aplikace pohodlně přijímat emaily za účelem testování správného chování. Ovšem k tomu, abychom si mohli zprávu přečíst, musí být nejprve odeslána. Velmi jednoduše lze tohoto cíle dosáhnout v Ubuntu po kontaktování služby Gmail. K doručení emailu se [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ve své podstatě tento článek volně navazuje na <a href="http://szj.cz/dva-tipy-jak-pri-vyvoji-pohodlne-testovat-emaily/">můj předchozí text</a>, kde jsem prozradil, jak během vývoje webové aplikace pohodlně přijímat emaily za účelem testování správného chování. Ovšem k tomu, abychom si mohli zprávu přečíst, musí být nejprve odeslána. Velmi jednoduše lze tohoto cíle dosáhnout v Ubuntu po kontaktování služby Gmail. K doručení emailu se použijí servery Google, a to i na localhostu.</p>
<p>Nejprve je nutno nainstalovat pomůcku jménem <strong>sSMTP</strong>. K tomu slouží tento příkaz:</p>
<pre class="brush: bash; title: ; notranslate">sudo apt-get install ssmtp</pre>
<p>Nyní následuje nezbytné nastavení. Ve svém oblíbeném editoru zobrazte obsah souboru <strong>/etc/ssmtp/ssmtp.conf</strong>. K uložení změn však pravděpodobně budete potřebovat rootovská práva. Dozajista se proto bude hodit následující:</p>
<pre class="brush: bash; title: ; notranslate">gksudo gedit /etc/ssmtp/ssmtp.conf</pre>
<p>S právy roota dojde k otevření požadovaného umístění v GUI editoru.</p>
<p>Konfigurační&nbsp;soubor obsahuje komentáře, které začínají mřížkou (<strong>#</strong>). Tyto řádky můžete ignorovat. Cílem je dosáhnout následujícího stavu:</p>
<pre class="brush: bash; title: ; notranslate">root=jmeno.prijmeni@gmail.com
mailhub=smtp.gmail.com:587
rewriteDomain=
hostname=jmeno.prijmeni@gmail.com
UseSTARTTLS=YES
FromLineOverride=YES
AuthUser=jmeno.prijmeni
AuthPass=nejakeTajneHesloKtereNikdoNevi</pre>
<p>Ne všechny konfigurační parametry jsou přítomny, a proto se neostýchejte je do souboru připsat.V mém případě šlo o <strong>UseSTARTTLS</strong>, <strong>AuthUser</strong> a <strong>AuthPass</strong>. Když v uvedeném příkladu uvádím jmeno.prijmeni@gmail.com, mám tím na mysli email, který ve službě Gmail používáte. Část <strong>jmeno.prijmeni</strong> tedy zaměňte za své uživatelské jméno.</p>
<p>Blížíme se do finále, tu náročnější část již máme za sebou. Pro editaci&nbsp;<strong>/etc/ssmtprevaliases</strong> zadejte:</p>
<pre class="brush: bash; title: ; notranslate">gksudo gedit /etc/ssmtp/revaliases</pre>
<p>Konfigurace vypadá takto:</p>
<pre class="brush: bash; title: ; notranslate">root:jmeno.prijmeni@gmail.com:smtp.gmail.com:587
uzivatelskeJmeno:jmeno.prijmeni@gmail.com:smtp.gmail.com:587</pre>
<p>Je nutno každému linuxovému uživateli jednotlivě povolit používání sSMTP. Vyznačenou část <strong>uzivatelskeJmeno</strong> tedy nahraďte loginem, kterým se do Ubuntu přihlašujete. Pokud jej neznáte, použijte příkaz <strong>who</strong>, který vám jej ochotně připomene. Vypíše totiž informace o aktuálně přihlášených účtech. Uživatelské jméno se poté nachází v pomyslné tabulce hned na prvním místě. V mém případě (viz screenshot) se jedná o login <strong>ubuntu</strong>.</p>
<p><a href="http://szj.cz/wp-content/uploads/2013/08/who.png"><img class="aligncenter size-full wp-image-829" title="who" src="http://szj.cz/wp-content/uploads/2013/08/who.png" alt="Příkaz who" width="644" height="173" /></a></p>
<p>K otestování správného nastavení poslouží tento příkaz:</p>
<pre class="brush: bash; title: ; notranslate">sudo ssmtp prijemce@domena.tld</pre>
<p>Po napsání své zprávy v terminálu stiskněte <strong>Enter</strong> a poté <strong>CTRL + D</strong>. Dojde k odeslání emailu nebo vypsání chybových hlášek.</p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/ubuntu-odesilani-emailu-na-localhostu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Použití Google Translate API v PHP</title>
		<link>http://szj.cz/pouziti-google-translate-api-v-php/</link>
		<comments>http://szj.cz/pouziti-google-translate-api-v-php/#comments</comments>
		<pubDate>Tue, 23 Jul 2013 10:08:10 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Programování]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Translate API]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[překlad]]></category>
		<category><![CDATA[překladač]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=795</guid>
		<description><![CDATA[Když se v současné době setkáte s požadavkem na vytvoření aplikace, která bude spoléhat na dostupné služby k překladu textu, zpravidla myšlenky směřují k využití Google Translate nebo Bing Translator. API u Google Translate není zdarma, platíte 20 dolarů za milión přeložených znaků. Bing Translator každý měsíc přeloží bezplatně 2 milióny znaků. Pokud potřebujete více, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Když se v současné době setkáte s požadavkem na vytvoření aplikace, která bude spoléhat na dostupné služby k překladu textu, zpravidla myšlenky směřují k využití Google Translate nebo Bing Translator. API u Google Translate není zdarma, platíte 20 dolarů za milión přeložených znaků. Bing Translator každý měsíc přeloží bezplatně 2 milióny znaků. Pokud potřebujete více, podívejte se na <a href="https://datamarket.azure.com/dataset/1899a118-d202-492c-aa16-ba21c33c06cb">ceník</a>. I když by mohlo nasazení služby Bing Translator vzhledem k provozním nákladům symbolizovat jasnou volbu, nezapomeňte si nejprve porovnat kvalitu překladu do cílového jazyka.</p>
<p>V mém případě se překlad textu svěřil vyhledávacímu gigantovi Google. I když dokumentace popisuje nasazení API v mnoha programovacích jazycích, nenašel jsem kontaktování služby v PHP s parametry, které jsem požadoval. Dozajista se proto bude hodit, když ukáži, jakým způsobem text překládám.</p>
<pre class="brush: php; title: ; notranslate">require_once './google-api-php-client/src/Google_Client.php';
require_once './google-api-php-client/src/contrib/Google_TranslateService.php';

function translate($from, $to, $what)
{
$client = new Google_Client();
$client-&gt;setApplicationName('JmenoAplikace');  
$client-&gt;setDeveloperKey('123456789');
$service = new Google_TranslateService($client);

$translations = $service-&gt;translations-&gt;listTranslations($what, $to, array(
                &quot;source&quot; =&gt; $from,
                &quot;format&quot; =&gt; &quot;html&quot;
));
            
return $translations[&quot;translations&quot;][0][&quot;translatedText&quot;];
}</pre>
<p>Pro snadnější práci využívám knihovnu pojmenovanou <a href="https://code.google.com/p/google-api-php-client/">Google API Client Library</a>. Tu stačí stáhnout a rozbalit do zvoleného umístění. Ve zdrojovém kódu následně připojíte soubor <strong>Google_Client.php</strong> a zvolenou službu, kterou budete používat. Já chci překládat text, a proto se poohlédnu po <strong>Google_TranslateService.php</strong> ze složky <strong>contrib</strong>. Nasleduje vložení vývojářského klíče. Ten se dozvíte po přihlášení do <a href="https://code.google.com/apis/console/">Google API Console</a> pod záložkou <strong>API Access</strong> konkrétního projektu. Zde hledejte část <strong>Simple API Access</strong>.</p>
<p>Nyní je na čase zavolat metodu, která obstará získání překladu. Já přitom znám původní jazyk i ten překládaný. Nepotřebuji proto, aby se jej Google snažil detekovat, v čemž ostatně u velmi krátkého překladu skládajícího se z jednoho slova ne vždy uspěje. Do parametrů <strong>$to</strong> a <strong>$from</strong> se jednoduše vloží ISO zkratka dle standardu <a href="https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes">639-1</a>, která má 2 znaky. Dále chci, aby Google přeložil text obsahující i HTML tagy tím způsobem, že je zachová. K tomu stačí specifikovat formát. Dle dokumentace se jako výchozí automaticky nastaví HTML, tento parametr tedy není nutno explicitně uvádět, alespoň ale budete mít představu kam sáhnout, když se rozhodnete chování překladu změnit.</p>
<p>Pokud dojde k chybě, vyhodí se výjimka <strong>Google_ServiceException</strong>. Já raději počítám i s <strong>Google_AuthException</strong>, <strong>Google_CacheException</strong>, <strong>Google_Exception</strong> a <strong>Google_IOException</strong>. Dále v případě reálného produkčního nasazení kontroluji, zda skutečně v polích existují příslušné indexy. K podobné opatrnosti mě poprvé donutilo API od Facebooku, kdy odpověď serveru ne vždy odpovídala tomu, co bylo uvedeno v dokumentaci.</p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/pouziti-google-translate-api-v-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Seznam českých podstatných jmen</title>
		<link>http://szj.cz/seznam-ceskych-podstatnych-jmen/</link>
		<comments>http://szj.cz/seznam-ceskych-podstatnych-jmen/#comments</comments>
		<pubDate>Sun, 07 Oct 2012 14:07:38 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Ostatní]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[podstatná jména]]></category>
		<category><![CDATA[podstatné jméno]]></category>
		<category><![CDATA[seznam]]></category>
		<category><![CDATA[slovník]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=441</guid>
		<description><![CDATA[K naplnění podstaty jednoho mého projektu jsem potřeboval získat poněkud specifická data – česká podstatná jména v prvním pádě. Nejprve jsem předpokládal, že podobný seznam musím s pomocí webového vyhledávače nalézt. Bohužel jsem však narážel pouze na nefunkční odkazy. Postupně jsem se proto smiřoval s faktem, že kýžený soupis budu vytvářet na vlastní pěst. Mé [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://szj.cz/wp-content/uploads/2012/10/seznam-podstatnych-jmen.png"><img class="alignleft size-full wp-image-445" title="seznam-podstatnych-jmen" src="http://szj.cz/wp-content/uploads/2012/10/seznam-podstatnych-jmen.png" alt="Seznam podstatných jmen" width="128" height="128" /></a>K naplnění podstaty jednoho mého projektu jsem potřeboval získat poněkud specifická data – česká podstatná jména v prvním pádě. Nejprve jsem předpokládal, že podobný seznam musím s pomocí webového vyhledávače nalézt. Bohužel jsem však narážel pouze na nefunkční odkazy. Postupně jsem se proto smiřoval s faktem, že kýžený soupis budu vytvářet na vlastní pěst. Mé myšlenky směřovaly k využití nejrůznějších slovníků používaných pro kontrolu pravopisu a tento nápad mi následně potvrdil i jeden tip, jenž jsem během procházení internetu objevil.</p>
<h2>Problémy nečiní ani jiné slovní druhy</h2>
<p>K získání seznamu nejprve zamiřte na <a href="http://www.openoffice.cz/stahnout/doplnky/cesky-slovnik">www.openoffice.cz</a>, kde stáhnete český slovník ve formátu <strong>oxt</strong>. U souboru následně zaměňte koncovku na <strong>zip </strong>a použijte libovolný dekomprimační nástroj. Uvnitř archívu čeká několik souborů, z nichž pro nás momentálně nejzajímavější nese označení <strong>cs_CZ.dic</strong>. Doporučuji se rovněž seznámit s přiloženou licencí. Zmíněný souhrn pochází původně ze slovníku pro <strong>ispell</strong> a přichází s formátem, jenž umožňuje identifikovat kýžené objekty zájmu. Pro tento účel jsem vytvořil jednoduchý skript v PHP, jenž celý soubor postupně projde a vybere pouze ta slova, o které má daný uživatel skutečně zájem. V mém případě šlo o řádky, jenž za symbolem lomítka (<strong>/</strong>) obsahovaly buď znak <strong>H</strong> nebo <strong>Z</strong>.</p>
<pre class="brush: php; title: ; notranslate">
$lines = file(&quot;./cs_CZ.dic&quot;);
$fileName = &quot;podstatna_jmena.txt&quot;;
for($i = 0 ; $i &lt; count($lines); $i++)
{
 $currentLine = explode(&quot;/&quot;, $lines[$i]);
 if( (strpbrk($currentLine[1], &quot;HZ&quot;) != false) )
 {
 file_put_contents($fileName, $currentLine[0].&quot;\n&quot;, FILE_APPEND);
 }
}
</pre>
<p>Nejprve jsem celý obsah slovníku s pomocí funkce <strong>file</strong> proměnil na pole. Následovalo jeho procházení s pomocí klasického iteračního cyklu. Na každý řádek byla aplikována snaha o jeho rozdělení na dvě poloviny díky <strong>explode</strong>. Pokud funkce <strong>strpbrk</strong> nalezla kýžený písmenný znak, dovolila provést zápis do druhého pomocného souboru. Po ukončení činnosti scriptu jeho obsah tvořily pouze slovní druhy, o něž skutečně stojíte &#8211; zde tedy konkrétně výhradně podstatná jména. Jejich předání dalšímu programu či scriptu následně již nic nezabrání.</p>
<h4>Příchozí dotazy:</h4><ul><li>slovník podstatných jmen</li><li>seznam podstatných jmen</li><li>seznam českých slov</li><li>slovník českých slov txt</li><li>databáze českých slov</li><li>česká podstatná jména</li><li>seznam českých podstatných jmen</li></ul>]]></content:encoded>
			<wfw:commentRss>http://szj.cz/seznam-ceskych-podstatnych-jmen/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Zvýraznění aktuální položky v menu s pomocí PHP</title>
		<link>http://szj.cz/zvyrazneni-aktualni-polozky-v-menu-s-pomoci-php/</link>
		<comments>http://szj.cz/zvyrazneni-aktualni-polozky-v-menu-s-pomoci-php/#comments</comments>
		<pubDate>Fri, 20 Jul 2012 06:41:50 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Programování]]></category>
		<category><![CDATA[menu]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[zvýraznění]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=344</guid>
		<description><![CDATA[Představme si klasický web. Zcela určitě na něm naleznete menu. K usnadnění orientace přitom může pomoci zvýraznění stránky, na které se uživatel momentálně nachází. Zdá se přitom, že jde o zanedbatelnou drobnost, schopnost pohybovat se na daném portálu s jistotou se však stává klíčovým požadavkem. K odlišení zvolené položky často plně postačí změnit její pozadí. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://szj.cz/wp-content/uploads/2012/07/menu-zvyrazneni.png"><img class="alignleft size-full wp-image-347" title="menu-zvyrazneni" src="http://szj.cz/wp-content/uploads/2012/07/menu-zvyrazneni.png" alt="Zvýraznění položky v menu" width="128" height="128" /></a>Představme si klasický web. Zcela určitě na něm naleznete menu. K usnadnění orientace přitom může pomoci zvýraznění stránky, na které se uživatel momentálně nachází. Zdá se přitom, že jde o zanedbatelnou drobnost, schopnost pohybovat se na daném portálu s jistotou se však stává klíčovým požadavkem.</p>
<p>K odlišení zvolené položky často plně postačí změnit její pozadí. O samotnou obměnu barvy se přitom starají kaskádové styly. Pokud si dnes stáhnete libovolnou bezplatnou šablonu, bývá již obvykle dostatečně připravena. Zvýraznění provádí přiřazení patřičného <strong>id</strong> samotnému odkazu nebo tagu <strong>li</strong>.</p>
<pre class="brush: xml; title: ; notranslate">&lt;ul&gt;
&lt;li id=&quot;current&quot;&gt;&lt;a href=&quot;login.php&quot; &gt;&lt;span&gt;Přihlásit se&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;register.php&quot; &gt;&lt;span&gt;Registrace&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;faq.php&quot; &gt;&lt;span&gt;FAQ&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</pre>
<p>Uvedený příklad může vypadat například takto:</p>
<p><a href="http://szj.cz/wp-content/uploads/2012/07/menu.png"><img class="aligncenter size-full wp-image-345" title="menu" src="http://szj.cz/wp-content/uploads/2012/07/menu.png" alt="Menu" width="316" height="48" /></a></p>
<p>Nyní si ve stručnosti představíme jednotlivé způsoby, které lze pro zvýraznění použít. U jednoduchého statického a opravdu nerozsáhlého webu lze přistoupit k manuálnímu připsání dotyčného id u každého souboru. V případě rozsáhlejšího projektu lze nastíněný problém řešit buď na straně serveru nebo použít JavaScript. Tento skriptovací jazyk se mi zde však nezdá jako příliš vhodný, protože jej daný návštěvník nemusí mít povolený. Zbývá tedy varianta odeslání do prohlížeče již vhodně upravené stránky, kde id bude patřit vybrané součásti z menu. Původně jsem myslel, že v PHP budu muset vytvořit velký počet podmínek, existuje však mnohem elegantnější zápis.</p>
<p>O vše se postará následující řádek:</p>
<pre class="brush: php; title: ; notranslate">if (strpos($_SERVER['PHP_SELF'], 'login.php')) echo ' id=&quot;current&quot;';</pre>
<p>Globální proměnná <strong>$_SERVER[&#8218;PHP_SELF&#8216;]</strong> obsahuje cestu k aktuálnímu souboru. Pokud v ní funkce <strong>strpos</strong> nalezne zadaný řetězec (v našem případě login.php) vrátí pozici, na které začíná. V případe žádného výskytu se dočkáme <strong>FALSE</strong>. Výpis <strong>id=&#8220;current&#8220;</strong> se proto u nevyhovující podmínky neprovede.</p>
<p>Nyní již jen stačí zmíněný kousek kódu umístit na patřičné místo. Obvykle záleží na tom, zda chcete nastavit id tagu <strong>a</strong> nebo <strong>li</strong>. Náš příklad vyžaduje druhou možnost, a proto pro zajištění plné funkčnosti postupuji následovně:</p>
<pre class="brush: php; title: ; notranslate">  echo '&lt;li';
  if (strpos($_SERVER['PHP_SELF'], 'login.php')) echo ' id=&quot;current&quot;';
  echo '&gt;&lt;a href=&quot;login.php&quot; &gt;&lt;span&gt;Přihlásit se&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;';
 
 echo '&lt;li';
  if (strpos($_SERVER['PHP_SELF'], 'register.php')) echo ' id=&quot;current&quot;';
  echo '&gt;&lt;a href=&quot;register.php&quot; &gt;&lt;span&gt;Registrace&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;';

 echo '&lt;li';
  if (strpos($_SERVER['PHP_SELF'], 'faq.php')) echo ' id=&quot;current&quot;';
  echo '&gt;&lt;a href=&quot;faq.php&quot; &gt;&lt;span&gt;FAQ&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;';</pre>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/zvyrazneni-aktualni-polozky-v-menu-s-pomoci-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Počet aktuálně přihlášených uživatelů v PHP</title>
		<link>http://szj.cz/pocet-aktualne-prihlasenych-uzivatelu-v-php/</link>
		<comments>http://szj.cz/pocet-aktualne-prihlasenych-uzivatelu-v-php/#comments</comments>
		<pubDate>Sat, 30 Jun 2012 13:42:25 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Programování]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[přihlášení uživatelé]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=317</guid>
		<description><![CDATA[Nedávno jsem přemýšlel, jak vyřešit zobrazování počtu osob, které se na určitou stránku přihlásily do členské sekce. Mé první myšlenky směřovaly k ukládání záznamu do databáze. Pokud bych však vytvořil speciální sloupec například typu ENUM, kde bych ukládal dva stavy (PRIHLASEN, NEPRIHLASEN), dostal bych se záhy do problémů. Údaje bych totiž mohl měnit jen na [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://szj.cz/wp-content/uploads/2012/06/php.png"><img class="alignleft size-full wp-image-318" title="php" src="http://szj.cz/wp-content/uploads/2012/06/php.png" alt="PHP" width="128" height="128" /></a>Nedávno jsem přemýšlel, jak vyřešit zobrazování počtu osob, které se na určitou stránku přihlásily do členské sekce. Mé první myšlenky směřovaly k ukládání záznamu do databáze. Pokud bych však vytvořil speciální sloupec například typu <strong>ENUM</strong>, kde bych ukládal dva stavy (<strong>PRIHLASEN</strong>, <strong>NEPRIHLASEN</strong>), dostal bych se záhy do problémů. Údaje bych totiž mohl měnit jen na základě provedení vhodné činnosti ze strany uživatele. Lidé však pochopitelně nemusí vždy postupovat tak, jak zamýšlel programátor. Mluvím konkrétně o odhlášení ze systému. Pokud by někdo jednoduše stránku zavřel, nelze změnit stav na <strong>NEPRIHLASEN</strong> a počítadlo aktivních uživatelů postupně přestane zobrazovat reálná data. Na následujících řádcích vám proto představím mnohem lepší řešení, které se nastíněnou situací počítá.</p>
<h2>Úprava databáze</h2>
<p>Nejprve bude potřeba pozměnit lehce strukturu tabulky, která uchovává informace o uživatelích. Přidejte sloupec <strong>LastTimeSeen</strong> datového typu <strong>DATETIME</strong>.</p>
<h2>Poslední krok &#8211; PHP</h2>
<p>Nyní si napíšeme několik řádků kódu, které obstarají aktualizaci údaje v databázi. Uložíme si přitom aktuální datum i čas.</p>
<pre class="brush: php; title: ; notranslate">$sql = &quot;UPDATE uzivatele SET LastTimeSeen = NOW() WHERE id = &quot;.$_SESSION[&quot;id&quot;];

mysql_query($sql);</pre>
<p>S pomocí <strong>NOW()</strong> máme zajištěno aktuální časové razítko. Obměnu záznamu pochopitelně provedeme jen v případě konkrétního id.</p>
<p>Nyní již disponujeme všemi nezbytnostmi ke spočítání přihlášených uživatelů. Postačí nám přitom jediný dotaz, jehož výsledek jen vypíšeme:</p>
<p>SELECT COUNT(*) FROM uzivatele WHERE LastTimeSeen > DATE_SUB(NOW(), INTERVAL 5 MINUTE)</p>
<p>Pojďme se blíže zaměřit na klauzuli WHERE. Hledáme jen ty řádky, v nichž sloupec LastTimeSeen je větší než čas před pěti minutami. Právě <strong>DATE_SUB</strong> slouží k odečtení vybraného intervalu. V našem případě provádíme rozdíl aktuálního časového razítka <strong>NOW()</strong> od pěti minut (<strong>INTERVAL 5 MINUTE</strong>).</p>
<p>Názorný příklad bude patrně jasnější. V 14:00 nám <strong>DATE_SUB(NOW(), INTERVAL 5 MINUTE)</strong> vrátí např. 2012-06-27 <strong>13:55</strong>:24.</p>
<p>Agregační funkce <strong>COUNT</strong> poté spočítá vyhovující záznamy. Právě toto číslo představuje momentálně aktivní uživatele.</p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/pocet-aktualne-prihlasenych-uzivatelu-v-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Apache – nastavujeme zobrazování chyb</title>
		<link>http://szj.cz/apache-%e2%80%93-nastavujeme-zobrazovani-chyb/</link>
		<comments>http://szj.cz/apache-%e2%80%93-nastavujeme-zobrazovani-chyb/#comments</comments>
		<pubDate>Sat, 23 Jun 2012 13:11:46 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Nezařazené]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php.ini]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=303</guid>
		<description><![CDATA[Na své distribuci Ubuntu jsem se rozhodl zprovoznit lokální webový a databázový server. Vznikla mi tak oblíbená kombinace označovaná jako LAMP (Linux, Apache, MySQL, PHP). Mohl jsem proto začít vytvářet dynamické stránky bez nutnosti nahrávat vždy soubory přes FTP na hosting. Úspora času je značná a není dále třeba věnovat pozornost tomu, jaké soubory po [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Na své distribuci Ubuntu jsem se rozhodl zprovoznit lokální webový a databázový server. Vznikla mi tak oblíbená kombinace označovaná jako LAMP (<strong>L</strong>inux, <strong>A</strong>pache, <strong>M</strong>ySQL, <strong>P</strong>HP). Mohl jsem proto začít vytvářet dynamické stránky bez nutnosti nahrávat vždy soubory přes FTP na hosting. Úspora času je značná a není dále třeba věnovat pozornost tomu, jaké soubory po úpravě kódu aktualizovat na vzdálené straně. Po defaultní instalaci s minimem nastavení jsem si však všiml, že mi lokální Apache neukazuje chyby v PHP. Namísto toho jsem obdržel informaci o problému na straně serveru. Taková konfigurace se hodí pro skutečné nasazení, protože případný útočník nezjistí podrobnosti, které by mu mohly pomoci v jeho nežádoucí činnosti. Během programování však absence chybových hlášení zabolí.</p>
<h2>Hledáme php.ini</h2>
<p>Ke změně chování Apache musíme provést obměnu v souboru php.ini. Jeho umístění se však může lišit dle verze či distribuce. Poradím vám proto univerzální způsob. Vytvořte si nový PHP skript a napište do něj:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
phpinfo();
?&gt;
</pre>
<p>Následně jej načtěte ve webovém prohlížeči (např. <strong>127.0.0.1/info.php</strong>). Zde nás zajímá položka <strong>Configuration File (php.ini) Path</strong>. V mém případě se tedy daný soubor nachází v <strong>/etc/php5/apache2/php.ini</strong>. K jeho otevření použijte libovolný editor. Nemáte-li práva zápisu, spusťte program jako root. Já například do terminálu zadal <strong>gksudo gedit</strong>. Nyní na vás čeká mnoho komentářů a dostupných voleb. My však hledáme <strong>display_errors</strong>, kde zadáme <strong>On</strong>. Nyní restartujeme Apache s pomocí příkazu<strong> sudo /etc/init.d/apache2 restart</strong>.</p>
<p>&nbsp;</p>
<p><a href="http://szj.cz/wp-content/uploads/2012/06/php-ini.png"><img class="aligncenter size-full wp-image-304" title="php-ini" src="http://szj.cz/wp-content/uploads/2012/06/php-ini.png" alt="php.ini" width="672" height="480" /></a></p>
<h3>Pokročilejší nastavení</h3>
<p>Uvedený postup v mém případě postačil k tomu, aby server začal zobrazovat nedostatky v syntaxi. S php.ini si navíc můžete určit, o jakých problémech chcete být vlastně informováni. Tuto vlastnost řeší direktiva <strong>error_reporting</strong>. Zpravidla se zde používá konstanta <strong>E_ALL</strong> zaručující výpis nejen všech chyb, ale i varování.</p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/apache-%e2%80%93-nastavujeme-zobrazovani-chyb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSON – multiplatformní zápis dat</title>
		<link>http://szj.cz/json-%e2%80%93-multiplatformni-zapis-dat/</link>
		<comments>http://szj.cz/json-%e2%80%93-multiplatformni-zapis-dat/#comments</comments>
		<pubDate>Sat, 18 Feb 2012 10:00:31 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Ostatní]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[programování]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=178</guid>
		<description><![CDATA[Během prozkoumávání funkcí API od SEOmoz jsem se seznámil s výborným způsobem přenosu informací mezi dvěma subjekty. V mém případě šlo o skript schopný zpracovat výsledky na základě odpovědi, kterou získal od serveru. Řešení se označuje jako JSON, což znamená JavaScript Object Notation. Neznamená to však, že by údaje bylo možno zpracovat pouze s pomocí [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://szj.cz/wp-content/uploads/2012/02/json.png"><img class="alignleft size-full wp-image-183" title="json" src="http://szj.cz/wp-content/uploads/2012/02/json.png" alt="JSON" width="128" height="128" /></a>Během prozkoumávání funkcí API od SEOmoz jsem se seznámil s výborným způsobem přenosu informací mezi dvěma subjekty. V mém případě šlo o skript schopný zpracovat výsledky na základě odpovědi, kterou získal od serveru. Řešení se označuje jako <strong>JSON</strong>, což znamená JavaScript Object Notation. Neznamená to však, že by údaje bylo možno zpracovat pouze s pomocí JavaScriptu, spíše je tomu naopak. Já jsem využil PHP, JSON však podporují i jiné jazyky. A čím vlastně popisovaný formát uchování dat vyniká? Jde o schopnost přenášet nejen řetězce, ale rovnou celé objekty či pole. Populární CSV se dle mého názoru na tento úkol příliš nehodí, jeho doménu symbolizují spíše údaje z databáze či tabulky. Výsledek po konverzi přitom získá formu běžného řetězce. Vypadat může například takto:</p>
<pre class="brush: php; title: ; notranslate">{&quot;fmrp&quot;:3.31508823980473,&quot;fmrr&quot;:8.71399339003802e-10,&quot;pda&quot;:29.96283221096798,&quot;ueid&quot;:42,&quot;ufq&quot;:&quot;szj.cz/&quot;,&quot;uid&quot;:120,&quot;umrp&quot;:3.851694829321838,&quot;umrr&quot;:3.447144837370461e-11,&quot;upa&quot;:37.82389310886856,&quot;upl&quot;:&quot;szj.cz/&quot;,&quot;us&quot;:200,&quot;ut&quot;:&quot;szj.cz | internet, novinky, linux, programování&quot;,&quot;uu&quot;:&quot;szj.cz/&quot;}</pre>
<p>Obrovskou výhodu přitom představuje možnost přečíst jednotlivé složky bez nutnosti jakékoliv předchozí programové úpravy. Stačí proto jediný pohled a ihned získáte ponětí o tom, s jakými informace máte tu čest.</p>
<h2>Další JSON vlastnosti</h2>
<p>Začal jsem se o celou problematiku blíže zajímat a záhy jsem zjistil, že při používání JSON se musí dbát pouze na jedinou věc. V samotném zápisu nenaleznete údaj nesoucí použité kódování. To znamená, že jej programátor musí jasně specifikovat. Pakliže tak učiněno není, s největší pravděpodobností půjde o UTF-8. Toto kódování se totiž považuje za výchozí.</p>
<h2>Zpracování v PHP</h2>
<p>Když jsem již otázku převodu dat zpět do použitelné podoby musel vyřešit, určitě nezaškodí, když předvedu mnou aplikovaný postup v případě PHP. Nejde přitom o nic složitého, stačí použít vhodnou funkci. Ta se jmenuje <strong>json_decode</strong> a jako první parametr očekává vstupní data. Ovlivnit rovněž lze, zda jako výstup dostaneme objekt nebo asociativní pole. Rozhodl jsem se pro druhou variantu, a proto na místě druhého parametru vidíte <strong>true</strong>.</p>
<pre class="brush: php; title: ; notranslate">echo var_dump(json_decode($json, true));</pre>
<pre class="brush: php; title: ; notranslate">array(13) {
  [&quot;fmrp&quot;]=&gt;
  float(3.3150882398047)
  [&quot;fmrr&quot;]=&gt;
  float(8.713993390038E-10)
  [&quot;pda&quot;]=&gt;
  float(29.962832210968)
  [&quot;ueid&quot;]=&gt;
  int(42)
  [&quot;ufq&quot;]=&gt;
  string(7) &quot;szj.cz/&quot;
  [&quot;uid&quot;]=&gt;
  int(120)
  [&quot;umrp&quot;]=&gt;
  float(3.8516948293218)
  [&quot;umrr&quot;]=&gt;
  float(3.4471448373705E-11)
  [&quot;upa&quot;]=&gt;
  float(37.823893108869)
  [&quot;upl&quot;]=&gt;
  string(7) &quot;szj.cz/&quot;
  [&quot;us&quot;]=&gt;
  int(200)
  [&quot;ut&quot;]=&gt;
  string(49) &quot;szj.cz | internet, novinky, linux, programování&quot;
  [&quot;uu&quot;]=&gt;
  string(7) &quot;szj.cz/&quot;
}</pre>
<p>K samotným údajům se poté pohodlně dostaneme přes patřičný index.</p>
<pre class="brush: php; title: ; notranslate">$pole = json_decode($json, true);
echo $pole[&quot;fmrp&quot;];</pre>
<pre class="brush: php; title: ; notranslate">//Výpis
3.31508823980473</pre>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/json-%e2%80%93-multiplatformni-zapis-dat/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
