30 dniowy kurs php – dzień 17 – sesje


Back-end (php, mysql)

Kolejna z nowych tablic $_SESSION oferuje tworzenie sesji w obrębie wizyty strony w przeglądarce. Dane odnośnie aktualnej sesji przechowywane są w pamięci przeglądarki. Czyli jeśli otworzysz stronę z sesją po czym przejdziesz na inną stronę i znów wrócisz na stronę z sesją to wciąż będzie ona zachowana. Ale jeśli zamkniesz przeglądarkę to dane odnośnie aktualnej sesji zostaną automatycznie usunięte.

Dane odnośnie sesji można też usuwać po upływie czasu. Świetnie widać działanie sesji w platformach bankowych, gdzie zostajemy automatycznie wylogowani po pewnym czasie bezczynności. Dostajemy wtedy zazwyczaj komunikat typu „sesja wygasła, zaloguj się ponownie”.

Są to oczywiście bardzo rozbudowane pod względem bezpieczeństwa systemy sesji i nie ma ich co porównywać z tym, który zaraz napiszemy.

Zacznijmy od pierwszej i najważniejszej funkcji, która rozpoczyna sesję.

<?php
session_start();
?>

Wpis ten dajemy zawsze na początku, czyli przed przed jakąkolwiek deklaracją doctype i html. Jednocześnie session_start(); musimy umieścić na każdej z podstron, na której chcemy obsługiwać sesję.

Licznik odsłon witryny

<?php
session_start();

// sprawdzenie czy istnieje tablica sesji 'licznik'
if(isset($_SESSION['licznik']))
{
// dodatnie wartości + 1 do istniejącej tablicy
$_SESSION['licznik'] = $_SESSION['licznik'] + 1;
}
else
{
// jeśli tablica sesji 'licznik' nie istnieje
// utwórz ją i przypisz jej wartość równą 1
$_SESSION['licznik'] = 1;
}
?>

Tworzymy nowy wpis o nazwie ‚licznik’ w tablicy $_SESSION. Podobnie jak w przypadku $_COOKIES możemy podawać dowolne nazwy.

Teoretycznie moglibyśmy napisać tylko $_SESSION[‚licznik’] + 1; ale wtedy pierwsze uruchomienie strony zwróci nam błąd: niezidentyfikowany index ‚licznik’. Musimy więc najpierw sprawdzić metodą if(isset()) czy dany index sesji jest ustanowiony. Jeśli nie to tworzymy go i nadajemy mu wartość 1.

Teraz wystarczy, że do naszego skryptu dopiszemy jeszcze kod zwracający liczbę odsłon strony

<?php
// odbieranie danych z tablicy sesji 'licznik'
echo "Licznik odsłon witryny: ". $_SESSION['licznik'];
?>

Uruchom powyższy skrypt w całości. Każde odświeżenie, czy ponowne uruchomienie skryptu zaowocuje zwiększeniem liczby odsłon.

Wszystko działa jednak w obrębie jednego pliku, a sesje możemy przenosić również na inne podstrony naszej witryny. Poniżej bardziej rozbudowany przykład składający się z 3 plików.

index.php

<?php
session_start();

// sprawdzenie czy istnieje tablica sesji 'licznik'
if(isset($_SESSION['licznik']))
{
// dodatnie wartości + 1 do istniejącej tablicy
$_SESSION['licznik'] = $_SESSION['licznik'] + 1;
}
else
{
// jeśli tablica sesji 'licznik' nie istnieje
// utwórz ją i przypisz jej wartość równą 1
$_SESSION['licznik'] = 1;
}
?>

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<title>Sesje</title>
</head>
<body>

<?php
// odbieranie danych z tablicy sesji 'licznik'
echo "Licznik odsłon witryny: ". $_SESSION['licznik'];
?>

<br/>
<a href="podstrona.php">link do podstrony</a>
<br/><br/>

<!-- przycisk z przeładowaniem strony (javascript) -->
<input type="button" value="Odśwież stronę" onClick="document.location.reload(true)" />

<br/><br/>
<a href="delete.php">usuń sesję</a>

</body>
</html>

podstrona.php

<?php
session_start();

// sprawdzenie czy istnieje tablica sesji 'licznik'
if(isset($_SESSION['licznik']))
{
// dodatnie wartości + 1 do istniejącej tablicy
$_SESSION['licznik'] = $_SESSION['licznik'] + 1;
}
else
{
// jeśli tablica sesji 'licznik' nie istnieje
// utwórz ją i przypisz jej wartość równą 1
$_SESSION['licznik'] = 1;
}
?>

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<title>Sesje</title>
</head>
<body>

<?php
// odbieranie danych z tablicy sesji 'licznik'
echo "Licznik odsłon witryny: ". $_SESSION['licznik'];
?>

<br/>
<a href="index.php">link do strony głównej</a>
<br/><br/>

<!-- przycisk z przeładowaniem strony (javascript) -->
<input type="button" value="Odśwież stronę" onClick="document.location.reload(true)" />

<br/><br/>
<a href="delete.php">usuń sesję</a>

</body>
</html>

delete.php

<?php
session_start();
 
// usunięcie z sesji indeksu 'licznik'
if(isset($_SESSION['licznik']))
{
 unset($_SESSION['licznik']);
}
 
// lub całkowite zniczenie sesji
session_destroy();
?>
 
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<title>Sesje</title>
</head>
<body>
 
Sesja usunięta
<!-- przycisk powrotu (javascript) -->
<input type="button" value="Wróć" onClick="history.back()" />
 
</body>
</html>

W powyższym przykładzie użyłem jeszcze javascript do stworzenia przycisku odświeżającego stronę oraz przycisku powrotu w pliku delete.php.

Usuwanie sesji

Z sesji możemy usunąć pojedynczy wpis lub możemy całkowicie zniszczyć sesję funkcją session_destroy(); W przypadku większej ilości wpisów w sesji (w powyższym przykładzie mamy tylko 1 indeks ‚licznik’) łatwiej jest użyć session_destroy(), chyba że chcemy usunąć tylko pojedyncze wpisy z tabeli sesji. Wtedy przyda się funkcja unset().