Session prom∞nnΘ

JeÜt∞ ne₧ vytvo°φme naÜi prvnφ session prom∞nnou, musφme upravit soubor phplib/local.inc. Na zaΦßtku souboru je definice t°φdy, kterß slou₧φ pro p°φstup k databßzi:

class DB_Poe extends DB_Sql {
  var $Host     = "localhost";             ## 
  var $Database = "poe_sessions";          ## 
  var $User     = "kris";                  ## 
  var $Password = "";                      ## 
}

My pravd∞podobn∞ p°ejmenujeme t°φdu DB_Poe na nßzev, kter² odpovφdß naÜφ aplikaci a nastavφme ΦlenskΘ prom∞nnΘ tak, aby obsahovaly sprßvnΘ jmΘno databßze (ishop), u₧ivatele (phplib) a heslo (octopus).

class DB_IShop extends DB_Sql {
  var $Host     = "localhost"; 
  var $Database = "ishop";     
  var $User     = "phplib";  
  var $Password = "octopus"; 
}

T°φda DB_Sql, ze kterΘ je naÜe odvozena, je p°itom definovßna v jednom ze soubor∙ phplib/db_*.inc tak, jak jsme nastavili v souboru phplib/prepend.php3, tak₧e odpovφdß nßmi pou₧φvanΘ databßzi.

Pro pou₧φvßnφ session prom∞nn²ch musφme upravit definici nßsledujφcφ t°φdy.

class Poe_Session extends Session {
  var $classname = "Poe_Session";

  var $cookiename     = "";                ## defaults to classname
  var $magic          = "Hocuspocus";      ## ID seed
  var $mode           = "cookie";          ## We propagate session IDs with cookies
  var $fallback_mode  = "get";
  var $lifetime       = 0;                 ## 0 = do session cookies, else minutes
 
  var $database_class = "DB_Poe";          ## Which database to connect...
  var $database_table = "active_sessions"; ## and find our session data in this table.

  var $gc_probability = 5;  
}

Op∞t si upravφme nßzev z Poe_Session na IShop_Session. Odpovφdajφcφm zp∙sobem musφme zm∞nit i nßzev t°φdy ulo₧en² v ΦlenskΘ prom∞nnΘ $classname.

Mn∞ osobn∞ se osv∞dΦilo prom∞nnou $fallback nastavit na prßzdnou hodnotu. V opaΦnΘm p°φpad∞ n∞kdy zlobilo pou₧φvßnφ cookies pro p°enos identifikßtor∙ session. Samoz°ejm∞ musφme nastavit Φlenskou prom∞nnou $database_class na jmΘno naÜφ t°φdy s databßzφ DB_IShop.

class IShop_Session extends Session {
  var $classname = "IShop_Session";

  var $cookiename     = "";                ## defaults to classname
  var $magic          = "Hocuspocus";      ## ID seed
  var $mode           = "cookie";          ## We propagate session IDs with cookies
  var $fallback_mode  = "";
  var $lifetime       = 0;                 ## 0 = do session cookies, else minutes
 
  var $database_class = "DB_IShop";        ## Which database to connect...
  var $database_table = "active_sessions"; ## and find our session data in this table.

  var $gc_probability = 5;  
}

Nynφ ji₧ m∙₧eme vytvo°it naÜφ prvnφ strßnku, kterß pou₧φvß session prom∞nnΘ. Na zaΦßtku ka₧dΘ strßnky musφme naΦφst soubor prepend.php3, pokud jej ovÜem nenaΦφtßme automaticky pomocφ auto_prepend.

Nßsledn∞ inicializujeme PHPLIB pomocφ volßnφ funkce page_open():

page_open(array("sess" => "IShop_Session"));

Nßsledn∞ si m∙₧eme provßd∞t, co chceme. StaΦφ, kdy₧ nakonec celou strßnku ukonΦφme pomocφ page_close(). Prom∞nnß $sess je p°itom instancφ t°φdy, kterß nßm umo₧nφ prßci se session prom∞nn²mi. Pomocφ metody register() m∙₧eme urΦit prom∞nnΘ, kterΘ se majφ chovat jako session prom∞nnΘ. Malß ukßzka:

<?
page_open(array("sess" => "IShop_Session"));
?>
<html>
<head>
<title>Prvnφ strßnka</title>
</head>
<body>
<?
    $sess->register("x");
    $x = 10;
?>
Prom∞nnß x je zaregistrovßna a mß hodnotu <?echo $x?>. 
Podφvejte se na <a href="dalsi.php">dalÜφ strßnku</a>,
kde uvidφte, zda z∙stane obsah prom∞nnΘ $x zachovßn.
</body>
</html>
<? page_close() ?>

Vytvo°φme skript dalsi.php, kter² nßm ukß₧e, zda session prom∞nnΘ opravdu fungujφ tak, jak majφ.

<?
page_open(array("sess" => "IShop_Session"));
?>
<html>
<head>
<title>Testovacφ strßnka</title>
</head>
<body>
Prom∞nnß x mß nynφ hodnotu <?echo $x?>. 
</body>
</html>
<? page_close() ?>

Za normßlnφch okolnostφ, by byla prom∞nnß $x prßzdnß, nynφ dφky PHPLIB p°ebφrß hodnotu nastavenou na p°edchozφ strßnce.

Mn∞ osobn∞ pou₧it² zp∙sob prßce se session prom∞nn²mi p°ipadß p°φjemn∞jÜφ ne₧ t°eba v ASP. StaΦφ jednou prom∞nnou zaregistrovat jako session, a pak s nφ pracovat zcela standardnφm zp∙sobem jako s ka₧dou jinou prom∞nnou. V ASP se na ka₧dou session prom∞nnou musφme slo₧it∞ odvolßvat pomocφ objektu Session.

Pokud si chcete vyzkouÜet o n∞co v∞tÜφ aplikaci, kterß vyu₧φvß PHPLIB, m∙₧ete si stßhnout p°φklady k mΘ knize o PHP. V souborech kosik.php, zbozi.php, vyloha-p.php a vyloha-m.php naleznete ukßzku velice primitivnφho virtußlnφho obchodnφho domu, kde se session prom∞nnΘ pou₧φvajφ k udr₧ovßnφ seznamu zbo₧φ, kterΘ mß u₧ivatel nakoupenΘ v koÜφku.

Metody t°φdy Session

V nßsledujφcφm struΦnΘm p°ehledu se seznßmφme s nejd∙le₧it∞jÜφmi metodami t°φdy Session, kterß je zßkladem pro tvorbu a pou₧φvßnφ session prom∞nn²ch.

register(prom∞nnß)

Metoda register() slou₧φ k zaregistrovßnφ danΘ prom∞nnΘ jako session prom∞nnΘ. Prom∞nnß musφ b²t globßlnφ a m∙₧e mφt libovoln² typ -- Φφslo, °et∞zec, pole nebo objekt.

Pokud chceme pou₧φvat jako session prom∞nnΘ i objekty, musφme v jejich definici deklarovat dv∞ ΦlenskΘ prom∞nnΘ -- classname a persistent_slots. Prom∞nnß classname musφ obsahovat °et∞zec se jmΘnem t°φdy. persistent_slots je naopak pole, kterΘ obsahuje jmΘna Φlensk²ch prom∞nn²ch, kterΘ se majφ v rßmci session prom∞nn²ch zachovßvat.

unregister(prom∞nnß)

Prom∞nnß ji₧ dßle nenφ sesion prom∞nnou. Jejφ obsah se nezm∞nφ, ale ji₧ se nep°edßvß na dalÜφ strßnky.

delete()

ZruÜφ vÜechny session prom∞nnΘ.

© Ji°φ Kosek 1999
$Id: session.html,v 1.2 2000/10/30 10:21:50 Admin Exp $