Razvoj web aplikacija – III dio

Web forme realizovane upotrebom HTML-a obezbjedjuju korisnicima jednostavan komunikacioni interfejs koji u pozadini ima efikasne mehanizme za razmjenu podataka sa web serverom. Ovo je najvažnija osobina web-a koja mu je obezbjedila planetarnu popularanost. PHP je “proširenje” HTML-a i ima dodatne programske mehanizme koji omogućuju da se od strane developera realizuju web forme maksimalno prilagodjene ergonomiji običnog korisnika.

Podaci iz web formi su raspoloživi PHP-ovim superglobalnim promjenljivim upotrebom $_GET i $_POST superglobalnih polja. Koje od ova dva superglobalna polja će biti korišteno zavisi od algoritma upotrebljenog u implementaciji programa. Pored ova dva superglobalna polja imamo i $_REQUEST suprglobalno polje koje se takođe može koristiti za pristup podacima u web formi  uz određena ograničenja. $_REQUEST  integriše funkcionalnosti i $_GET i $_POST polja.

Superglobalna polja su raspoloživa u bilo kom opsegu (i globalnom i lokalnom) tokom izvršenja programa što ih čini pogodnim za upotrebu od strane developera. Na primjer, možete ih koristiti u funkcijama a da ih prije toga ne deklarišete kao globalne promjenljive. Unutar tijela korisničkih funkcija se supreglobalnim poljima direktno pristupa i nema potrebe da se prenose kao funkcijski parametar. Kod verzija PHP-a koje su starije od 4.1.0, nije bila ovakva situacija. Morali su se koristiti drugačiji setovi polja i na drugačiji način im se pristupalo. Superglobalna polja  $_GET, $_POST i $_REQUEST u verzijama PHP-a prije 4.1.0. nisu postojala. Na raspolaganju su bila polja $_HTTP_GET_VARS i $_HTTP_POST_VARS (umjesto $_GET i $_POST, respektivno). Polja $_HTTP_GET_VARS i $_HTTP_POST_VARS nisu bila “supeglobalna” i da bi se koristila morala su se daklarisati kao i sva ostala standardna polja.

Da bi ilustrovali kako se vrši transfer podataka od HTML-a prema PHP-u, pogledajmo sljedeći programski kod:

Capture

Na Slici  1 vidimo kako web forma iz prethodnog programskog koda izgleda u Web browser-u

Capture

Slika 1: Web browser iscrtava HTML formu

Ukoliko unesete slovo C kao odgovor i pritisnete taster “Izvrsi upit”, HTTP zahtjev sličan onom koji je ispisan u nastavku se šalje web serveru:

CaptureKao PHP developer, možete referencirati ovu vrijednost koristeći $_POST[‘answer’] superglobalno polje, obzirom da je raspoloživi metod za upotrebu definisan u post  form action tagu HTML programa.

Ukoliko bi metod u specifikaciji forme bio GET zahtjev, zahtjev koji bi se prosljedio kroz HTTP protokol bi bio sličan narednom:

GET /process.php?answer=C HTTP/1.1

Host: example.org

Kada se zahtjev ispostavlja Get metodom, u mogućnosti ste da kao developer u programskom kodu pozovete $_GET[‘answer’] kako bi dobili podatak o tome šta je korisnik unjeo kao odgovor uz promjenljivu ‘answer’.

Bitna razlika izmedju GET i POST metode jeste da kod GET metode dužina stringa kojim se prenose vrijednosti promjenljivih ne smije biti veća od 1024 karaktera (POST metod nema tog ograničenja).

POST metoda se prenosi kroz HTTP zaglavlje i zaštita podataka zavisi od sigurnosti HTTP-a. GET metod prosljedjuje podatke kroz query string URL u kojem su u parovima smještene promjenljive i njihove vrijednosti povezane znakom “=” pri čemu su jedan par od drugog odvojeni znakom “&”.  Tipičan primjer ovakvog URL-a bi mogao biti:

aaaa.test.com?name1=value1&name2=value2

Jedan važan momenat u vezi sa shvatanjem rada HTML formi je da uvjek imamo u vidu da se rezultat bilo kojeg elementa web forme  prezentira u obliku parova “ime = vrijednost” iz zahtjeva pri čemu su različiti parovi povezani znakom “&”. Ovo važi kako za skrivene elemente web formi tako i za radio button-e, checkbox-ove ali i za sve ostale tipove podataka. Ovo važi kako kod prosljeđivanja GET metodom tako i kod prosljeđivanja POST metodom. Način prezentacije se ne treba mješati sa time kako se prezentacija prenosi (kod GET metode je prenos kroz URL a kod POST metode kroz HTTP zaglavlje)

Pogledajmo sljedeću web formu:

Capture

Na Slici 2  vidimo kako izgleda web forma na osnovu prethodno ispisanog HTML koda. Za razliku od prvog primjera, korisniku je sada na raspolaganju samo “dugme” koje treba da pritisne kako bi se pokrenula obrada. Koliko god puta korisnik pritisnuo na ovo “dugme”, web serveru se šalje POST zahtjev a vrijednost  $_POST[‘answer’] će uvijek biti “C”. Stvarni zahtjev poslat preko web browser-a je ovakvom implementacijom identičan zahtjevu koji se prosljeđivao u prvom primjeru (u slučaju da je korisnik u prvom primjeru unosio znak “C”). U ovom trenutku nas ne interesuje koje rješene je tehnički korektnije. Bitno je da uočimo da je, samo posmatrajući način na koji se vizuelno na web browseru realizuje zahtjev, nemoguće utvrditi koji je metod i koja superglobalna promjenljiva upotrebljena za njeno generisanje.

Capture Slika 2: Web browser iscrtava HTML formu

Ponašanje nekih elemenata forme može na prvi pogled zbunjivati. Uočite da su elementi kao što su check box-ovi i  radio button-i, zbog njihove Boolean prirode, uključeni u zahtjev samo ako su selektovani. Samo kada se “selektuju” vrijednosti ovih komponenti na web formi njihova vrijednost postaje odredjena atributom “value” koji se nalazi uz njih u HTML tag-u. Zbog ovakvog ponašanja, odgovarajuća promjenljiva u PHP-u može ali i ne mora biti setovana. Zbog toga, za ove tipove kontrola se preporučuje da se uvjek prethodno pozove funkcija isset() kako bi se provjerilo da li su vrijednosti promjenljivih inicijalizovane.

Slijedi još jedna specifičnosti web formi i komunikacije PHP-a sa HTML-om. Uočimo da postoje posebni slučajevi u kojima nekoliko elemenata web forme  treba da dobije jedinstveno ime, kao što je to prikazano u sljedećem primjeru:

Capture

Web browser će poslati zahtjev koji će biti sličan sljedećem  (pretpostavimo da je korisnik unjeo vrijednosti u polja redom: “C” i “A”):

Capture

Ukoliko vrijednosti referencirate sa $_POST[‘answer’], primjetićete da je odgovor “A”. Gdje je, u tom slučaju “nestao” prvi odgovor?

Pošto PHP procesira web formu u ime Vas i pošto on dodjeljuje vrijednosti polja iz web formi supreglobalnim promjenljivima, vrijednosti će biti prepisane jedna preko druge. Ukoliko to nije ponašanje koje je za Vas poželjno, postoji jednostavna konvencija koju u tom slučaju možete primjeniti. Dovoljno je da prethodni primjer modifikujete na sljedeći način:

Capture

Dodajući [ ]  na kraj elementa web forme, Vi u stvari tražite od PHP-a da kreira polje od ovih elemenata.

Pretpostavljajući da od strane korisnika dobijemo isti redosljed odgovora kao i u prvom slučaju (“C” i “A”, respektivno) ove vrijednosti se prije procesiranja web forme od strane web servera smještaju u $_POST[‘answer’] koji je sada jednodimenzionalno polje, a izlazni rezultat funkcije print_r($_POST[‘answer’]) će biti sljedeći:

CaptureNa taj način, sada imate obadvije vrijednosti sačuvane korektno  u jednodimenzionalnom polju.

Zaključak o komunikaciji izmedju HTML-a i PHP-a

Iz prethodnog izlaganja je bitno uočiti da od HTML-a prema PHP-u  postoji mogućnost slanja podataka ali to nije direktna razmjena podataka.

Podatke u HTML – web formu unosi korisnik na klijent strani

Da bi PHP utvrdilo šta je korisnik unio i da bi pristupio vrijednostima iz $_POST i $_GET superglobalnih polja kontrola se mora nekako vratiti web serveru jer je PHP web server proces. Dakle, potrebno je da se desi reload web forme ili prenos kontrole na drugu formu (jednostavno rečeno – potrebno uraditi nešta što će natjerati web server da procesira zahtjev). Ovo se u nastavku može iskoristiti kao “event” unutar kojeg se mogu kontrolisati korisnikovi zahtjevi i sadržaji superglobalnih polja.

Ne postoji neki drugi – direktniji način na koji je moguće od HTML-a poslati PHP-u podatke.

Razmjena podataka u suprotnom smjeru – od PHP-a prema HTML-u je direktna jer se sve odvija na server strani a sve pripreme su uradjene prije nego se forma prikaže na web browser-u. Evo primjera u kojem HTML promjenljiva formvar dobija vrijednost 10 iz PHP koda:

CaptureAko pogledate objašnjenje u prethodnom tekstu iz ove edicije biće Vam jasno da je programski kod koji je ispisan u prethodnom primjeru PHP kod koji se nalazi na serveru i prije nego se bilo šta uputi client-u taj kod se prevodi u sljedeći HTML kod:

CaptureOvo ponašanje možemo generalizovati i na JavaScript ali na client strani procesa. Ako znamo da je  JavaScript dio client tehnologije – promjene postaju validne čim se na clientu desi promjena i kada kontrolu dobije odgovarajući dio client programa. To ima za posljedicu da je komunikacija (razmjena podataka) izmedju JavaScript-a i Web Forme direktna u oba smjera.

Iz PHP u JavaScript se mogu takodje direktno prenjeti podaci. Sa druge strane, JavaScript u PHP (isto kao i u slučaju HTML-a u PHP) ne može direktno (bez prethodnog reloada) prosljediti podatke.

Za kraj, evo nekoliko primjera direktne komunikacije koja se odvija na client mašinama.

Form promjenljiva u Javascript promjenljivu:

CaptureJavascript promjenljiva u Form promjenljivu:

CapturePHP promjenljiva u Javascript promjenljiveCapture

 

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s