PHP - 14. díl – cookies

Ve 14. díle seriálu o PHP bude pojednávat detailně o cookies. Na závěr si uděláme počítadlo, které bude měřit počty návštěv každému uživateli zvlášť.

Co jsou to cookies?

Anglický termín "cookies" má relativně hodně významů, ale pro naše účely se nejčastěji překládá jako sušenka. V podstatě je to pár bajtů dat, který si webový server uloží v prohlížeči přímo u uživatele. Pokud uživatel znovu přistoupí na stejnou stránku, webový server si "sušenku" znovu přečte. K čemu je to dobré?

Pomocí cookies můžete zjišťovat informaci o každém uživateli zvlášť, a tento komfort vám nic jiného, než cookies neposkytne. Můžete je využít ke zpříjemnění prostředí pro uživatele samotného. Můžete si třeba uložit, které diskusní příspěvky už uživatel viděl, a nabídnout mu ty nepřečtené. Můžete si v cookies pamatovat jeho nastavení. U internetového obchodu si můžete pamatovat, které položky má návštěvník ve svém košíku. Prostě můžete uložit cokoli, co se týká konkrétního uživatele.

Každý z vás má pravděpodobně ve svém prohlížeči uloženy desítky, možná stovky cookies. Většina lidí to ani neví, nebo nevnímá. Mnohé webové servery jsou dokonce na cookies tak závislé, že bez nich nefungují, například mnohé internetové obchody.

Cookies - technický úvod

Jak už jsem psal výše, cookies je pár bajtů dat, v podstatě krátký text, který zasíláte prohlížeči. Prohlížeč u sebe cookies uloží, a při příští návštěvě od stejného uživatele je znovu předá. Obsahem cookies může být cokoli, pouze celková velikost cookies je omezena na 4 KB.

Pokud vysíláte cookies na uživatelův prohlížeč, má každá z nich tyto části:

  • Jméno - každá cookies se musí nějak jmenovat. Můžete vyslat více cookies, ale každá musí mít jiné jméno.
  • Data - data, která jsou uložena do cookies, a kvůli kterým vlastně cookies vůbec posíláme.
  • Doba expirace - každá cookies se po určité době sama smaže. Doba expirace představuje datum a čas, kdy jí prohlížeč automaticky odstraní. Po tomto datumu a času jsou data již stará a nepotřebná. Pokud se nezadá žádné datum expirace, cookies se automaticky smaže už při zavření stránky.
  • Doména - cookies platí jen pro určitou doménu, například pro zive.cz. Jiná doména nemůže cookies přijmout. Části doména a cesta jsou uvedeny z bezpečnostních důvodů a určují, kdo smí vyslané cookie přijmout.
  • Cesta - cookies smí přijmout jen stránky s určitou virtuální cestou. Pokud se neuvede žádná cesta, jsou cookies přístupné jen webovým stránkám ze stejného adresáře, jako je stránka, která cookies vyslala.
  • Secure - určuje, zda cookies se smí přijímat pouze pomocí zabezpečeného SSL kanálu, nebo zda může přijít i normálním nezabezpečeným kanálem.

Tyto části jsou důležité hlavně proto, že při vysílání cookies se tyto jednotlivé části nastavují.

Vysílání a příjem cookies v PHP

Pro vysílání cookies pomocí PHP slouží funkce setcookie. Předem je potřeba říci, že tato funkce zapisuje do hlaviček HTTP protokolu (viz minulý díl seriálu o PHP). Důsledkem je hlavně to, že funkce setcookie se musí použít dříve, nežli cokoli vypíšeme na výstup, jinak funkce setcookie selže a nic nevyšle.

Funkce setcookie má volitelně jeden až šest parametrů, kterými se předávají jednotlivé části cookie. Mohou se zprava vynechávat:

setcookie(jméno, data, doba expirace, cesta, doména, secure);

Pro příjem cookies je určeno pole proměnných s názvem $HTTP_COOKIE_VARS, které obsahuje všechna cookies, které webová stránka přijala.

Pro demonstraci vysílání a příjmu cookies v PHP si můžeme uvést velmi jednoduchý příklad:

<?php
  setcookie(`test`, `pokusná data`, time()+3600);
?>
<html>
<head>
<title>Příklad 1. z 14. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?
  if (isset($HTTP_COOKIE_VARS[`test`]))
    echo $HTTP_COOKIE_VARS[`test`];
  else
    echo `cookie nepřijmuta`;
?>
</body>
</html>

Příklad začíná PHP částí s funkcí setcookie. Protože funkce setcookie musí být uvedena dříve, než přijde jakýkoli výstup, je tato funkce úplně na začátku příkladu. V našem příkladě funkce setcookie má 3 parametry. Prvním parametrem je název cookie, v našem příkladě se jmenuje test. Druhý parametr jsou samotná data, zvolil jsem řetězec "pokusný text". Třetí, poslední parametr obsahuje dobu expirace. Tu jsem odvodil od funkce time(), která vrací aktuální datum a čas a přičetl jsem k ní 3600 sekund, tedy jednu hodinu. Doba expirace se tedy dá přeložit jako od tohoto okamžiku za hodinu vyprší platnost cookie.

Dále v příkladu pokračuje začátek HTML kódu. Pak nastává další sekce PHP kódu, kde testuji proměnnou $HTTP_COOKIE_VARS[`test`]. Tedy testuji, zda jsem přijal cookie s názvem test.

Pokud si příklad vyzkoušíte poprvé, bude vyslána cookie s názvem test a uložena ve vašem prohlížeči. Protože cookie může být přijmuta až při dalším načtení stránky, při prvním spuštění dostanete výpis textu "cookie nepřijmuta". Při dalším spuštění ovšem začíná vypisovat data, tedy náš text "pokusný text". Pokud byste počkali hodinu, což je doba, za kterou naše cookie vyprší, opět zahlásí "cookie nepřijmuta".

Počítadlo návštěv uživatele

Pomocí cookies se dá napsat velmi jednoduché počítadlo, které každému uživateli sdělí, kolikrát navštívil naší webovou stránku:

<?php
  if (isset($HTTP_COOKIE_VARS[`navsteva`]))
    $navsteva = $HTTP_COOKIE_VARS[`navsteva`];
  else
    $navsteva = 0;
 
  ++$navsteva;

  setcookie(`navsteva`, $navsteva, time()+1000000);
?>
<html>
<head>
<title>Příklad 2. z 14. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?
  echo `Tuto stránku jsi navštívil celkem `, $navsteva, ` krát.`;
?>
</body>
</html>

Pokud si příklad spustíte, a nejlépe opakovaně, zjistíte, že při každém dalším spuštění vám zvýší počet návštěv na stránce. Počty návštěv poctivě ukládá každému uživateli zvlášť do cookies do jeho prohlížeče.

K ukládání počtu návštěv je použito cookie s názvem navsteva. Zbytek PHP kódu byste už měli bezpečně přečíst, protože se v něm nepoužívá nic nového. Doba exspirace cookie je nastavena na milión sekund, což je asi 11 dní. Později bude uvedena metoda, jak vymyslet rozumněji zapsanou dobu exspirace. Jako data cookie se ukládá právě proměnná $navsteva s počtem návštěv.

Jak uvádět dobu expirace?

Pro uvedení doby exspirace můžeme použít dvě funkce, a to buď funkci time, nebo mktime. Funkce time nám dobře poslouží k tomu, abychom stanovili za kolik sekund od této chvíle má cookie vypršet. A funkce mktime je zase vhodná, když chceme přímo zadat datum a čas, kdy má přesně dojít k vypršení cookie.

Funkci time jsme už používali, prostě uvedením výrazu

time() + počet_sekund

řekneme, za kolik sekund má cookie vypršet.

Funkce mktime má v ideálním případě 6 parametrů, které znamenají jednotlivé fragmenty data a času. Podivné pořadí v parametrech berme jako chyták PHP:

mktime(hodina, minuta, sekunda, měsíc, den, rok)

Takže teď můžu poopravit počítadlo tak, že uvedu dobu expirace na 31. prosince 2030, což je dostatečně dlouhá doba:

<?php
  if (isset($HTTP_COOKIE_VARS[`navsteva`]))
    $navsteva = $HTTP_COOKIE_VARS[`navsteva`];
  else
    $navsteva = 0;
 
  ++$navsteva;

  setcookie(`navsteva`, $navsteva, mktime(0,0,0,12,31,2030));
?>
<html>
<head>
<title>Příklad 3. z 14. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?
  echo `Tuto stránku jsi navštívil celkem `, $navsteva, ` krát.`;
?>
</body>
</html>

Diskuze (26) Další článek: Nová verze ovladačů pro grafické karty ATI

Témata článku: Software, Windows, Programování, PHP, Jednotlivý díl, Cookies, Elsa, HTML, COO, Time, Díl, Určitá doba, Stejné parametry, Fragment, Echo, Head, Cookie


Určitě si přečtěte

Podívejte se, co dokáže vyrobit jedna z nejexotičtějších 3D tiskáren v Česku

Podívejte se, co dokáže vyrobit jedna z nejexotičtějších 3D tiskáren v Česku

** Na jaře tiskla unikátní české respirátory ** Používá ji třeba Škoda Auto, a.s. ** Zajeli jsme se podívat do pražského showroomu 3Dees

Jakub Čížek | 12

Porovnání deseti cloudových disků: kam a za kolik uložit 100 GB, 1 TB a 10 TB dat?

Porovnání deseti cloudových disků: kam a za kolik uložit 100 GB, 1 TB a 10 TB dat?

** Zjistili jsme, kam do cloudu nejvýhodněji uložíte data ** Vytvořili jsme žebříček cen deseti cloudových úložišť ** Ceny se liší - často i velice výrazně!

Karel Kilián | 104

Jak sestavit rodokmen. Z informací, které jsou na internetu

Jak sestavit rodokmen. Z informací, které jsou na internetu

Podrobný návod, jak hledat ve starých matrikách informace o předcích a nemuset při tom ani vstát od počítače. Základy internetové genealogie.

Marek Lutonský | 59

Zahodil jsem Windows, přešel na Linux a nezbláznil se z toho

Zahodil jsem Windows, přešel na Linux a nezbláznil se z toho

** Měsíc jsem se nedotkl Windows a byl závislý jen na Linuxu ** Jaká byla pozitiva a negativa přechodu? ** Se kterými aplikacemi jsem (ne)zápasil a které bych doporučil?

Lukáš Václavík | 244


Aktuální číslo časopisu Computer

Megatest televizí do 25 000 Kč

Nejlepší herní klávesnice

Srovnání správců hesel

Jak upravit fotky pro tisk