Professional Documents
Culture Documents
PHP
SADRŽAJ
1 Uvod............................................................................................................................... 3
2 PHP OKRUŽENJE..........................................................................................................3
2.1 Razlika između server-side i client-side skripti.........................................................5
3 OSNOVE PHP KODA.....................................................................................................7
3.1 Osnovna sintaksa, promenljive i operatori................................................................7
3.2 Promenljive, tipovi podataka, konstante...................................................................9
3.3 Funkcije..................................................................................................................10
3.3.1 Funkcije za upravljanje varijablama................................................................12
3.4 Domen važenja promenljive...................................................................................13
3.5 Operatori................................................................................................................14
3.6 PHP uslovne naredbe............................................................................................16
3.7 PHP petlje..............................................................................................................18
3.8 Nizovi..................................................................................................................... 20
3.9 Rad sa stringovima................................................................................................23
4 NAPREDNA SINTAKSA PHP KODA............................................................................28
4.1 Date....................................................................................................................... 28
4.2 Include and Require...............................................................................................29
4.3 ObjektnoOrijentisanoProgramiranje u PHP............................................................30
4.4 PHP napredne funkcije za rukovanje fajlovima......................................................32
4.5 Superglobals.......................................................................................................... 33
4.6 Register globals.....................................................................................................34
4.7 PHP napredne funkcije za rukovanje cookies........................................................35
4.7.1 Slanje header-a...............................................................................................37
4.8 PHP napredne funkcije za sesijama.......................................................................38
4.9 PHP napredne funkcije za upravljanje greškama...................................................44
5 UVOD U FORME..........................................................................................................47
5.1 O formama uopšteno.............................................................................................47
5.2 Metode slanja i prihvatanja podataka.....................................................................48
5.3 Provera metode pristupa dokumentu / skripti.........................................................51
5.4 Forme i srpski znakovi............................................................................................52
5.5 Prikaz i obrada unutar jednog dokumenta..............................................................52
5.6 Elementi za unos podataka....................................................................................54
5.7 Text box polje.........................................................................................................54
5.8 Text area................................................................................................................54
5.9 Hidden polje...........................................................................................................56
5.10 Checkbox........................................................................................................... 56
5.11 Upload fajla.........................................................................................................58
2
3
Uvod
Server - side skripting je web server tehnologija koja omogućava da se korisnički zahtevi
obrađuju pomoću skripti koje se izvršavaju na serverskoj strani kako bi se generisale
dinamičke stranice. Najčešće se koristi da bi se interaktivne web stranice povezale sa
bazama podataka, radi identifikacije korisnika, ažuriranja sadržaja, stvaranja raznih
diskusionih grupa i još zbog mnogo toga. Razlika između skriptovanja na serverskoj i
korisničkoj strani je u tome što se kod korisničke strane skripte izvršavaju u web browser-u
korisnika, najčešće pomoću JavaScript-a.
PHP je open source jezik koji se koristi za razvoj server-side aplikacija, kao i dinamičkog
Web sadržaja. PHP dozvoljava interakciju sa velikim brojem relacionih baza podataka kao
što su MySQL, Oracle, IBM D2, Microsoft SQL Server, PostgreSQL i SQLite. PHP radi na
većini operativnih sistema današnjice, kao što su UNIX, Linux, Windows i Mac OS i može da
interaguje sa većinom Web servera.
Personal Home Page Tools je predstavio PHP 1995. godine, a dve godine kasnije su razvoj
nastavila dva Izraelska programera. Od 1999. godine se zasniva na Zend engine-u. PHP je
prvo bio akronim za Personal Home Page Tools, da bi kasnije promenio naziv u Hypertext
Preprocessor.
Danas, PHP je instaliran na više od 20 miliona sajtova i preko million web servera. Poslednja
realizovana stabilna verzija je 5.3.0 iz juna 2009.god.
PHP OKRUŽENJE
4
kompatibilan je sa skoro svim serverima koji se danas koriste (Apache, IIS, itd. )
lak je za učenje i efikasno funkcioniše na strani servera.
Takođe treba napomenuti da je moguće gore navedene komponente skinuti u formi paketa
koji sadrže sve pomenute komponente. Najpoznatiji paketi tog tipa su: EasyPHP 4, WAMP5 i
XAMPP6. Download i korišćenje ovih paketa je takođe besplatno.
klijent (korisnik Interneta koji koristi neki brauzer) zahteva PHP stranicu sa servera
server prosleđuje zahtev servisu za veb (program veb-server na serveru)
veb-server prepoznaje da se traži PHP datoteka
ne šalje njegov sadržaj klijentu, nego ga izvršava kao program pomoću PHP modula
izlazni tekst programa (standardni izlaz) se šalje klijentu kao rezultat zahteva
klijent prepoznaje vrstu rezultata (HTML kod, slika, PDF sadržaj, arhiva itd.)
rezultat se prikazuju klijentu na odgovarajući način
1
http://httpd.apache.org/download.cgi
2
http://www.mysql.com/downloads/index.html
3
http://www.php.net/downloads.php
4
http:///www.download.com/EasyPHP/3000-7957_4-10297309.html
5
http://www.wampserver.org
6
http://www.apachefriends.org/en/xampp.html
5
Razlika između server-side i client-side skripti
Server side skripte se izvršavaju na serveru kada server primi zahtev za obradom. Nakon
zahteva server izvršava kod i na osnovu njega generiše HTML kod i šalje ga klijentu. To
znači da stranica koja se prikazuje u pretraživaču klijenta ne postoji u tom obliku nigde na
serveru odakle ju je klijent primio.
Osnovna razlika između PHP i HTML stranica je u načinu na koji web server upravlja njima.
Kada web serveru stigne zahtev za HTML stranicom, web server preduzima sledeće
operacije:
Čita zahtev
Pronalazi stranicu na serveru
Šalje stranicu ka browser-u
Kada web server dobije zahtev za PHP stranicom, umesto slanja statičke HTML stranice,
server preduzima određene akcije u skaldu sa PHP kodom:
Čita zahtev
Pronalazi stranicu na serveru
Obrađuje sve instrukcije koje se nalaze u PHP fajlu, in a taj način kreira ili modifikuje
stranicu
Šalje novu stranicu ka browser-u
6
Slika 2 Obrada zahteva za HTML stranicom
Možda bi bilo najbolje malo detaljnije razmotriti razlike između njih na jednom trivijalnom
primeru. Neka je na primer, potrebno napisati skriptu koja prikazuje tačno vreme negde na
stranici. Iako ovo zvuči kao vrlo trivijalan i lagan primer, gotovo ga je nemoguće izvesti.
Zašto? Prvo pitanje koje treba postaviti je 'Koje je vreme tačno vreme?'. Ono na serveru ili
ono na klijentovom računaru? Ove dve skripte će retko kada prikazati isti rezultat.
<html>
<head>
<script language="JavaScript">
var v = new Date()
document.write(v.getHours())
document.write(":")
document.write(v.getMinutes())
document.write(":")
document.write(v.getSeconds())
</script>
</head>
<body>
</body>
</html>
7
Primer 2 – prikaz serverskog vremena
<?php
$str_vreme= date("H:i:s");
echo $str_vreme;
?>
U PHP fajlu, blok koji je okružen jezičkim strukturama <?php i ?> se smatra PHP kodom i
izvršava se, a ostatak van tih znakova se smatra tekstom koji jednostavno treba da se
ispiše na standardni izlaz, bez interpretiranja. Ako se PHP kod izvršava na serveru koji
podržava skraćenice, PHP blok može početi i sa <?, a završiti se sa ?> tagom. PHP kod se
može napisati bilo gde u okviru <body> taga HTML dokumenta. U nekim slučajevima, PHP,
kod se piše u okviru <head> taga.
Sa regularnim .html fajlovima, HTTP server (npr. Apache) samo prenosi sadržaj stranice u
browser. Server ne pokušava da razume ili obrađuje HTML fajl – to je posao browser-a.
Fajlovi sa .php ekstenzijom se “skeniraju” i obrađuje se kod.
PHP fajl sadži standardne HTML tagove i PHP skript kod. Sledi primer dva prosta PHP koda
koji na ekranu browser – a ispisuju “Zdravo svete!”.
Primer 3
<html>
<head> <title> Primer outputa Zdravo svete </title> </head>
<body>
<?php
echo "Zdravo svete!";
?>
</body>
</html>
Primer 4
<html>
<head> <title> Primer outputa Zdravo svete </title> </head>
<body>
<?php
print ( 'Zdravo svete');
?>
</body>
</html>
Kao što iz primera vidi, svaka linija PHP koda mora da se završi tačkom – zarez. Tačka –
zarez se koristi da bi se jedan set instrukcija razdvojio od drugog seta. Postoje dve osnovne
8
komande koje služe za prikazivanje teksta na browser – u: echo i print7. Kao što je već
rečeno, PHP kod se nalazi u okviru HTML koda i izvršava se na serveru. Tek kada se PHP
kod izvrši na serveru, output se šalje do browser - a klijenta koji izvršava HTML kod i
prikazuje PHP kod koji je već izvršen na serveru,tj. prikazuje i rezultat PHP koda i rezultat
HTML koda. Ako se na primer u PHP skripti koristi komanda echo “<br>”, dešava se
sledeće:
Pomoću echo naredbe u PHP skriptama, mogu se pisati bilo koji HTML kodovi koje browser
treba da izvrši.
Unutar koda je moguće prebaciti se, u bilo kojem trenutku, iz HTML moda u PHP mode. Cak
i unutar if, for i ostalih kontrolnih struktura. Ovo omogućuje rad sa template-ima u kojima se
na isti način prikazuju različiti podaci iste strukture. Ovo je Ilustrovano jednostavnim
primerom:
Primer 5
<html>
<head>
<title>Untitled</title>
</head>
<body>
<?
$ime="Marko";
$prezime="Markovic";
?>
<table width="300" border="1" cellspacing="0" cellpadding="0">
<tr>
<td>
<?
echo $ime;
?>
</td>
<td><?=$prezime?></td>
</tr>
</table>
</body>
</html>
Marko Markovic
Za ispis sadržaja varijable korišćena su dva različita načina koji su rezultirali istim krajnjim
ispisom. Naime unutar <? i ?> se nalazi php kod koji će se izvršiti ukoliko se u njemu ne
nalaze neke sintaksne greške. Druga metoda ispisa je izgledala ovako : <?=$prezime?> .
7
Razlika između ove dve funkcije je samo u tome što funkcija print može da vrati vrednost true/false,
a echo nema tu mogućnost. Echo je za nijansu brža pri izvršavanju programa
9
Ova metoda se koristi kada je potrebno ispisati neku varijablu ili string. Ova linija je identična
<? echo $prezime ?> samo što je umesto echo naredbe korišćen znak = koji PHP-u govori
da ispiše ono što se nalazi
između <? i ?> oznaka.
Kao što i u HTML – u postoje komentari, tako se komentari mogu navoditi i u PHP bloku.
Postoje dve osnovne vrste komentara u PHP – u: jednolinijski (single – line comment) i
višelinijski (large comment block) komentari. Za jednolinijske komentare se koristi symbol
“//”, a za višelinijski komentari se pišu između “ /*“ i “ */” simbola. Sledi primer.
Primer 6
<html>
<head> <title> Primer PHP komentara </title> </head>
<body>
<?php
// Ovo je jednolinijski komentar
/* Ovo je višelinijski komentar,
što znači da se on može pisati
u više redova!
*/
?>
</body>
</html>
Promenljive (varijable) se u PHP – u koriste za čuvanje konkretnih vrednosti kao npr. tekst
stringova, brojeva ili nizova. Kada se jednom promenljiva postavi, ona se može koristiti više
puta u PHP skripti. Sve varijable u PHP – u počinju simbolom dolar simbolom “ $ “. Pravilno
postavljena (setovana) promenljiva ima sledeću sintaksu:
$ime_promenljive=vrednost;
U PHP – u promenljiva ne mora da se deklariše pre nego što se postavi, što znači da ne
mora da se navede tip promenljive kao u drugim programskim jezicima. U PHP – u se
promenljive automatski deklarišu kada se koriste.
<?php
$age = 30;
$age = 31;
echo $age;
?>
10
echo mojaPromenljiva;
Ako se pomoću jedne echo naredbe prikazuju dve promenljive, koristi se tzv. separator
simbol .“ “.
Primer 7
<html>
<head> <title> Primer postavljanja promenljivih </title> </head>
<body>
<?php
$prva=16;
$druga="Zdravo narode! ";
echo $prva . “ “ . $druga;
/* u echo naredbi koristi se " " , da bi se odvojilo prikazivanje
promenljivih, tj. da se ne bi na browseru ispisalo 16Zdravo narode!, već
16 Zdravo narode! */
?>
</body>
</html>
U PHP-u ne postoje fiksni tipovi podataka. Naime, ne mora se definisati tip varijable pre
njenog korišćenja i varijabla se može deklarisati bilo kada unutar skripte i pridruživati joj se
različiti tipovi podataka tokom izvođenja skripte (iako ovo nije uobičajena niti previše
pametna praksa). Isto tako se može menjati tip podataka neke varijable jednog te istog
sadržaja.
Konstante
Konstante su vrednosti koje ne menjaju svoju vrednost. Za kreiranje konstanti u PHP, koristi
se funkcija define ()
define("kompanija", "FON");
Funkcije
Funkcije u PHP-u se definišu sledećom sintaksom:
<?
function imefunkcije($argument1,$argument2…$argumentN)
11
{
// … blok naredbi funkcije
}
?>
Primer 8
<?php
phpinfo();
?>
<?
function saberi($broj1,$broj2)
{
$zbir=$broj1+$broj2;
return $zbir;
} // pridruživanje varijabli rezultata funkcije
$br1=12;
$br2=22;
echo saberi($br1,$br2);
?>
U gornjem primeru su umesto varijabli $br1 i $br2 korišćene i varijable imena $broj1 i $broj2.
Ovo je moguće zato što se funkciji ne daju same varijable već njihove vrednosti koje se
čuvaju u lokalnim (funkcijske) varijablama koje postoje samo za vreme izvođenja funkcije.
Ukoliko je potrebno funkcijom izmeniti sadržaj neke varijable, ona se mora dati funkciji
pomoću reference (pass by reference). Ne postoji oznaka za referencu u ovom slučaju pri
pozivu funkcije. Sama postavka funkcije čini da se varijabla daje funkciji pomoću reference.
U ovom slučaju je korišćeno davanje varijable pomoću reference u liniji povecaj($neki_broj,10)
.
<?
function povecaj(&$broj,$vrednost){
$broj+=$vrednost;
}
$neki_broj=12;
povecaj($neki_broj,10);
echo $neki_broj;
?>
Nije obavezno koristiti isto ime varijable u glavnom programu i funkciji, iako je moguće.
Rezultat će u oba slučaja biti isti.
<?
function frizider($stanje="pun"){
echo "Frizider je $stanje";
}
// ispis default vrednosti
frizider();
echo "<hr>";
// ispis date vrednosti
frizider("prazan");
?>
12
Rezultat :
Frižider je pun
__________________
Frižider je prazan
Pri radu sa funkcijama koje imaju default vrednost bitno je da ta vrednost mora biti konstanta
(string ili broj). Isto tako ukoliko funkcija ima više argumenata od kojih jedan ili više imaju
default vrednosti oni moraju biti sa krajnje desne strane liste argumenata iza argumenata
bez default vrednosti:
Primer 12
<?
function automobili($gori,$bolji="Audi"){
echo "$bolji je bolji od $gori";
}
automobili("Peglice");
?>
gettype()
settype()
array,
double, integer,
object
string.
<?
$a = 7.5;
settype($a, "integer");
echo $a;
?>
13
isset() i unset()
is...() functions
<?
$ProductID = "432BB";
if (is_string ($ProductID)) {
echo ("String");
}
?>
Kao izlaz se dobija "m". Varijabla $position unutar funkcije je dostupna samo u okviru
funkcije i ne može joj se pristupiti van nje.
14
?>
Ako se definiše varijabla kao static u nekoj funkciji, ona se inicijalizuje prilikom prvog
poziva funkcije i postavlčja na definisanu vrednost. Svaki sledeći poziv funkcije neće dovesti
do nove inicijaliizacije.
<?
function counter () {
static $counter = 0;
++$counter;
}
?>
Operatori
Operatori koji se koriste u PHP script programskom jeziku:
Aritmetički operatori
Operatori dodele
Operatori poređenja
15
!= Nije jednako kao 5!=8 vrača true
> Veće od 5>8 vraćafalse
< Manje od 5<8 vraća true
>= Veće ili jednako od 5>=8 vaća false
<= Manje ili jednako od 5<=8 vraća true
Logički operatori
Cast operatori
<html>
<head> <title> Primer sa operatorima </title>
<body>
<?php
$x=25;
$y=100;
$z=50;
$promenljiva=($x>$y) || ($y>$z);
echo $promenljiva;
// ovde se se vraca rezultat 1, jer je iskaz true
$promenljiva1=($x!==$y) && ($z<=$y) && ($y!==105);
echo $promenljiva1;
// ovde se ne vraca rezultat, jer je iskaz false
?>
<body>
</html>
16
PHP uslovne naredbe
Kao i u drugim programskim jezicima, u PHP – u se koriste uslovne naredbe. If … else
uslovna naredba se koristi ako postoji neki uslov koji treba da se testira. Ako je zadati uslov
tačan (true), izvršava se jedan set instrukcija, a ukoliko je uslov netačan (false), izvršava se
drugi set instrukcija. Sintaksa:
Primer 14
If (uslov) {
Kod koji se izvrsava ukoliko je uslov true;
}
else {
kod koji se izvrsava ukoliko je uslov false;
}
Primer 15:
<html>
<head> <title> Primer if – else uslovne naredbe </title> </head>
<body>
<?php
$promenljiva=45;
If($promenljiva>20)
{
echo "Vrednost promenljive je veca od 20";
}
else
{
echo "Vrednost promenljive je manja od 20";
}
?>
</body>
</html>
<?
$logged_in = TRUE;
$user = "Admin";
$banner = ($logged_in==TRUE)?"Welcome back $user!":"Please login.";
echo "$banner";
?>
Ako treba da se izvrši programski kod ukoliko su jedan ili više uslova tačni, koristi se elseif
uslovna naredba.
<?
If ( uslov ) {
// naredbe koje se izvršavaju ukoliko je uslov == true
} elseif ( uslov2 ) {
// naredbe koje se izvršavaju ukoliko je uslov == false i uslov2==true
} elseif ( uslov3 ) {
// naredbe koje se izvršavaju ukoliko je uslov == false i uslov2 == false i
uslov3
== true
} else {
// naredbe koje se izvršavaju ukoliko su svi uslovi == false
}
17
?>
Primer 17
<html>
<head> <title> Primer elseif uslovne naredbe </title> </head>
<body>
<?php
$promenljiva=30;
If ($promenljiva<=30) {
echo "Broj je manji ili jednak 30";
}
elseif($promenljiva>30 && $promenljiva<=45) {
echo "Broj je veci od 30, a manji ili jednak 45";
}
else {
echo "Broj je veci od 45";
}
?>
</body>
</html>
Ukoliko treba da se izvrši jedan ili više blokova programskog koda, koristi se switch naredba.
Switch naredba se koristi zbog izbegavanja velikih blokova programskog koda if … elseif …
else naredbi. Sintaksa:
switch (promenljiva)
{
case slučaj1:
kod koji se izvrsava ako je promenljiva = slučaj1 ;
break;
case slučaj2:
kod koji se izvrsava ako je promenljiva=slučaj2;
break;
case slučaj3:
kod koji se izvrsava ako je promenljiva=slučaj3;
break;
default:
kod koji se izvrsava ako vrednost promenljive nije jednaka ni jednom
navedenom slučaju;
}
<html>
<head> <title> Primer switch naredbe </title> </head>
<body>
<?php
$x=10;
switch($x)
{
case 1:
echo "Broj je 1";
break;
case 10:
echo "Broj je 10";
break;
case 20:
echo "Broj je 20";
break;
18
default:
echo "Ne znam koji je broj";
}
?>
</body>
</html>
Ključna reč break označava završetak grane. Ukoliko se izostavi između dve grane naredbe,
obe grane će se izvršiti ukoliko je viša (ona koja sledi pre) aktivirana. Naredbe će se
izvršavati sve dok se ne pojavi break ili završetak switcha.
Primer 19
<?
$int_var=5;
switch ($int_var){
case 0:
echo 'Broj je nula';
break;
case 5:
echo 'Broj je pet';
case 6:
echo 'Broj je 6';
break;
default:
echo 'Broj nije poznat';
}
?>
PHP petlje
Često se dešava da je potrebno određeni kod izvršiti više puta. Da bi se ovo postiglo, bez
suvišnog kucanja, koriste se petlje. U PHP – u se koriste sledeće petlje:
while – određeni kod se izvršava sve dok je zadati uslov true.
do ... while – određeni kod se izvršava jednom i onda se u okviru petelje ponovo
izvršava sve dok je specijalni uslov true.
for – kod se kroz petlju izvršava onoliko puta koliko je to korisnik odredio
foreach – kod se kroz petlju izvršava za svaki element niza
While naredba će izvršavati blok koda ako i dok je uslov true. Sintaksa:
while(uslov)
Primer 29:
<html>
<head> <title> Primer while naredbe </title> </head>
<body>
<?php
$x=1;
while($x<=5) {
echo "Broj je" . $x;
echo "<br>";
$x++;
}
?>
19
</body>
</html>
Do … while petlja će izvršiti blok programskog koda makar jednom, i onda će ponavljati
petlju dok je uslov tačan. Sintaksa:
do
{
kod koji se izvrsava;
}
While(uslov);
Primer 30:
<html>
<head> <title> Primer za do...while petlju </title> </head>
<body>
<?php
$x=0;
do {
$x++;
echo "Broj je : " . $x;
echo "<br>";
}
while($x<=5);
?>
</body>
</html>
<html>
<head> <title> Primer za for petlju </title> </head>
<body>
<?php
for ($x=0;$x<5;$x++){
echo "Zdravo svete!";
echo "<br>";
}
?>
</body>
</html>
Foreach petlja se koristi da bi se prikaziali elemente niza. Za svaku petlju, vrednost tekućeg
elementa niza se dodeljuje nekoj promenljivoj, pa se u sledećoj petlji vrednost sledećeg
elementa niza dodeljuje istoj toj promenljivoj itd. Sintaksa:
foreach(niz as vrednost)
{
Kod koji se izvrsava;
}
Nizovi
20
Kao što je poznato, u nizovima se čuvaju vrednosti elemenata koji su istog tipa i koji su slični
na neki način. Ti elementi se zovu elementi niza i svaki element ima svoj jedinstven ID
(Identifier) i može mu se lako pristupiti. Postoje tri tipa nizova:
Element niza može pripadatai bilo kom tipu podataka, bez obzira na ostale elemente.
$niz=array();
$niz[0]=”Marko”;
$niz[1]=”Petar”;
$niz[2]=”Srdjan”;
$niz[3]=”Djura”;
Primer 32
<html>
<head> <title> Primer numerickih nizova </title> </head>
<body>
<?php
$niz=array("Internet tehnologije", "Simulacija" ,"Elektronsko poslovanje");
echo $niz[0] . " " . " i" . " " . $niz[1] . " " . "i" ." " . $niz[2] . "su
najbolji predmeti";
?>
</body>
</html>
$niz=array();
$niz[“Marko”]=32;
$niz[“Petar”]=28;
$niz[“Srdjan”]=20;
$niz[“Zdravko”]=56;
21
<html>
<head> <title> Primer asocijativnih nizova </title> </head>
<body>
<?php
$niz=array("jabuka"=>"crvena","kruska"=>"zuta","tresnja"=>"crvena","pomoran
dza"=>"narandzasta");
echo $niz["jabuka"];
// rezultat ce biti crvena
echo "<br>";
// prelazak u novi red uz pomoc HTML koda
echo $niz["pomorandza"];
// rezultat ce biti narandzasta
?>
</body>
</html>
Kod multidimenzionih nizova, svaki element može da bude nov niz i svaki element pod –
niza takođe može da bude niz itd.
<html>
<head> <title> Primer multidimenzionih nizova </title> </head>
<body>
<?php
$porodice=array
(
"Jovanovic"=>array
(
"Marko",
"Pedja",
"Marina"
),
"Petrovic"=>array
(
"Milena",
"Marko",
"Jovana"
),
"Stankovic"=>array
(
"Petar",
"Jasmina",
"Milica",
"Isidora"
)
);
echo $porodice["Jovanovic"][1] . " " . "je clan porodice Jovanovic";
// ispisace se da je Pedja clan porodice Jovanovic
?>
</body>
</html>
Nizovi su osnovni tip elementa koji se najčešće susreće u radu sa bazama podataka. Naime,
kada se izvrši upit na bazu, vraćeni rezultat je niz. Osnovne operacije nad nizovima su
šetanje kroz niz, sortiranje niza, pretraživanje niza pa lepljenje niza u string što je vec
objašnjeno u prethodnom poglavlju.
22
<?
$arr_valute=array("USD","EUR","GBP","HRK");
foreach ($arr_valute as $kljuc=>$vrednost)
echo "[$kljuc] => $vrednost <br>";
?>
Za prolaženje, korišćena je foreach petlja koja u svakom svom ponavljanju uzima novi
element iz niza. Uzima ih od manjeg indeksa prema većem. Isti ovaj učinak se može postići
na više raznih načina, od kojih je jedan da se prvo proveri ukupan broj elemenata niza pa da
se for petljom prošeta kroz niz.
array_search($trazeno,$niz_za_pretraziti):
Funkcija prima dva obavezna argumenta. Prvi argument je vrednost koja se traži, a drugi je
niz u kojem se traži vrednost. Postoji i treći, neobavezni, argument koji može biti true ili false.
On služi ukoliko se želi uporediti i tip podataka.
Recimo
$int_broj=111 i $str_broj='111'
unset ($arr_mailovi[$nadeni]);
<?
$arr_niz=array(
0=>10,
1=>15,
2=>9,
3=>19,
4=>13,
5=>15,
6=>99,
7=>74
);
// sortiranje niza
asort($arr_niz);
print_r($arr_niz);
?><hr><?
arsort($arr_niz);
print_r($arr_niz);
?><hr><?
ksort($arr_niz);
print_r($arr_niz);
?><hr><?
krsort($arr_niz);
print_r($arr_niz);
23
?>
U drugom slučaju niz se sortira silazno (od najveće prema najmanjoj vrednosti). To se radi
pomoću funkcije arsort($arr_niz). Ova funkcija je identična asort() funkciji po svojim
osobinama osim po redosledu elemenata nakon sortiranja.
U trećem slučaju niz se sortira po ključu. Znači da će kljuc (indeks) sa manjom vrednošću
biti pre u nizu pošto funkcija ksort($arr_niz) sortira niz po indeksu uzlazno. Odnos indeks =>
vrednost je zadržan nakon sortiranja.
Poslednji slučaj sortira niz po indeksu, ali silazno. Tu radnju obavlja funkcija krsort($arr_niz).
Ona je identična funkciji ksort(), samo što sortira niz obrnutim redosledom.
Rad sa stringovima
Stringovi su najčešći tip podataka kojim se radi u PHP-u zbog prirode PHP-a kao alata za
izradu HTML stranica na serveru. U PHP-u se nalaze već gotove funkcije koje automatizuju
većinu operacija koje su potrebne za manipulisanje i rad sa sadržajem string podataka.
Sadržaj string tipa varijable se nalazi između navodnika. Mogu se koristiti dupli i jednostruki
navodnici. Postoje razlike u ispisu sadržaja zavisno od tipa navodnika koji se koriste.
Korišćenjem duplih navodnika može se koristiti 'special characters'. To su posebni znakovi
koji govore PHP-u da izvrši određene radnje pri ispisu sadržaja varijable i slede iza znaka
backslash ( \ ). On se ujedno koristi za preskakanje određenog znaka unutar stringa.
Znak Značenje
\t Tab razmak (HT ili 0x09 u ASCIIu)
\\ Backslash
\$ Dolar znak
\" Dupli navodnik
\n Novi red(LF ili 0x0A u ASCIIu)
Ovi znakovi neće imati uticaja na izgled same stranice u prozoru browsera, već ce njihov
uticaj biti vidljiv tek pri pregledu source-a dokumenta. Ovim se može sasvim sakriti činjenica
da je stranica stvorena putem PHP-a i pomoću njih je lakše pronaći grešku u generisanoj
stranici. U protivnom bi se sav sadržaj ispisao u jedan red bez razmaka. U tom neredu bi bilo
teško naći bilo šta, a kamoli grešku u ispisu, ako se traži u source view-u.
Ukoliko je potrebno da se neki tekst prebaci u novi red pri gledanju stranice u prozoru
browsera treba se poslužiti <br> i sličnim tagovima. Još jedan bitna razlika između duplih i
jednostrukih navodnika je ta da će se pri korišćenju duplih navodnika sadržaj varijable
ispisati a pri korišćenju jednostrukih navodnika ispisaće se ime varijable skupa sa znakom $.
24
Primer 21
<?
$str_ime="Internet tehnologije";
echo ("Moje ime je $str_ime");
?>
Ispisuje:
Primer 22
<?
$str_ime="Internet tehnologije";
echo ('Moje ime je $str_ime');
?>
U PHP-u je takođe moguće spajanje više stringova u jedan ispis. Ponekad pri radu sa
stringovima, a posebno pri obradi podataka iz formi, podaci u sebi sadrže nepotrebne
razmake na početku ili kraju stringa. Pod razmacima se podrazumevaju : razmak od jednog
mesta(space), tab razmak od više space-ova (escape znak \t), znak za novi red na kraju
reda (escape znak \n).
Treba obratiti pažnju na to da se nepotrebni prazni prostor i rezultati escape znakova ne vide
u HTML pogledu dokumenta već tek kada pogledate source dokumenta ili ukoliko se nalaze
unutar <pre>…</pre> tagova za prikaz preformatiranog teksta.
<?
$str_glavni=" \tOvo je string \nsa puno praznog prostora \n";
echo $str_glavni;
// izbacivanje praznog prostora sa pocetka stringa
$str_bez_pocetka=ltrim($str_glavni);
echo "<hr>\n";
echo "<h4>String bez praznog prostora na pocetku stringa</h4>\n";
echo "<pre>$str_bez_pocetka</pre>\n";
// izbacivanje praznog prostora sa kraja stringa
$str_bez_kraja=rtrim($str_glavni);
echo "<hr>\n";
echo "<h4>String bez praznog prostora na kraju stringa</h4>\n";
echo "<pre>$str_bez_kraja</pre>\n";
// izbacivanje praznog prostora iz celog stringa
$str_bez_praznina=trim($str_glavni);
echo "<hr>\n";
echo "<h4>String bez praznog prostora na kraju i pocetku stringa</h4>\n";
echo "<pre>$str_bez_praznina</pre>\n";
?>
U ovom primeru su korišćene tri funkcije za izbacivanje praznina sa početka i kraja stringa.
Prva je ltrim(string) - ltrim izbacuje praznine i escape znakove sa leve strane (početka)
stringa. Druga je rtrim(string) - rtrim izbacuje praznine i escape znakove sa desne strane
(kraja) stringa. Treća je trim(string) - trim izbacuje praznine i escape znakove sa obe strane
25
stringa. Ove funkcije mogu izbaciti praznine samo sa početka i kraja striga dok one unutar
stringa ostaju na svom mjestu.
<?php
$password="secretpassword1";
if (strstr($password,"password")){
echo('Passwords cannot contain the word "password".');
}
else {
echo ("Password accepted.");
}
?>
strstr($str_zadati,$str_trazeni)
Primer 25 Pronalaženje pozicije prvog pojavljivanja znaka ili stringa u stringu i ispis
ukupnog broja pojavljivanja.
<hr>
<h3>Ispisivanje pozicije pronadjenog stringa ili znaka unutar zadatog
stringa</h3>
<?
$string="Internet tehnologije je veoma ineresantan predmet";
$trazeni="je";
// ispisivanje pozicije prvog nalazenja trazenog strina unutar zadatog
stringa
$int_pozicija=strpos($string,$trazeni);
echo $int_pozicija;
?>
<hr>
<h3>Ukupan broj pojavljivanja traženog znaka ili stringa</h3>
<?
// racunanje broja pojavljivanja nekog stringa ili znaka unutar stringa
$suma=substr_count($string,$trazeni);
echo "Broj pojavljivanja :$suma";
?>
strpos($string,$trazeni)
Funkcija vraća integer vrednost koja predstavlja poziciju prvog znaka traženog stringa unutar
zadatog stringa. Ukoliko traženi string ne postoji unutar zadatog stringa funkcija vraća
vrednost False.
substr_count($str_zadani,$str_trazeni)
Funkcija vraća integer vrednost koja reprezntira ukupan broj pojavljivanja traženog stringa
unutar zadatog stringa. Funkcija vraća 0 ukoliko nema pojavljivanja. Ovo se interpretira kao
False vrednost unutar if strukture.
Kada se koristi promenljiva tipa string, mogu se koristiti ugrađene PHP funkcije (built – in
PHP functions) strlen() i strpos() koje izvršavaju određene operacije nad stringom Funkcija
strlen() izračunava dužinu stringa, tj. određuje od koliko se karaktera dati string sastoji.
Sintaksa:
26
Strlen(ime promenljive kojoj je dodeljen dati string ili sam string);
<?php
$password="secret1";
if (strlen($password) <= 5)
{
echo("Passwords must be a least 5 characters long.");
}
else {
echo ("Password accepted.");
}
?>
Strpos() funkcija traži drugi string ili karakter u okviru stringa i vraća broj pozicije gde se
nalazi karakter, odnosno broj pozicije odakle počinje string. Računanje pozicija počinje od
nule.
Strpos (string ili ime promenljive, karakter ili string kome se određuje pozicija).
<html>
<head> <title> Primer strpos funkcije </title> </head>
<body>
<?php
$promenljiva="Internet tehnologije";
echo strpos($promenljiva,"tehn");
?>
</body>
</html>
<?
$string="Ovo je string koji cemo izrezati na više delova";
// rezanje stringa
$arr_izrezani=explode(" ",$string);
foreach($arr_izrezani as $kljuc => $vrednost){
echo $kljuc . " => " . $vrednost . "<br>\n";
}
?><hr><?
// lepljenje stringa iz niza
$arr_stringovi=array("Ovo","je","string","koji","cemo","zalepiti");
$zalepljeni=implode(" ",$arr_stringovi);
echo $zalepljeni;
?>
// rezanje stringa
$arr_izrezani=explode(" ",$string);
Ovaj fragment koda reže zadati string tako da podeli zadati string na fragmente od kojih je
svaki novi fragment deo originalnog stringa između dva znaka data kao uslov razdvajanja u
prvom argumentu funkcije. Svi novi fragmenti se čuvaju u nizu u kojem indeksi odgovaraju
rednom broju fragmenta.
27
<?php
$email='neko@negde.com';
$arr_fragemnti=explode('@',$email);
echo 'nick : ' . $arr_fragemnti[0]; // ispisivanje imena iz e-mail adrese
echo 'domena : ' . $arr_fragemnti[1]; // ispisivanje domena e-mail adrese
?>
<html>
<head> <title> Primer za for petlju </title> </head>
<body>
<?php
$my_string = <<<TEST
Tizag.com
Webmaster Tutorials
Unlock your potential!
TEST;
echo $my_string;
?>
</body>
</html
Isti stringovi
<?php
$name1 = "Bill";
$name2 = "BILL";
if (!$result){
echo "They match.";
}
?>
28
NAPREDNA SINTAKSA PHP KODA
Date
PHP ugrađena funkcija date() je korisna i često korišćena funkcija. Ova funkcija formatira
timestamp (broj sekundi koji je protekao od 1. Januara 1970. godine) u razumljiv oblik
prikazivanja datuma i vremena. Sintaksa:
date(format, timestamp)
Prvi parametar date funkcije format određuje format prikazivanja datuma i vremena. Evo
nekih slova koja se mogu koristiti uz format parametar:
29
Primer 37
<html>
<head> <title> Primer za date() funkciju </title> </head>
<body>
<?php
echo date("Y/M/D");
echo "<br>";
echo date("D/M/Y");
echo "<br>";
echo date("D.M.Y");
?>
</body>
</html>
Dve navedene funkcije se koriste u kreiranju funkcija, hedera (header), futera (footer) ili
drugih elemenata koji se mogu koristi više puta, na različitim Web stranama.
Funkcija include() uzima ceo sadržaj željenog fajla i kopira ga u fajl u kome se poziva
include() funkcija. Kao primer, uzeta su dva fajla, jedan se zove include.php, a drugi fajl, koji
će biti uključen u prvi, zove se linkovi.html.
<html>
<head> <title> Linkovi </title> </head>
<body>
<a href="http://www.google.com"> Kliknite ovde ako hocete na sajlt Googl -
a </a>
<br>
30
<a href="http://www.fon.bg.ac.yu"> Kliknite ovde ako hocete na sajt Fon - a
</a>
<br>
<a href="http://www.yahoo.com"> Kliknite ovde ako hocete na sajt Yahoo - a
</a>
</body>
</html>
<html>
<head> <title> Primer za include() </title> </head>
<body>
<?php
include("linkovi.html");
echo "<br>";
echo "Vidite linkove?";
// moze se koristiti i require() funkcija umesto include(), isti je efekat,
samo je error report drugaciji
?>
</body>
</html>
ObjektnoOrijentisanoProgramiranje u PHP
Kao i većina drugih naprednih programskih jezika i PHP omogućava objektno orijentisano
programiranje. Osnovni koncepti objektnog programiranja su u potpunosti podržane u PHP:
Abstrakcija
Enkapsulacija
Nasleđivanje
Da bi se koristio objekat prvo se mora napraviti klasa (class) sa nekim funkcijama i poljima u
njoj, pa se pozivati unutar koda. Varijable unutar klase su proporties tog objekata, a njene
funkcije su metode istog objekata.
<?
class objekat{
var $testna;
function ispisi(){
echo $this->testna;
}
}
// kreiranje instance objeka
$obj=new objekat;
// nameštanje objektne varijable $testna
$obj->testna="Tekst koji je čuvan za ispis";
// pozivanje funkcije koja za ispis
$obj->ispisi();
?>
31
Rezultat :
U gornjem primeru uz osnovne tehnike kreiranje objekta i njegove instance u skripti može se
primijetiti još jedna stvar.
echo $this->testna;
Korišćenjem $this-> pre imena varijable pristupa se toj varijabli i može se koristiti za ispis ili
izmenu podataka. Na isti način se pristupa i funkcijama. Ukoliko je potrebno pri instanciranju
objekta automatski izvršiti neke radnje poput spajanja na bazu podataka ili bilo koju sličnu
operaciju koja je potrebna za dalji rad objekta treba koristiti konstruktore. Konstruktori su
funkcije objekta (klase) koji se izvršavaju zajedno sa stvaranjem instance objekta.
Konstruktori imaju isto ime kao i sam objekat.
<?
class objekat{
var $testna;
// konstruktor
function objekat(){
$this->testna="Ovo je tekst koji smo stvorili konstruktorom<br>";
$this->ispisi();
}
function ispisi(){
echo $this->testna;
}
}
// pozivanje objekta u kodu
$obj=new objekat;
// nameštanje objektne varijable $testna
$obj->testna="Tekst koji je čuvan za ispis";
// pozivanje funkcije koja za ispis
$obj->ispisi();
?>
Rezultat :
32
PHP napredne funkcije za rukovanje fajlovima
Sintaksa:
fopen(“ime_fajla“,“mod“);
Sledeća tabela prikazuje sve modove koje može sadržati fopen() funkcija.
Modovi Opis
r Čitanje. Počinje od početka fajla, tj. prvog reda (line).
r+ Čitanje/Pisanje. Počinje od početka fajla, tj. prvog reda (line).
w Pisanje.Otvara fajl i briše ceo sadržaj fajla, a ako fajl ne postoji, kreira fajl.
w+ Čitanje/Pisanje.Otvara fajl i briše ceo sadržaj fajla, a ako fajl ne postoji,
kreira fajl.
a Dodaje. Otvara fajl i dodaje nov sadržaj na kraj fajla.
a+ Čitanje/Dodaje. Otvara fajl i dodaje nov sadržaj na kraj fajla.
x Pisanje. Kreira nov fajl, vraca error, ako fajl već postoji.
x+ Čitanje/Pisanje. Kreira nov fajl, vraća error, ako fajl već postoji.
Funkcija fclose() nije obavezna, ali kao dobra programerska praksa važi da se otvoreni fajl
zatvori.
Funkcija feof (naziv_fajla ili promenljive kojoj je fajl dodeljen) proverava da li je dostignut kraj
fajla koji se čita, tj. da li je pokazivač došao do poslednjeg reda fajla.
Funkcija fgets (naziv fajla ili promenljive kojoj je fajl dodeljen) služi za čitanje fajla i to red po
red.
Funkcija fgetc (naziv fajla ili promenljive kojoj je fajl dodeljen) služi za čitanje fajla i to
karakter po karakter.
Za potrebe sledećeg primera, kreiran je fajl sa proizvoljnim tekstom koji je nazvan proba.txt.
Nakon toga, novokreirani fajl će biti otvoren iz PHP skripte i njegov sadržaj će biti iščitan i
prikazan na ekranu i to red po red. Kod izgleda ovako:
Primer 43
<html>
<head> <title> Primer za fopen() </title> </head>
<body>
<?php
$fajl=fopen("proba.txt", "r") or exit ("Ne mogu da otvorim fajl");
// otvara se fajl proba.txt u modu r(read)
while (!feof($fajl)){
// dok se ne dodje do kraja fajla, izvrsava se kod u viticastim zagradama
echo fgets($fajl) . "<br>";
}
fclose($fajl);
?>
</body>
</html>
33
Superglobals
Sve promenljive koje spolja ulaze u PHP kod, dolaze u jednom od nekoliko specifičnih
nizova pod nazivom superglobals. Superglobalne promenljive8 su dostupne u bilo kom delu
skripta, čak i unutar objekata, funkcija, nizova. Drugim rečima, one se ne definišu, one su
već prisutne. Predstavljaju specifične nizove varijabli, koje dolaze spolja u PHP fajl.
Obuhvataju podatke poslate sa HTML formi, podatke o kukijima, informacije o sesiji, upload-
ovanim fajlovima serveru i čine ih raspoloživim na svakom mestu. Predstavljaju način da
PHP otkrije odakle određena vrednost dolazi. Na ovaj način se ne dozvoljava da bilo koja
promenljiva submit – ovana od strane korisnika, automatski uđe u PHP kod. Varijable unutar
PHP skripta ostaju izolovane od potencijalnih napada.
Ako na primer korisnik popuni formu, server neće dodeliti te vrednosti globalnim
promenljivama $name, $password. Umesto toga, ti podaci će biti podeljeni u niz:
$_POST[‘name’], $_POST[‘password’] i može im se pristupiti samo preko globalne
promenljive $_POST
$_GLOBALS
$_SERVER
Sadrži informacije o okruženju web servera. Predstavlja niz varijabli podešenih od strane
servera ili povezanih sa izvršnim okruženjem trenutne skripte. Pre nego što se uspostavi
kontrola nad skriptom, PHP postavlja niz vrednosti u vezi sa serverom, okruženjem, i
zahtevima od strane kljienta. Sve one su smeštene u $_SERVER superglobalnoj varijabli.
Ime Vrednost
………
8
Nisu bile raspoložive sve do verzije PHP 4.1, ali su postojale alternativne metode
34
$_GET i $_POST
$_COOKIE
$_FILES
Asocijativni niz varijabli poslatih u PHP fajl putem HTTP POST metode.
$_ENV
$_SESSION
$_REQUEST
Sve informacije dobijene od strane korisnika. Sadrži sve varijable prikupljene preko GET,
PUT, COOKIE metoda.
Register globals
Register_globals predstavlja jedan od parametara koji se podešavaju u konfiguracionom
fajlu php.ini. Ima dve vrednosti on i off, koje određuju, da li je dozvoljeno registrovati
varijable EGPCS (Environment, GET, POST, Cookie, Server) kao globalne. Od verzije PHP
4.2.0, po default – u je namešten na off
Uvođenje register_globals nije bila loša ideja, problem je nastao zbog toga što se u većini
skriptova ne proverava izvor varijable, pre nego što se ona koristi. Opasnost je u tome što
PHP ne zahteva od varijabli da budu predefinisane pre korišćenja. Postojala je mogućnost
da zlonamerni korisnik pozove PHP skriptu pomoću GET ili POST metode. Ukoliko se ime
varijable, koja se šalje, poklapa sa imenom varijable koja se u skriptu koristi za nešto
značajno, može doći do poremećaja funkcionalnosti programa, slanjem nekog lažnog
parametra.
Sample.php:
<?php
if (check_username_and_password())
{
35
//they logged in successfully
$access = TRUE;
}
if ($access) {
echo "Welcome to the administrative control panel.";
//more privileged code here...
}
else {
echo "Access denied";
}
?>
HTTP/1.0 200
Content-Length: 1276
Content-Type: text/html
Date: Tue, 06 Nov 2001 04:12:49 GMT
Expires: Tue, 06 Nov 2001 04:12:59 GMT
Server: simwebs/3.1.6
Set-Cookie: animal=egg-laying-mammal
<html>...</html>
Kada web server primi odgovor, u sledećem HTTP zahtevu ukjučuje cookie u header polju
Cookie:
U PHP - u, mogu se i kreirati i čitati vrednosti cookie fajla. Za potrebe kreiranje cookie
fajlova, PHP koristi ugrađenu (built – in) funkciju setcookie(). Sintaksa:
36
vrednost Vrednost smeštena u cookie. Internet
Unix timestamp kad ističe
Time()+60*60*24*7 - istče za nedelju
Datum_isteka cookie, ako nije podešeno ističe
dana
čim se zatvori browser
URL putanja na sajtu koja može
da pristupi cookie – u. Default
putanja /testing
znači da svaki direktorijum
može pristupiti cookie - u
Da bi se ograničio pristup samo na www
Slično putanji, samo što pristup
na sajtu example.com koristi se
domen može biti ograničen na
www.example.com. Za pristup svim
poddomen sajta,
domenima sajta koristi se .example.com.
Ako je podešeno na 0, cookie
se šalju samo preko HTTPS
0 za sigurnu konekciju I 1 za nesigurnu,
sigurnost connection. HTTPS konekcija
što je i default vrednost
koristi enkripciju između klijenta
I servera
Za potrebe čitanja vrednosti cookie fajlova, PHP koristi globalnu promenljivu $_COOKIE[],
koja kao parametar uzima ime (name) parametar funkcije setcookie().
Takođe treba napomenuti da je neophodno PHP kod koji sadrži setcookie() funkciju staviti
pre HTML koda (pošto se cookie šalje, odnosno razmenjuje u okviru header-a), da bi se
vrednosti mogle upisivati u cookie fajl i čitati iz njega.
U sledećem primeru dat je prikaz setcookie() funkcije.. Datum isteka postavljen je na 1 čas
(3600 sekundi).
Primer 44
<?php
setcookie("ime", "imekukija", time()+3600);
// postavljen je cookie cije je ime - ime, vrednost - imekukija i datum
isteka 1 sat
?>
<?php
if (isset($_COOKIE['ime'])) {
// proverava da li je za ime - ime podesena neka vrednost u cookie - ju
echo "Dobrodosla" . " " . $_COOKIE['ime'];
}
else {
echo "Dobrodosao posetioce";
}
?>
<html>
<head> <title> Primer za Cookie </title> </head>
<body>
</body>
</html>
37
Ako postoji potreba da se izbriše cookie pre isteka vremena, ponovo se koristi funkcija
setcookie() i kao argument time() navodi se negativno vreme, npr. setcookie(“ime”,
“Internet”, time()-3600) ili se pozove funkcija setcookie(“ime”), sa samo jednim parametrom.
<?php
$Month = 2592000 + time();
//this adds 30 days to the current time
setcookie(AboutVisit, date("F jS - g:i a"), $Month);
?>
<?php
if(isset($_COOKIE['AboutVisit']))
{
$last = $_COOKIE['AboutVisit'];
echo "Welcome back! <br> You last visited on ". $last;
}
else
{
echo "Welcome to our site!";
}
Slanje header-a
HTTP je protokol za prenos podataka između servera i klijenta (browser). Pored podataka
koje vidimo u browser-u kao što su tekst i slike ovim protokolom se istovremeno šalju i
podaci koji se ne vid. Ovi podaci se nazivaju header-i i oni sadrže informacije o serveru,
browser-u, jeziku, tipu podataka koje podržavaju i sl. Primer hedera koje šalje browser:
Host: www.bigcompany.com
User-Agent: Mozilla 4.0 (Compatible; MSIE; 5.5)
Accept: text/*, text/html, text/html;level=1, */*
Accept-Language: da, en-gb;q=0.8, en;q=0.7
Header-e možemo grubo podeliti u dve grupe: Request header-e koje browser šalje kada se
zahteva neki fajl sa servera i Response header-e koje šalje server kada isporučuje taj fajl.
Na osnovu tih podataka možemo zaključiti koji browser korisnik koristi, koje servise
podržava uređaj korisnika i sl.
Format je:
"header_name: header_value"
38
header("Location: http://www.myelab.net");
Treba napomenuti da sve što se nalazi u header-u, mora biti poslato browser-u pre bilo
kakvog ispisa u HTML
Koncept HTTP protokola kao protokola “bez stanja” veoma često može da stvori probleme
kompleksinm aplikacijama koje podrazumevaju određen vid interakcije sa korisnikom. Takvi
sajtovi se ne mogu implementirati kao niz nepovezanih stranica, odnosno niz stranica koje
ne čuvaju stanje. Običan HTML sajt ne prenosi podatke sa jedne stranice na drugu. Drugim
rečima, sve informacije se zaboravljaju čim se učita nova stranica. Ovo može da bude veliki
problem, posebno u slučajevima kao što je “potrošačka korpa”, kada je neophodno imati sve
podatke(npr. koje proizvode je kupac uzeo), bez obzira da li su kupljeni na prvoj ili poslednjoj
stranici sajta. Svi selektovani proizvodi moraju biti zapamćeni na neki način, pre dodavanja
sledećeg u nizu.
Sesija predstavlja apstraktni koncept, koji čini niz HTTP zahteva i odgovora između
određenog web servera i web browser-a . Sesija je veoma korisna u web aplikacijama kada
je neophodno deliti i prenositi informacije između stranica. Pošto HTTP kao protokol ne
podržava ovaj koncept, svi server-side jezici su razvili tehnologije za upravljanje sesijama.
Postoje tri ključne stvari koje treba posmatrati kada su u pitanju sesije na webu.
Svaki HTTP zahtev mora sadržati nekakav identifikator koji omogućava serveru da
obradi zahtev sa svim skaldištenim (zapamćenim stanjima). Na primer, kada korisnik
završi kupovinu, podaci o svim proizvodima u korpi, kao i podacima o korisniku
moraju biti na raspolaganju serveru.
PHP rešava ovo pitanje, omogućavajući skladištenje informacija o korisniku na serveru (npr.
ime, username, selektovani proizvodi i sl.). Uglavnom, informacije iz sesija se ne čuvaju
predugo, ali u potpunosti je izvodljivo čuvati ih u nekoj bazi.
PHP sesije rade tako što kreiraju jedinstveni id tzv. UID (Unique ID) za svakog posetioca
web sajta i čuvaju korisničke promenljive koje su zasnovane na UID. UID se čuva ili u cookie
fajlu ili u URL – u (Uniform Resource Locator).
39
1) Kada korisnik zahteva određenu stranicu u koju je ugrađen concept sesije, PHP
generiše id sesije i kreira fajl koji čuva sve varijable vezane za sesiju.
Kada se prvi put pozove funkcija session start(), osim kreiranja id sesije, automatski se u
odgovoru generiše i polje Set-Cookie. Ubacuje se cookie bez potrebe za eksplicitnim
pozivanjem funkcija setcookie() ili header().
Kada se u PHP stranici potraži session_start( ), a pri tom PHPSESSID se nalazio u HTTP
zahtevu, PHP pokušava da pronađe fajl sesije u koji su skladištene sve varijable sesije. Ako
ne postoji fajl pridružen ovoj sesiji, kreira se novi.
Nakon startovanja sesije i prelaska na bilo koju drugu stranicu, PHP prenosi id sesije na
svaku stranu ili preko kukija ili preko PHPSESSID kao GET varijable.
40
Cookies
URL parametar
Cookies su optimalno rešenje, ali se može dogoditi da nisu omogućeni. Drugi način
podrazumeva ubacivanje id sesije direktno u URL.
Moguće je koristiti i konstantu SID, koja se automatski definiše kada se sesija startuje. Ova
konstanta ima oblik session_name=session_id.
Sve varijable vezane za jednu određenu sesiju se mogu pročitati preko globalne promenljive
$_SESSION. U narednom primeru će biti prikazano kako se uz pomoć $_SESSION[]
promenljive može videti koliko puta je određena web strana pregledana od strane korisnika.
Sesija započinje pomoću funkcije session_start() i na taj način se inicijalizuje niz varijabli u
okviru superglobalne $_SESSION[]. Nakon toga je moguće kreirati varijable i dodeljivati im
vrednosti. Sesija mora biti startovana pre bilo kakvog ispisa na ekranu, usled ograničenja
HTTP protokola, koji zahteva slanje sesija u okviru header-a.
<?php
session_start();
?>
<html>
<head> <title> Primer za $_SESSION() promenljivu </title> </head>
<body>
<?php
if (isset($_SESSION['view'])) {
$_SESSION['view'] = $_SESSION['view'] + 1;
}
else {
$_SESSION['view']=1;
}
echo "Stranica je pregledana" . " " . $_SESSION['view'] . " " . "puta";
?>
</body>
</html>
U sledećem primeru se vidi suština koncepta sesije. Prelaskom sa jedne na drugu stranicu
ne gubi se vrednost promenljive ukupaniznos.
prva.php
<?php
// pocetna stranica
session_start();
$_SESSION["ukupaniznos"] = 1;
print "<a href='druga.php'> Prelaskom na sledecu stranicu povecavate iznos
za 5 dinara</a>";
?>
druga.php
<?php
41
// druga.php
session_start();
$_SESSION["ukupaniznos"]=$_SESSION["ukupaniznos"] + 5;
print $_SESSION["ukupaniznos"];
?>
Treba primetiti da se vrednost varijable ukupan iznos povećala prilikom prelaska na stranicu
druga.php. Sesija se vezuje za skup svih stranica koje se posećuju u okviru nje, a ne samo
na pojedinačne stranice. Prilikom poziva funkcije session_start(), ne inicijalizuje se nova
sesija, nego se samo ponovo aktivira postojeća sa svim svojim varijablama. Na slici se vidi
cookie, koji sa sobom nosi id sesije.
U ovom primeru se nakon izvršavanja prve varijable njena vrednost čuva u fajlu sesije tako
što se ona automatski serijalizuje i izgleda ovako: ukupaniznos|i:1;.
42
Nakon poziva druge stranice ona u serijalizovanom obliku izgleda ovako
Da bi varijable sesije ostale zapamćene, neophdno ih je ili postaviti preko globalne varijable
$_SESSION ili registrovati pomoću funkcije session_register(). Na taj način, one se pamte u
definisanom fajlu:
unset($_SESSION["session_name"]),
Ukoliko bi se u prethodnom primeru koristio prenos id sesije preko URL deo koda:
bi se promenio u:
<?
session_start();
if(isset($_COOKIE['PHPSESSID']))
{
echo 'The session ID has been store in a cookie';
}
if (defined(SID))
{
43
echo 'The session ID has been stored in the query string';
}
?>
Sve operacije vezane za sesije se moraju obaviti pre nego što se bilo kakav sadržaj pošalje
korisniku. Ovo se može osigurati na više načina. Prvi je da se te operacije stave na sam
početak skripte. U tom slučaju pre tih operacija ne sme biti nikakav kod, HTML ili prazan red.
Ovo je u većini situacija vrlo teško postići. Drugi način za onemogućavanje slanja bilo
kakvog sadržaja korisniku je korišćenjem output buffering funkcija. Output buffering je
kontrolisanje slanja generisanog HTML koda korisniku. Znači da se na samom početku
skripte može isključiti slanje outputa PHP koda (ili drugim rečima uključiti output buffering).
Ovim se osigurava da se korisniku neće ništa poslati pre nego što treba. Ovom metodom se
operacije sesije mogu obavljati bilo gde na stranici.
Ovim je uključen output buffering i korisniku se neće slati nikakv sadržaj pre pojavljivanja
ob_end_flush();
PHP sesije su idealne za web sajtove koji zahtevaju logovanje pomoću korisničkog imena i
šifre. Ovakvi sajtovi se veoma često sastoje iz većeg broja stranica i potrebno je informaciju
u logovanju preneti i na druge stranice (ne očekuje se da se korisnik ponov loguje na svakoj
stranici). Postupak u PHP bi mogao da izgleda ovako:
4) Kada god korisnik pređe na neku drugu stranicu, proverava se preko promenljive
login da li je ulogovan
5) Ako je ulogovan prikazuje se sadržaj stranice, a ako nije korisnik se vraća na stranicu
za logovanje
<?php
session_start();
if ($_SESSION['login'] != "go" ) {
header("Location: loginPage.php");
exit();
}
else
if ($_SESSION['login'] = "go" )
{
//Prikaži sadržaj stranice
}
?>
44
PHP napredne funkcije za upravljanje greškama
Važan segment PHP koda je upravljanje greškama (tzv. error handler). Default error
handeler u PHP – u je jako jednostavan. Poruka o grešci se šalje do browser - a sa nazivom
php fajla u kome se greška nalazi, broju linije koda gde je greška i poruci koja opisuje
prirodu greške.
Kada se prave skripte i Web aplikacije, rukovanje greškama je nezaobilazan postupak. Ako
programskom kodu nedostaje provera grešaka, aplikacija izgleda neprofesionalno i može biti
izložena rizicima sigurnosti.
Primer 47
<html>
<head> <title> Primer za error handling - funkcija die() </title> </head>
<body>
<?php
if (!file_exists("dobrodosli.txt")) {
die ("Fajl dobrodosli.txt ne postoji na Vasem file sistemu");
}
else {
$fajl=fopen("dobrodosli.txt", "r");
}
?>
</body>
</html>
45
Nephodan parametar. Određuje tip izveštaja o greški za korisičko –
error_level
definisanu grešku. Ovaj parametar mora biti ceo broj.
Nephodan parametar. Određuje poruku kada se greška javi za korisničko
error_message
– definisanu grešku.
error_file Opcioni parametar. Ispisuje ime fajla u kome se greška javila.
error_line Opcioni parametar. Ispisuje broj linije koda gde se greška javila.
Opcioni parametar. Ipisuje imena svih promenljivih i njihovih vrednosti koje
error_context
su bile aktivne kada je došlo do grešle
Sledeća tabela prikazuje tip izveštaja o grešci, tj. broj koji se definiše u parametru
error_message.
Primer 48
<html>
<head> <title> Primer za erorr handler - personalizovana greska </title>
</body>
<body>
<?php
function personalizovanaGreska($errno, $errstr) {
echo "<b> Greska: <b> [$errno] $errstr ";
}
// sada ce se postaviti error_handler
set_error_handler("personalizovanaGreska");
// okidanje, tj. nailazenje na gresku,prikazace se vrednost promenljive
koja ne postoji
echo ($test);
?>
</body>
</html>
U nastavku, biće prikazan još jedan primer u kome ako je dati broj veći od 2, izvršavanje
skripte se prekida pomoću trigger_error() funkcije:
46
Primer 49
<html>
<head> <title> Primer za personalizovani error handler(3) </title> <head>
<body>
<?php
function personalizovanaGreska($errno,$errstr)
{
echo "<b> Greska </b> [$errno] $errstr";
echo "Kraj skripte";
die();
}
set_error_handler("personalizovanaGreska",E_USER_WARNING);
// okidanje greske
$test=2;
if($test>1){
trigger_error("vrednost mora biti veca od 1", E_USER_WARNING);
}
?>
</body>
</html>
47
UVOD U FORME
Zbog prirode PHP-a kao serverskog skriptnog jezika za dinamičku manipulaciju web
sadržajem koja u mnogim situacijama zavisi od korisničkog unosa ili korisničkih akcija
(kliktanje na linkove i slične akcije), rad sa formama predstavlja jedno od najbitnijih oblasti.
Forme se koriste u velikom broju web aplikacija, nezavisno u kom je jeziku aplikacija
napisana. Zbog ovoga je potrebno imati znanje samih HTML formi (tipove polja, koja su za
koju namenu najbolja, načine grupisanja elemenata … ).
Uz poznavanje HTML dela formi, potrebno je znati kako pomoću PHP-a prihvatiti i obraditi
vrednosti koje su unesene u formu.
O formama uopšteno
Sa tehničke strane gledano, forma je HTML element pomoću kojeg se grupiše više
elemenata za unos podataka (tipa text box, select izbornik, opcije… ). U elemente forme
korisnik može uneti (ili izabrati) informacije koje se kasnije koriste za bilo koju svrhu (unos
informacija u bazu podataka, slanje e-maila sa unesenim informacijama … ). Razlog
grupisanja više elemenata za unos podataka u jednu formu je više – manje očigledan.
Uglavnom, kada se vrši nekakav unos na web stranici, obično se radi o više povezanih
informacija koje čine celinu (primer : login forma sa username - om i password - om). Pošto
su elementi forme grupisani šalju se na obradu zajedno kada se forma submit - uje.
<html>
<head>
<title>Primer 1 : Umetanje forme u HTML dokument</title>
</head>
<body>
<h1>Primer 1 : Umetanje forme </h1>
<hr>
<p>Ispunite formu : </p>
<form method="post" action="prihvat.php" name="forma1">
<input name="submitdugme" type="submit" value="Posalji">
</form>
</body>
</html>
Forma se predstavlja preko jednog od osnovnih HTML tagova koji ima svoj početak i kraj, i
određene atribute.
48
Drugi atribut je action="prihvat.php". Preko action atributa se definiše fajl na serveru, koji će
obraditi zahtev
Treći atribut je name="forma1". Ovaj argument nije bitan za prihvatanje i obradu podataka
forme pomoću PHP-a. Važnost ovog argumenta se više ogleda u izradi JavaScript klijentskih
kodova, i služi za identifikaciju ove forme.
Preko input taga se kreiraju različiti tipovi elemanat koji omogućavaju unos od strane
korisnika. Ukoliko je input elemenat tipa submit, na ekranu je prikazan kao dugme I što je
najvažnije klik na to dugme generiše događaj onsubmit, odnosno dovodi do submit-ovanja
forme.
Dve osnovne metode prosleđivanja podataka forme nekom dokumentu (skripti) su POST i
GET. Odabir metode prosleđivanja podataka forme se vrši navođenjem method argumenta
<form> taga. Moguće vrednosti metod argumenta su "post" i "get".
Odabirom metode se utiče na koji način će se sami podaci forme proslediti stranici, i to je
nezavisno od jezika u kojem će se ti podaci prihvatiti i obraditi. U PHP-u odabirom metode
se bira i način na koji će biti prihvaćeni podaci.
Klasična dilema u web aplikacijama je da li koristiti GET ili POST metodu. Pravi odgovor je
teško definisati.
Prva razlika između ovih metoda je 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). Podaci se prenose u obliku ključ=vrednost. Na primer:
http://www.myelab.net/php/userform.php?username=internet,
Odabirom metode POST podaci nisu vidljivi u komandnoj liniji već se šalju transparentno
kroz header HTTP requesta. POST-om se podaci forme šalju kroz request header i time se
na njih ne može uticati izmenom linka u adress baru. Takođe, postoji i ograničenje na
količinu podataka koji se mogu poslati putem GET metode. Ograničenje zavisi od postavki
samog servera na kom se nalazi dokument na kom se procesira forma i varira od 256 byte-
ova do čak 32 Kb. Zato, ukoliko se radi o formama koje u sebi sadrže polja za unos velikih
tekstova ili sličnih podataka GET i nije adekvatna metoda za prosleđivanje informacija.
U GET metodi informacije stavljaju u URL, što ovu metodu čini idealnom u slučaju kada
želite omogućiti posetiocima sitea da ubace stranicu koju gledaju u svoje favorites, jer će
staviti URL zajedno sa prikačenim query stringom.
GET je prilično nesigurna metoda jer posetilac vrlo lako može izmeniti zahtev jednostavnom
promenom URL-a u adress baru svog browsera, tako da nije preporučljivo koristiti ovu
metodu za prosleđivanje recimo usernamea i passworda u login formama i sličnih osetljivih
49
informacija. Jedino pravilo koje se mora poštovati je da se obavezno mora koristiti POST
metoda kada se preko forme uploa-uje određen fajl
Primer 2 se sastoji od dva dela. Radi se o istoj formi, samo što se u slučaju a) koristi GET
metoda, a u slučaju b) POST.
Primer se sastoji od dva dokumenta za oba slučaja. Prvi će biti nazvan forma.php, a drugi
prihvat.php. Iz imena se zaključuje da će se u forma.php nalaziti sama forma, a u
prihvat.php će se nalaziti PHP skripta koja će prihvatiti informacije i ispisati ih na ekran. Ovi
primeri bi trebalo da ilustruju osnovnu metodu za prihvatanje podataka iz forme.
Dokument : forma.php
<html>
<head>
<title> Prosledivanje informacije GET metodom</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
</head>
<body>
<form name="primer2-a" method="get" action="prihvat.php">
Unesi svoje ime :
<input name="ime" type="text" >
<br>
<input name="submit" type="submit" value="Posalji">
</form>
</body>
</html>
Dokument : prihvat.php
<html>
<head>
<title>Primer 2 a) : Prihvatanje podataka GET metode</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
</head>
<body>
<?php
echo "Pozdrav " . $_GET["ime"];
?>
</body>
</html>
Potrebno je uočiti samo da je u metod argumentu nameštena vrednost get. U ovom primeru
je u formu ubačeno dva elementa. Radi se o <input> tagu koji ima više različitih tipova.
U oba elementa je potrebno primeniti korišćenje name argumenta. Pomoću njega se daje
polju ime i to ime se koristi u PHP-u za prihvatanje podataka koji su uneseni u to polje.
50
Ukoliko se ne imenuje polje, podaci koji se unesu u njega nisu vidljivi PHP skripti koja je
namenjena za prihvatanje podataka iz forme.
Prihvatanje podataka je sam po sebi vrlo jednostavan. Unutar PHP-u postoje superglobalne
varijable. To su varijable (nizovnog tipa) koje definiše sam PHP pri pokretanju svake skripte.
$_GET
Sadrži sve varijable poslate preko HTTP GET zahteva. Ovo se odnosi i na one poslate
direktno preko URL - a (http://www.example.com/page.php?id=2) i preko submit – ovanja
forme korišćenjem GET metoda.
Gornja linija ispisuje poruku koja se sastoji od konstantnog dela Pozdrav i dela u kojem se
ispisuje ono što je uneseno u text box polje u forma.php dokumentu koje je nazvano ime. Iz
ovog jednostavnog primera je vidljivo da se podacima iz forme pristupa pomoću
odgovarajuće superglobalne varijable. Vrednost nekog elementa forme se nalazi unutar
superglobalne varijable na indeksu koji odgovara imenu tog elementa forme. U kojoj se
superglobalnoj varijabli nalaze podaci zavisi o izabranoj metodi prosleđivanja podataka. U
ovom primeru je metoda bila GET, tako da je korišćena superglobalna varijabla $_GET.
Pre nego što se krene sa drugim delom primera, treba primetiti da su se podaci koji su
ispunjeni u forma.php dokumentu zalepili na link u prihvat.php dokumentu koji ispisuje
podatke.
http://localhost/phpbook/forme/primer2/prihvat.php?ime=MojeIme&submit=Po
%9Aalji
Sve iza znaka ? u gornjem linku se naziva QUERY STRING. Radi se o seriji parova imena i
vrednosti medusobno odvojenim znakom &.
Bilo bi moguće ovim načinom preneti podatke iz jedne stranice na drugu čisto putem linkova.
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 formi iz primera, kada se u text box unese Marko
Čak je i izostavljena druga varijabla u query stringu pošto ona za sada nije potrebna u
prihvat.php dokumentu.
Dokument : forma.php
<html>
<head>
<title>Primer 2 b) : Prosledivanje informacije POST metodom</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
</head>
<body>
<h2>Primer 2 b) : Prosledivanje informacije POST metodom </h2>
<hr>
<form name="primer2-b" method="post" action="prihvat.php">
51
Unesi svoje ime :
<input name="ime" type="text" >
<br>
<input name="submit" type="submit" value="Posalji">
</form>
</body>
</html>
Dokument : prihvat.php
<html>
<head>
<title>Primer 2 b) : Prihvatanje podataka POST metode</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
</head>
<body>
<?php
echo "Pozdrav " . $_POST["ime"];
?>
</body>
</html>
$_POST
Princip prihvata podataka poslatih POST metodom je isti kao i kod prihvata podataka GET
metode, sa manjim razlikama.
Druga razlika je u već spomenutoj superglobalnoj varijabli koja je ovog puta $_POST.
Dodatna i očigledna razlika je da sada više nema query stringa i nije moguće direktno uticati
na podatke nakon što je forma ispunjena i submitovana.
Njene moguće vrednosti su POST i GET, zavisno od metode otvaranja stranice. Njena
vrednost će uvek biti GET osim u slučaju da se dokumentu pristupilo nakon submitovanja
forme sa POST metodom.
Iz tog razloga ovo nije najbolja metoda za proveru da li je neko stvarno ispunio formu i
pristupio dokumentu za prihvatanje i obradu podataka.
Kod search formi je dodatna, već spomenuta, prednost ta što se query string čuva zajedno
sa URL-om u favorites posetioca, tako da je moguće opet se vratiti na isto pretraživanje
nakon više dana jednostavnim odabirom bookmarka.
52
Forme i srpski znakovi
Zatim otvorite forma.php iz istog slučaja, ispunite formu sa nekim srpskim znakovima pa je
submitujte. Kao što se vidi, neki od znakova se nisu prikazali pravilno. Ako se usklade
charset-ovi srpski znakovi će se prikazivati bez problema.
Iz tog razloga je poželjno stvari koje su usko povezane, poput prikaza i obrada forme držati
unutar istog dokumenta u najmanju ruku.
<html>
<head>
<title>Primer 3 :Prikaz i obrada forme unutar jednog dokumenta</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
</head>
<body>
<h2>Primer 3 :Prikaz i obrada forme unutar jednog dokumenta</h2>
<hr>
<form name="primer3" method="post" action="<?=$_SERVER['PHP_SELF']?>">
Unesi svoje ime :
<input name="ime" type="text" >
<br>
<input name="submituj" type="submit" value="Posalji">
</form>
<?php
if ( !isset($_POST["submituj"]))
{
}
else {
echo "Pozdrav " . $_POST["ime"];
}
53
?>
</body>
</html>
Zapravo je eliminisana potrebu za dva odvojena dokumenta i sve se obavlja unutar istog
dokumenta. Prva stvar koja se odmah uočava je
if ( !isset($_POST["submituj"]))
Ono što treba primetiti u primeru je da se proverava postojanje vrednosti za submit taster
unutar forme. To se radi zato što je ta vrednost obavezno prisutna ukoliko se forma ispunila i
submit - ovala.
$PHP_SELF je varijabla koju definiše sam PHP i u njoj se nalazi ime trenutno aktivnog
dokumenta. Pošto se želi da se forma prikaže i obradi unutar istog dokumenta, to je tačno
ono što je potrebno. Iako se tu moglo ručno upisati ime dokumenta, korišćenje $PHP_SELF
je preporučljivo, zato što se ovako može promeniti ime dokumenta, a u njemu će sve i dalje
raditi kako je zamišljeno, zato što PHP sam namešta njenu vrednost.
U slučaju da se želi imati u jednoj formi više submit tastera, u zavisnosti od toga koji je
kliknut treba u obradi forme obaviti različite operacije. Na primer, kada se radi nekim
administrativnim alatima, gde je potrebno napraviti više različitih operacija nad istim
podacima.
<html>
<head>
<title>Primer 4 : Forma sa vise submit tastera</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
</head>
<body>
<h2>Primer 4 :Forma sa vise submit tastera</h2>
<hr>
<form name="primer4" method="post" action="<?=$_SERVER['PHP_SELF']?>">
<input type="submit" name="taster1" value="Taster 1">
<br>
<input type="submit" name="taster2" value="Taster 2">
</form>
<?
if (isset($_POST["taster1"]))
echo "Pritisnuli ste taster 1";
if (isset($_POST["taster2"]))
echo "Pritisnuli ste taster 2";
?>
</body>
</html>
54
Ovog puta je kao uslov prikaza ili obrade forme korišćen $REQUEST_METHOD. On je
korišćen zato što ovog puta postoje dva submit tastera, i pritiskom bilo kojeg od njih želi se
umesto prikaza forme pokrenuti obradu iste.
Suština je u tome (a to je i cela poenta ovog primera) da će se nakon submit - ovanja forme
pomoću jednog od tih tastera popuniti vrednost unutar superglobalne $_POST varijable
samo onog tastera koji je pritisnut, što dokazuje deo koda koji obrađuje formu.
if (isset($_POST["taster1"]))
echo "Pritisnuli ste taster 1";
if (isset($_POST["taster2"]))
echo "Pritisnuli ste taster 2";
• Text box
• Text area
• Sakriveno polje / hidden field
• Checkbox
• Radio taster
• Lista / meni – select izbornik
• Polje za upload datoteka
Radi se o polju za unos jedne linije teksta. Ime pomoću kojeg mu se pristupa u PHP-u mu se
navodi u name atributu. Ukoliko se želi da pri učitavanju stranice u ovom elementu nalazi
neka vrednost možet se navesti pomoću value atributa.
Text area
<textarea name="velikiTekst"></textarea>
Ovo je polje za unos texta sa više redova. Korisnik može prebaciti unos teksta u novi red pa
ga kao takvog poslati na obradu. Pravila oko imenovanja su ista kao i za sve ostale
elemente. Za razliku od text boxa, text area nema value atribut, već se defaultna vrednost
zadaje na sledeći način:
55
<textarea name="velikiTekst">Ovo je default vrednost elementa i može imati
više redova </textarea>.
Kod davanja defaultne vrednosti je bitno paziti da će se 2 space znaka u samom elementu
prikazati kao dva prazna prostora, pa da prelazak u novi red u HTML-u uzrokuje
prebacivanje unosa podataka u elementu u novi red.
<html>
<head>
<title>Primer 6 : Koriscenje text area elementa</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
</head>
<body>
<h2>Primer 6 : Koriscenje text area elementa</h2>
<hr>
<?
if ( !isset($_POST["submituj"])){
?>
<form name="primer3" method="post" action="<?=$_SERVER['PHP_SELF']?>">
Unesi tekst od vise redova :<br>
<textarea name="tekst"></textarea>
<br>
<input name="submituj" type="submit" value="Posalji">
</form>
<?
} else {
echo "<b>Uneli ste : </b><br>" . $_POST["tekst"];
echo "<hr>";
// ispis sa obracanjem paznje na prelazak u nov red.
echo "<b>Tekst u izvornom obliku : </b><br>";
echo nl2br($_POST["tekst"]);
}
?>
</body>
</html>
Unešena vrednost u textarea elementu se nalazi unutar superglobalne varijable $_POST ili
$_GET, zavisno od metode prosleđivanja podataka forme. Pošto je u ovom primeru metoda
POST vrednost se nalazi unutar $_POST varijable.:
Radi se o tome da HTML u svom source - u zanemaruje sve praznine, tj. više uzastopnih
praznina interpretira poput jednog praznog prostora. Pod isto pravilo spada i prelazak u novi
red u HTML sourcu. Ugrađena funkcija PHP - a je korišćena u drugom ispisu u primeru, a
ispis unesene vrednosti prati isti format teksta koji je upisan u text area polje.
Korišćena funkcija je :
echo nl2br($_POST["tekst"]);
(nl2br – citaj new line to break)
Ime funkcije govori što ona radi. U stringu koji joj se da kao argument menja sve nove
redove ( \n ) sa HTML <br> tagom koji prebacuje ispis u novi red pri gledanju dokumenta u
browseru.
56
Hidden polje
<input type="hidden" name="nevidljivoPolje" value="Vrednost polja">
Kao što i samo ime elementa / polja kaže, radi se o polju koje nije vidljivo pri gledanju
dokumenta u browseru, pa korisnik ne može direktno uticati na vrednost koja je sačuvana u
njemu. Vrednost koje se nalazi u u takvom polju se mora namestiti direktno u source - u
dokumenta ili unosom u HTML source ručno ili pomoću PHP-a. Drugi način promene
vrednosti je dinamički, za vreme gledanja stranice u browseru putem JavaScripta. Kao i kod
text boxa, vrednost se unosi u value atribut. Ovo polje obično služi za pamćenje nekih
vrednosti koje ne zavise od korisnika (posetioca), pa se na ovaj način štite od korisničkog
unosa i izmene.
Checkbox
<input type="checkbox" name="jezik" value="srpski">
Checkbox je element koji se uglavnom koristi u slučaju kada se korisniku želi omogućiti da
izabere jednu, više ili ni jednu vrednost iz nekog logički povezanog skupa vrednosti. Recimo,
u gornjem primeru bi značilo da korisnik priča srpski ukoliko je označio to polje, ili ga ne
priča ukoliko ga je ostavio neoznačenim. Normalno, pošto se radi o grupi povezanih
informacija trebalo bi biti ponuđeno više jezika pomoću više checkboxova. Iako gornja
tvrdnja ne mora biti uvek tačna, recimo može se raditi o samo jednoj vrednosti, poput
označavanja saglasnosti sa nečim ili sličnim da / ne situacijama.
Ovaj primer se može koristiti u situaciji u kojoj je potrebna potvrda posetioca da je punoletan
i da je saglasan sa pravilima sajta
<html>
<head>
<title>Primer 7 a) : Prihvatanje checkbox elementa</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
</head>
<body>
<h2>Primer 7 a): Prihvatanje checkbox elementa</h2>
<hr>
<?
if (! $_POST["ime"] ){
?>
<form name="form1" method="post" action="">
<p>
<input type="checkbox" name="punoletan" value="1">
Punoletan sam i saglasan sam sa pravilima sitea</p>
<p>
<input name="ime" type="submit" value="Ulaz">
</p>
</form>
<?
} else {
// provera da li je označen checkbox
if ($_POST["punoletan"]) {
echo "Posto si punoletan mozes dalje koristiti ove stranice";
} else {
echo "Posto nisi punoletan ne mozes pristupiti sadrzaju ovih stranica";
57
die();
}
}
?>
</body>
</html>
<html>
<head>
<title>Primer 7 b) : Prihvatanje vrednosti vise povezanih checkbox
elemenata</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
</head>
<body>
<h2>Primer 7 b) : Prihvatanje vrednosti vise povezanih checkbox
elemenata</h2>
<hr>
<?
if ((!isset($_POST["ime"])) || !$_POST["ime"]){
?>
<form name="form1" method="post" action="">
<p>Koje od ponudenih jezika pricate tecno?</p>
<p>
<input type="checkbox" name="jezik[]" value="engleski">
Engleski<br>
<input type="checkbox" name="jezik[]" value="nemacki">
Nemacki<br>
<input type="checkbox" name="jezik[]" value="francuski">
Francuski<br>
<input type="checkbox" name="jezik[]" value="ruski">
Ruski </p>
<p>
<input name="ime" type="submit" id="ime" value="Posalji">
</p>
</form>
<?
} else {
if ((isset($_POST["jezik"])) and (is_array($_POST["jezik"]) and count
($_POST["jezik"]) > 0 ))
{
echo "Jezici koje pricate su :";
foreach ($_POST["jezik"] as $pricam){
echo $pricam . ",";
}
} else {
echo "Jeste sigurni da ne pricate ni
jedan od navedenih jezika?";
}
}
?>
</body>
</html>
58
Upload fajla
PHP upravlja upload-om fajlova preko superglobalne varijable $_FILES, koja sadrži niz
varijabli, poslatih preko POST metode.
Fajl se čuva u temporary direktorijumu. Fajl će biti uklonjen, odmah nakon zahteva, ako se
ne sačuva, t.j ne kopira na alternativnu lokaciju. Fajlu se pristupa preko imena isto kao i bilo
kom drugom input elementu. Funkcija koja se koristi za čuvanje je copy (). U novijim
verzijama PHP, koristi se funkcija move_uploaded_file (string $filename, string $destination)
<?php
$target = "upload/";
$target = $target . basename( $_FILES['uploaded']['name']) //basename daje
ime fajla koji je uploadovan ;
if(move_uploaded_file($_FILES['uploaded']['tmp_name'], $target))
{
echo "Fajl je uspešno uploadovan";
}
else {
echo "Upload nije uspeo";
}
?>
59