14. PHP – obsługa cookies i sesje


Ciasteczka – Cookies

Ciasteczka – Cookies, to krótkie informacje tekstowe, wysyłane przez stronę internetową, które za pośrednictwem przeglądarki zapisywane są na komputerze użytkownika. Ciasteczka wykorzystywane są do zapamiętywania dowolnych danych, które można zakodować w postaci ciągu znaków, dzięki czemu użytkownik nie musi wpisywać tych samych danych za każdym razem, gdy odwiedzi daną stronę WWW  np. login użytkownika, zawartość koszyka, nasze preferencje, ankieta którą już wypełnialiśmy, czy preferowany język na stronie itp.

Gdy posiadamy formularz rejestracji wszystkie dane możemy przechowywać w bazie, ale dzięki ciastkom możemy ominąć ten proces. Wystarczy, że użytkownik raz coś wybierze i jego preferencje zostaną zapisane, do momentu ich zmiany lub usunięcia. Oczywiście należy mieć na uwadze, ze użytkownik wyłączy zapisywanie ciasteczek.

Ciasteczka identyfikują dane komputera i przeglądarki, która korzysta ze strony WWW. W żaden sposób nie są szkodliwe dla naszego sprzętu, nie zmieniają ustawień konfiguracyjnych.

Ciasteczka mogą być odczytane tylko z poziomu domeny, z której pochodzą.

Ciasteczka są wymieniane przy przesyłaniu nagłówków HTTP, zanim strona WWW zostanie załadowana, po załadowaniu strony wysłanie ciasteczka jest niemożliwe. Należy zatem umiejętnie zaplanować wysyłanie ciasteczek. Kod wysyłający ciasteczko musi znajdować się jako pierwszy, zanim jakakolwiek informacja zostanie przesłana.

Podstawowe rodzaje ciasteczek

„Cookies” sesyjne – są to tymczasowe informacje przechowywane w pamięci przeglądarki do momentu zakończenia sesji przeglądarki, czyli do momentu jej zamknięcia.

„Cookies” stałe, nazywane również „śledzące„cookie” (ang. tracking cookies) –pozostają w pamięci przeglądarki przez dłuższy okres. Czas ten zależy od wyboru, którego można dokonać w ustawieniach przeglądarki. Ten rodzaj cookies zezwala na przekazywanie informacji na serwer za każdym razem, gdy odwiedzana jest dana strona.

„Cookies” podmiotów zewnętrznych – (ang. third parties cookies) – to informacje pochodzące np. z serwerów reklamowych, serwerów firm i dostawców usług (np. wyszukiwania albo map umieszczanych na stronie) współpracujących z właścicielem danej strony internetowej. Ten rodzaj cookie pozwala dostosowywać np. reklamy do preferencji i zwyczajów ich użytkowników.

Tworzenie ciasteczek

Wyślemy ciasteczko o nazwie „login” i wartości „JohnSmith” oraz „pass” o wartości „admin”. Ustawimy żywotność ciasteczka na 60 sekund. Do ustawienia ciasteczka wykorzystujemy funkcję setcookie($nazwa, $wartosc, $czas), która posiada wiele argumentów, ale najczęściej wykorzystuje się 3 pierwsze (więcej informacji o setcookie() na stronie dokumentacji)

<?php
// utworzenie ciasteczek
setcookie("login", "JohnSmith", time()+60);
setcookie("pass", "admin", time()+60);
?>

Jeśli chcesz przypisać wiele wartości do jednego ciasteczka, możesz po prostu złączyć je w tablicę. Na przykład:

<?php
setcookie("logowanie[login]", "JohnSmith", time()+60);
setcookie("logowanie[pass]", "admin", time()+60);
?>

Spowoduje to stworzenie dwóch oddzielnych ciasteczek, mimo, iż „logowanie” będzie teraz pojedynczą tablicą w twoim skrypcie. Jeśli chcesz ustawić tylko jedno ciasteczko z wieloma wartościami, rozważ możliwość użycia przedtem funkcji serialize() lub explode() na wartości.

Można pominąć trzeci parametr, czyli $czas – ciasteczko będzie ważne do zamknięcia przeglądarki (przyjmie wartość 0).

Jeżeli nazwy ciasteczek są takie same, ich wartości zostaną nadpisane (o ile ścieżka lub domena nie są różne) np. dla koszyka do zakupów możesz potrzebować licznika a jego wartość stale przekazywać dalej, tzn.

<?php
if (isset($_COOKIE['ile'])) {
   $ile = $_COOKIE['ile'] + 1;
} else {
   $ile = 1;
}
setcookie('ile', $ile, time()+3600);
?>

Odczytywanie ciasteczek

Tworzone ciasteczka są automatycznie zapisywane w tablicy superglobalnej $_COOKIE (analogicznie do poznanych już tablic $_POST i $_GET), którą możemy przeglądać i operować danymi w niej zapisanymi.

<?php
if(isset($_COOKIE['login']) && $_COOKIE['pass']){
  echo "dane logowania kompletne";
}else{
  echo "Brak ciasteczka z danymi logowania";
}
?>

Możemy wyświetlić całą tablicę przy pomocy funkcji print_r:

<?php
echo '<pre>';
print_r($_COOKIE);
echo '</pre>';
?>

Usuwanie ciastek

Aby usunąć ciasteczko należy ustawić dla niego ujemną wartość czasową. Zamiast dodawać do funkcji time() czas przez jaki ma być ważne po prostu go odejmujemy.

setcookie('uzytkownik', "Ala", time()-3600);

Powyższy kod usunie ciastko użytkownik z ostatniej godziny.

 

Przykład:

W oparciu o mechanizm ciasteczek skrypt wypisuje na stronie komunikaty:

‒ Gdy odwiedzający wejdzie na stronę pierwszy raz zakładane jest ciasteczko z czasem trwania 2 godziny od utworzenia oraz wyświetlany jest w paragrafie, czcionką pogrubioną, komunikat: „Dzień dobry! Strona lotniska używa ciasteczek”

‒ Jeżeli odwiedzający w ciągu 2 godzin od poprzedniego wejścia wejdzie ponownie na stronę wyświetlany jest w paragrafie, czcionką pochyloną, komunikat „Witaj ponownie na stronie lotniska”

<?php
if(isset($_COOKIE['start'])){
  $msg="<p><i>Witaj ponownie na stronie lotniska</i></p>";
}else{
  setcookie('start','start',time()+2*60*60);
  $msg="<p><b>Dzień dobry! Strona lotniska używa ciasteczek</b></p>";
}
?>

Sesje – Session

Sesje lub inaczej kontrola sesji pozwala na zapamiętanie użytkownika, jego preferencji i upoważnień na stronie np. w przypadku korzystania z koszyka zakupów, mechanizmu logowania itp. Przechodzenie pomiędzy stronami nie skutkuje wówczas koniecznością ponownego logowania się na stronie.

Sesja tworzona jest w postaci unikalnego identyfikatora tzw. SID. Taki identyfikator przechowywany jest w pliku cookie po stronie klienta lub przekazywany za pomocą adresu URL. Zmienne przechowywane są po stronie serwera, a użytkownik ma tylko id sesji.

Wszelkie dane jakie chcemy przekazywać pomiędzy stronami zostają zapisane w tablicy superglobalnej $_SESSION.

 

Etapy tworzenia sesji

  1. Rozpoczynanie sesji
  2. Tworzenie zmiennych sesyjnych
  3. Praca na zmiennych sesyjnych
  4. Usuwanie zmiennych i niszczenie sesji

 

Rozpoczynanie sesji

Aby rozpocząć sesję lub móc korzystać z danych z istniejącej sesji, na początku każdego skryptu należy wywołać funkcję:

session_start()

<?php
session_start();
echo "<pre>"; 
print_r($_SESSION); 
echo "</pre>";

//zobaczymy, że tablica superglobalna SESSION zaistniała
?>

Jeżeli SID sesji nie istnieje, zostanie on utworzony, a jeżeli istnieje – funkcja pobierze wartości wszystkich zmiennych obecnej sesji.

Tworzenie zmiennych sesyjnych

Zmienną sesyjną tworzymy wpisując do tablicy $_SESSION kolejny element np.

$_SESSION[’zm_sesyjna_1′]=”Ja”;

<?php
session_start();

$_SESSION['zm_sesyjna_1']="Ja"; //tworzymy zmienną sesyjną

echo "<pre>"; 
print_r($_SESSION); 
echo "</pre>";

/*
Array ( 
    [zm_sesyjna_1] => Ja 
)
*/
?>

Tak zadeklarowana zmienna będzie pamiętana tak długo, jak jest to ustawione w pliku php.ini (tą warość można zmieniać ręcznie w pliku),

; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
; http://php.net/session.gc-maxlifetime
session.gc_maxlifetime=1440

lub dopóki nie zostanie usunięta ręcznie (jak to zrobić opisałam niżej).

Praca na zmiennych sesyjnych

Zmienne sesyjne stosujemy jak wcześniej omawiane zmienne tablicowe.

Zanim rozpoczniemy używanie zmiennych należy sprawdzić, czy istnieją te zmienne:

<?php
session_start();

$zm_s_1=$_SESSION['zm_sesyjna_1']="Ja"; //przypisałam zmienną sesyjną do innej zmiennej - tak też można

if(isset($zm_s_1)){//sprawdzam czy taka zmienna jest
    echo "<pre>"; 
    print_r($_SESSION); 
    echo "</pre>";
}
else{
    echo "nie ma zmiennych sesyjnych";
}
?>

Usuwanie zmiennych i niszczenie sesji

W celu usunięcia zmiennej sesyjnej stosujemy:

unset($_SESSION[’zm_sesyjna_1′]);

lub

unset($zm_s_1);

Gdy chcemy usunąć wszystkie zmienne na raz:

$_SESSION=array();

czyli po prostu nadpisujemy istniejącą tablicę – nową pustą tablicą.

Jeżeli sesja nie jest już potrzebna, np. klient wyloguje się z aplikacji, możemy zniszczyć sesję:

session_destroy();

 

 

Podczas pracy z sesjami należy pamiętać, że rekord sesji nie jest tworzony, dopóki zmienna nie zostanie zarejestrowana przy użyciu funkcji session_register() lub przez dodanie nowego klucza do tablicy superglobalnej $_SESSION. Dzieje się tak niezależnie od tego, czy sesja została uruchomiona przy użyciu funkcji session_start().

https://www.php.net/manual/en/intro.session.php