Uvod
Posle upoznavanja sa osnovama PHP-a, na red prirodno dolazi upoznavanje sa različitim tehnikama za prosleđivanje podataka PHP skriptama, odnosno, sa tehnikama za razmenu podataka između skripti (koje čine sadržaj sajta).
Korisnički podaci koji 'završe' u PHP skriptama (kao i razni drugi podaci), dostupni su za obradu preko tzv. superglobalnih promenljivih, sa kojima ćemo se detaljno upoznati u članku koji je pred nama i kroz nekoliko narednih članaka.
Pojam superglobalne promenljive u PHP-u
Pored promenljivih koje programeri mogu definisati sami (za potrebe izvršavanja PHP skripti), postoje i promenljive koje se u toku izvršavanja skripti generišu automatski.
Da budemo precizni, u pitanju su asocijativni nizovi, * čijim elementima skripte mogu pristupati, pri čemu se elementi nizova ponekad mogu samo čitati, a ponekad se mogu i upisivati. **
Asocijativni nizovi koje smo prethodno opisali, nose zajednički naziv superglobalne promenljive, a najčešće korišćene superglobalne promenljive su:
- $_GET - podaci prosleđeni preko HTTP metode GET (preko HTML forme, ili, još češće - preko URL-a)
- $_POST - podaci prosleđeni preko HTTP metode POST (najčešće preko HTML forme)
- $_SESSION - podaci koji se čuvaju u okvire sesije u browseru (od trenutka kada se sajt pokrene, sve dok se ne zatvori)
- $_COOKIE - podaci koji se čuvaju lokalno (na računaru klijenta) u obliku HTTP kukija
- $_SERVER - podaci o parametrima konekcije (IP adresa koja je korišćena za pristup, naziv servera sa koga je ispraćen link do sajta koji se poziva, naziv browsera i drugi podaci)
- $_REQUEST - podaci o protokolu koji je korišćen za slanje podataka
Superglobalna promenljiva $_GET
Ukoliko ste pažljivo ispratili članak o strukturi web adresa, primetili ste da se na kraju URL-a može naći upit, koji sadrži dodatne informacije.
U kontekstu diskusije o superglobalnim promenljivama u jeziku PHP, delovi upita predstavljaju indekse i vrednosti kojima se može pristupati preko superglobalne promenljive $_GET
.
U pitanju je transparentan - ali samim tim i nesiguran (!) način za prenos podataka, i stoga je potrebno prepoznati koji se podaci smeju, a koji ne smeju, prosleđivati preko protokola GET.
Pristup parametrima koji su prosleđeni preko protokola GET
Ako se u adresnu liniju browsera unese sledeći URL ....
.... serveru se prosleđuje zahtev za pretragu, a parametri pretrage - u kontekstu toga kako im se dalje može pristupati preko PHP-a - predstavljaju sledeće podatke:
- indeks
"ime"
sa pripisanom vrednošću"Ivo"
- indeks
"prezime"
sa vrednošću"Andrić"
Preko PHP koda, navedenim parametrima može se pristupiti na sledeći način:
Da bismo isprobali kako sve funkcioniše u praksi, kreiraćemo skriptu pretraga.php
, * unećemo sledeći kod ** ....
.... i (pošto pokrenemo skriptu), u browseru će se pojaviti sledeći ispis:
Za početak smo naprosto pozivali vrednosti preko indeksa i nismo se pitali da li su podaci pod datim indeksom zapravo prosleđeni, međutim, da bismo bili sigurni da su indeksi koji se pozivaju, pravilno definisani, potrebno je koristiti mehanizam provere.
Provera ispravnosti parametara - isset
Ukoliko URL ne sadrži upit, a skripta za obradu ipak pokuša da pristupi superglobalnoj promenljivoj $_GET
(odnosno, nekom od indeksa), doći će do greške - što znači da je potrebno da se programski kod iz prethodnog odeljka dopuni grananjem u kome se koristi funkcija za proveru podataka:
Za proveru dostupnosti podataka koje korisnik prosleđuje pri unosu URL-a, koristi se funkcija isset
(koja proverava da li je promenljivoj dodeljena vrednost):
- ukoliko preko protokola GET nije prosleđen nijedan podatak, prvi
if
iz gornje skripte preći će odmah nafalse
granu i ispisati poruku o grešci - ukoliko postoje podaci koji su prosleđeni preko protokola GET, i pri tom su pravilno formatirani, proradiće deo koda koji smo koristili do sada (
true
grana unutrašnjegif-a
) - ukoliko postoje podaci koji su prosleđeni preko protokola GET, ali, nisu pravilno formatirani, biće ispisana odgovarajuća poruka (
false
grana unutrašnjegif-a
)
Može se reći da je programski kod koji smo prethodno prikazali previše zvaničan, ali, za početno upoznavanje, takav 'školski primer' je sasvim prikladan.
Međutim, u svakodnevnim situacijama, ipak je uputno koristiti jednostavnije i praktičnije kodove (na primer):
Umesto relativno "glomazne" if-else
strukture, izmenjena skripta koristi jednostavniji mehanizam provere: ukoliko nisu ispunjeni uslovi za nastavak izvršavanja (smatramo da dalje izvršavanje zavisi od prosleđenih podataka) - prekida se dalje izvršavanje.
Ukoliko je sve u redu, nastavlja se izvršavanje.
Kada treba koristiti prenos podataka preko protokola GET?
Podaci koji se prosleđuju preko protokola GET (kao deo URL-a), jasno su vidljivi, i omogućavaju usmeravanje servera na određene sadržaje i pamćenje stranica po potrebi (bookmarks).
Recimo, sledeći upit ....
.... koji je deo sledeće adrese ....
.... pokrenuće sve neophodne procedure za učitavanje sadržaja koji su vezani za navedeni članak.
Neki drugi upit sa odgovarajućim parametrima, pokrenuo bi otvaranje drugog članka, dok bi upit sa parametrima koji se ne prepoznaju * - doveo do poruke o grešci.
Kada ne treba koristiti prenos podataka preko protokola GET?
U praktičnom smislu, pitanje iz naslova važnije je od pitanja o tome kada treba koristiti prosleđivanje podataka preko protokola GET.
Budući da su podaci koji se prosleđuju preko URL-a vidljivi (a time nažalost i lako dostupni za zloupotrebu), jasno je da protokol GET nije prikladan izbor za prenos osetljivih informacija kao što su lozinke za pristup sajtovima, lični podaci i sl.
Velika je greška prosleđivati osetljive podatke preko protokola GET, i stoga se zarad prosleđivanja osetljivih podataka koristi drugi vid prenosa, preko protokola POST (čemu je posvećen naredni članak).
Kratak rezime ....
Da rezimiramo ukratko:
- prenos preko protokola GET koristi se onda kada je potrebno da informacije koje se šalju, postanu deo URL-a (kao parametri pretrage, indeksi stranica i sl)
- zbog očigledne "otvorenosti", protokol GET ne sme se koristiti za slanje osetljivih informacija (lozinke, lične informacije i sl)
- prilikom prijema podataka u PHP skripti za obradu, potrebno je (preko funkcije
isset
), proveriti da li su podaci pravilno prosleđeni
U sledećem nastavku serijala o PHP-u, govorićemo (kao što smo već najavili), o prosleđivanju podataka preko protokola POST.