- Základní údaje
- Kategorie: PHP
- Zobrazení: 450
Formuláře jsou naprostým základem webových stránek, které chcete mít interaktivní, neboli chcete, aby bylo možné pracovat s odezvou uživatele. Naprostým předpokladem je, že v tomto případě musíte mít alespoň základní znalosti HTML (XHTML) v oblasti tvorby formulářů a jejich prvků.
Formuláře a jejich parametry v HTML (XHTML)
Při vytváření jakéhokoliv formuláře HTML začínáme značkou <form>. Ta má několik dalších parametrů. Pro naše současné účely nám ovšem budou postačovat dva hlavní. Prvním je parametr action Ten určuje příjemce dat z formuláře. Pro nás to bude nějaký PHP skript, který bude schopen tyto údaje přijmout a zpracovat, popř. vypsat. O tomto parametru později. Druhým veledůležitým parametrem je parametr method Ten určuje, jakým způsobem se budou data z formuláře posílat. Zde se v praxi využívá prakticky pouze dvou metod a to je metoda post a get. Abychom mohli data z formuláře odeslat, musíme k tomu vytvořit nějaký příkaz. Používá se odesílací tlačítko, které se tvoří vložením značky <input> s parametrem type=“submit“. To zařídí, že se všechna data odešlou do námi zadaného skriptu. Typické použití formulářů vypadá asi takto:
<form action="mujskript.php" method="post">
<!-- datové položky formuláře -->
<input type="submit" value="Odeslat data formuláře">
</form>
Dále si zkusíme do formuláře přidat textové pole, aby bylo co odesílat:
<form action="mujskript.php" method="post">
Jméno: <input type="text" name="jmeno"><br />
<input type="submit" value="Odeslat data formuláře" />
</form>
Nyní si vytvoříme kompletní jednoduchou webovou stránku s formulářem:
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="utf-8">
<title>Jednoduchý formulář</title>
</head>
<body>
<form action="vypis_dat.php" method="post">
Zadej svoje jméno: <input type="text" name="jmeno"><br />
<input type="submit" value="Odeslat data formuláře" />
</form>
</body>
</html>
Jak můžete z kódu vypozorovat, data mají být zpracovány souborem vypis_dat.php. Ten ovšem do této chvíle neexistuje. Proto si jej vytvoříme:
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="utf-8">
<title>Zpracovaná data z formuláře</title>
</head>
<body>
<?php
$jmeno = $_POST['jmeno'];
echo 'Vaše jméno je ', $jmeno;
?>
</body>
</html>
Aby se vám skutečně data z formuláře vypsaly, musí se tento soubor nacházet ve stejné složce jako je ten, ze kterého data odesíláte (pokud tedy nemáte zadanou jinou cestu k souboru, což v našem případě nemáme). Ještě se zaměříme na předešlý kód. První řádek v PHP kódu je deklarace proměnné $jmeno, ke které je přiřazen záznam z odeslaného formuláře a to konkrétně s názvem jmeno. Jak vidíte je zde i zmíněna právě metoda zasílaných dat - $_POST. Pokud tedy odesíláte jednou metodou, nemůžete pro zpracování použít druhou metodu. Dnes se prakticky v 99% pracuje s metodou POST. Rozdíly odesílacích metod:
Metoda GET | Metoda POST |
Neumí odeslat rozsáhlá data | Umí odesílat rozsáhlá data |
Odesílá data jako součást adresy URL | Odesílá data jinou cestou, než je adresa URL |
Formuláře s podmínkou
První příklad je zaměřen na formulář, u kterého přijímací skript ověřuje podmínku – zadání správného hesla. Nejprve tedy stránka s formulářem, do kterého musí uživatel napsat správné heslo:
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="utf-8">
<title>Zadej prosím heslo</title>
</head>
<body>
<h2>Pokud se chceš dozvědět podrobnosti o srazu, musíš zadat správné heslo</h2>
<form action="vysledek.php" method="post">
Zadej heslo: <input type="password" name="heslo"><br>
<input type="submit" value="Odeslat heslo">
</form>
</body>
</html>
Po spuštění se vyhodnocuje odeslaný výraz z formuláře v souboru vysledek.php takto:
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="utf-8">
<title>Informace o srazu</title>
</head>
<body>
<?php
if ($_POST['heslo'] == 'lokomotiva')
echo 'Sraz se bude konat zítra ve 3 hodiny u Tygra';
else
echo 'Bohužel zadal jsi špatné heslo, nic se nedozvíš';
?>
</body>
</html>
Skript je doplněn o podmínku if. Správné heslo je „lokomotiva“. Pokud jej tedy uživatel nezadá, nezobrazí se mu požadovaný text. Pokuste se doplnit podmínku o další prvek, který je nutno správně do formuláře zadat. Doplňte stránku frameworkem Bootstrap.
- Základní údaje
- Kategorie: PHP
- Zobrazení: 116
Tento příklad je pomůcka pro zjištění správné váhy. Je zde využit tzv. Body Mass Index (BMI), který se vypočítá takto: BMI = váha / (výška x výška) POZN.: váha musí být v kg a výška v metrech! Tabulka figury člověka podle BMI:
Podvyživený | BMI je menší než 15 |
Podváha | BMI je menší než 18,5 |
Ideální | BMI je od 18,5 do 25 |
Nadváha | BMI je od 25 do 30 |
Obezita | BMI je od 30 do 40 |
Nadměrně obézní | BMI je větší než 40 |
První stránka pro zadání hodnot vypadá takto:
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="utf-8">
<title>Zadejte Vaše parametry</title>
</head>
<body>
<form action="vysledek.php" method="post">
Zadej váhu: <input type="text" name="vaha"> kg<br />
Zadej výšku: <input type="text" name="vyska"> cm<br />
<input type="submit" value="Spočítej figuru">
</form>
</body>
</html>
Hodnota výšky se zadává běžně v cm, což je následně ve vyhodnocovacím skriptu potřeba převést na metry. Druhá stránka, která má spočítat BMI:
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="utf-8">
<title>Informace o figuře</title>
</head>
<body>
<?php
$vaha = $_POST['vaha'];
$vyska = $_POST['vyska'];
$vyska_v_metrech = $vyska / 100.0;
//tato proměnná se vytváří jen proto, aby se převedla výška na metry
$BMI = $vaha / ($vyska_v_metrech * $vyska_v_metrech);
echo 'Vaše BMI = ', $BMI;
echo '<br /><br />';
if ($BMI < 15)
echo 'Jste podvyživený/á';
else if ($BMI < 18.5)
echo 'Máte podváhu';
else if ($BMI < 25)
echo 'Máte ideální postavu';
else if ($BMI < 30)
echo 'Máte nadváhu';
else if ($BMI < 40)
echo 'Jste obézní';
else
echo 'Jste nadměrně obézní';
?>
</body>
</html>
- Základní údaje
- Kategorie: PHP
- Zobrazení: 793
Vytvoření návštěvní knihy v PHP s návazností na MySQL databází vyžaduje v první řadě připojení na server s touto databází. Než toto připojení vytvoříte, je třeba v dané databázi také tabulku pro návštěvní knihu vytvořit. Např. přes rozhraní Adminer nebo PhpMyAdmin takto můžeme potřebnou tabulku vytvořit tímto příkazem:
CREATE TABLE kniha
(
ID INT NOT NULL AUTO_INCREMENT ,
NICK VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL ,
EMAIL VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NULL ,
WEB VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NULL ,
VZKAZ VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL ,
DATUM VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL ,
PRIMARY KEY (ID)
);
Dále již můžeme zrealizovat připojení, které bývá umístěno většinou v samostatném souboru. Např. můžeme vytvořit soubor db.php, který obsahuje následující kód: POZOR! - údaje pro připojení je třeba změnit podle vašeho připojení na databázový server.
<?php
//Zadání jednotlivých údajů potřebných pro připojení do databáze:
$dbhost = 'server.xy'; //server, kde se nachází databáze (často bývá localhost)
$dbname = 'databaze'; //jméno databáze
$dbuser = 'uzivatel'; //uživatelské jméno
$dbpass = 'heslo'; //heslo
//Vytvoření připojení:
$spojeni = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
//Kontrola připojení s případnou hláškou
if (!$spojeni)
{
echo 'Spojení s mysql serverem se nepodařilo navázat.<br>';
}
//Stav, kdy se podaří navázat spojení s databází již nevypisujeme
//Následuje nastavení kódování a následná práce s daty
mysqli_set_charset($spojeni, "utf8");
?>
Ujistěte se, že soubor, který vytváříte má kódování UTF-8. Tabulku v databázi můžeme vytvořit také tak, že se SQL příkazy vloží do PHP kódu. Tato varianta však vyžaduje nejprve vytvořit spojení s databází, tedy nejprve vytvořit soubor db.php. Následný soubor (můžeme ho nazvat např. vytvor-knihu.php) může vypadat např. takto:
<?php
// Napojení souboru se spojením k databázi
require 'db.php';
// SQL příkaz k vytvoření tabulky Clanky v databázi
$vytvor_knihu = "
CREATE TABLE kniha
(
ID INT NOT NULL AUTO_INCREMENT ,
NICK VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL ,
EMAIL VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NULL ,
WEB VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NULL ,
VZKAZ VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL ,
DATUM VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL ,
PRIMARY KEY (ID)
)";
if (mysqli_query($spojeni, $vytvor_knihu)) {
echo "Tabulka Clanky byla vytvořena";
} else {
echo "Chyba, tabulka nebyla vytvořena: " . mysqli_error($spojeni);
}
mysqli_close($spojeni);
?>
V dalším kroku je vytvořen soubor, který umožňuje vepsat a následně poslat data do návštěvní knihy. Můžeme jej např. nazvat kniha.php
<?php
header("Content-Type: text/html; charset=utf-8");
//řádek kvůli správnému kódování
include('db.php');
//vložení externího souboru s připojením
?>
<form action="" method="post">
<div class="form-group">
<label for="nick">Nick:</label>
<input type="text" class="form-control" name="nick">
</div>
<div class="form-group">
<label for="email">Email:</label>
<input type="text" class="form-control" name="email">
</div>
<div class="form-group">
<label for="web">Váš web:</label>
<input type="text" class="form-control" name="web">
</div>
<div class="form-group">
<label for="comment">Vzkaz:</label>
<textarea id="summernote" class="form-control" rows="5" name="vzkaz"></textarea>
</div>
<div class="form-group">
<label for="kontrola">Kontrolní otázka - Kolik je jedna a jedna (slovem):</label>
<input type="text" class="form-control" name="kontrola">
</div>
<button type="submit" class="btn btn-success">Odeslat vzkaz</button>
</form>
<!-- všimněte si, že formulář není součástí php kódu -->
<?php
if (!empty ($_POST))
// empty - prázdný a jeho negace nebo-li
// pokud bylo cokoliv zadáno do formuláře, začne se vykonávat následující podmínka
{
// přijme všechny zadané informace do formuláře
$nick = $_REQUEST["nick"];
$email = $_REQUEST["email"];
$web = $_REQUEST["web"];
$vzkaz = $_REQUEST["vzkaz"];
$datum = StrFTime("%d.%m.%Y", Time());
// Kontrolní otázka kvůli SPAMu
$kontrola = $_REQUEST["kontrola"];
// pokud byly vyplněn alespoň nick a vzkaz a pokud je správně zodpovězena kontrolní otázka, může se nový příspěvek uložit do databáze
if(($nick!="") and ($vzkaz!="") and ($kontrola=="dva"))
{
// uloží se nový vzkaz do databáze a vrátí 1
$zapis = mysqli_query($spojeni, "INSERT INTO kniha (NICK, EMAIL, WEB, VZKAZ, DATUM)
VALUES ('$nick','$email','$web','$vzkaz','$datum');");
// Hláška o zdárném zápisu
echo ("<h1>Vzkaz přidán</h1>");
}
// pokud nebyl doplňěn nick a vzkaz nebo je chybná kontrolní otázka, zahlasí výzvu
else {
echo ('<div class="alert alert-danger">
<strong>Chyba!</strong> Musíte vyplnit alespoň Nick, Vzkaz a Kontrolní otázku.</div>');
}
}
// vloží externí soubor s výpisem všech vzkazů, které jsou uloženy v databázi
include('vzkazy.php');
?>
Poslední částí je externí soubor, který zabezpečuje vypsání dat z databáze s názvem vzkazy.php:
<?php
$pocet_vzkazu = mysqli_query($spojeni, "SELECT COUNT(*) as pocet FROM kniha;");
//přečte počet vzkazů v databázi
$cislo = mysqli_fetch_array($pocet_vzkazu);
//sql příkaz na počet řádků
$celkem_vzkazu = $cislo["pocet"];
echo "<b>Celkový počet vzkazů: ".$celkem_vzkazu."</b><hr>";
$vzkazy = mysqli_query($spojeni, "SELECT * FROM kniha;");
// pokud nebyly načteny žádné vzkazy, vypiš chybu
if(!$vzkazy){
echo "Chyba při načtení vzkazů !!";
}
// jinak ulož vzkazy do pole a postupně je vypiš
else{
// cyklus while projde všechny vzkazy,
// pomoci pole $vzkaz[""] vypíše všechny informace jednotlivých vzkazů
while ($vzkaz = mysqli_fetch_array($vzkazy))
{
echo $vzkaz["ID"]."<br />";
echo $vzkaz["NICK"]."<br />";
echo $vzkaz["EMAIL"]."<br />";
echo $vzkaz["WEB"]."<br />";
echo $vzkaz["VZKAZ"]."<br />";
echo $vzkaz["DATUM"]."<br />";
}
}
?>
Funkční návštěvní knihu (bez jakéhokoliv CSS) najdete v tomto demu. Úkoly ke kapitole:
- Pokuste se vložit tuto návštěvní knihu do webové stránky s bootstrapem a doplňte jak formulář, tak výpisy vzkazů kaskádovými styly (můžete se inspirovat např. zde)
- Dále zkuste změnit tvar (podobu) datumu zápisu na den + přesný čas.
- Přejmenujte patřičný soubor a případné odkazy na něj tak, aby návštěvní kniha "startovala" z určitého adresáře, ve kterém jsou soubory návštěvní knihy uloženy
- Vytvořte ochranu proti robotům např. ve formě kontrolní otázky (tedy za pomoci podmínky...)
- Do formulářového prvku Vzkaz importujte jednoduchý editor (např. https://summernote.org/).
- Další větší úpravou je vytvoření stránkování (např. jako v tomto demu). Zdrojové kódy k tomuto demu - navstevni-kniha-bs.zip
Další položky, které lze ukládat jako součást zápisu do návštěvní knihy
IP adresa
Jako další informaci, kterou můžeme ukládat do databáze je např. IP adresa uživatele. To můžeme v PHP detekovat velmi jednoduše:
echo 'Vaše IP adresa je ' . $_SERVER['REMOTE_ADDR'];
Toto zjištění IP adresy $_SERVER['REMOTE_ADDR'] je možné pouze v případě, že bylo PHP voláno z prohlížeče. V CLI režimu (například spuštění z Terminálu cronem) není IP adresa k dispozici. Do databáze lze pak tuto adresu uložit např. jako hodnotu varchar(39), kam se vejde jak IP verze 4. tak IP verze 6. Zjišťování, ukládání i následná práce s IP adresami je však značně obšírnější a přináší bohužel další problémy. Více např. v tomto článku - php.baraja.cz/ip-adresa.
- Základní údaje
- Kategorie: PHP
- Zobrazení: 460
Nejdříve si v databázi vytvoříme tabulku Clanky, do které budeme ukládat všechny články. Jednotlivé sloupce tabulky budou tyto:
- ID (zároveň primární klíč),
- název článku,
- autor,
- obsah článku
- a datum.
Tuto tabulku můžete buď vytvořit ručně přes nějaké rozhraní typu Adminer nebo PHPMyAdmin a nebo jej můžete spustit přes soubor, který vidíte níže. Název může být např. vytvor-clanky.php. Soubor obsahuje příkazy SQL a je napojen na db.php, který zabezpečuje připojení k databázi. Ten samozřejmě musíte vytvořit nejdříve (viz předcházející kapitola). Soubor vytvor-clanky.php může vypadat např. takto:
<?php
// Napojení souboru se spojením k databázi
require 'db.php';
// SQL příkaz k vytvoření tabulky Clanky v databázi
$vytvor_clanky = "CREATE TABLE Clanky (
id INT(6) AUTO_INCREMENT PRIMARY KEY,
nazev VARCHAR(30) NOT NULL,
autor VARCHAR(30) NOT NULL,
obsah TEXT,
datum VARCHAR(30) NOT NULL
)";
if (mysqli_query($spojeni, $vytvor_clanky)) {
echo "Tabulka Clanky byla vytvořena";
} else {
echo "Chyba, tabulka nebyla vytvořena: " . mysqli_error($spojeni);
}
mysqli_close($spojeni);
?>
Samotný příkaz SQL vypadá takto:
CREATE TABLE Clanky (
id INT(6) AUTO_INCREMENT PRIMARY KEY,
nazev VARCHAR(30) NOT NULL,
autor VARCHAR(30) NOT NULL,
obsah TEXT,
datum VARCHAR(30) NOT NULL
)
Dále si vytvoříme soubor, kterým budeme články vytvářet - novy-clanek.php:
<?php
require 'db.php' ;
?>
<form action="" method="post">
Název článku:<br>
<input type="text" name="nazev"><br>
Autor:<br>
<input type="text" name="autor"><br>
Obsah článku:<br>
<textarea name="obsah"></textarea><br>
<input type="submit" value="Uložit článek">
</form>
<?php
if (!empty ($_POST))
// empty - prázdný a jeho negace nebo-li
// pokud bylo cokoliv zadáno do formuláře, začne se vykonávat následující podmínka
{
// přijme všechny zadané informace do formuláře
$nazev = $_REQUEST["nazev"];
$autor = $_REQUEST["autor"];
$obsah = $_REQUEST["obsah"];
$datum = StrFTime("%d.%m.%Y", Time());
// uložíme data do databáze
$novy_clanek = mysqli_query($spojeni, "INSERT INTO Clanky (nazev, autor, obsah, datum)
VALUES ('$nazev', '$autor', '$obsah','$datum')");
// Po uložení vypíše hlášku
echo ("Článek byl uložen<br>");
}
echo ('<a href="/vypis.php">Výpis článků</a>');
mysqli_close($spojeni);
?>
V závěru předchozího kódu "voláme" soubor vypis.php, kterým si necháme vypsat všechny články v databázi:
<?php
require 'db.php';
$vysledek = mysqli_query($spojeni, "SELECT * FROM Clanky ORDER BY datum DESC");
// Načtení článků seřazených podle datumu
while($data = mysqli_fetch_assoc($vysledek))
{
echo "<i>Název: </i><b>";
echo $data['nazev'];
echo "</b><br><i>Autor: </i>";
echo $data['autor'];
echo "<br><i>Vytvořeno: </i>";
echo $data['datum'];
echo "<br><i>Obsah článku:</i><br>";
echo $data['obsah'];
echo "<hr>";
}
?>
Na konec ještě vytvoříme základní rozhraní, např. takto:
<h1>Jednoduchý systém na ukládání článků do databáze</h1>
<p><a href="/novy-clanek.php">Vytvořit nový článek</a></p>
<p><a href="/vypis.php">Výpis článků</a></p>
POZOR! Odstraňte lomítka v adrese odkazů (vytváří se automaticky redakčním systémem...).
Prohlédněte si demo Takovýto systém ovšem neumožňuje editovat uložené články.
Další inspirace ke kapitole:
- zkuste vytvořit ve formuláři pro odesílání článků ochranu před roboty
- doplňte stránky o CSS např. formou frameworku
- Základní údaje
- Kategorie: PHP
- Zobrazení: 302
Protokol HTTP, který slouží ke komunikaci mezi www serverem a prohlížečem je bezstavový. Tzn., že mezi jednotlivými přechody stránek se neudržuje žádné spojení. Když kliknete na odkaz, pouze se spojí klient se serverem, server pošle stránku a spojení se ukončí. Pokud ale potřebujete znát obsah hodnoty proměnné, kterou uživatel odeslal formulářem asi tak o 3 stránky dříve, bez session se neobejdeme.
Jaká je hlavní činnost session:
- identifikaci uživatele
- uchovávání obsahu proměnných
Pro identifikaci uživatele stačí správně identifikovat opětovné přístupy od téhož uživatele. Samotná data přiřazená ke konkrétnímu uživateli již není třeba mezi stránkami sdílet, ale lze je ukládat na server a odkazovat se na ně. Na tomto principu jsou založeny sessions. Při jejich vytváření je uživateli vygenerován unikátní identifikátor sloužící k jeho rozpoznání a umožňující přistupovat ke konkrétnímu datovému souboru. Pro sdílení mezi jednotlivými stránkami tento identifikátor uložíme do cookie, kterou prohlížeč na server odesílá při každém načítání stránky. Data samotná jsou defaultně uložena v serializované podobě v souboru uloženém na serveru a pojmenovaném podle uvedeného identifikátoru. Příklad http requestu (vyžádání nějaké URL adresy):
GET /wiki/Wikipedie HTTP/1.1
Host: cs.wikipedia.org
Accept-Charset: UTF-8,*
Zde vidíme zcela běžnou obecnou hlavičku, kde není spuštěn příkaz (funkce session) a server odpovídá anonymnímu uživateli.
GET /programujeme-v-php/sessions?rev=1 HTTP/1.1
Host: pehapko.cz
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en,cs;q=0.8
Cookie: PHPSESSID=9g0jg1mgs26c1i0e4hok7rgbd1; nette-browser=spx2kdfq2y
V druhém případě již hlavička obsahuje záznamy o cookies, vidíme tady hned dvě. Cookie s název PHPSESSID je klíč k identifikaci uživatele. Cookie nette-browser není tak důležitý. Identifikuje prohlížeč. Pokud není na serveru nastavený session.auto_start (což ve výchozím stavu není), zahájíme session relaci funkcí session_start(). Kvůli nastavování cookie musíme tuto funkci volat před jakýmkoliv výstupem, typicky zcela na začátku souboru (až na výjimky...). V této chvíli již můžeme začít pracovat se superglobálním polem $_SESSION (dříve $HTTP_SESSION_VARS). Hodnotu do session přiřadíme běžným operátorem přiřazení $_SESSION['time'] = time(). Přečíst (s vypsáním) ji můžeme standardní konstrukcí echo $_SESSION['time']. Obecně lze říci, že se session pracujeme jako s běžným polem, můžeme používat in_array, isset, unset a podobně všechny funkce pro práci s poli, jak byly uvedeny v díle o polích. Jediný rozdíl při práci mezi session a běžnými poli je jejich superglobálnost, tj. jsou viditelé v libovolné funkci. Pozn. Na rozdíl od nastavení cookie pomocí setcookie() se změna session projeví ještě na téže stránce (změněná cookie až po reloadu, protože obvykle neupravujeme přímo $_COOKIE). Příklad základní práce se session – čas strávený na stránce a další statistiky
<?php
session_start();
$firstVisit = false;
if (!isset($_SESSION['firstVisit']))
{
$_SESSION['firstVisit'] = new \Datetime;
$_SESSION['lastVisit'] = new \Datetime;
$_SESSION['count'] = 0;
$firstVisit = true;
}
$timeSum = (new \Datetime)->diff($_SESSION['firstVisit']);
$timeLast = (new \Datetime)->diff($_SESSION['lastVisit']);
$lastVisit = $_SESSION['lastVisit'];
$_SESSION['lastVisit'] = new \Datetime;
$_SESSION['count']++;
echo ($firstVisit ? 'Vítejte, jste u nás poprvé.' : 'Děkujeme, že se k nám vracíte.') . PHP_EOL;
echo '<br>Čas první návštěvy: ' . $_SESSION['firstVisit']->format('H:i:s - d.m.Y') . PHP_EOL;
echo '<br>Celkový čas strávený na našich stránkách: '. $timeSum->format('%H:%i:%s') . PHP_EOL;
echo '<br>Čas předchozí návštěvy: ' . $lastVisit->format('H:i:s') . PHP_EOL;
echo '<br>Čas od předchozí návštěvy: ' . $timeLast->format('%H:%i:%s') . PHP_EOL;
echo '<br>Počet návštěv: ' . $_SESSION['count'] . PHP_EOL;
?>
Vyzkoušejte si tento příklad takto:
- Aktualizacemi téže stránky se budou měnit časové údaje. Aplikace si pamatuje svoji historii.
- Otevřete si stránku ve dvou různých prohlížečích (nebo v jednom + anonymním režimu) a paralelně jednotlivé stránky aktualizujte. Ověřte, že se jednotlivé relace neovlivňuji.
- Naopak otevřete stránku ve dvou běžných oknech prohlížeče (sdílejících cookies). Zjistíte, že nyní se relace vzájemně ovlivňují.
- Můžete vytvořit několik (volitelně odkazy provázaných) stránek a includovat do nich výše uvedený kód. Zjistíte, že se session sdílí mezi stránkami (session_start() musí být na každé stránce).
- Můžete si měnit jednotlivé cookie, když je smažete, bude vaše návštěva označena jako první. Zakážete-li ve svém prohlížeči přijímat cookies, pokaždé bude návštěva označena jako první.
- Výchozí nastavení pamatování si session bývá 24 minut (1440 sekund), nechte relaci delší dobu neaktivní a pak zkuste aktualizovat. Zřejmě uvidíte, že se v relaci pokračuje a nic se nestalo, mazání starých záznamů je totiž pravděpodobnostní. Existence po dobu 24 minut od poslední aktualizace je zaručena. Smazání po této době nikoliv, to závisí na aktivitě garbage collectoru, která je při výchozím nastavení 0.01, tj. s pravděpodobností 1 % při každé inicializaci smaže staré session záznamy. **Na některých systémech (Debian, Ubuntu) bývá gc zcela neaktivní a mazání periodicky provádí cronová úloha.
Demo k testování. Zdroj: http://www.pehapko.cz/programujeme-v-php/sessions