V minulé lekci jsme použili pro uložení informací o uživateli cookies, ale zároveň jsme se zmiňovali o jejich problémech. Další možností, jak uchovávat a předávat data mezi stránkami je využití sessions. Toto pole proměnných je vytvořeno na serveru a je k dispozici všem scriptům, dokud se nezavře prohlížeč nebo není sessions ukončena. Tyto možnosti se mohou využít například pro uložení indikace toho, zda je uživatel přihlášený (ať už kdekoli - knihovna, obchod, banka, chat) a může listovat v dalších stránkách, nebo můžeme uložit jeho aktuální objednávku (nákupní košík) a podobně. Ve starší literatuře tento pojem nenajdete, sessions totiž fungují v PHP až od verze 4. Také musí být jejich používání v php.ini povolené, ale to je přednastavená volba.

Sessions

Budete-li hledat informace o session na internetu nebo v literatuře, asi narazíte jako já na zmatek v syntaxi v závislosti na verzi PHP. Ukázky uvedené níže mám vyzkoušené na naší nainstalované konfiguraci a měly by snad fungovat pro PHP 4.1 a výše (ale ze všech probraných témat jsem si nejméně jistý :-)). Stejně jako u předešlých polí předpokládáme, že je vypnuto register_globals (používání globálních proměnných), proto budeme také obdobně používat pole $_SESSION (potom už nebudeme používat například session_register, na které můžete v jiných zdrojích narazit).
První příkaz slouží k "nastartování" session, je potřeba ho uvést ve všech scriptech, kde chceme session využít:
session_start();
Příkaz by nebylo potřeba, kdyby v php.ini byl nastavený automatický start session, dále je také přednastaveno, že session pro svůj identifikátor používá cookies, proto musí být tento příkaz uveden na začátku stránky. Nastavení parametrů pro session (tak jako řadu dalších) si můžete zobrazit v phpinfo().
Příkaz pro vyprázdnění session použijeme zpravidla po odhlášení uživatele:
session_destroy();
Další práce s proměnnými je stejná jako u předešlých polí, například:
$_SESSION["jmeno"]="jakub";
Můžeme také zrušit jen jednu proměnnou příkazem:
unset ($_SESSION["jmeno"]);
Pokud použijeme více proměnných (nebo dokonce pole), opět můžeme použít příkaz pro "rozbalení" celého pole $_SESSION:
extract($_SESSION);


Jednou z možností využití SESSION je umožnit přístup k některým svým stránkám jen těm uživatelům, kteří znají heslo pro jejich otevření. S využitím SESSION může být po zadání správného hesla k dispozici více stránek právě díky tomu, že proměnné v SESSION jsou přístupné dokud nezavřeme prohlížeč nebo pole SESSION nezrušíme.

Zaheslované stránky

V dalším textu uvedu samozřejmě jen jednu z mnoha možností, jak "vpustit" na některé své stránky jen toho, kdo zná tajné heslo. Než se pustím do zdroje, uvedu příkaz (funkci) pro zaslání HTTP hlavičky, který se musí použít ještě před vlastním HTML zdrojem stránky. Parametry tohoto příkazu mohou být různé, ale nejčastěji se používá pro přesměrování na jinou stránku:
header("location: next.php");
Tento příkaz právě využijeme k přesměrování z "tajné" stránky na stránku s přihlášením, pokud nebylo zadané heslo. Na začátku (pozor - na úplném začátku!) každé takové "důvěrné" stránky by měla být "nastartovaná" session a zkontrolovaná proměnná pro přihlášení, například stránka zpoved.php (znovu raději uvádím podstatnou většinu zdroje):
<?php
session_start();
if (!isset($_SESSION["prihlasen"])):
header("location: prihlas.php");
endif;
?>
<html>
<head>
<title>Důvěrné</title>
</head>
<body>
Tento text je určen jen mému zpovědníkovi.
Hřích první: ....
</body>
</html>
Pokud nebylo zadané heslo, dojde k přeměrování na stránku prihlas.php, kde by uživatel měl zadat správné heslo. Pokud ho zadá, dojde opět k přesměrování na původní stránku zpoved.php. Na stránce je formulářík pro zadání hesla, jen po zadání správného hesla lze ze stránky "odejít". Zdroj obsahuje dvě drobné chybičky, které jistě pečlivý čtenář snadno odhalí :-):
<?php
session_start();
?>
<html>
<head>
<title>Přihlášení</title>
</head>
<body>
<h1>Přihlášení</h1>
<?php
if (isset($_POST["heslo"])):
if ($_POST["heslo"]=="1234"):
$_SESSION["prihlasen"]="ano"; header("location: zpoved.php");
else: echo"chybne heslo";
endif;
endif;
?>
<form action="next.php" method="post">
Zadejte heslo:
<input type="pasword" name="prihlasen" value="">
<input type="submit" name="odeslat" value="GO">
</form>
</body>
</html>


Úkoly:

Úkol (2 body+prémie)

Vytvoř libovolnou "tajnou" stránku, na kterou bude mít přístup jen ten, kdo bude znát heslo. Prémiové body můžeš získat za stylovou úpravu.

Úkol (3 body)

Zkus vyřešit odhlášení z utajených stránek.

Úkol (body podle užitečnosti a zpracování zdroje, minimálně 4 body)

Najdi na internetu další ukázku využití session, uprav ji pro PHP5 a dostatečně okomentuj (především doposud neprobírané příkazy). Nezapomeň uvést zdroj.

Název školy:Základní škola, Hradec Králové, M. Horákové 258
Název projektu:EU peníze školám
Číslo projektu:CZ.1.07/1.4.00/21.2575
Téma:Programování v PHP
Název:VY_32_INOVACE_15_10A_PHP15
Autor:Pavel Petr
Použité zdroje: Není-li uvedeno jinak, jsou všechny ilustrační obrázky dílem autora.