Seja oziroma session omogoča, da PHP med več zahtevki istega uporabnika ohrani podatke. Na strani uporabnika je običajno shranjen le identifikator seje, dejanski podatki pa se hranijo na strežniku.
Pomni: Seja omogoča, da si spletna aplikacija med različnimi obiski istega uporabnika zapomni pomembne podatke, na primer prijavo, košarico ali začasne nastavitve.
Osnovna pravila pri uporabi sej
- Sejo začnemo ali nadaljujemo z ukazom
session_start();. - Podatke beremo in zapisujemo prek polja
$_SESSION. $_SESSIONuporabljamo kot asociativno polje.session_start()mora biti izveden pred izpisom HTML vsebine.
Pozor: Če session_start() pokličemo prepozno, torej po izpisu vsebine, lahko PHP javi napako pri pošiljanju glav HTTP.
Kaj je v PHP seja
PHP seja je mehanizem za ohranjanje podatkov med več zahtevki. Podatki so v programu dostopni prek polja $_SESSION, ki je preddefinirano superglobalno asociativno polje.
Pomni: Polje $_SESSION je na voljo povsod v skripti in ga ni treba posebej prenašati med funkcijami kot navadno lokalno spremenljivko.
Začetek seje in zapis podatka
Ko želimo v sejo zapisati podatek, najprej zaženemo sejo, nato pa v polje $_SESSION dodamo nov ključ.
<?php
session_start();
if (!isset($_SESSION['moja_seja'])) {
$_SESSION['moja_seja'] = bin2hex(random_bytes(16));
}
echo 'Vrednost moje seje: ' . $_SESSION['moja_seja'];
?>
Pozor: V starejši kodi pogosto vidimo zapise, ki ob vsakem nalaganju strani ustvarijo novo vrednost seje. To ni primerno, če želimo podatek v seji ohraniti med več zahtevki.
Primer: števec obiskov strani
Seje pogosto uporabljamo za shranjevanje začasnih podatkov o uporabniku. Preprost primer je števec ogledov strani.
<?php
session_start();
if (!isset($_SESSION['stevec'])) {
$_SESSION['stevec'] = 1;
} else {
$_SESSION['stevec']++;
}
echo 'Ogledov: ' . $_SESSION['stevec'];
?>
Brisanje podatkov iz seje
Če želimo odstraniti samo en podatek iz seje, uporabimo unset(). Če želimo uničiti podatke celotne seje, uporabimo session_destroy().
<?php
session_start();
// izbriše en ključ
unset($_SESSION['stevec']);
// uniči podatke seje
session_destroy();
?>
Pozor: session_destroy() izbriše podatke seje, ne odstrani pa samodejno vseh vrednosti iz trenutne skripte ali piškotka seje. Pri popolni odjavi običajno počistimo tudi $_SESSION.
Varnostno priporočilo
Po prijavi uporabnika je priporočljivo zamenjati identifikator seje, da zmanjšamo tveganje zlorabe obstoječega ID-ja seje.
<?php
session_start();
// po uspešni prijavi
session_regenerate_id(true);
$_SESSION['uporabnik'] = 'ana';
?>
Pomni: Po uspešni prijavi je dobra praksa uporabiti session_regenerate_id(), ker s tem dobimo nov identifikator seje.
Česa ne shranjujemo v sejo
V sejah običajno hranimo manjše količine podatkov, kot so identifikatorji, uporabniško ime, vloga uporabnika ali vsebina košarice. V sejo ni primerno shranjevati vsega, poleg tega pa nekaterih vrst podatkov, na primer resource, ni mogoče hraniti.
Pozor: V sejo praviloma ne shranjujemo velikih količin podatkov ali neprimernih tipov. Za trajne podatke raje uporabimo podatkovno zbirko.
Pogoste napake
- izpuščanje klica
session_start();, - klic funkcije
session_start();šele po izpisu HTML-vsebine, - nepotrebno prepisovanje podatkov v seji ob vsakem nalaganju strani,
- napačno enačenje seje in piškotka,
- brisanje le enega ključa namesto celotne seje ob odjavi.