54
http://www.w3schools.com/php/ 1 2. Rad s datumima i vremenima 2.1 PHP funkcija Date() Function PHP datumska funkcija vrši formatiranje podataka o datumu i vremenu (timestamp). Sintaksa date (format, timestamp) Parametar Opis format Potrebno. Određuje format timestamp-a timestamp Opciono. Određuje timestamp. Default je tekuće vrijeme i datum PHP date() funkcija – Šta je timestamp (vremenska odrednica)? Timestamp je broj sekundi od 1. januara 1970. u 00:00:00 po Griniču. Ovaj izraz je takođe poznat i kao Unix Timestamp. 2.2 Formatiranje datuma Prvi parametar u datumskoj funkciji određuje način formatiranja datuma/vremena. Ovaj parametar koristi alfanumeričke karaktere da bi se prikazao datum i vrijeme. Ovdje ćemo navesti neke od karaktera koje možemo koristiti u tu svrhu: d – dan u mjesecu (01-31) m – Tekući mjesec, u bliku broja (01-12) Y – Tekuća godina, za to se koriste četiri cifre Pregled svih karaktera koji se mogu koristiti kao parametar za formatiranje datuma i vremena mogu se naći u PHP Date reference. Druge oznake, poput “/”, “.”, ili “-” se takođe mogu ubacivati između slova da bi se izvršilo dodatno formatiranje datuma i vremena: <?php echo date("Y/m/d"); echo "<br />"; echo date("Y.m.d"); echo "<br />"; echo date("Y-m-d"); ?> Rezultat gore navedenog koda bi mogao izgledati kao:

76439266 PHP Za Pocetnike

Embed Size (px)

Citation preview

Page 1: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

1

2. Rad s datumima i vremenima 2.1 PHP funkcija Date() Function PHP datumska funkcija vrši formatiranje podataka o datumu i vremenu (timestamp). Sintaksa date (format, timestamp) Parametar Opis format Potrebno. Određuje format timestamp-a timestamp Opciono. Određuje timestamp. Default je tekuće vrijeme i datum PHP date() funkcija – Šta je timestamp (vremenska odrednica)? Timestamp je broj sekundi od 1. januara 1970. u 00:00:00 po Griniču. Ovaj izraz je takođe poznat i kao Unix Timestamp. 2.2 Formatiranje datuma Prvi parametar u datumskoj funkciji određuje način formatiranja datuma/vremena. Ovaj parametar koristi alfanumeričke karaktere da bi se prikazao datum i vrijeme. Ovdje ćemo navesti neke od karaktera koje možemo koristiti u tu svrhu:

● d – dan u mjesecu (01-31) ● m – Tekući mjesec, u bliku broja (01-12) ● Y – Tekuća godina, za to se koriste četiri cifre

Pregled svih karaktera koji se mogu koristiti kao parametar za formatiranje datuma i vremena mogu se naći u PHP Date reference. Druge oznake, poput “/”, “.”, ili “-” se takođe mogu ubacivati između slova da bi se izvršilo dodatno formatiranje datuma i vremena: <?php echo date("Y/m/d"); echo "<br />"; echo date("Y.m.d"); echo "<br />"; echo date("Y-m-d"); ?>

Rezultat gore navedenog koda bi mogao izgledati kao:

Page 2: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

2

2006/07/11 2006.07.11 2006-07-11

2.3 Dodavanje timestamp-a Drugi parametar u datumskoj funkciji određuje timestamp. Ovaj parametar je opcioni. Ukoliko se ne proslijedi vrijednost za timestamp koristiće se tekuće vrijeme i datum. U sledećem primjeru koristićemo funkciju mktime da bismo kreirali timestamp za naredni dan. Funkcija mktime vraća Unix timestamp za određeni datum. Sintaksa mktime (hour, minute, second, month, day, zear, is_ dst) Da bi se izvršilo pomjeranje vremena za jedan dan unaprijed jednostavno se dodaje jedan (1) na argument za dan u mktime() funkciji: <?php $tomorrow = mktime(0,0,0,date("m"),date("d")+1,date("Y")); echo "Tomorrow is ".date("Y/m/d", $tomorrow); ?>

Rezultat gore navedenog koda bi mogao izgledati slično sljedećem: Tomorrow is 2006/07/12

PHP Date – Reference Više informacija o svim PHP datumskim funkcijama može se naći u PHP Date Reference.

Page 3: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

3

3. Snimanje i učitavanje podataka PHP Include File (PHP uključivanje datoteke) Server Side Includes (SSI) se koristi za kreiranje funkcija, header-a (zaglavlje), footers (začelje), ili elemenata koji će se ponovo koristiti na većem broju stranica. Server Side Includes Pomoću funkcija include() ili require() sadržaj neke datoteke se može unijeti u PHP datoteku prije nego što ga server procesira. U svakom slučaju, radi se o dvijema identičnim funkcijama, izuzev u pogledu obrade grešaka. Funkcija include() izdaje upozorenje pri čemu se izvršavanje programa nastavlja, dok funkcija require() generiše fatalnu grešku pri čemu se izvršavanje programa prekida nakon pojave greške. Ove dvije funkcije se koriste za kreiranje funkcija, headers-a, footers-a, ili elemenata koji se mogu ponovo koristiti na većem broju stranica. Na ovaj način programer može uštedjeti značajno vrijeme tokom rada na pisanju programa. To znači da se može kreirati standardni header (zaglavlje) ili menu (meni) dokumenta koji bi mogli da se nalaze na svim web stranicama. Kada bude potrebno ažuriranje header-a (zaglavlja) u tom slučaju se može ažurirati samo data include datoteka. Kada se dodaje nova stranica na datom web site-u, jednostavno se može promijeniti meni datoteka (menu file) umjesto da se ažuriraju linkovi na svim web stranicama. 3.1 Include() funkcija Funkcija include() uzima čitav tekst iz neke određene datoteke i kopira ga u datoteku koja koristi include() funkciju. Primjer 1 Pretpostavimo da imate standardnu header datoteku pod nazivom “header.php”. Da biste uvrstili ovu header datoteku na web stranicu, koristite za to include() funkciju, kao npr.: <html> <body> <?php include("header.php"); ?> <h1>Welcome to my home page</h1> <p>Some text</p> </body> </html>

Primjer 2 Pretpostavimo da imamo jednu standardnu meni datoteku koju bi bilo potrebno koristiti na svim stranicama (include dokumenti obično imaju “.php” ekstenziju). Analiziraćemo “menu.php” datoteku datu u nastavku:

Page 4: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

4

<html> <body> <a href="http://www.w3schools.com/default.php">Home</a> | <a href="http://www.w3schools.com/about.php">About Us</a> | <a href="http://www.w3schools.com/contact.php">Contact Us</a>

Potrebno je da sve tri datoteke, “default.php”, “about.php”, i “contact.php” uključuju “menu.php” datoteku. Slijedi kod u “default.php”: <?php include("menu.php"); ?> <h1>Welcome to my home page</h1> <p>Some text</p> </body> </html>

Ako pogledate izvorni kod datoteke “default.php” u browser- u (čitaču), onda će isti izgledati kao: <html> <body> <a href="default.php">Home</a> | <a href="about.php">About Us</a> | <a href="contact.php">Contact Us</a> <h1>Welcome to my home page</h1> <p>Some text</p> </body> </html>

Naravno, istu stvar bi morali da uradimo i u slučaju datoteka “about.php” i “contact.php”. Korišćenjem include datoteka, potrebno je samo da se ažurira tekst u “menu.php” datoteci ako odlučite da preimenujete ili promijenite poredak linkova, ili da dodate neku drugu web stranicu na site. 3.2 Require() funkcija require() funkcija je identična include() funkciji, osim što postoji razlika u načinu obrade greške. include() funkcija generiše upozorenje, pri čemu se program i dalje izvršava, dok require() funkcija ukazuje na fatalnu grešku, a izvršavanje programa će biti odmah prekinuto nakon pojavljivanja greške. Ukoliko se uključi datoteka pomoću include() funkcije, a pri tom dođe do pojave greške, tada bi se mogla dobiti sledeća poruka o grešci: PHP kod: <html> <body> <?php include("wrongFile.php"); echo "Hello World!"; ?>

Page 5: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

5

</body> </html>

Poruka o grešci: Warning: include(wrongFile.php) [function.include]: failed to open stream: No such file or directory in C:\home\website\test.php on line 5 Warning: include() [function.include]: Failed opening 'wrongFile.php' for inclusion (include_path='.;C:\php5\pear') in C:\home\website\test.php on line 5 Hello World!

Primjećuje se da se echo iskaz i dalje izvršava! To je posledica toga što Upozorenje ne zaustavlja dalje izvršavanje programa. Na istom primjeru ćemo analizirati slučaj korišćenja require() funkcije. PHP kod: <html> <body> <?php require("wrongFile.php"); echo "Hello World!"; ?> </body> </html>

Poruka o grešci: Warning: require(wrongFile.php) [function.require]: failed to open stream: No such file or directory in C:\home\website\test.php on line 5 Fatal error: require() [function.require]: Failed opening required 'wrongFile.php' (include_path='.;C:\php5\pear') in C:\home\website\test.php on line 5

Echo iskaz se nije dalje izvršavao zbog toga što je program zaustavljen nakon pojave fatalne greške. Preporučuje se korišćenje require(), a ne include() funkcije zbog toga što program ne bi trebalo da nastavi sa daljim izvršavanjem, ako neke od datoteka nedostaju ili su pogrešno imenovane.

Page 6: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

6

3.3 PHP File Handling (PHP rukovanje datotekom) Fopen funkcija se koristi za otvaranje datoteka u PHP. Otvaranje datoteke fopen() funkcija se koristi za otvaranje datoteke u PHP-u. Prvi parametar ove funkcije sadrži ime datoteke koja će se otvoriti, a drugi parametar određuje na koji će se način datoteka otvoriti: <html> <body> <?php $file=fopen("welcome.txt","r"); ?> </body> </html>

Datoteka se može otvoriti na jedan od sledećih načina: Načini Opis r Samo čitanje, od početka datoteke. r+ Čitanje/pisanje, od početka datoteke. w Samo pisanje. Otvara i briše sadržaj datoteke ili kreira novu datoteku

ukoliko ona ne postoji. w+ Čitanje/pisanje. Otvara i briše sadržaj datoteke ili kreira novu

datoteku ukoliko ona ne postoji a Dodavanje. Otvara datoteku i piše do kraja datoteke, ili kreira novu

datoteku ukoliko ona ne postoji a+ Čitanje/dodavanje. Čuva sadržaj datoteke pisanjem do kraja iste. x Samo pisanje. Kreira novu datoteku. Vraća FALSE i grešku ako

datoteka već postoji x+ Čitanje/pisanje. Kreira novu datoteku. Vraća FALSE i grešku ako

datoteka već postoji Napomena: Ako fopen() funkcija ne može otvoriti određenu datoteku, ista će vratiti vrijednost 0 (false (pogrešno)). Primjer Sljedeći primjer prikazuje poruku ako se fopen() funkcijom ne može otvoriti određena datoteka: <html> <body> <?php $file=fopen("welcome.txt","r") or exit("Unable to open file!"); ?> </body> </html>

3.4 Zatvaranje fajla

Page 7: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

7

fclose() funkcija se koristi za zatvaranje otvorene datoteke: <?php $file = fopen("test.txt","r"); //some code to be executed fclose($file); ?>

3.5 Provjera kraja datoteke (Check End-of-file) Funkcija feof() se koristi za provjeru da li se stiglo do “kraja fajla” (EOF). feof() funkcija je korisna za prolaženje kroz podatke nepoznate veličine. if (feof($file)) echo "End of file";

Napomena: Ne možete čitati iz datoteka otvorenih u w, a i x modu. 3.6 Čitanje datoteke red po red fgets() funkcija se koristi za čitanje jednog reda iz datoteke. Napomena: Nakon pozivanja ove funkcije, pokazivač će se pomjeriti na sljedeći red u datoteci. Primjer U sljedećem primjeru je prikazano čitanje datoteke red po red sve dok se ne dođe do kraja datoteke: <?php $file = fopen("welcome.txt", "r") or exit("Unable to open file!"); //Output a line of the file until the end is reached while(!feof($file)) { echo fgets($file). "<br />"; } fclose($file); ?>

3.7 Čitanje datoteke znak po znak Funkcija fgetc() se koristi za čitanje pojedinačnog znaka iz datoteke. Napomena: Nakon poziva ove funkcije pokazivač datoteke će se pomjeriti na sljedeći znak. Primjer U narednom primjeru prikazano je čitanje datoteke znak po znak sve dok se ne dođe do kraja datoteke: <?php

Page 8: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

8

$file=fopen("welcome.txt","r") or exit("Unable to open file!"); while (!feof($file)) { echo fgetc($file); } fclose($file); ?>

PHP Filesystem Reference Više podataka o funkcijama PHP sistema datoteka (filesystem) se može naći u PHP Filesystem Reference.

Page 9: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

9

4. Rad sa sistemom datoteka i serverom PHP File Upload (PHP postavljanje datoteke) Uz pomoć PHP-a je moguće izvršiti učitavanje (upload) datoteka na dati server. 4.1 Kreiranje Upload-file forme Omogućavanje korisnicima učitavanje datoteka iz forme može biti veoma korisno. Sljedeća HTML forma služi za učitavanje (uploading) datoteka: <html> <body> <form action="upload_file.php" method="post" enctype="multipart/form-data"> <label for="file">Filename:</label> <input type="file" name="file" id="file" /> <br /> <input type="submit" name="submit" value="Submit" /> </form> </body> </html>

U gore prikazanom HTML obrascu potrebno je obratiti pažnju na sljedeće:

● Atribut enctype u <form> tag-u (oznaci) određuje koji tip sadržaja treba koristiti kada se šalje (submit) ovaj obrazac. “multipart/form-data” se koristi kada ovaj obrazac zahtijeva binarne podatke, poput sadržaja fajla koji treba učitati (upload).

● Tip=”file” atribut u <input> oznaci određuje da bi ulaz trebalo obraditi kao datoteku. Npr., kada se forma pogleda u browser-u, browse dugme će se nalaziti odmah do input polja.

Napomena: Omogućavanje korisnicima da učitavaju datoteke predstavlja veliki bezbjednosni rizik. Jedino korisnici od povjerenja koji imaju za to dozvolu mogu da vrše učitavanje datoteka. 4.2 Kreiranje zapisa za učitavanje (upload) “upload_file.php” datoteka sadrži kod koji omogućava učitavanje (uploading) datoteke: <?php if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";

Page 10: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

10

echo "Stored in: " . $_FILES["file"]["tmp_name"]; } ?>

Korišćenjem globalnog PHP $_FILES niza mogu se učitati datoteke sa klijentovog računara na udaljeni server. Prvi parametar je ime input forme, a drugi indeks može biti “name” (ime), “type” (tip), “size” (veličina), “tmp_name” ili “error” (greška). Kao npr.:

$_FILES[„file“] [“name“] – ime učitane datoteke. $_FILES[„file“] [’’type“] – tip učitane datoteke. $_FILES[„file“] [’’size“] – veličina u bajtima učitane datoteke. $_FILES[„file“] [’’tmp_name“] –ime privremene kopije datoteke koja je

postavljena na server. $_FILES[„file“] [’’error“] – kod greške koja je nastala kao rezultat učitavanja

datoteke.

Ovo je veoma jednostavan način učitavanja datoteka. Iz bezbjedonosnih razloga trebalo bi dodati ograničenja u vezi sa tim koji su tipovi datoteka korisniku dozvoljeni da učita na server mašini. 4.3 Ograničenja kod postavljanja (upload) datoteka U sljedećem prrimjeru dodajemo neka ograničenja u vezi datoteke koja se učitava. Korisnik može jedino usnimiti .gif ili .jpeg datoteke, a veličina datoteke mora biti ispod 20 kb:

<?php if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/pjpeg")) && ($_FILES["file"]["size"] < 20000)) { if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Stored in: " . $_FILES["file"]["tmp_name"]; } } else { echo "Invalid file"; } ?>

Napomena: Za IE da bi prepoznao jpg datoteke tip mora biti pjpeg, za FireFox to mora biti jpeg.

Page 11: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

11

4.4 Snimanje postavljene datoteke U gore navedenim primjerima pravi se privremena kopija učitanih datoteka u PHP temp direktorijumu (PHP privremenom direktorijumu) na serveru. Privremeno kopirane datoteke se automatski uklanjaju kada se program izvrši. Da bi se pohranila učitana datoteka potrebno ju je kopirati na nekom drugom mjestu: <?php if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/pjpeg")) && ($_FILES["file"]["size"] < 20000)) { if ($_FILES["file"]["error"] > 0) { echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; if (file_exists("upload/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " already exists. "; } else { move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); echo "Stored in: " . "upload/" . $_FILES["file"]["name"]; } } } else { echo "Invalid file"; } ?>

Gore navedeni program provjerava da li datoteka već postoji, a ukoliko ne postoji, datoteka se kopira u određeni direktorijum. Napomena: Datoteka iz ovog primjera se snima u novom direktorijumu pod nazivom “upload”.

Page 12: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

12

5. UPRAVLJANJE SESIJAMA U PHP-u 5.1 PHP Cookies Šta je Cookie? Cookie se često koristi za identifikaciju korisnika. Cookie je jednostavna datoteka koju server postavlja na korisnikov računar. Svaki put kada isti računar traži neku stranicu pomoću browser-a (čitača), on će takođe tom prilikom poslati i cookie. Sa PHP-om se mogu i kreirati i mijenjati vrijednosti cookie-ja. 5.2 Kako kreirati Cookie? Funkcija setcookie() se koristi za postavljanje cookie-ja.

Napomena: Funkcija setcookie() se mora pojaviti PRIJE <html> oznake. Sintaksa setcookie(name, value, expire, path, domain);

Primjer 1

U narednom primjeru definisaćemo cookie pod nazivom “user” (korisnik) i dodijelićemo mu vrijednost “Alex Porter”. Takođe, odredićemo da li će vrijeme važenja ovog cookie-ja isteći nakon sat vremena: <?php setcookie("user", "Alex Porter", time()+3600); ?> <html> .....

Napomena: Vrijednost cookie-ja se automatski URL kodira prilikom slanja cookie-ja i automatski se dekodira nakon primanja (da bi se spriječilo URL kodiranje koristimo setrawcookie() funkciju). Primjer 2 Takođe možete postaviti vrijeme važenja cookie-ja i na drugi način. To je možda lakši način nego u slučaju kada se koriste sekunde. <?php $expire=time()+60*60*24*30; setcookie("user", "Alex Porter", $expire); ?> <html> .....

Page 13: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

13

U gore navedenom primjeru vrijeme važenja cookie-ja je podešeno na mjesec dana (60 sec * 60 min * 24 hours * 30 days). 5.3 Kako da promijenimo vrijednost cookie? PHP $_COOKIE promjenljiva se koristi za čuvanje vrijednosti cookie-ja. U dolje navedenom primjeru prikazaćemo vrijednost cookie-ja pod nazivom “user”: <?php // Print a cookie echo $_COOKIE["user"]; // A way to view all cookies print_r($_COOKIE); ?>

U narednom primjeru koristićemo funkciju isset() kako bismo saznali da li je cookie postavljen. <html> <body> <?php if (isset($_COOKIE["user"])) echo "Welcome " . $_COOKIE["user"] . "!<br />"; else echo "Welcome guest!<br />"; ?> </body> </html>

5.4 Kako izbrisati Cookie? Prilikom brisanja cookie-ja potrebno je utvrditi da li je isteklo njegovo vrijeme važenja. Primjer brisanja cookie-ja: <?php // set the expiration date to one hour ago setcookie("user", "", time()-3600); ?>

Šta ako Browser NE podržava Cookies-je? Ukoliko data aplikacija radi sa browser-ima (pretraživačima) koji ne podržavaju cookies-je, tada je potrebno koristiti druge metode da bi se proslijedila informacija sa jedne na drugu stranicu u datoj aplikaciji. Prosljeđivanje podataka kroz forme je jedan od načina (forme i korisnički ulazni podaci su objašnjeni ranije). U donjem primjeru forma prosljeđuje korisničke ulazne podateke u “welcome.php” datoteku kada korisnik klikne lijevim tasterom miša na dugme “submit” (podnesi): <html> <body> <form action="welcome.php" method="post">

Page 14: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

14

Name: <input type="text" name="name" /> Age: <input type="text" name="age" /> <input type="submit" /> </form> </body> </html>

Pregled vrijednosti korisničkih ulaznih podataka u “welcome.php” datoteci se vrši pomoću sljedećeg koda: <html> <body> Welcome <?php echo $_POST["name"]; ?>.<br /> You are <?php echo $_POST["age"]; ?> years old. </body> </html>

5.5 PHP Sessions (sesije) Promjenljiva PHP Sessions se koristi za pohranjivanje informacija ili za promjenu parametara korisničke sesije. Promjenljive sesije sadrže informacije o jednom korisniku i dostupne su na svim stranicama u datoj aplikaciji. PHP promjenljive sesije Postupak pri radu sa aplikacijom je sledeći: prvo se otvori aplikacija, zatim se izvrše neke izmjene u njoj i nakon toga se ista zatvori. Veoma sličan postupak je i u slučaju session (sesije). Kompjuter zna ko je korisnik. On zna kada je korisnik pokrenuo aplikaciju i kada je završio aplikaciju. Međutim, kada je riječ o Internetu tu postoji jedan problem: web server ne zna ko je korisnik i koje akcije korisnik preduzima zbog toga što HTTP adresa ne čuva stanje sesije. PHP session rešava ovaj problem tako što omogućava pohranjivanje korisničkih podataka na serveru radi kasnijeg korišćenja (npr. korisničko ime (username), artikle za kupovinu, itd.) Međutim, informacija o sesiji je privremenog karaktera, a biće izbrisana nakon što korisnik napusti dati web site. Ako je potrebno stalno pohranjivanje korisničkih podataka možda će biti poželjno da se podaci pohrane u bazu podataka. Sessions (sesije) rade na osnovu kreiranja jedinstvenog id (UID) za svakog posjetioca, a promjenljive se pohranjuju na osnovu ovog UID. UID se pohranjuje ili u cookie-ju ili se prenosi kroz URL.

Page 15: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

15

5.6 Pokretanje PHP Session Prije nego što se pohrane korisničke informacije o datoj PHP session (sesiji), potrebno je prvo pokrenuti samu sesiju. Napomena: Funkcija session_start() se mora pojaviti PRIJE <html> oznake: <?php session_start(); ?> <html> <body> </body> </html>

Gore prikazani kod će registrovati user's session (korisničku sesiju) sa serverom, omogućiće postupak čuvanja korisničkih informacija i odrediće UID za tu user's session (korisničku sesiju). 5.7 Pohranjivanje promjenljive sesije Pravilan način pohranjivanja i promjene promjenljivih sesije je putem korišćenja PHP $_SESSION promjenljive: <?php session_start(); // store session data $_SESSION['views']=1; ?> <html> <body> <?php //retrieve session data echo "Pageviews=". $_SESSION['views']; ?> </body> </html>

Rezultat gore navedenog koda je: Pageviews=1

U dolje navedenom primjeru kreira se jednostavni brojač stranica (page-view counter). Funkcijom isset() se provjerava da li je “views” promjenljiva već postavljena. Ako je “views” promjenljiva postavljena onda se može uvećati brojač za jedan. Ako promjenljiva “views” ne postoji onda se kreira “views” promjenljiva i postavlja se na vrijednost 1: <?php session_start(); if(isset($_SESSION['views'])) $_SESSION['views']=$_SESSION['views']+1;

Page 16: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

16

else $_SESSION['views']=1; echo "Views=". $_SESSION['views']; ?>

5.8 Prekidanje sesije Ako se žele izbrisati neki session podaci, u tom slučaju se može koristiti unset() ili session_destroy() funkcije. unset() funkcija se koristi za oslobađanje neke određene session promjenljive: <?php unset($_SESSION['views']); ?>

Takođe, sesija se može u potpunosti izbrisati korišćenjem session_destroy() funkcije: <?php session_destroy(); ?>

Napomena: session_destroy() funkcija će resetovati datu sesiju pri čemu će se izgubiti svi pohranjeni podaci o sesiji.

Page 17: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

17

6. Slanje e-mail-ova direktno iz programa 6.1 PHP mail() funkcija PHP mail() funkcija se koristi za slanje e-mail-ova iz programa. Sintaksa mail (to (prima), subject (predmet), message (poruka), header (zaglavlja), parameters (parametri)) Parametar Opis to (prima) Potrebno. Određuje primaoca/primaoce mail-a subject (predmet) Potrebno. Određuje predmet mail-a. Napomena: Ovaj

parametar ne može sadržavati bilo koje oznake za novi red. message (poruka) Potrebno. Određuje poruku koja se šalje. Svaki red treba biti

odvojen sa LF (\n). Redovi ne bi trebalo da sadrže više od 70 oznaka

headers (zaglavlja) Opciono. Određuje dodatna zaglavlja, poput From (Šalje), Cc(Carbon copy) i Bcc (Blind carbon copy). Dodatna zaglavlja trebada budu odvojena sa CRLF (\r\n)

Parameters (parametri)

Opciono. Određuje dodatni parametar za program za slanje mail-a.

Napomena: Da bi mail funkcije bile dostupne, PHP zahtijeva da je email sistem instaliran i da je operativan. Program koji će se koristiti se određuje konfiguracijom u php.ini fajlu. Više o tome može se naći PHP Mail reference. 6.2 PHP jednostavni E-mail Najednostavniji način za slanje email-a pomoću PHP-a je slanje tekstualnog email-a. U narednom primjeru prvo navodimo promjenljive ($to, $subject, $message, $from, $headers), a zatim koristimo te promjenljive u mail() funkciji za slanje e-mail-a. <?php $to = "[email protected]"; $subject = "Test mail"; $message = "Hello! This is a simple email message."; $from = "[email protected]"; $headers = "From: $from"; mail($to,$subject,$message,$headers); echo "Mail Sent."; ?>

6.3 PHP mail obrazac (PHP Mail Form) Uz pomoć PHP-a se može napraviti forma za povratne informacije (feedback-form) na datom website-u. U narednom primjeru prikazano je slanje tekstualne poruke na

Page 18: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

18

određenu e-mail adresu: <html> <body> <?php if (isset($_REQUEST['email'])) //if "email" is filled out, send email { //send email $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail( "[email protected]", "Subject: $subject", $message, "From: $email" ); echo "Thank you for using our mail form"; } else //if "email" is not filled out, display the form { echo "<form method='post' action='mailform.php'> Email: <input name='email' type='text' /><br /> Subject: <input name='subject' type='text' /><br /> Message:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html>

Prethodni primjer funkcioniše na sljedeći način:

● Prvo, provjerava da li je email input polje popunjeno, ● Ako nije popunjeno (npr. kada je web stranica prvi put posjećena), prikazuje

HTML formu, ● Ako je popunjeno (nakon što je obrazac ispunjen), šalje email iz obrasca, ● Kada se pritisne submit (podnesi) dugme nakon što je obrazac ispunjen, stranica

se ponovo učitava, utvrđuje se da li je email input polje popunjeno, a zatim se šalje email poruka.

Napomena: Ovo je najjednostavniji način za slanje e-mail-a, ali ovaj način nije bezbjedan. U narednom poglavlju je dato više detalja o nedostacima e-mail komandnih skripti i kako da se izvrši provjera korisničkih podataka kako bi korisnički ulazni podaci bili sto bezbjedniji. PHP Mail Reference Više informacija o PHP mail() funkciji se može naći u PHP Mail Reference. 6.4 PHP bezbjedno slanje e-mail-ova Kao što smo vidjeli u prethodnom poglavlju u PHP e-mail komandnom skriptu postoji određeni nedostatak.

Page 19: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

19

PHP E-mail zloupotrebe (PHP E-mail Injections) Prvo pogledajte PHP kod iz prethodnog poglavlja: <html> <body> <?php if (isset($_REQUEST['email'])) //if "email" is filled out, send email { //send email $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail("[email protected]", "Subject: $subject", $message, "From: $email" ); echo "Thank you for using our mail form"; } else //if "email" is not filled out, display the form { echo "<form method='post' action='mailform.php'> Email: <input name='email' type='text' /><br /> Subject: <input name='subject' type='text' /><br /> Message:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html>

Problem sa gore prikazanim kodom je taj što neovlašćeni korisnici mogu ubaciti podatke u mail zaglavlja (headers) preko ulaznog obrasca. Šta se dešava ako korisnik doda sledeći tekst u e-mail ulaznom polju u ovom obrascu? [email protected]%0ACc:[email protected] %0ABcc:[email protected],[email protected], [email protected],[email protected] %0ABTo:[email protected]

Kao i obično, mail() funkcija postavlja gornji tekst u mail headers (zaglavlja) i sada header ima dodatno Cc:, Bcc: i To (Prima): polje. Kada korisnik klikne na dugme submit , e-mail će biti poslat na sve gore navedene adrese! 6.5 PHP sprečavanje e-mail zloupotreba (PHP Stopping E-mail Injections) Najbolji način da se spriječe e-mail zloupotrebe je kontrola ispravnosti ulaznih podataka. Dolje navedeni kod je isti kao i onaj u prethodnom poglavlju, ali smo ovog puta dodali i kontrolor ispravnosti ulaznih podataka (input validator) koji provjerava e-mail polje u obrascu:

Page 20: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

20

<html> <body> <?php function spamcheck($field) { //filter_var() sanitizes the e-mail //address using FILTER_SANITIZE_EMAIL $field=filter_var($field, FILTER_SANITIZE_EMAIL); //filter_var() validates the e-mail //address using FILTER_VALIDATE_EMAIL if(filter_var($field, FILTER_VALIDATE_EMAIL)) { return TRUE; } else { return FALSE; } } if (isset($_REQUEST['email'])) {//if "email" is filled out, proceed //check if the email address is invalid $mailcheck = spamcheck($_REQUEST['email']); if ($mailcheck==FALSE) { echo "Invalid input"; } else {//send email $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail("[email protected]", "Subject: $subject", $message, "From: $email" ); echo "Thank you for using our mail form"; } } else {//if "email" is not filled out, display the form echo "<form method='post' action='mailform.php'> Email: <input name='email' type='text' /><br /> Subject: <input name='subject' type='text' /><br /> Message:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html>

U gore prikazanom kodu koriste se PHP filteri da bi se ispitala ispravnost unijetih podataka:

● Filter FILTER_SANITIZE_EMAIL filter uklanja sve nelegalne e-mail karaktere iz niza,

● Filter FILTER_VALIDATE_EMAIL filter ispituje ispravnost vrijednosti ulaznih podataka, kao što je npr. e-mail adresa.

O filterima se može naći više informacija u poglavlju PHP Filter.

Page 21: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

21

7. OBRADA GREŠAKA u PHP-u Default obrada greške u PHP-u je veoma jednostavna. Poruka o grešci sa imenom datoteke (filename), brojem reda i poruka koja opisuje grešku se šalje browser-u (čitač). 7.1 PHP obrada greške Kada se prave komandne skripte i web aplikacije, obrada greški predstavlja jedan veoma važan dio u procesu programiranja. Ako u programu nedostaje kod za provjeru grešaka, tada program može izgledati veoma neprofesionalno, a pri tome korisnik aplikacije može biti izložen različitim bezbjedonosnim rizicima. Različite metode za obradu grešaka su sljedeće:

● Jednostavni “die()” iskazi, ● Uobičajene greške i pokretači obrade grešaka (error triggers), ● Izvještaj o greškama.

Osnovna obrada grešaka: Korišćenje die() funkcije U primjeru koji slijedi prikazan je jedan jednostavan program koji otvara datu tekst datoteku: <?php $file=fopen("welcome.txt","r"); ?>

Ukoliko datoteka ne postoji dobija se informacija o grešci, kao npr.: Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in C:\webfolder\test.php on line 2

Da bi se izbjeglo da korisnik dobije poruku o grešci kao što je gore pomenuta, prvo se provjerava da li datoteka postoji prije nego što joj se pristupi: <?php if(!file_exists("welcome.txt")) { die("File not found"); } else { $file=fopen("welcome.txt","r"); } ?>

Ako datoteka ne postoji dobiće se informacija o grešci, kao npr.: File not found

Page 22: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

22

Gore navedeni kod je efikasniji od prethodnog zbog toga što koristi jednostavan mehanizam za obradu grešaka da bi se zaustavilo izvršavanje programa nakon pojave greške. Međutim, prosto zaustavljanje izvršavanja programa nije uvijek pravi način. Razmotrimo alternativne PHP funkcije za obradu grešaka. 7.2 Kreiranje funkcije za obradu grešaka Kreiranje funkcije za obradu grešaka je veoma prosto. Jednostavno se kreira posebna funkcija koja se može upotrebiti kada dođe do greške u PHP kodu. Ova funkcija takođe mora da se sastoji od minimum dva parametra (nivoa greške i poruke o grešci), ali može sadržavati i do pet parametara (opciono): fajl, broj reda i kontekst greške): Sintaksa error_function(error_level,error_message, error_file,error_line,error_context)

Parametar Opis error_level Potrebno. Određuje izvještaj o grešci za određenu grešku. Mora imati brojčanu

vrijednost. Pogledati tabelu ispod radi mogućih izvještaja o nivoima greške error_message Potrebno. Određuje poruku o grešci za određenu korisničku grešku (user-

defined error) error_file Opciono. Određuje ime fajla (filename) u kom se greška dogodila error_line Opciono. Određuje broj reda u kome je došlo do greške error_context Opciono. Određuje niz koji sadrži svaku varijabilu i njihove vrijednosti koje se

koriste kada dođe do greške Izvještaj o nivoima grešaka Ovi izvještaji o nivoima grešaka su različiti tipovi grešaka za koje se može iskoristiti user-defined error handler: Vrijednost Konstanta Opis 2 E_WARNING Run-time greške koje nisu fatalne. Dalje izvršavanje programa

se ne prekida. 8 E_NOTICE Run-time napomene. Program je pronašao nešto što bi moglo

biti greška, ali što bi se takođe moglo desiti i prilikom uobičajenog izvršavanja komandne skripte.

256 E_USER_ERROR Fatalna greška produkovana od strane korisnika. Ovo je nešto poput E_ERROR koji je postavio programer koristeći PHP funkciju trigger_error().

512 E_USER_WARNING Upozorenje koje nije fatalno, a prouzrokovano je od strane korisnika. Ovo je poput E_WARNING kojeg je postavio programer koristeći funkciju trigger_error().

1024 E_USER_NOTICE Poruka koja je prouzrokovana od strane korisnika Ovo je poput E_NOTICE koje je postavio programer koristeći funkciju trigger_error()

Page 23: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

23

4096 E_RECOVERABLE_ERROR

Uhvatljiva fatalna greška. Ovo je poput E_ERROR, ali koja se može registrovati preko funkcije korisnika (takođe pogledati set_error_handler() )

8191 E_ALL Sve greške i upozorenja, izuzev nivoa E_STRICT (E_STRICT će biti dio E_ALL kao što je PHP 6.0)

Sada ćemo napisati funkciju za obradu grešaka: function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Ending Script"; die(); }

Gore prikazani kod je jednostavna funkcija za obradu grešaka. Kada se pokrene ova funkcija ona će ustanoviti nivo greške i poruku o grešci. Nakon toga, kao izlaz funkcije dobijaju se podaci o nivou greške i poruka, a zatim se prekida izvršavanje komandne skripte. Kada se kreira funkcija za obradu greške potrebno je ustanoviti kada bi tu funkciju trebalo pokrenuti. 7.3 Postavljanje Error handler (obrađivač greške) Default funkcija za obradu greške u PHP je ugrađena u error handler-u (obrađivaču greške). U vezi sa tim napisaćemo funkciju koja je iznad default error handler-a tokom izvršavanja komandne skripte. Moguće je promijeniti error handler na taj način da se isti primijeni samo za neke tipove greški, čime bi komandna skripta mogla obraditi razne tipove greški na različite načine. Međutim, u sljedećem primjeru koristićemo custom error handler za obradu svih tipova greški: set_error_handler("customError");

Pošto želimo da naša custom funkcija rešava sve greške, za set_error_handler() funkciju potreban je samo jedan parametar, dok bi se drugi parametar mogao dodati kako bi se odredio nivo greške. Primjer Testiranje error handler-a gdje se pokušava prikazati vrijednost promjenljive koja ne postoji: <?php //error handler function function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr"; } //set error handler set_error_handler("customError"); //trigger error echo($test); ?>

Page 24: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

24

Rezultat gore datog koda bi trebalo da bude sličan sljedećem: Error: [8] Undefined variable: test

7.4 Pokretanje obrade greške (Trigger an Error) U komandnom skriptu pomoću kojeg korisnici mogu unositi podatke korisno je obraditi greške koje se javljaju kao posledica nelegalnog unosa podataka. U PHP-u ovo je moguće uraditi pomoću trigger_error() funkcije. Primjer U ovom primjeru dolazi do pojave greške ako je “test” promjenljiva veća od “1”: <?php $test=2; if ($test>1) { trigger_error("Value must be 1 or below"); } ?>

Rezultat prethodnog koda može biti sličan sljedećem: Notice: Value must be 1 or below in C:\webfolder\test.php on line 6

Greška se može obraditi bilo gdje u programu gdje se to želi, a dodavanjem drugog parametra može se odrediti koji nivo greške je obrađen. Mogući tipovi grešaka:

● E_USER_ERROR – Fatalna greška koja je produkovana od strane korisnika tokom izvršavanja programa. To su greške koje se ne mogu ispraviti. Izvršavanje programa se stoga prekida.

● E_USER_WARNING – Upozorenje koje je produkovano od strane korisnika tokom izvršenja programa, a koje nije fatalno. Izvršavanje programa se ne zaustavlja.

● E_USER_NOTICE – Default. Napomena koja je produkovana od strane korisnika tokom izvršavanja programa. Program je tokom izvršavanja naišao na nešto što bi moglo da bude greška, ali do čega bi takođe moglo doći i u toku njegovog uobičajenog izvršavanja.

Primjer U ovom primjeru dolazi do generisanja E_USER_WARNING ako je “test” promjenljiva

Page 25: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

25

veća od “1”. Ako se pojavi E_USER_WARNING onda se koristi custom error handler i program će prekinuti izvršavanje: <?php //error handler function function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Ending Script"; die(); } //set error handler set_error_handler("customError",E_USER_WARNING); //trigger error $test=2; if ($test>1) { trigger_error("Value must be 1 or below",E_USER_WARNING); } ?>

Rezultat prethodnog koda može izgledati kao: Error: [512] Value must be 1 or below Ending Script

Nakon što je objašnjeno kako se obrađuju greške i kako se pokreću funkcije za obradu greške, u sljedećem odeljku će biti više riječi o zapisivanju (evidenciji) grešaka koje su se dogodile odnosno error logging-u. Zapisivanje grešaka (Error Logging) Po definiciji PHP šalje zapis o grešci na server, u dio sistemskih datoteka u kojima se bilježi svako prijavljivanje na sistem, zavisno od toga kako je podešena error_log konfiguracija u php.ini fajlu. Korišćenjem error_log() funkcije mogu se poslati zapisi o grešci u određenu datoteku ili na neko drugo udaljeno mjesto. Slanje poruka o greškama putem e-mail-a može biti dobar način za dobijanje obavještenja o određenim greškama. 7.5 Slanje poruke o greškama putem e-mail-a U narednom primjeru ćemo pokazati kako se šalje e-mail sa porukom o grešci i prekida izvršavanje programa, ako se pojavi neka određena greška: <?php //error handler function function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Webmaster has been notified"; error_log("Error: [$errno] $errstr",1, "[email protected]","From: [email protected]"); } //set error handler

Page 26: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

26

set_error_handler("customError",E_USER_WARNING); //trigger error $test=2; if ($test>1) { trigger_error("Value must be 1 or below",E_USER_WARNING); } ?>

Rezultat prethodnog koda može biti sličan sljedećem: Error: [512] Value must be 1 or below Webmaster has been notified

Mail koji je poslao gore navedeni kod izgleda ovako: Error: [512] Value must be 1 or below

Ovo se ne bi trebalo koristiti za sve greške. Uobičajene greške bi trebalo upisati na server koristeći za to default PHP logging system.

Page 27: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

27

8. PHP Exception Handling (rukovanje izuzecima) Izuzeci se koriste za promjenu uobičajenog programskog toka ako dođe do pojave neke određene greške 8.1 Šta je izuzetak (exception)? U PHP-u 5 je predstavljen novi objekat koji je namijenjen obradi grešaka. Izuzetak se koristi za promjenu uobičajenog toka izvršavanja programa ako dođe do pojave određene greške pod određenim uslovima. Uslov se naziva izuzetkom. Kada se dogodi izuzetak uobičajeno dolazi do sledećeg:

● Snima se tekući status programa, ● Izvršavanje programa će se prebaciti na prethodno definisanu (custom)

exception handler funkciju, ● Zavisno od situacije, handler, obrađivač izuzetka, zatim, može nastaviti

izvršavanje programa na osnovu sačuvanog statusa programa, okončati izvršavanje programa ili nastaviti izvršavanje programa sa nekog drugog mjesta u kodu.

Pokazaćemo različite metode za rešavanje grešaka:

● Osnovno korišćenje izuzetaka, ● Pravljenje custom exception handler-a - posebnog obrađivača izuzetka, ● Višestruki izuzeci, ● Ponovno “bacanje” (događanje) izuzetka, ● Postavljanje top level exception handler-a - obrađivača izuzetka najvišeg nivoa.

Napomena: Izuzetke treba jedino koristiti sa uslovima kada dolazi do grešaka i ne bi ih trebalo koristiti u smislu naredbi skoka na neko drugo mjesto u kodu programa. 8.2 Osnovno korišćenje izuzetaka Kada se dogodi neki izuzetak, dio koda koji slijedi neće biti izvršen, a PHP će pokušati da pronađe odgovarajući blok “catch”. Ako izuzetak nije uhvaćen, pojaviće se informacija da je došlo do fatalne greške uz poruku “Uncaught Exception”. Probaćemo da “bacimo” izuzetak, a da ga pri tom ne “uhvatimo”: <?php //create function with an exception function checkNum($number) { if($number>1) {

Page 28: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

28

throw new Exception("Value must be 1 or below"); } return true; } //trigger exception checkNum(2); ?>

Gore prikazani kod će “uhvatiti” sljedeću grešku: Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in C:\webfolder\test.php:6 Stack trace: #0 C:\webfolder\test.php(12): checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6

Try, throw i catch (pokušaj, baci i hvataj) Da bismo izbjegli grešku iz gore navedenog primjera potrebno je da napišemo ispravan kod koji bi rešavao izuzetke. Ispravan kod treba da uključuje:

1. Try (pokušaj) – funkcija koja koristi izuzetak trebalo bi da bude sadržana u “try” bloku. Ako se izuzetak ne dogodi, kod će normalno nastaviti sa izvršavanjem. Ipak, ako se izuzetak dogodi, izuzetak je onda “thrown” (bačen).

2. Throw (baci) – Ovo je način kako se pokreće izuzetak. Svako “baci” (throw) mora imati makar jedno “hvataj” (catch).

3. Catch (hvataj) - “catch” blok analizira izuzetak i definiše objekat koji sadrži informaciju o izuzetku.

Pokušajmo da pokrenemo izuzetak uz pomoć validnog koda: <?php //create function with an exception function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } //trigger exception in a "try" block try { checkNum(2); //If the exception is thrown, this text will not be shown echo 'If you see this, the number is 1 or below'; } //catch exception catch(Exception $e) { echo 'Message: ' .$e->getMessage(); } ?>

Page 29: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

29

U gore prikazanom kodu pojaviće se sledeća greška: Message: Value must be 1 or below

Na primjeru je objašnjeno sledeće: Gore prikazani kod baca (throw) izuzetak i hvata (catch) ga: 1. Definiše se checkNum() funkcija. Pomoću nje se provjerava da li je broj veći od 1.

Ako je broj veći od 1 izuzetak je bačen. 2. checkNum() funkcija se poziva u “try” bloku, 3. „Bačen” je izuzetak u checkNum() funkciji. 4. “catch” blok obrađuje izuzetak i definiše objekat ($e) koji sadrži informaciju o izuzetku. 5. Poruka o grešci iz izuzetka se prikazuje pomoću komande $e->getMessage() iz objekta koji sadrži izuzetak. Međutim, jedan od načina da zadovoljimo pravilo da „svako throw (bacanje) mora imati i catch (hvatanje)“ je da se utvrdi obrađivač izuzetaka na najvišem nivou za rešavanje izuzetaka (top level exception handler), kako bi se riješile eventualne greške u kodu. 8.3 Definisanje Custom Exception Class Definisanje custom exception handler-a je krajnje jednostavno. Definiše se posebna klasa sa metodama koje se mogu pozvati kada se neki izuzetak pojavi u PHP kodu. Ta klasa bi morala naslijediti exception class (klasu izuzetaka). Custom Exception Class sadrži sve elemente iz PHP exception class pa bi se tome mogle samo pridodati custom funkcije. Definišimo Exception Class kao: <?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address'; return $errorMsg; } } $email = "[email protected]"; try { //check if if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {

Page 30: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

30

//throw exception if email is not valid throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?>

Nova klasa (class) je kopija stare exception class sa dodatkom errorMessage() metode. Pošto se radi o kopiji stare klase koja sadrži elemente i metode iz stare klase onda se mogu koristiti exception class metode poput getLine(), getFile() i getMessage(). Na primjeru je objašnjeno sledeće: Gore prikazani kod throw (baca) izuzetak i catch (hvata) ga sa Custom Exception Class:

1. customException() klasa je definisana kao ekstenzija stare exception class klase. Na ovaj način ona nasljeđuje sve metode i osobine stare exception class klase.

2. Definisana je errorMessage() funkcija. Ova funkcija vraća poruku o grešci ukoliko je e-mail adresa netačna.

3. $email promjenljiva se inicijalizuje kao string koji nije validna e-mail adresa. 4. Izvršava se blok “try” (pokušaj), a izuzetak je „bačen“ pošto e-mail adresa nije

validna. 5. Blok “catch” (hvataj) hvata izuzetak i prikazuje poruku o grešci.

8.4 Multiple Exceptions (višestruki izuzeci) Program može koristiti veći broj izuzetaka kako bi se provjerio i veći broj uslova. Moguće je koristiti nekoliko if..else blokova, switch ili ugnježdene višestruke izuzetke. Ovi izuzeci mogu koristiti različite exception klase za izuzetke i vraćati različite poruke o greškama: <?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address'; return $errorMsg; } } $email = "[email protected]"; try { //check if if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {

Page 31: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

31

//throw exception if email is not valid throw new customException($email); } //check for "example" in mail address if(strpos($email, "example") !== FALSE) { throw new Exception("$email is an example e-mail"); } } catch (customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); } ?>

Na primjeru je objašnjeno sledeće: U gore navedenom kodu testiraju se dva uslova i „baca” (throw) se izuzetak ako bilo koji od uslova nije ispunjen:

1. customException() klasa je definisana kao ekstenzija stare exception class klase. Na ovaj način ona nasljeđuje sve metode i osobine stare exception class klase.

2. Definisana je errorMessage() funkcija. Ova funkcija vraća poruku o grešci ukoliko je e-mail adresa netačna.

3. $email promjenljiva se inicijalizuje kao string koji je validna e-mail adresa, ali sadrži string „example“.

4. Izvršava se blok “try” (pokušaj), a izuzetak nije „bačen“ na prvom uslovu. 5. Drugi uslov pokreće izuzetak pošto e-mail sadrži niz (string) “example” (primjer). 6. Blok “catch” (hvataj) hvata izuzetak i prikazuje tačnu poruku o grešci.

Ukoliko ne postoji customException catch već samo osnovni exception catch, u tom slučaju će se izuzetak rešavati pomoću exception catch. 8.5 Ponovno bacanje izuzetaka (Re-throwing exceptions) Ponekad, kada je neki izuzetak „bačen”, isti se može obraditi drugačije u odnosu na već postojeći standardni način. Moguće je „baciti” izuzetak po drugi put unutar “catch” (hvataj) bloka. Program bi trebalo da prikrije sistemske greške od korisnika. Sistemske greške mogu biti važne za programera, ali za korisnika ne mogu biti interesantne. Da bismo korisniku olakšali stvari može se ponovo baciti izuzetak sa user friendly porukom: <?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = $this->getMessage().' is not a valid E-Mail address.';

Page 32: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

32

return $errorMsg; } } $email = "[email protected]"; try { try { //check for "example" in mail address if(strpos($email, "example") !== FALSE) { //throw exception if email is not valid throw new Exception($email); } } catch(Exception $e) { //re-throw exception throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?>

U primjeru je objašnjeno sledeće: Gore navedeni kod testira da li email adresa sadrži niz (string) “example”, a ukoliko ga sadrži, izuzetak se ponovo baca:

1. customException() klasa je definisana kao ekstenzija stare exception class klase. Na ovaj način ona nasljeđuje sve metode i osobine stare exception class klase.

2. Definisana je errorMessage() funkcija. Ova funkcija vraća poruku o grešci ukoliko je e-mail adresa netačna.

3. $email promjenljiva se inicijalizuje kao string koji je validna e-mail adresa, ali sadrži string „example“.

4. Blok “try” (pokušaj) sadrži još jedan “try” blok koji treba da omogući ponovno bacanje (re-throw) izuzetka.

5. Izuzetak je pokrenut pošto e-mail sadrži string “example”. 6. Blok “catch” (hvataj) hvata izuzetak i ponovo “baca” customException. 7. “customException” je uhvaćen i prikazuje poruku o grešci.

Ako izuzetak nije uhvaćen u tekućem “try” bloku, on će tražiti catch blok na “higher levels” (višim nivoima). 8.6 Postavljanje Top Level Exception Handler set_exception_handler() funkcija postavlja određenu korisničku funkciju (user-defined function) koja bi trebalo da rešava sve „neuhvaćene“ izuzetke. <?php function myException($exception)

Page 33: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

33

{ echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler('myException'); throw new Exception('Uncaught Exception occurred'); ?>

Rezultat gore prikazanog koda bi trebalo biti sličan sljedećem: Exception: Uncaught Exception occurred

U gore navedenom kodu nije bilo “catch” bloka. Umjesto toga pokrenut je top level exception handler. Ovu funkcija bi trebalo koristiti za hvatanje neuhvaćenih izuzetaka. Pravila za izuzetke:

Kod se može nalaziti u „try“ bloku da bi pomogao hvatanju potencijalnih izuzetaka.

Svaki „try“ ili „throw“ blok mora imati barem jedan odgovarajući „catch“ blok. Višestruki „catch“ blokovi se mogu koristiti za hvatanje (catch) različitih vrsta

izuzetaka. Izuzeci mogu biti „bačeni“ (throw) ili „ponovo bačeni“ (re-throw) u „catch“ blok

u okviru „try“ bloka.

Jednostavno pravilo: Ako nešto „bacite“ (throw) to morate i da „uhvatite“ (catch).

Page 34: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

34

9. FILTRIRANJE PODATAKA U PHP-u (PHP filtar) PHP filteri se koriste za provjeru ispravnosti i filtriranje podataka koji dolaze iz nebezbjednih izvora kao što su podaci koje unosi korisnik. 9.1 Šta je PHP filter? PHP filter se koristi za provjeru ispravnosti i filtriranje podataka koji dolaze iz nebezbjednih izvora. Testiranje, provjera ispravnosti i filtriranje podataka koje unosi korisnik odnosno unaprijed pripremljenih podataka, predstavljaju važne dijelove bilo koje web aplikacije. PHP filter je napravljen da bi se filtriranje podataka obavilo na lakši i brži način. Zašto koristimo filtar? Skoro sve web aplikacije zavise od ulaznih podataka koje unosi korisnik ili ih prosljeđuje neka druga aplikacija, kao npr. web service-i. Korišćenjem filtera se dobija na sigurnosti i pouzdanosti u radu date aplikacije koja će dobiti tačne ulazne podatke. Uvijek je potrebno filtrirati sve podatke koji dolaze spolja! Filtriranje ulaznih podataka je jedno od najvažnijih aplikacionih bezbjednosnih pitanja. Šta se podrazumjeva pod ulaznim podacima?

Podaci iz nekog obrasca, Cookies, Web services podaci, Serverske promjenljive, Rezultati pretraživanja baze podataka

9.2 Funkcije i filtri Da bi se filtrirala neka promjenljiva koristi se jedna od sljedećih funkcija za filtriranje:

filter_var() – ovom funkcijom se uz pomoć posebnog filtera obavlja filtriranje pojedinačne promjenljive,

filter_var_array() – ovom funkcijom se filtrira nekoliko promjenljivih sa istim ili različitim filterima,

filter_input – uzima jednu ulaznu promjenljivu i vrši njeno filtriranje, filter_input_array – uzima nekolko ulaznih promjenljivih i filtrira ih sa istim ili

različitim filterima.

U narednom primjeru se provjerava ispravnost jednog cijelog broja koristeći funkciju filter_var(): <?php $int = 123; if(!filter_var($int, FILTER_VALIDATE_INT)) { echo("Integer is not valid"); }

Page 35: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

35

else { echo("Integer is valid"); } ?>

U gore prikazanom kodu koristi se „FILTER_VALIDATE_INT“ filter za filtriranje promjenljive. Pošto je cijeli broj ispravan, rezultat prethodnog koda će biti: ’’Intenger is valid“ (Cijeli broj je validan). Ako pokušamo sa promjenljivom koja nije cijeli broj (npr. „123abc“), izlaz prethodnog koda će biti: „Intenger is not valid“ (Cijeli broj nije validan). Kompletna lista funkcija i filtera se može naći u PHP Filter Reference. 9.3 Provjera ispravnosti i korekcije Postoje dvije vrste filtera: filteri za provjeru ispravnosti i filteri za korekciju. Filteri za provjeru ispravnosti:

se koriste za provjeru ispravnosti ulaznih korisničkih podataka, imaju stroga pravila za formate, kao što je npr. provjera ispravnosti URL ili e-

mail, vraćaju očekivani tip za uspješno izvršeno filtriranje ili FALSE za neuspješno

filtriranje. Filteri za korekciju:

se koriste da bi omogućili ili onemogućili određene karaktere u nizu (string), nemaju pravila o formatu podataka, uvijek vraćaju vrijednost tipa niz (string).

9.4 Opcije i kontrolne promjenljive Opcije i kontrolne promjenljive se koriste da bi se određenim filterima definisale dodatne opcije za filtriranje. Različiti filteri imaju različite opcije i kontrolne promjenljive. U sljedećem primjeru se ispituje ispravnost cijelog broja korišćenjem opcije filter_var(), „min_range“ i „max_range“: <?php $var=300; $int_options = array( "options"=>array ( "min_range"=>0, "max_range"=>256 ) );

Page 36: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

36

if(!filter_var($var, FILTER_VALIDATE_INT, $int_options)) { echo("Integer is not valid"); } else { echo("Integer is valid"); } ?>

U gore prikazanom kodu opcije moraju biti postavljene u asocijativnom nizu sa imenom ’’options“ (opcije). Ako je upotrebljena kontrolna promjenljiva ona ne treba da bude član niza. Pošto cijeli broj „300“ nije u određenom opsegu, rezultat prethodno navedenog koda će biti: ’’Integer is not valid“ (Cijeli broj nije validan). Potpuna lista funkcija i filtera se može naći u PHP Filter Reference. Potrebno je provjeriti svaki filter kako bi se analizirale sve dostupne opcije i kontrolne promjenljive. 9.5 Ispitivanje ispravnosti ulaznih podataka Provjeravaju se podaci koji se prosljeđuju preko ulazne forme odnosno obrasca. Prvo je potrebno utvrditi da li postoje ulazni podaci koje tražimo. Zatim se vrši filtriranje unesenih podataka korišćenjem filter_input() funkcije. U dolje navedenom primjeru ulazna promjenljiva „email“ je poslata na PHP stranicu: <?php if(!filter_has_var(INPUT_GET, "email")) { echo("Input type does not exist"); } else { if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL)) { echo "E-Mail is not valid"; } else { echo "E-Mail is valid"; } } ?>

Objašnjenje primjera: U prethodno navedenom primjeru ulazna promjenljivu email je poslata na PHP stranicu uz pomoć ’’GET“ metode:

1. Provjeriti da li postoji ulazna promjenljiva ’’email“ tipa „GET“, 2. Ako ulazna promjenljiva postoji, provjeriti da li je ispravna e-mail adresa.

9.6 Ispravka ulaznih promjenljivih Pokušaćemo da ispravimo vrijednost za promjenljivu URL koja je poslata iz datog obrasca. Prvo je potrebno utvrditi da li postoje ulazni podaci koje tražimo. Zatim se ispravljaju uneseni podaci koristeći za to funkciju filter_input().

Page 37: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

37

U dolje navedenom primjeru, ulazna promjenljiva „url“ je poslata na PHP stranicu: <?php if(!filter_has_var(INPUT_POST, "url")) { echo("Input type does not exist"); } else { $url = filter_input(INPUT_POST, "url", FILTER_SANITIZE_URL); } ?>

Objašnjenje primjera: U gore navedenom primjeru ulazna promjenljiva „url“ je poslata uz pomoć “POST” metode:

1. Provjeriti da li postoji “url” ulazna promjenljiva tipa “POST”, 2. Ako ulazna promjenljiva postoji, onda je možemo korigovati eliminisanjem

nevažećih karaktera i na kraju je pohranjujemo u $url promjenljivu. Ako je ulazna promjenljiva string poput sljedećeg, http://www.W3ååSchøøools.com/, $url promjenljiva će nakon sprovedenih korekcija izgledati kao: http://www.W3Schools.com/

9.7 Filtriranje višestrukih ulaznih podataka Ulazna forma se skoro uvijek ima više od jednog polja za unos podataka. Da bi se izbjeglo stalno korišćenje filter_var() ili filter_input() funkcija, mogu se umjesto njih koristiti sledeće funkcije: filter_var_array() ili filter_input_array(). U sljedećem primjeru koristi se filter_input_array() funkcija da bi se filtrirale tri GET promjenljive: name, age i e-mail adresa: <?php $filters = array ( "name" => array ( "filter"=>FILTER_SANITIZE_STRING ), "age" => array ( "filter"=>FILTER_VALIDATE_INT, "options"=>array ( "min_range"=>1, "max_range"=>120 )

Page 38: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

38

), "email"=> FILTER_VALIDATE_EMAIL, ); $result = filter_input_array(INPUT_GET, $filters); if (!$result["age"]) { echo("Age must be a number between 1 and 120.<br />"); } elseif(!$result["email"]) { echo("E-Mail is not valid.<br />"); } else { echo("User input is valid"); } ?>

Objašnjenje primjera: Prethodno navedeni primjer sadrži tri ulazne promjenljive (name, age i email) koje su poslate na PHP stranicu uz pomoć “GET” metode. Potrebno je:

1. Odrediti niz koji sadrži imena ulaznih promjenljivih i filtere koji su upotrebljeni za određene ulazne promjenljive,

2. Pozvati funkciju filter_input_array() sa GET ulaznim promjenjivima i nizom koji smo upravo odredili,

3. Provjeriti “age” i “email” promjenljive u $result promjenljivoj za nevažeće ulazne promjenljive. (Ako bilo koja od ulaznih promjenljivih nije tačna ta ulazna promjenljiva će biti FALSE (pogrešna) nakon korišćenja filter_input_array() funkcije).

Drugi parametar filter_input_array() funkcije može biti niz ili pojedinačni filter ID. Ako je parametar pojedinačni ID filter sve vrijednosti u ulaznom nizu se filtriraju posebnim filterom. Ako je parametar neki niz onda se moraju poštovati sledeća pravila:

Dati niz mora biti asocijativni niz koji sadrži neku ulaznu promjenljivu kao kao ključ niza (array key) (kao npr. “age” ulazna promjenljiva),

Vrijednost niza mora biti filter ID ili niz koji određuje filter, kontrolne promjenljive i opcije.

9.8 Korišćenje Callback filtera Moguće je pozvati neku određenu korisničku funkciju i iskoristiti je kao filter koristeći FILTER_CALLBACK filter. Na ovaj način se postiže puna kontrola filtriranja podataka. Može se kreirati i sopstvena korisnička funkcija ili se koristiti postojeća PHP funkcija. Funkcija koja se želi koristiti kao filter je određena na isti način kao što je to određena i neka opcija, u datom asocijativnom nizu koji se zove “names”. U dolje navedenom primjeru koristi se funkcija koju je napravio korisnik da bi se izvršilo pretvaranje karaktera “_” u prazna polja: <?php

Page 39: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

39

function convertSpace($string) { return str_replace("_", " ", $string); } $string = "Peter_is_a_great_guy!"; echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace")); ?>

Rezultat gore navedenog koda bi trebalo da izgleda kao: Peter is a great guy!

Objašnjenje primjera: U gore navedenom primjeru je karakter “_” pretvoren u prazna polja:

1. Kreirati funkciju koja bi zamijenila karakter “_” u prazna polja 2. Pozvati filter_var() funkciju sa FILTER_CALLBACK filterom i nizom koji sadrži datu

funkciju.

Page 40: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

40

10. RAD SA MySQL bazom podataka MySQL je najpopularniji open-source sistem za upravljanje bazama podataka. Podaci u MySQL se pohranjuju u objekte baze podataka koji se nazivaju tabele. Tabela predstavlja skup unijetih povezanih podataka i sastoji se od kolona i redova. Baze podataka su korisne za pohranjivanje informacija po kategorijama. Neko preduzeće može imati bazu podataka koja će sadržati sledeće tabele: “Employees” (zaposleni), “Products” (proizvodi), “Customers” (potrošači) i “Orders” (narudžbine). 10.1 Tabele baze podataka Baza podataka najčešće sadrži jednu ili više tabela. Svaka tabela se identifikuje po imenu (npr. “Customers” ili “Orders”). Tabele sadrže zapise (redovi) sa podacima. U narednom primjeru dat je primjer tabele koja se zove “Persons” (lica): LastName FirstName Address City Hansen Ola Timoteivn 10 Sandnes Svendson Tove Borgvn 23 Sandnes Pettersen Kari Storgt 20 Stavanger

U gore navedenoj tabeli se nalaze tri zapisa (za svaku osobu posebno) i četiri kolone sa podacima (LastName (prezime), FirstName (ime), Address (adresa), i City (grad)). 10.2 Upiti Upit je zahtijev za potraživanje informacija iz baze podataka. Pomoću MySQL upita upućenog bazi podataka se mogu se potraživati i dobiti određene povratne informacije u vidu zapisa (recordset). Pogledajmo naredni upit: SELECT LastName FROM Persons

U gore navedenom upitu se potražuju svi podaci u koloni “LastName” iz tabele “Persons”, nakon čega se dobija sledeća povratna informacija: LastName Hansen

Svendson Pettersen

10.3 Preuzimanje (Download) baze podataka MySQL Ukoliko nemate PHP server sa MySQL bazom podataka, MySQL možete skinuti sa sledeće adrese: http://www.mysql.com/downloads/index.html

Page 41: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

41

10.4 Podaci o bazi podataka MySQL Dobra osobina MySQL-a je ta što se može iskoristiti da podrži već postojeće aplikacije baza podataka. Možda upravo zbog toga mnogi misle da MySQL jedino može upravljati malim i srednjim sistemima. MySQL predstavlja de facto standardnu bazu podataka za web sites koji podržavaju ogroman broj kako podataka tako i korisnika (poput Friendster, Yahoo, Google). Pogledajte spisak kompanija koje koriste MySQL na: http://www.mysql.com/customers.

Page 42: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

42

11. PRISTUP BAZI PODATAKA POMOĆU PHP-a 11.1 Uspostavljanje konekcije sa MySQL bazom podataka MySQL baza podataka se veoma često koristi sa PHP-om. Prije nego što se pristupi podacima u bazi podataka, potrebno je uspostaviti konekciju sa bazom podataka. U PHP-u se konekcija na MySQL bazu podataka uspostavlja pomoću mysql_connect() funkcije. Sintaksa mysql_connect(servername,username,password);

Parameter Description servername Optional. Specifies the server to connect to. Default value is "localhost:3306" username Optional. Specifies the username to log in with. Default value is the name of the user

that owns the server process password Optional. Specifies the password to log in with. Default is ""

Napomena: Postoji više dostupnih parametara, ali oni koji su gore navedeni su najvažniji. Više podataka se može pronaći u PHP MySQL Reference. Primjer U narednom primjeru ćemo pohraniti konekciju u promjenljivu ($con) radi kasnije upotrebe u programu. Dio “die” će se izvršiti ukoliko konekcija ne uspije: <?php $con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Could not connect: ' . mysql_error()); } // some code ?>

11.2 Zatvaranje konekcije Konekcija će biti automatski zatvorena po završetku rada programa. Da bi se konekcija zatvorila koristi se mysql_close() funkcija: <?php $con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Could not connect: ' . mysql_error()); } // some code mysql_close($con); ?>

Page 43: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

43

PHP MySQL kreiranje baze podataka i tabela Baza podataka sadrži jednu ili više tabela. 11.3 Pravljenje baze podataka Iskaz CREATE DATABASE (napravi bazu podataka) se koristi za definisanje baze podataka u MySQL. Sintaksa CREATE DATABASE database_name

Više o SQL-u se može naći u SQL tutorial-u. Da bismo izvršili ovaj iskaz uz pomoć PHP moramo koristiti mysql_querry() funkciju. Ova funkcija se koristi za slanje upita ili komande bazi podataka putem MySQL konekcije. Primjer U narednom primjeru pravimo bazu podataka pod nazivom “my_db”: <?php $con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Could not connect: ' . mysql_error()); } if (mysql_query("CREATE DATABASE my_db",$con)) { echo "Database created"; } else { echo "Error creating database: " . mysql_error(); } mysql_close($con); ?>

11.4 Definisanje tabele Iskaz CREATE TABLE (napravi tabelu) se koristi za definisanje tabele u MySQL-u. Sintaksa CREATE TABLE table_name ( column_name1 data_type, column_name2 data_type, column_name3 data_type, .... )

Page 44: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

44

Potrebno je dodati iskaz CREATE TABLE funkciji mysql_query() da bi se izvršila komanda. Primjer U narednom primjeru napravićemo tabelu pod nazivom “Persons” sa tri kolone. Imena kolona će biti “FirstName”, “LastName” i “Age”: <?php $con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Could not connect: ' . mysql_error()); } // Create database if (mysql_query("CREATE DATABASE my_db",$con)) { echo "Database created"; } else { echo "Error creating database: " . mysql_error(); } // Create table mysql_select_db("my_db", $con); $sql = "CREATE TABLE Persons ( FirstName varchar(15), LastName varchar(15), Age int )"; // Execute query mysql_query($sql,$con); mysql_close($con); ?>

Važno: Baza podataka mora biti izabrana prije nego što se tabela definiše. Baza podataka se selektuje uz pomoć mysql_select_db() funkcije. Napomena: Kada se u bazi podataka definiše polje tipa varchar, mora se odrediti maksimalna dužina polja, npr. varchar(15). Tip podataka određuje koju vrstu podataka neka kolona može sadržavati. Potpune informacije o svim tipovima podataka koji su dostupni u MySQL-u mogu se naći u Data Types reference. 11.5 Primarni ključevi i Auto Increment polja Svaka tabela treba da ima polje koje se zove primarni ključ. Primarni ključ se koristi isključivo za identifikaciju redova u tabeli. Vrijednost svakog primarnog ključa mora biti jedinstvena u tabeli. Osim toga, polje primarnog ključa ne može biti null zbog toga što sistem za upravljenje bazom podataka zahtijeva neku vrijednost za primarni ključ da bi se locirao zapis u bazi.

Page 45: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

45

U narednom primjeru postavlja se person ID polje kao polje primarnog ključa. Polje primarnog ključa je često neki ID broj sa AUTO_INCREMENT podešavanjem. AUTO_INCREMENT automatski povećava vrijednost polja ID za 1 (jedan) svaki put kada se doda novi podatak. Da bismo bili sigurni da polje primarnog ključa ne može biti null moramo dodati NOT NULL podešavanje za to polje. Primjer $sql = "CREATE TABLE Persons ( personID int NOT NULL AUTO_INCREMENT, PRIMARY KEY(personID), FirstName varchar(15), LastName varchar(15), Age int )"; mysql_query($sql,$con);

PHP MySQL Insert Into komanda 11.6 Unošenje podataka u tabelu baze podataka Komanda INSERT INTO se koristi za dodavanje novih zapisa u tabelu baze podataka. Sintaksa Komandu INSERT INTO je moguće napisati u dva oblika. Prvi oblik ne određuje imena kolona gdje će podaci biti uneseni, već samo njihovu vrijednost: INSERT INTO table_name VALUES (value1, value2, value3,...)

Drugi oblik određuje imena i kolona i vrijednosti koje će biti unesene: INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)

Da bi se uz pomoć PHP-a izvršili gore navedeni iskazi potrebno je koristiti mysql_query() funkciju. Ova funkcija se koristi za slanje upita ili komande bazi podataka putem MySQL konekcije. Primjer U prethodnom poglavlju napravili smo tabelu pod imenom “Persons” sa tri kolone; “Firstname”, “Lastname” i “Age”. U narednom primjeru ćemo koristiti istu tabelu. Osim toga u tabelu “Persons” ćemo dodati još dva podatka:

Page 46: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

46

<?php $con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("my_db", $con); mysql_query("INSERT INTO Persons (FirstName, LastName, Age) VALUES ('Peter', 'Griffin', '35')"); mysql_query("INSERT INTO Persons (FirstName, LastName, Age) VALUES ('Glenn', 'Quagmire', '33')"); mysql_close($con); ?>

11.7 Unošenje podataka iz forme u bazu podataka Napravićemo HTML obrazac koji bi se mogao iskoristiti za dodavanje novih zapisa u tabelu “Persons”. HTML obrazac: <html> <body> <form action="insert.php" method="post"> Firstname: <input type="text" name="firstname" /> Lastname: <input type="text" name="lastname" /> Age: <input type="text" name="age" /> <input type="submit" /> </form> </body> </html>

Kada korisnik klikne mišom na submit dugme u HTML obrascu, kao u gore navedenom primjeru, obrazac podataka se šalje u “insert-php”. “insert.php” fajl se konektuje na bazu podataka i uzima vrijednosti iz forme uz pomoć PHP $_POST promjenljivih. Zatim, mysql_query() funkcija izvršava iskaz INSERT INTO i nakon toga će biti dodat novi podatak u tabelu “Persons”. “insert.php” stranica: <?php $con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("my_db", $con); $sql="INSERT INTO Persons (FirstName, LastName, Age) VALUES ('$_POST[firstname]','$_POST[lastname]','$_POST[age]')"; if (!mysql_query($sql,$con)) { die('Error: ' . mysql_error()); } echo "1 record added"; mysql_close($con) ?>

Page 47: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

47

PHP MySQL Select komanda 11.8 Odabiranje podataka iz tabele baze podataka Naredba SELECT se koristi za odabiranje podataka iz baze. Sintaksa SELECT column_name(s) FROM table_name

MySQL komande se mogu izvršiti pomoću PHP-a korišćenjem funkcije mysql_query(). Ova funkcija se koristi za slanje upita ili komandi bazi podataka putem MySQL konekcije. Primjer U narednom primjeru odabiraju se svi podaci koji su pohranjeni u tabeli “Persons” (Oznakom * se odabiraju svi podaci u tabeli): <?php $con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("my_db", $con); $result = mysql_query("SELECT * FROM Persons"); while($row = mysql_fetch_array($result)) { echo $row['FirstName'] . " " . $row['LastName']; echo "<br />"; } mysql_close($con); ?>

U prethodnom primjeru je pokazano kako se čuvaju podaci koje vraća funkcija mysql_query() u $result promjenljivu. Funkcija mysql_fetch_array() se koristi da bi se preuzeo prvi red iz recordset-a (skupa zapisa) kao niz (array). Svaki poziv mysql_fetch_array() funkcije vraća naredni red u recordset-u. While petlja prolazi kroz sve zapise u recordset-u. Vrijednost svakog reda se prikazuje pomoću PHP $row promjenljive ($row[’FirstName’] i $row[’LastName’]). Rezultat gore navedenog koda će biti: Peter Griffin Glenn Quagmire

Page 48: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

48

11.9 Prikazivanje rezultata u HTML tabeli U narednom primjeru se vrši odabiranje podataka, kao u prethodnom primjeru, ali će podaci biti prikazani u HTML tabeli: <?php $con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("my_db", $con); $result = mysql_query("SELECT * FROM Persons"); echo "<table border='1'> <tr> <th>Firstname</th> <th>Lastname</th> </tr>"; while($row = mysql_fetch_array($result)) { echo "<tr>"; echo "<td>" . $row['FirstName'] . "</td>"; echo "<td>" . $row['LastName'] . "</td>"; echo "</tr>"; } echo "</table>"; mysql_close($con); ?>

Rezultat gore prikazanog koda će biti: Firstname Lastname

Glenn Quagmire

Peter Griffin

11.10 PHP MySQL “Where” uslov WHERE uslov WHERE uslov se koristi za prikazivanje samo onih podataka koji ispunjavaju određene kriterijume. Sintaksa SELECT column_name(s) FROM table_name WHERE column_name operator value

Page 49: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

49

Da bismo uz pomoć PHP-a izvršili gore navedeni iskaz potrebno je koristiti mysql_query() funkciju. Ova funkcija se koristi za slanje upita ili komande bazi podataka putem MySQL konekcije. Primjer U sledećem primjeru se vrši odabiranje svih zapisa iz tabele “Persons” gdje je “FirstName=’Peter’: <?php $con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("my_db", $con); $result = mysql_query("SELECT * FROM Persons WHERE FirstName='Peter'"); while($row = mysql_fetch_array($result)) { echo $row['FirstName'] . " " . $row['LastName']; echo "<br />"; } ?>

Rezultat gore navedenog koda će biti: Peter Griffin

11.11 PHP MySQL „Order By“ ključna riječ ORDER BY ključna riječ ORDER BY ključna riječ se korsti za sortiranje podataka u recordset-u (skupu zapisa). ORDER BY ključna riječ sortira zapise u rastućem poretku po definiciji. Ako se zapisi žele sortirati u opadajućem poretku može se koristiti ključna riječ DESC. Sintaksa SELECT column_name(s) FROM table_name ORDER BY column_name(s) ASC|DESC

Primjer U narednom primjeru vrši se odabiranje svih podataka pohranjenih u tabeli „Persons“ i sortiraju se rezultati po koloni „Age“: <?php $con = mysql_connect("localhost","peter","abc123");

Page 50: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

50

if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("my_db", $con); $result = mysql_query("SELECT * FROM Persons ORDER BY age"); while($row = mysql_fetch_array($result)) { echo $row['FirstName']; echo " " . $row['LastName']; echo " " . $row['Age']; echo "<br />"; } mysql_close($con); ?>

Rezultat gore navedenog koda će biti: Glenn Quagmire 33 Peter Griffin 35

Uređivanje zapisa po dvjema kolonama (Order by Two Colums) Takođe je moguće izvršiti sortiranje po više kolona. Kada se sortiranje vrši po više kolona, npr. po dvijema kolonama, druga kolona se jedino koristi za sortiranje ako su vrijednosti u prvoj koloni jednake: SELECT column_name(s) FROM table_name ORDER BY column1, column2

11.12 PHP MySQL Update komanda Ažuriranje (update) podataka u bazi podataka Komanda UPDATE se koristi za ažuriranje postojećih zapisa u tabeli. Sintaksa UPDATE table_name SET column1=value, column2=value2,... WHERE some_column=some_value

Napomena: Uočimo WHERE uslov u UPDATE sintaksi. WHERE uslov određuje koji bi podatak ili podaci trebalo biti ažurirani. Ukoliko se izostavi WHERE uslov, biće ažurirani svi podaci!

Page 51: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

51

Da bismo uz pomoć PHP izvršili gore navedeni iskaz moramo koristiti mysql_query() funkciju. Ova funkcija se koristi za slanje upita ili komande bazi podataka putem MySQL konekcije. Primjer Ranije smo kreirali tabelu pod imenom „Persons“: FirstName LastName Age Peter Griffin 35

Glenn Quagmire 33

U narednom primjeru se ažuriraju određeni podaci u tabeli ’’Persons“: <?php $con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("my_db", $con); mysql_query("UPDATE Persons SET Age = '36' WHERE FirstName = 'Peter' AND LastName = 'Griffin'"); mysql_close($con); ?>

Nakon ažuriranja, tabela ’’Persons’’ će izgledati kao: FirstName LastName Age Peter Griffin 36 Glenn Quagmire 33

11.13 PHP MySQL Delete komanda Brisanje podataka iz tabele Komanda DELETE FROM se koristi za brisanje podataka iz baze podataka. Sintaksa DELETE FROM table_name WHERE some_column = some_value

Page 52: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

52

Napomena: Uočimo WHERE uslov u DELETE sintaksi. WHERE uslov određuje koji bi podatak ili podaci trebalo biti izbrisani. Ukoliko se izostavi WHERE uslov, biće izbrisani svi podaci! Da bismo uz pomoć PHP izvršili gore navedeni iskaz moramo koristiti mysql_query() funkciju. Ova funkcija se koristi za slanje upita ili komande bazi podataka putem MySQL konekcije. Primjer Pogledajmo narednu tabelu ’’Persons’’: FirstName LastName Age Peter Griffin 35 Glenn Quagmire 33

U narednom primjeru biće izbrisani svi podaci u tabeli ’’Persons’’ koji sadrže LastName=’Grifin’: <?php $con = mysql_connect("localhost","peter","abc123"); if (!$con) { die('Could not connect: ' . mysql_error()); } mysql_select_db("my_db", $con); mysql_query("DELETE FROM Persons WHERE LastName='Griffin'"); mysql_close($con); ?>

Nakon brisanja tabela će ovako izgledati: FirstName LastName Age Glenn Quagmire 33

Page 53: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

53

12. PHP ODBC API 12.1 Definisanje ODBC konekcije ODBC je Application Programming Interface (API) koji omogućava povezivanje sa bazom podataka (npr. MS Access database). Sa ODBC konekcijom se može izvršiti povezivanje na bilo koju bazu podataka na bilo kom računaru u mreži sve dotle do kada je ODBC konekcija aktivna. ODBC konekcija na MS Assess Database se može definisati na sljedeći način:

1. Kliknite na ikonicu Administrative Tools u Control panel-u. 2. Duplim klikom kliknite ikonicu Data Sources (ODBC). 3. Odaberite System DSN. 4. Kliknite Add u System DSN. 5. Odaberite Microsoft Access Driver. Kliknite Finish. 6. Dalje kliknite Select da biste locirali bazu podataka. 7. Bazi podataka dajte Data Source Name (DSN) (Ime izvora podataka) 8. Kliknite OK.

NAPOMENA: Ova konfiguracija se mora uraditi na računaru gdje je web site i lociran. Ukoliko ste pokrenuli Internet Information Server (IIS) na vašem računaru, gore navedene instrukcije će funkcionisati, ali ako je web site lociran na udaljenom serveru onda morate obezbijediti fizički pristup tom serveru ili tražiti od vašeg web provajdera da za vas uspostavi DSN. 12.2 Povezivanje na dati ODBC odbc_connect() funkcija se koristi za povezivanje na dati ODBC. Funkcija ima četiri parametra: data source name (ime izvora podataka), username (korisničko ime, password (lozinku) i optional cursor type (opcioni tip kursora). Primjer U narednom primjeru uspostavlja se konekcija sa DSN-om pod nazivom northwind, bez parametara username i password. Zatim se definiše i izvršava SQL upit: $conn=odbc_connect('northwind','',''); $sql="SELECT * FROM customers"; $rs=odbc_exec($conn,$sql);

12.3 Promjena podataka odbc_fetch_row() funkcija se koristi za vraćanje podataka iz result-set-a. Ova funkcija vraća vrijednost tačno (true) ukoliko može da vrati zapise iz baze podataka, u suprotnom vraća vrijednost pogrešno (false).

Page 54: 76439266 PHP Za Pocetnike

http://www.w3schools.com/php/ 

54

Funkcija ima dva parametra: ODBC result identifier i optional row number: odbc_fetch_row($rs)

12.4 Promjena polja iz registra Odbc_result funkcija se koristi za čitanje polja iz zapisa. Ova funkcija ima dva parametra: ODBC result identifier i field number ili name. Sljedeći kod vraća vrijednost polja prvog polja u zapisu: $compname=odbc_result($rs,1);

Sljedeći kod vraća vrijednost polja pod nazivom ’’CompanyName’’: $compname=odbc_result($rs,"CompanyName");

12.5 Zatvaranje ODBC konekcije Odbc_close funkcija se koristi za zatvaranje ODBC konekcije. odbc_close($conn);

Primjer za ODBC Naredni primjer pokazuje kako prvo da napravimo konekciju sa bazom podataka, zatim result-set, kao i kako se prikazuju podaci u HTML tabeli. <html> <body> <?php $conn=odbc_connect('northwind','',''); if (!$conn) {exit("Connection Failed: " . $conn);} $sql="SELECT * FROM customers"; $rs=odbc_exec($conn,$sql); if (!$rs) {exit("Error in SQL");} echo "<table><tr>"; echo "<th>Companyname</th>"; echo "<th>Contactname</th></tr>"; while (odbc_fetch_row($rs)) { $compname=odbc_result($rs,"CompanyName"); $conname=odbc_result($rs,"ContactName"); echo "<tr><td>$compname</td>"; echo "<td>$conname</td></tr>"; } odbc_close($conn); echo "</table>"; ?> </body> </html>