traži:  
 php.com.hr > Metode slanja i prihvata podataka

Metode slanja i prihvata podataka
 


U prošlom odsječku članka smo u primjeru rekli da je moguće odabrati metodu kojom će se podaci forme proslijediti dokumentu ( skripti ) za obradu njenih informacija. U ovom odsječku ćemo se detaljno pozabaviti ovom problematikom i napravit ćemo prvu cijelu formu, skupa sa prihvatom njenih podataka.

Ali idemo redom.

Dvije osnovne metode prosljeđivanja podatak forme nekom dokumentu (skripti) su POST i GET.

Odabir metode prosljeđivanja podataka forme se vrši navođenjem method argumenta <form> taga. Moguće vrijednosti method argumenta su 'post' i 'get'. Mislim da nije potrebno isticati koja vrijednost predstavlja koju metodu.

Odabirom metode utječemo na koji način će se sami podaci forme proslijediti stranici, i to je neovisno o jeziku u kojem će se ti podaci prihvatiti i obraditi. U PHP-u odabirom metode i odabiremo način na koji ćemo prihvatiti te podatke, no o tome malo kasnije.

Idemo vidjeti koje su točno te razlike u metodama pri samom prosljeđivanju informacija.

Prva razlika je ona najdrastičnija i odmah uočljiva.

Kada se odabere metoda GET podaci forme se šalju kroz komandnu liniju (query string, tj. iza znaka ? u adress baru browsera).

Odabirom metode POST podaci nisu vidljivi u komandnoj liniji već se šalju transparentno kroz header HTTP requesta. Detalje oko HTTP requesta i HTTP responsa neću pokriti u ovom tekstu pošto se radi o zasebnoj temi, ali ono što je bitno za znat je da se pri komunikaciji između klijenta i servera (browser – web server) šalju zahtjevi o odgovori koji se sastoje od više dijelova.

Kod requesta, ili zahtijeva za nekom stranicom od strane klijenta na nekom serveru se obično radi o čistom headeru zahtjeva koji u sebi sadrži adresu stranice koja se želi vidjeti, neke informacije o samom klijentu (tip browsera, OS …), te GET i POST podaci.

Kod responsa, ili uzvraćanja informacija servera klijentu se može raditi o više situacija. Ukoliko je nastala neka greška pri pribavljanju zatražene stranice onda se šalje samo response header sa kodom greške te nekim dodatnim informacijama (tip servera, protokol …). Ukoliko se requestom zatražila postojeća stranica onda se šalje response koji se sastoji od dva dijela. Od headera koji sadrži opet te generalne informacije skupa sa nekim dodacima, poput COOKIESA, te od body-a koji u sebi obično sadrži HTML kod stranice koju smo zatražili.

Dobro, kakve sve ovo ima veze sa POST-om i GET-om. Kao što sam rekao, POST-om se podaci forme šalju kroz request header i time se na njih ne može utjecati izmjenom linka u adress baru browsera i shvaćanje procesa komunikacije između servera i klijenta nam može kasnije dobro doći.

Također, postoji i ograničenje na količinu podataka koji se mogu poslati putem GET metode. Ograničenje ovisi o postavkama samog servera na kojem se nalazi dokument na kojem se procesira forma i varira od 256 byte-ova do čak 32 Kb. Zato, ukoliko se radi o formama koje u sebi sadržavaju polja za unos velikih tekstova ili sličnih podataka GET i nije najsretnija metoda za prosljeđivanje informacija.

Kako se odlučiti koju metodu koristiti? Metoda koja se koristi za prosljeđivanje informacija ovisi o situaciji u kojoj se nalazite. Svaka metoda ima svoje vrline i mane.

Rekao sam da se u GET metodi informacije lijepe na sam URL, što ovu metodu čini idealnom u slučaju kada želite omogućiti posjetiteljima sitea da spreme stranicu koju gledaju u svoje favoritese, jer će spremiti URL zajedno sa zalijepljenim query stringom. Primjer ovoga bi bio Google i njihova tražilica koja sve podatke iz formi lijepi u query string baš iz tog razloga.

Sa druge strane GET je vrlo nesigurna metoda jer ju posjetitelj vrlo lako može izmijeniti jednostavnom izmjenom URL-a u adress baru svog browsera, tako da nije preporučljivo koristiti ovu metodu za prosljeđivanje recimo usernamea i passworda u login formama i sličnih osjetljivih informacija.

Ali neka pravila u odabiru metode ne postoje i kao programeri aplikacija odlučujemo koju ćemo metodu koristiti, ovisno o situaciji u kojoj se nalazimo, i ovo je izvan aspekta ovog članka. Jedino pravilo koje se mora poštovati je da se obavezno mora koristiti POST metoda kada se izrađuju upload forme, ali o njima nećemo sada govoriti.

Idemo sada vidjeti sve gore spomenute implikacije o metodama na praktičnom primjeru.

Primjer 2 se sastoji od dva dijela. Radi se o istoj formi, samo što se u slučaju a) koristi GET metoda, a u slučaju b) POST.

Primjer se sastoji od dva dokumenta za oba slučaja. Prvi ćemo nazvati forma.php, a drugi prihvat.php. Iz imena zaključujete da će se u forma.php nalaziti sama forma, a u prihvat.php će se nalaziti PHP skripta koja će prihvatiti te informacije i ispisati ih na ekran. Ovi primjeri bi trebali ilustrirati osnovnu metodu za prihvat podataka iz forme.

Primjer 2 a) : Jednostavna forma pomoću GET metode

Dokument : forma.php

<html>

<head>

<title>Primjer 2 a) : Prosljeđivanje informacije GET metodom</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">

</head>

<body>

<h2>Primjer 2 a) : Prosljeđivanje informacije GET metodom </h2>

<hr>

<form name="primjer2-a" method="get" action="prihvat.php">

Unesi svoje ime :

<input name="ime" type="text" >

<br>

<input name="submit" type="submit" value="Pošalji">

</form>

</body>

</html>

Dokument : prihvat.php

<html>

<head>

<title>Primjer 2 a) : Prihvat podataka GET metode</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">

</head>

<body>

<?

echo "Pozdrav " . $_GET["ime"];

?>

</body>

</html>

Pokrenite forma.php i ispunite polje sa svojim imenom te kliknite na gumb na kojem piše Pošalji. To bi trebali izgledati otprilike ovako :

Nakon pritiska gumba, tj. submitanja forme se u prozoru otvara dokument prikaz.php koji ispisuje uneseno ime nazad na ekran. To izgleda otprilike ovako :

Primjer 2 a) objašnjenje :

Idemo prvo pogledati bitne dijelove forma.php dokumenta.

U prvom primjeru smo prošli kroz dijelove <form> taga tako da ću ih sada preskočiti. Potrebno je uočiti samo da je u method argumentu namještena vrijednost get.

Za razliku od prvog primjera ovog puta smo u formu ubacili dva elementa. Radi se o <input> tagu koji ima vise različitih tipova, sa kojima ćemo se upoznati malo kasnije. Prvi put je korišten u svom text tipu :

<input name="ime" type="text" >

a drugi put se radi o gumbu :

<input name="submit" type="submit" value="Pošalji">

U oba elementa je potrebno primijeniti korištenje name argumenta. Pomoću njega dajemo polju ime i to ime koristimo u PHP-u za prihvat podataka koji su uneseni u to polje.

Ukoliko ne imenujete polje, podaci koji se unesu u njega nisu vidljivi PHP skripti koja je namijenjena za prihvat podataka iz te forme.

Oko detalja svih različitih elemenata forme, te načinima rada sa njima će biti više govora kasnije u članku. Ovaj primjer samo ilustrira kako prihvatiti podatke iz forme.

Prihvat podataka je sam po sebi vrlo jednostavan. Unutar PHP-u postoje superglobalne varijable. To su varijable (nizovnog tipa) koje definira sam PHP pri pokretanju svake skripte. Superglobalne varijable nisu tema ovog članka, tako da ćemo se mi samo pozabaviti sa dvije od njih.

Prva je $_GET i ona je korištena u prihvat.php dokumentu našeg primjera.

echo "Pozdrav " . $_GET["ime"];

Gornja linija ispisuje poruku koja se sastoji od konstantnog dijela Pozdrav i dijela u kojem se ispisuje ono što je uneseno u text box polje u forma.php dokumentu koje smo nazvali ime.

Iz ovog jednostavnog primjera je vidljivo da se podacima iz forme pristupa pomoću odgovarajuće superglobalne varijable. Vrijednost nekog elementa forme se nalazi unutar te superglobalne varijable na indeksu koji odgovara imenu tog elementa forme. U kojoj se superglobalnoj varijabli nalaze podaci ovisi o izabranoj metodi prosljeđivanja podataka. U ovom primjeru je metoda bila GET, tako da je korištena superglobalna varijabla $_GET.

U b dijelu ovog primjera ćemo koristiti POST metodu, tako da će korištena superglobalna varijabla biti $_POST.

Prije nego što krenemo na drugi dio primjera, primijetite da su se podaci koji smo ispunili u forma.php dokumentu zalijepili na link u prihvat.php dokumentu koji ispisuje te podatke.

http://localhost/phpbook/forme/primjer2-a /prihvat.php?ime=Marko&submit=Po%9Aalji

Sve iza znaka ? u gornjem linku se naziva QUERY STRING.

Radi se o seriji parova imena i vrijednosti međusobno odvojenim znakom &.

Ako si sada pomišljate da bi bilo moguće ovim načinom prenijeti podatke iz jedne stranice na drugu čisto putem linkova, onda dobro mislite. Naime, PHP-u je svejedno da li se podaci u query stringu popunjavaju putem neke forme, ili se radilo o <a> tagu u kojem je u href argumentu napisan url skupa sa query stringom.

Znači, ovo bi bio ekvivalent našoj formi iz primjera, kada se u text box unese Marko

<a href='prihvat.php?ime=Marko'>Moje ime je Marko</a>

Čak smo i izostavili drugu varijablu u query stringu pošto nam ona za sada nije potrebna u prihvat.php dokumentu.

Idemo sada ovom primjeru promijeniti metodu u POST i vidjeti kako to mijenja način prihvata podataka.

Primjer 2 a) : Jednostavna forma pomoću POST metode

Dokument : forma.php

<html>

<head>

<title>Primjer 2 b) : Prosljeđivanje informacije POST metodom</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">

</head>

<body>

<h2>Primjer 2 b) : Prosljeđivanje informacije POST metodom </h2>

<hr>

<form name="primjer2-b" method="post" action="prihvat.php">

Unesi svoje ime :

<input name="ime" type="text" >

<br>

<input name="submit" type="submit" value="Pošalji">

</form>

</body>

</html>



Dokument :  prihvat.php

<html>

<head>

<title>Primjer 2 b) : Prihvat podataka POST metode</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">

</head>

<body>

<?

echo "Pozdrav " . $_POST["ime"];

?>

</body>

</html>


Pokrenite forma.php i ispunite polje sa svojim imenom te kliknite na gumb na kojem piše Pošalji. To bi trebali izgledati otprilike ovako :





Nakon pritiska gumba, tj. submitanja forme se u prozoru otvara dokument prikaz.php koji ispisuje uneseno ime nazad na ekran. To izgleda otprilike ovako :






Primjer 2 b) objašnjenje :

Princip prihvata podataka polsanih POST metodom je isti kao i kod prihvata podataka GET metode, sa manjim razlikama.

Prva razlika je u forma.php dokumentu, gdje je promijenjena metoda u POST.

<form name="primjer2-b" method="post" action="prihvat.php">

Druga razlika je u već spomenutoj superglobalnoj varijabli koja je ovog puta $_POST.

echo "Pozdrav " . $_POST["ime"];

Dodatna i očita razlika je da sada više nema query stringa i nije moguće direktno utjecati na podatke nakon što je forma ispunjena i submitana.

Prije nego se dalje nastavimo upoznavati sa elementima formi želio bih istaknuti par vrlo važnih stvari.
Register globals

U oba dijela primjera 2 smo za prihvat podataka koristili superglobalne varijable. No to nije uvijek obavezno. Naime, kada je u konfiguraciji PHP-a namještena direktiva register_globals na On onda je podacima iz forme ili query stringa moguće pristupiti i izostavljanjem imena superglobalnih varijabli, te podacima iz elemnta forme pristupamo pomoću varijable ekvivalentnog imena elementa forme čijoj vrijednosti želimo pristupiti.

Da malo ovo razjasnim na primjeru.

U oba slučaja iz primjera 2 smo mogli koristiti prihvat.php dokument koji bi izgledao ovako :

<html>

<head>

<title>Primjer 2 c) : Prihvat podataka</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">

</head>

<body>

<?

echo "Pozdrav " . $ime;

?>

</body>

</html>

Znači, umjesto $_POST['ime'] ili $_GET['ime'] smo koristili samo $ime.

Iako ovo na prvi pogled izgleda kao bolji način za prihvat podataka ipak će vam mnogi iskusni PHP programeri reći da to nije istina.

Naime, ovom metodom ste si napravili pravu malu sigurnosnu crnu rupu. Radi se o tome da ukoliko je PHP konfiguriran sa register_globals=On svatko može vašoj skripti promijeniti vrijednost neke varijable čistim navođenjem te varijable u query string.

Također, ponekada je poželjno znati da li neka varijabla koju u skripti koristimo spada u session varijable, cookije ili je došla iz forme ili query stringa.

Iz tog razloga je poželjno držati register_globals na Off te koristiti superglobalne varijable za prihvat željenih podataka.
Provjera metode pristupa dokumentu / skripti

U nekim situacijama je potrebno znati kojom metodom je neki dokument / skripta otvorena, te na osnovi toga obavljamo potrebne operacije.

Ovo je moguće provjerom vrijednosti $_SERVER["REQUEST_METHOD"] ili skraćeno $REQUEST_METHOD varijable.

Njene moguće vrijednosti su POST i GET, ovisno o metodi otvaranja stranice. Njena vrijednost će uvijek biti GET osim u slučaju da se dokumentu pristupilo nakon submitanja forme sa POST metodom.

Iz tog razloga ovo nije najbolja metoda za provjeru da li je netko stvarno ispunio formu i pristupio dokumentu za prihvat i obradu podataka. O toj provjeri će biti govora malo kasnije kada ćemo napraviti obradu forme sa više submit gumba.

No prije toga, da vam demonstriram jednu zanimljivu činjenicu. Otvorite formu slučaja b Primjera 2 te ju ispunite i submitajte. Kada se otvori prihvat.php refreshajte stranicu. Sada bi vas browser trebao pitati da li želite opet poslati podatke forme stranici te morate odabrati potvrdnu akciju ukoliko želite opet vidjeti prihvat.php. U slučaju da odaberete da ne želite opet poslati podatke dobijete error page (iako ovo ovisi o konfiguraciji samog browsera).

Sada pokušajte ovo isto učiniti za a slučaj Primjera 2. Kod njega vas browser ništa ne pita već odmah prikazuje stranicu.

Zbog ovoga je GET metoda puno praktičnija kada se rade forme za pretraživanje, jer svako dodatno klikanje pri surfanju kroz site samo može iznervirati posjetitelja, što nam nije cilj, zar ne?

Također, kod search formi je dodatna, već spomenuta, prednost ta što se query string sprema zajedno sa URL-om u favoritese surfera, tako da se moguće opet vratiti na isto pretraživanje nakon više dana jednostavnim odabirom bookmarka.

Ova činjenica također dobro dođe kod debugiranja skripti za prihvat podataka forme. Ukoliko postoji greška u prihvat.php dokumentu možete ju ispraviti u editoru u kojem pišete skriptu, te nakon što sačuvate izmjene kliknete refresh u browseru i dokument će se prikazati ukoliko ste ispravili sve greške. Radi toga se nije potrebno vratiti na formu te ju ponovno ispuniti da bi testirali da li su sve greške ispravljene.
Forme i hrvatski znakovi

Hrvatski znakovi su sudeći po mnogim forumima i raspravama na usenetu dosta velik problem, posebno početnicima. Iz tog razloga bih želio malo rasvijetliti ovu problematiku.

Problem neprikazivanja, tj. lošeg prikazivanja hrvatskih znakova leži u nepravilnom i nedosljednom korištenju charseta unutar svih dokumenata skripte.

Naime, prije izrade skripti dobra praksa je odlučiti se za jedan charset te ga dosljedno koristiti na svim dokumentima unutar sitea i time ćete izbjeći sve probleme sa njima. Ovo pravilo vrijedi i za rad sa bazom podataka.

Da se uvjerite na primjeru.

Otvorite prihvat.php iz jednog od slučaja Primjera 2, te mu promijenite

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">

u

<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">

Zatim otvorite forma.php iz istog slučaja, ispunite formu sa nekim hrvatskim znakovima te ju submitajte.

Kao što vidite, neki od znakova se nisu prikazali pravilno. Ako uskladite charsete hrvatski znakovi će se prikazivati bez problema.

Ovo su bile osnove slanja i prihvata podataka iz forme. U slijedećem dijelu članka će biti govora o pojedinim elementima HTML formi, te o načinima rada sa njima. No, prije toga ćemo malo zakoračiti u područje logike prikaza formi radi pojednostavljena primjera koji dolaze u sljedećem dijelu.

 


PHP i forme
 © 2004 - 2008 php.com.hr