Archiv pro štítek: PHP

Zvýraznění aktuální položky v menu s pomocí PHP

Zvýraznění položky v menuPř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í. 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 id samotnému odkazu nebo tagu li.

<ul>
<li id="current"><a href="login.php" ><span>Přihlásit se</span></a></li>
<li><a href="register.php" ><span>Registrace</span></a></li>
<li><a href="faq.php" ><span>FAQ</span></a></li>
</ul>

Uvedený příklad může vypadat například takto:

Menu

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.

O vše se postará následující řádek:

if (strpos($_SERVER['PHP_SELF'], 'login.php')) echo ' id="current"';

Globální proměnná $_SERVER[‚PHP_SELF‘] obsahuje cestu k aktuálnímu souboru. Pokud v ní funkce strpos 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 FALSE. Výpis id=“current“ se proto u nevyhovující podmínky neprovede.

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 a nebo li. Náš příklad vyžaduje druhou možnost, a proto pro zajištění plné funkčnosti postupuji následovně:

  echo '<li';
  if (strpos($_SERVER['PHP_SELF'], 'login.php')) echo ' id="current"';
  echo '><a href="login.php" ><span>Přihlásit se</span></a></li>';
 
 echo '<li';
  if (strpos($_SERVER['PHP_SELF'], 'register.php')) echo ' id="current"';
  echo '><a href="register.php" ><span>Registrace</span></a></li>';

 echo '<li';
  if (strpos($_SERVER['PHP_SELF'], 'faq.php')) echo ' id="current"';
  echo '><a href="faq.php" ><span>FAQ</span></a></li>';

Počet aktuálně přihlášených uživatelů v PHP

PHPNedá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 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 NEPRIHLASEN 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á.

Úprava databáze

Nejprve bude potřeba pozměnit lehce strukturu tabulky, která uchovává informace o uživatelích. Přidejte sloupec LastTimeSeen datového typu DATETIME.

Poslední krok – PHP

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.

$sql = "UPDATE uzivatele SET LastTimeSeen = NOW() WHERE id = ".$_SESSION["id"];

mysql_query($sql);

S pomocí NOW() máme zajištěno aktuální časové razítko. Obměnu záznamu pochopitelně provedeme jen v případě konkrétního id.

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:

SELECT COUNT(*) FROM uzivatele WHERE LastTimeSeen > DATE_SUB(NOW(), INTERVAL 5 MINUTE)

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ě DATE_SUB slouží k odečtení vybraného intervalu. V našem případě provádíme rozdíl aktuálního časového razítka NOW() od pěti minut (INTERVAL 5 MINUTE).

Názorný příklad bude patrně jasnější. V 14:00 nám DATE_SUB(NOW(), INTERVAL 5 MINUTE) vrátí např. 2012-06-27 13:55:24.

Agregační funkce COUNT poté spočítá vyhovující záznamy. Právě toto číslo představuje momentálně aktivní uživatele.

Apache – nastavujeme zobrazování chyb

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 ú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í.

Hledáme php.ini

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:

<?php
phpinfo();
?>

Následně jej načtěte ve webovém prohlížeči (např. 127.0.0.1/info.php). Zde nás zajímá položka Configuration File (php.ini) Path. V mém případě se tedy daný soubor nachází v /etc/php5/apache2/php.ini. 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 gksudo gedit. Nyní na vás čeká mnoho komentářů a dostupných voleb. My však hledáme display_errors, kde zadáme On. Nyní restartujeme Apache s pomocí příkazu sudo /etc/init.d/apache2 restart.

 

php.ini

Pokročilejší nastavení

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 error_reporting. Zpravidla se zde používá konstanta E_ALL zaručující výpis nejen všech chyb, ale i varování.