PHP - Prosleđivanje podataka preko URL-a ($_GET)
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 zarad čitanja zapisanih podataka, a u pojedinim okolnostima, vrednosti se mogu i upisivati na različite indekse. **
Asocijativni nizovi koje smo prethodno opisali, nose zajednički naziv superglobalne promenljive.
U PHP-u, najčešće se koriste sledeće superglobalne promenljive:
- $_GET - podaci prosleđeni preko HTTP metode GET (najčešće putem URL-a)
- $_POST - podaci prosleđeni preko HTTP metode POST (najčešće putem HTML forme)
- $_SESSION - podaci koji se čuvaju u okviru 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 i "upit" (praktično: niska koja sadrži dodatne informacije).
U kontekstu diskusije o superglobalnim promenljivama u jeziku PHP, delovi upita (koji 'završe' u PHP skripti), predstavljaju indekse i vrednosti kojima se može pristupati preko superglobalne promenljive $_GET
.
U pitanju je način za prenos podataka koji je transparentan - ali samim tim i nesiguran(!), 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, nakon čega prosleđeni parametri pretrage postaju dostupni preko superglobalne promenljive $_GET
, na sledeći način:
- indeks
"ime"
povezuje se sa vrednošću"Ivo"
- indeks
"prezime"
povezuje se sa vrednošću"Andrić"
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 čitali 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 prepravi, tj. dopuni.
Kao što vidimo, prepravke i dopune podrazumevaju provere preko funkcije isset
(koja vraća vrednost true
ukoliko je promenljiva (koja se predaje kao argument), deklarisana i ima vrednost koja je različita od null
).
Višestruko grananje (iz gornjeg bloka), obavlja sledeće zadatke:
- 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 proveriti (preko funkcije
isset
), 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.