PHP - Direktno prosleđivanje podataka između stranica ($_SESSION)
Uvod
Kada je u pitanju prosleđivanje podataka između stranica preko superglobalnih promenljivih $_GET i $_POST, diskutovali smo (kako i dolikuje za početak), uglavnom o tome šta se preko dve osnovne superglobalne promenljive može uraditi, međutim, verujemo da ste mogli naslutiti da dva navedena osnovna mehanizma za prenos podataka, ne omogućavaju povrat podataka "unazad" (na takav način da onaj ko piše skripte, može direktno uticati na razmenu podataka između dve stranice).
Recimo, neku od skripti za obradu podataka (koje smo do sada koristili), možemo uputiti "nazad" na skriptu index.php
(preko koje je skripta za obradu pokrenuta), ali, ukoliko to učinimo - skripta index.php
neće moći da koristi podatke iz nizova $_GET
ili $_POST
.
Superglobalna promenljiva $_SESSION
rešava problem neposrednog prosleđivanja podataka između stranica, na prilično elegantan način.
Superglobalna promenljiva $_SESSION
Da pojasnimo dodatno smernice koje smo pomenuli u uvodu:
- sadržaj nizova
$_GET
i$_POST
kreira se korišćenjem podataka iz HTML formi ili URL-a (za$_GET
- na oba načina; za$_POST
- prosleđivanjem preko forme) - ako preko browsera pokušamo da "pređemo unazad", sa stranice za obradu - na stranicu sa koje su podaci prosleđeni, prethodno definisani sadržaj superglobalnih promenljivih
$_GET
i$_POST
neće biti dostupan (a isti je slučaj ukoliko se redirekcija obavlja preko PHP koda)
Superglobalna promenljiva $_SESSION
omogućava neposredno kreiranje indeksa i prosleđivanje podataka (kada se kreira određeni indeks, podaci koji su zapisani na tom mestu postaju dostupni svim stranicama koje koriste $_SESSION
(i ostaju zabeleženi kada se "vraćamo unazad", bilo preko komandi u browseru, bilo preko PHP instrukcija)).
Na prvi pogled, sve deluje "baš kako treba", reklo bi se da je superglobalna promenljiva $_SESSION
"sve što nam treba", i reklo bi se da je u stanju da zameni, i $_GET
, i $_POST
, međutim ....
Sve (dobro i povoljno) što smo naveli o superglobalnoj promenljivoj $_SESSION
- i dalje stoji, ali, uz jednu "sitnu" napomenu: preko superglobalne promenljive $_SESSION
mogu se prosleđivati samo oni podaci koji već postoje u skriptama (vrednosti promenljivih, rezultati izračunavanja i (naravno) - podaci koji su uneti u web aplikaciju preko superglobalnih promenljivih $_GET
i $_POST
).
Dakle, podaci koje unose korisnici, u "sistem" dospevaju preko superglobalnih promenljivih $_GET
i $_POST
, a za sve ostalo (da parafraziramo jedan popularni slogan) - tu je $_SESSION
.
Šta je sesija
Kada govorimo o sesijama (u kontekstu izvršavanja računarskih programa), u pitanju je vremenski okvir koji počinje pokretanjem programa i završava se isključivanjem programa, pri čemu (u navedenom vremenskom okviru), često dolazi do skladištenja podataka koji se mogu razmenjivati između različitih programskih modula.
U slučaju web browsera (u kontekstu ovog članka i u kontekstu upotrebe superglobalne promenljive $_SESSION
), pojam sesije vezan je za pokretanje određenog sajta.
Kada se sajt otvori, podaci koje sajt koristi mogu se pamtiti i prosleđivati između različitih stranica sajta, sve dok se sajt ne zatvori (uz napomenu da proces "pamćenja podataka" zapravo nije automatizovan, što ćemo u nastavku dodatno pojasniti).
Tipičan primer za razmenu podataka o kakvoj govorimo, javlja se na sajtovima koji koriste podatke za prijavu na korisnički nalog (forumi, društvene mreže i sl): ako se preko stranice za prijavu uspešno prijavimo, podaci za autorizaciju postaće dostupni i ostalim stranicama sajta i nećemo morati ponovo da se prijavljujemo na svakoj stranici (s tim što vredi još jednom ponoviti da proces nije automatizovan).
Kako se pokreće $_SESSION
Način korišćenja superglobalne promenljive $_SESSION
veoma je jednostavan - pod uslovom da se pridržavamo određenih pravila.
Pre svega, na samom početku svake skripte u kojoj će biti korišćena superglobalna promenljiva $_SESSION
, potrebno je navesti sledeći kod:
Programski kod koji smo prikazali jeste krajnje jednostavan, ali, pravila su (zapravo) vrlo striktna - komanda session_start
se obavezno mora navesti - na samom početku skripte.
Ukoliko se unutar PHP datoteke kombinuju HTML i PHP kodovi, skriptu treba formatirati tako da prethodni uslov bude zadovoljen (recimo, na sledeći način):
Nakon pripreme, može se pristupati promenljivoj $_SESSION
.
Kako se koristi niz $_SESSION
Ukoliko preko skripte proba_session.php
pozovemo sledeće instrukcije ....
.... desiće se jedna od dve stvari (za svaki od indeksa):
- ukoliko indeks ne postoji u nizu, biće kreiran i biće mu dodeljena zadata vrednost
- ukoliko indeks već postoji, biće mu dodeljena nova vrednost (umesto dotadašnje)
.... i (prosto rečeno) - to je sve što je potrebno uraditi da bismo mogli zadavati vrednosti indeksima u okviru superglobalne promenljive $_SESSION
i na taj način razmenjivati podatke između različitih stranica određenog sajta (naravno, kao što smo već naglasili, uslov je da navedeni podaci već postoje u nekoj od skripti, i da nismo "zaboravili" da povežemo PHP skriptu sa superglobalnom promenljivom $_SESSION
, preko komande session_start
).
Sa druge strane, čitanje vrednosti na određenom indeksu (kao i u slučaju kada smo koristili promenljive $_GET
i $_POST
), nije operacija koja se može obaviti bezuslovno (tj. uvek), a za proveru se koristi (već dobro poznata) funkcija isset
.
Sada možemo kreirati skriptu obrada.php
i u nju uneti sledeći kod:
U pitanju je (za početak), krajnje jednostavna skripta, koja za cilj ima osnovno upoznavanje sa novim mehanizmom za razmenu podataka.
Pri pokretanju skripte (ukoliko smo prethodno pokretali skriptu index.php
), dobićemo sledeći ispis:
Međutim, da bismo se dodatno upoznali sa tim šta se (sve) može uraditi preko niza $_SESSION
, pogledaćemo još jedan primer (zanimljiviji i praktičniji).
Praktičan primer upotrebe superglobalne promenljive $_SESSION
Recimo da želimo da naš (novi) uprošćeni sajt funkcioniše na sledeći način (vrlo uobičajen na modernim sajtovima):
- sajt se sastoji iz dve stranice:
index.php
- stranica na kojoj će biti forma za unos imenaobrada.php
- stranica preko koje se proverava da li uneto ime ima dužinu od bar dva znaka
- stranica
index.php
prosleđuje podatke straniciobrada.php
preko protokola POST - po završenoj obradi, ukoliko je došlo do greške pri unosu, posetilac sajta biva vraćen na stranicu
index.php
(na kojoj će polje za unos podataka biti uokvireno crvenom bojom, a ispod polja će biti ispisana poruka o grešci)
Prvo ćemo napisati skriptu obrada.php
, koja će biti znatno jednostavnija (i sasvim razumljiva čitaocima, budući da smo princip prosleđivanja podataka preko superglobalne promenljive $_POST
(koji je veoma sličan), već objasnili u prethodnom članku):
Potom je potrebno napisati i skriptu index.php
(u koju treba uneti sledeći sadržaj):
Iako skripta index.php
može na prvi pogled delovati pomalo zbunjujuće, sve nedoumice rešavaju se osvrtom na jednostavna pravila sa kojima smo se do sada već upoznali:
- PHP blok može biti ubačen unutar HTML-a, na (manje-više) bilo kom mestu: pre, posle, ili između tagova, ali i između atributa unutar taga (što ćete uskoro moći da vidite u tutorijalu u kome ćemo se baviti kreiranjem forme za prijavu korisnika)
- svrha prikazanog PHP koda je - ispis taga
<input>
koji se poziva na klasucrni_okvir
(ukoliko nije vraćena poruka o grešci), ilicrveni_okvir
(ukoliko je vraćena poruka o grešci) - takođe, ukoliko je poruka o grešci prosleđena, biće ispisana unutar paragrafa sa id-om
poruka_o_gresci
- u oba slučaja, provera podrazumeva korišćenje uslova preko koga se ispituje da li je indeks
$_SESSION['poruka_greska']
aktiviran - poruka o grešci generiše se preko skripte
obrada.php
i prosleđuje preko superglobalne promenljive$_SESSION
(indeks$_SESSION['poruka_greska']
biće aktiviran i sadržaće tekst poruke o grešci) - ukoliko se u skripti
obrada.php
ustanovi da nije došlo do greške pri slanju podataka, indeks$_SESSION['poruka_greska']
biće ukinut
Kratak rezime ....
U prethodnim redovima imali smo priliku da se upoznamo sa superglobalnom promenljivom $_SESSION
i (takođe) sa praktičnim primerom upotrebe ovog korisnog mehanizma za prosleđivanje podataka.
Sve navedeno predstavlja dobru osnovu za praćenje tutorijala za kreiranje kompletnog formulara za prijavu korisnika (u kome ćemo koristiti do sada opisane tehnike za pristup podacima iz baze podataka i prosleđivanje podataka između stranica), i upravo to će biti tema narednog članka.