PHP - Prosleđivanje podataka preko URL-a ($_GET)
Uvod
Posle upoznavanja sa osnovama PHP-a, na red 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. * U pitanju su asocijativni nizovi ** čijim elementima skripte mogu pristupati, pre svega zarad čitanja zapisanih podataka, ali (u pojedinim okolnostima), takođe i zarad direktnog upisivanja vrednosti na različite indekse. ***
U PHP-u postoji nekoliko automatski generisani asocijativnih nizova koji se pojavljuju pod zajedničkim nazivom superglobalne promenljive, pri čemu najveću upotrebnu vrednost imaju sledeći nizovi:
- $_GET - podaci koji su prosleđeni preko HTTP metode GET (najčešće putem URL-a)
- $_POST - podaci koji su 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, 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 HTTP metode GET.
Pristup parametrima koji su prosleđeni preko HTTP metode GET
Ako se u adresnu liniju browsera unese sledeći URL (koji će poslužiti kao primer) ....
https://www.enciklopedija.rs/pretraga.php?ime=Ivo&prezime=Andrić
.... 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ć"
Za probu, kreiraćemo skriptu pretraga.php, * sa sledećim sadržajem ** ....
<?php
$ime = $_GET['ime'];
$prezime = $_GET['prezime'];
echo "Prosledili ste sledeće podatke:<br>";
echo "Ime: " . $ime . "<br>";
echo "Prezime: " . $prezime . "<br>";
?>
.... i pošto se skripta izvrši, u browseru će se pojaviti sledeći ispis:
Prosledili ste sledeće podatke:
Ime: Ivo
Prezime: Andrić
Za početak, skripta naprosto čita vrednosti preko indeksa - bez obaziranja na to da li su podaci pod datim indeksom zapravo prosleđeni (što donekle 'može da prođe' na samom početku, u prvom primeru i sl), međutim, u iole ozbiljnijim okolnostima (tj. u produkcijskim uslovima), potrebno je prvo proveriti da li su indeksi definisani pravilno.
Provera ispravnosti parametara - funkcija 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).
<?php
if (isset($_GET))
{
if (isset($_GET['ime']) && isset($_GET['prezime'])) {
$ime = $_GET['ime'];
$prezime = $_GET['prezime'];
echo "Uneli ste sledeće podatke:<br>";
echo "Ime: " . $ime . "<br>";
echo "Prezime: " . $prezime . "<br>";
}
else {
echo "Podaci koji su prosleđeni preko HTTP metode GET ";
echo "nisu formatirani na odgovarajući način.";
}
}
else {
echo "Nijedan podatak nije prosleđen preko HTTP metode GET.<br>";
}
?>
Kao što se može primetiti, 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 HTTP metode GET nije prosleđen nijedan podatak, prvi
ifiz gornje skripte će odmah preći nafalsegranu i ispisaće poruku o grešci - ukoliko postoje podaci koji su prosleđeni preko HTTP metode GET, i pri tom su pravilno formatirani, proradiće deo koda koji smo koristili do sada (
truegrana unutrašnjegif-a) - ukoliko postoje podaci koji su prosleđeni preko HTTP metode GET, ali nisu pravilno formatirani, biće ispisana odgovarajuća poruka (
falsegrana unutrašnjegif-a)
Može se reći da je programski kod koji smo prethodno prikazali 'suviše zvaničan', ali, za početno upoznavanje, 'školski primer' je sasvim prikladan.
Sa druge strane, u svakodnevnim situacijama - ipak je uputno koristiti jednostavnije i praktičnije kodove.
Na primer:
<?php
// Prvo treba proveriti da li su podaci (uopšte) prosleđeni.
// Ukoliko je došlo do greške u prosleđivanju podataka,
// skripta se može, po potrebi, zaustaviti
// preko komande exit().
if (!isset($_GET['ime']) || !isset($_GET['prezime']))
{
echo "Greška pri formatiranju upita ";
echo "koji je prosleđen preko URL-a.";
exit();
}
// Ukoliko su podaci uredno prosleđeni,
// može se nastaviti sa izvršavanjem komandi.
$ime = $_GET['ime'];
$prezime = $_GET['prezime'];
echo "Prosledili ste sledeće podatke:<br>";
echo "Ime: $ime <br>";
echo "Prezime: $prezime <br>";
?>
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 (bez obaveštavanja korisnika).
Kada treba koristiti prenos podataka preko HTTP metode GET?
Podaci koji se prosleđuju preko HTTP metode GET (kao deo URL-a), jasno su vidljivi, i omogućavaju usmeravanje servera na određene sadržaje i pamćenje stranica po potrebi (recimo, opcija "bookmarks" u browserima).
Za primer možemo uzeti sledeći upit ....
?p=izbor_stapova
.... koji je deo sledeće adrese:
https://www.skijanje.rs/blog.php?p=izbor_stapova
- prikazani upit pokreć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
- upit sa parametrima koji se ne prepoznaju * - doveo bi do poruke o grešci
Kada ne treba koristiti prenos podataka preko HTTP metode GET?
U praktičnom smislu, pitanje iz naslova je važnije od pitanja o tome kada treba koristiti HTTP metodu GET za prosleđivanje podataka, jer - 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 metoda 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 HTTP metode GET, i stoga se zarad prosleđivanja osetljivih podataka koristi drugi vid prenosa, preko HTTP metode POST (čemu je posvećen naredni članak). *
Kratak rezime ....
Kratak rezime pravila za upotrebu superglobalne promenljive $_GET je sledeći:
- prenos preko HTTP metode 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", HTTP metoda GET se ne sme 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 je već najavljeno), o prosleđivanju podataka preko HTTP metode POST.