nav_dugme codeBlog codeBlog
  • početna Početna stranica
  • Sačuvani članci Sačuvani članci
  • Članci
     (spisak)
  • Kontakt
Povratak na vrh stranice

Info & povezani članci Info o članku - dugme

Info

trejler_sat Datum objave: 23.02.2021.

trejler_dokument Jezici: PHP

trejler_teg_narandzasti Težina: 7/10

PHP
internet
session
cookie
autorizacija
web server
localhost
backend
fullstack
teorija

Tema: PHP

Uvod u PHP i back-end programiranjePovezivanje skripti sa MySql bazama podatakaTutorijal - Kreiranje forme za prijavu korisnika$_GET - Prosleđivanje podataka preko URL-a ($_GET)$_POST - Prosleđivanje podataka preko HTML formeTutorijal - Ažuriranje praznih kolona u bazi podataka

Povezani članci

Pokretanje lokalnog web serveraUvod u web dizajn - 1. deo - Početni koraciUvod u JavaScript i DOM (Document Object Model)JSON - tekstualni format za razmenu podatakaStruktura web adresa i pristup internet stranicamaHTTP statusni kodoviKako napraviti dobru lozinkuLokalno skladištenje podataka browsera (sessionStorage, localStorage, cookies)Šablonske niske u programskim jezicimaIzbor prvog programskog jezika
Svi članci
Programming isn't about what you know; it's about what you can figure out.
Chris Pine

PHP - Direktno prosleđivanje podataka između stranica ($_SESSION)

Facebook LinkedIn Twitter Viber WhatsApp E-mail
zoom_plus zoom_minus bookmark
početna > Članci > Teorija

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, neka od skripti za obradu podataka (koje smo do sada koristili), može se 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:

		
<?php
	session_start();

	// Tek posle komande session_start()
	// navode se i ....

	// OSTALE NAREDBE
?>
		
	
Slika 1. - Za korišćenje superglobalne promenljive $_SESSION, od presudnog je značaja da se na samom početku skripte navede komanda session_start.

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):

		
<?php
	session_start();
?>

<!DOCTYPE html>

<html>
	<head>
		<meta charset='utf-8'/>
		<title>Naslov</title>
	</head>


	<body>
		<?php
			// Blok PHP koda u kome
			// se poziva $_SESSION
		?>
		
		<nav>
		</nav>

		<main>
			<?php
				// Blok PHP koda u kome
				// se poziva $_SESSION
			?>
		</main>

		<footer>
		</footer>
	</body>
</html>
		
	
Slika 2. - Primer PHP skripte koja kombinuje HTML i PHP kodove (primetimo da je i ovog puta komanda session_start zapisana na samom početku, u zasebnom PHP bloku).

Dakle (u skladu sa prethodno navedenim pravilom): komanda session_start poziva se na samom početku.

Nakon pripreme, može se pristupati promenljivoj $_SESSION.

Kako se koristi niz $_SESSION

Ukoliko preko skripte proba_session.php pozovemo sledeće instrukcije ....

		
<?php
	session_start();

	// OSTALE NAREDBE #1

	// POZIV NIZA $_SESSION

	$_SESSION['ime']     = "Petar";
	$_SESSION['prezime'] = "Milenković";
	$_SESSION['email']   = "petar_milenkovic@proba.rs";

	// OSTALE NAREDBE #2
?>
		
	
Slika 3. - Ovoga puta, skripta index.php je samo pomoćna skripta preko koje ćemo definisati sadržaj superglobalne promenljive $_SESSION.

.... 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:

		
<?php
	session_start();

	// Proverićemo (za svaki slučaj),
	// da li su podaci prosleđeni:

	$uslov = isset($_SESSION['ime']) &&
	         isset($_SESSION['prezime']) &&
	         isset($_SESSION['email']);

	if (!$uslov) {
		"Greška pri prosleđivanju podataka.";
		exit();

		// U našoj "školskoj" skripti,
		// napravićemo ispis, ali, u praksi,
		// najčešće bismo samo zanemarili
		// nedostatak sadržaja i odreagovali
		// na sasvim drugačiji način
	}

	// Pozivanje niza $_SESSION:

	$ime     = $_SESSION['ime'];
	$prezime = $_SESSION['prezime'];
	$email   = $_SESSION['email'];

	// Probni ispis sadržaja:

	echo "Ime: "     . $ime     . "<br>";
	echo "Prezime: " . $prezime . "<br>";
	echo "E-mail: "  . $email   . "<br>";
?>
		
	
Slika 4. - Skripta preko koje se pristupa podacima unutar superglobalne promenljive $_SESSION (naravno, uz proveru da li su podaci pravilno prosleđeni).

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:

		
Ime: Petar
Prezime: Milinković
E-mail: petar_milinkovic@gmail.com
		
	
Slika 5. - Rezultat izvršavanje prethodno definisane skripte.

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

U drugom primeru, pretpostavićemo da je potrebno da (novi) uprošćeni sajt funkcioniše na sledeći način: *

  • sajt se sastoji od dve stranice:
    • index.php - stranica na kojoj će biti forma za unos imena
    • obrada.php - stranica preko koje se proverava da li uneto ime ima dužinu od bar dva znaka
  • stranica index.php prosleđuje podatke stranici obrada.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 prikazana poruka o grešci)

* Opisani način obrade podataka je veoma uobičajen na modernim sajtovima.

Takođe, novi primer je svojevrsna priprema za sledeći članak: tutorijal za kreiranje forme za prijavu korisnika, u kome će biti korišćen upravo princip prosleđivanja podataka koji smo prethodno opisali.

Prvo ćemo kreirati 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):

		
<?php
	session_start();
	$uslov = false;

	// Ukoliko ime nije prosleđeno, kreiraćemo indeks
	// 'greska' u superglobalnoj promenljivoj $_SESSION
	// i upisati odgovarajuću poruku o grešci:

	if (!isset($_POST['ime'])) {
		$_SESSION['greska'] = "Ime nije prosleđeno";
		$uslov = true;
		header("location: index.php");
	}

	// Ako je skripta došla do ovog mesta, ime jeste prosleđeno ....

	$ime = trim($_POST['ime']);

	// .... ali, proverićemo da li je ime
	// formatirano shodno uslovima zadatka
	// (ako nije, kreiraćemo indeks 'greska' i
	// upisati odgovarajuću poruku:

	if (str_len($ime) < 2) {
		$_SESSION['greska'] = "Ime je kraće od dva znaka";
		$uslov = true;
		header("location: index.php");
	}

	// Ako nije bilo grešaka pri prosleđivanju
	// podataka, ispisaćemo poruku .... 

	echo "Čestitamo!<br>";
	echo "Prosledili ste ime: " . $ime . "<br>";

	// Takođe (što je važnije), ukinućemo
	// indeks 'greska', zarad pravilnog
	// funkcionisanja skripte "index.php".

	unset($_SESSION['greska']);
?>
		
	
Slika 6. - Skripta za obradu podataka (koju koristimo u primeru).

Potom je potrebno napisati i skriptu index.php (u koju treba uneti sledeći sadržaj):

		
<?php
	session_start();
?>

<!DOCTYPE html>

<html>
	<head>
		<meta charset='utf-8'>
		<title></title>
		<style>
			.crni_okvir {
				border: solid 1px black;
			}

			.crveni_okvir {
				border: solid 2px red;
			}
		</style>
	</head>

	<body>
		<form method='POST' action='obrada.php'>
			<label for='ime'>Ime:</label>
			<?php
				// Prvo treba proveriti da li se skripta nalazi
				// u režimu u kome je potrebno ispisivati poruke
				// o grešci (ako nas je ovde "vratila" skripta
				// "obrada.php"), ili, nije potrebno - ako se
				// stranica otvara prvi put (ili se vraćamo posle
				// prethodnog prosleđivanja podataka koje je
				// bilo uspešno):

				$uslov = isset($_SESSION['greska']) &&
				         isset($_SESSION['ima_gresaka']);

				if (!$uslov) {  // Ako je sve u redu ....
					// .... iscrtava se običan okvir:

					echo "<input class='crni_okvir' type='text' name='ime'/>"
				}
				else {  // Ako nije ....
				{
					// .... iscrtava se crveni okvir:

					echo "<input class='crveni_okvir' type='text' name='ime'/>"
				}
			?>
			<input type='submit' value='OBRADA'/>
		</form>

		<p id='poruka_o_gresci'>
			<?php
				// PHP blok u kome se trenutno nalazimo
				// može pristupati podacima iz prethodnih
				// blokova, i stoga se može koristiti
				// već provereni uslov:
				
				if ($uslov) {
					echo "Greška pri unosu imena:<br>";
					echo $_SESSION['greska'] . "<br>";
				}
			?>
			else {
				echo "";
			}
		</p>

	</body>
</html>
		
	
Slika 7. - Skripta index.php (koju koristimo u primeru), koja se poziva na superglobalnu promenljivu $_SESSION, pri čemu se sadržaj definiše preko skripte koju smo videli na prethodnoj slici (slika #6).

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 klasu crni_okvir (ukoliko nije vraćena poruka o grešci), ili crveni_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.

Autor članka Nikola Vukićević Za web portal codeblog.rs
Napomena: Tekstovi, slike, web aplikacije i svi ostali sadržaji na sajtu codeblog.rs (osim u slučajevima gde je drugačije navedeno) predstavljaju intelektualnu svojinu autora sajta codeblog.rs i zabranjeno je njihovo korišćenje na drugim sajtovima i štampanim medijima, kao i bilo kakvo drugo korišćenje u komercijalne svrhe, bez eksplicitnog pismenog odobrenja autora.
© 2020-2025. Sva prava zadržana.
Facebook LinkedIn Twitter Viber WhatsApp E-mail
početna > Članci > PHP - Direktno prosleđivanje podataka između stranica ($_SESSION)
codeBlog codeBlog
Sajt posvećen popularizaciji kulture i veštine programiranja.
Napomena: Tekstovi i slike na sajtu codeblog.rs (osim u slučajevima, gde je drugačije navedeno) predstavljaju intelektualnu svojinu autora sajta codeblog.rs i zabranjeno je njihovo korišćenje na drugim sajtovima i štampanim medijima, kao i bilo kakvo drugo korišćenje u komercijalne svrhe, bez eksplicitnog odobrenja autora.
© 2020-2025. Sva prava zadržana.
Facebook - logo
Instagram - logo
LinkedIn - logo
Twitter - logo
E-mail
Naslovna
   •
Uslovi korišćenja
   •
Obaveštenja
   •
FAQ
   •
Kontakt