primena tcp/ip tehnologija u namenskim...
TRANSCRIPT
UNIVERZITET U BEOGRADU
ELEKTROTEHNIČKI FAKULTET
KATEDRA ZA ELEKTRONIKU
Primena TCP/IP tehnologija
u namenskim sistemima
3. PHP
prof. dr Milan Ponjavić Haris Turkmanović
Školska 2019/20
Primena TCP/IP tehnologija u namenskim sistemima
2
3.1. Uvod
Da bi svrha upotrebe PHP jezika bila jasnija, neophodno je dobro razumeti komunikaciju koja
se odvija između klijenta i server i način funkcionisanja servera. Takođe, neophodno je razumeti
šta zapravo predstavlja svaka od ovih strana i kako izgledaju poruke koje se razmenjuju između
ove dve strane. Ova komunikacija je delom objašnjena na jednom od prethodnih časova, ali zbog
važnosti i boljeg sagledavanja stvari, u uvodnom delu ove laboratorijske vežbe data je mala
teorijska osnova koja čitaocu treba bolje da približi način na koji se ova komunikacija odvija.
Klijenta u komunikaciji predstavlja uređaj na kom se nalazi softver koji pruža mogućnost
iniciranja komunikacije. Pod iniciranjem komunikacije podrazumeva se slanje zahteva serveru.
Zahtev može biti u cilju dobavljanja podataka sa servera ili prenosa podataka na server. Klijenta,
u komunikaciji putem internet mreže, predstavlja Web Browser.
Server u komunikaciji predstavlja uređaj (računar, mikrokontroler, …) koji poseduje softver
ili hardver koji implementiraju odgovarajuću funkcionalnost. Ta funkcionalnost predstavlja
mogućnost uređaja da odgovori na zahtev klijenta. Ukoliko je zahtev klijenta da mu se proslede
odgovarajući podaci, server treba da pošalje te podatke klijentu. Ukoliko je primljeni zahtev takav
da klijent želi serveru da pošalje podatke, server treba da primi te podatke i skladišti ih u svoju
memoriju. Jedan od najčešće korišćenih web servera jeste Apache.
Poruke između servera i klijenta razmenjuju se posredstvom HTTP protokola. Postoje dva tipa
ovih poruka a to su HTTP Request (Zahtev) i HTTP Response (Odgovor). Na sistemu sa slike 3.1.1
, koji predstavlja jedan klasičan internet sistem, biće objašnjeno komuniciranje između klijenta i
servera.
3.1.1 - Komunikacija između klijenta i servera
1. Klijent šalje HTTP request serveru. Ova poruka ima sledeću sadržinu
Apache
Web Server
PhP Interpreter
Files
1
2
3
4
5
Primena TCP/IP tehnologija u namenskim sistemima
3
Method Path Version of the protocol
Headers
- Method – Rezervisane reči koje definišu koji tip akcije klijent želi da
sprovede. Najčešće je to reč GET koja označava da klijent želi da dobavi fajl
sa servera ili reč POST koja označava da klijent šalje server neke podatke
prikupljene posredstvom HTML forme
- Path – Putanja do resursa na serveru
- Version of the protocol – Verzija protokola
- Headers – Dodatne informacije
2. Server prima zahtev i shodno sadržini primljene poruke sprovodi odgovarajuću akciju.
3. Ukoliko server primi poruku sa zahtevom za dobavljanjem neke HTML stranice ili
nekog drugog fajla, vrši se potraga te stranice ili fajla na disku koji se nalazi na serveru,
i ukoliko zahtevani resurs postoji, vraća se klijentu.
4. Ukoliko je server dobio zahtev za pokretanje PHP skripte, skripta se traži na serveru i
ukoliko skripta postoji na serveru, poziva se odgovarajući PHP interpreter koji tumaći
kod PHP skripte i kao rezultat izvršavanja te skripte vraćaju se podaci klijentu
5. Svi podaci koji se vraćaju klijentu, kao rezultat neke akcije na serveru, “zapakovani”
su u HTTP Response poruku koja ima sledeću strukturu
- Status code – Broj koji označava da li je zahtev uspešno obrađen.
- Status text – Detaljnije objašnjenje status code-a
- Version of the protocol – Verzija protokola
- Headers – Dodatne informacije
Na osnovu prethodno izloženog scenarija, koji ilustruje tok poruka od klijenta ka serveru i
korake koje server sprovodi u cilju odgovaranja na zahtev klijenta, možemo uvideti svrhu
korišćenja PHP skripti.
3.1.1. PHP
PHP ( Hypertext Preprocessor ) je skriptni jezik koji se izvršava na strani servera. Skripte
pisane na ovom jeziku se izvršavaju na zahtev klijenta a za njihovo tumačenje koristi se
odgovarajući PHP interpreter. Dakle, ove skripte se ne prevode na mašinski jezik, već se direktno
tumače. Da bi tumačenje ovih skripti bilo moguće, neophodno je da na serveru postoji instaliran
Version of the protocol Status code Status text
Headers
Primena TCP/IP tehnologija u namenskim sistemima
4
PHP interpreter. PHP omogućava pravljenje dinamičkih Web Sajtova i obradu podataka koji se
nalaze na serveru. PHP skripte imaju ekstenziju .php
3.1.2. Konfiguracija servera na host računaru
Da bi korišćenje PHP skripti bilo moguće neophodno je pokrenuti web server. U primerima
koji slede, serverska strana je implementirana na našem računaru a to je moguće zahvaljujući loop-
back ip adresi (127.0.0.1). Sa linka je neophodno preuzeti softver Wamp koji pokreće web server
na našem računaru. Nakon preuzimanja softvera neophodno je izvršiti instalaciju softvera na
računar. Ukoliko putanje tokom instalacije nisu menjane, na disku c nalazi se folder wamp64. U
ovom folderu se nalazi folder www u kome je neophodno skladištiti sve fajlove neophodne za
realizaciju web sajta. Nakon instalacije neophodno je pokrenuti instalirani softver. Nakon
pokretanja softvera u donjem desnom uglu windows interfejsa pojavljuje se indikacija da je server
aktivan (ukoliko je ikonica crvena, a ne zelena, sačekati neko vreme dok ne postane zelena.)
Da bi potvrdi uspešnost instalacije Web servera na host računaru, neophodno je otvoriti web
browser i u navigacioni deo web browsera uneti adresu 127.0.0.1 nakon čega se dobija rezultat
prikazan na slici 3.1.3.
Web stranica sa slike 3.1.3 je rezultat postojanja fajlova u direktorijumu C:/Wamp64/www.
Neophodno je izbrisati sve fajlove iz ovog direktorijuma jer ćemo, kroz nastavak ovog časa, u taj
direktorijum smeštati fajlove koji su nam neophodni za realizaciju naših zadataka.
3.1.2 - Indikacija da je server uspešno pokrenut
3.1.3 - Potvrda da je server uspešno pokrenut
Primena TCP/IP tehnologija u namenskim sistemima
5
3.2. Primeri
Primeri koji slede imaju za cilj da demonstriraju način pisanja PHP skripti i mogućnosti koje
ovaj jezik pruža.
3.2.1. Obrada podataka na serveru
Potrebno je realizovati web sistem koji proverava da li se tačka nalazi u krugu.
Podrazumevano je da je centar kruga u koordinatnom početku. Od korisnika se traži da unese
prečnik kruga kao i koordinate tačke. Nakon unosa podataka, na serveru se vrši provera da li je
tačka u krugu i korisniku se ispisuje odgovarajuća poruka na novoj stranici u zavisnosti od
rezultata provere.
Rešenje:
Neophodno je napraviti HTML stranicu koja od korisnika prikuplja tražene podatke
(poluprencik, x i y koordinate tačke). Prikupljanje podataka se postiže pomoću HTML forme koja
za ovaj primer ima sledeću sadržinu:
Forma predstavlja HTML element koji se koristi za prikupljanje podataka od korisnika i
slanje prikupljenih podataka na server. Vrednost atributa action predstavlja putanju do skritpe koja
će se pozvati nakon što se proslede podaci. Slanje podataka na server moguće je pomoću više
različitih metoda ali kroz ovaj kurs obrađivaće se metoda POST. Ova metoda podrazumeva da se
podaci šalju na server u vidu uređenog para name/value i i da su na toj putanji do servera skriveni
od korisnika. Podaci koji se šalju serveru predstavljaju vrednosti (value) uzete od korisnika
pomoću elemenata input. Da bi se podaci poslali na server, neophodno je uraditi submit forme,
odnosno kliknuti na dugme koje realizuje posebnu funkciju a to je slanje podataka na server. Nakon
implementacije ove strukture na HTML stranici dobija se izgled kao na slici 3.2.1
<form action="check.php" method="post">
<p>Poluprečnik: <br>
<input type = "text" name="poluprecnik">
</p>
<p>X koordinata tačke:<br>
<input type = "text" name="xCoord">
</p>
<p>Y koordinata tačke:<br>
<input type = "text" name="yCoord">
</p>
<input type = "submit" value="Pošalji">
</form>
Primena TCP/IP tehnologija u namenskim sistemima
6
Nakon što unesemo podatke i kliknemo na dugme “Pošalji“ izvršiće se slanje unetih podataka
na server, a nakon toga će se pozvati skripta check.php. Sada je neophodno implementirati PHP
funkcionalnost ove skripte.
PHP kod se piše između dela označenog sa <?php ?>. Ovaj deo je moguće postaviti bilo
gde na HTML stranici ali, da bi izvršavanje ovog dela koda bilo moguće, neophodno je da
ekstenzija fajla bude .php. Da bi implementirali funkcionalnost provere, tj. da li je se tačka nalazi
u krugu, neophodno je unutar check.php skripte ubaciti sledeći kod:
Prikazani kod predstavlja sadržaj PHP skripte check.php. Iz prikazanog koda možemo
zaključiti sledeće:
- Promenljive se u PHP jeziku definišu tako što se ispred naziva promenljive stavi simbol $
- PHP ne razlikuje tipove promenljivih
- Globalna promenljiva _POST predstavlja asocijativni niz čiji su elementi vrednosti
dobijene pomoću input elemenata forme. Asocijativni niz se može indeksirati pomoću key
vrednosti koja je u našem slučaju vrednost atributa name iz HTML forme
- Svaka naredba u PHPu završava se sa ;
- U PHPu postoji if-else struktura kao u većini drugih programskih jezika
- Naredba echo služi za generisanje izlaza PHP skripte koji će se proslediti kiljentu.
<?php
$r = $_POST["poluprecnik"];
$x = $_POST["xCoord"];
$y = $_POST["yCoord"];
if( $x**2 + $y**2 < $r**2 ){
echo "<p> Tacka se nalazi u krugu <p>";
}
else{
echo "<p> <p> Tacka se ne nalazi u krugu <p> <p>";
}
?>
3.2.1 - Izgled stranice nakon implementacije forme
Primena TCP/IP tehnologija u namenskim sistemima
7
Dakle, navedena skripta najpre preuzme baferisane vrednosti koje su skladištene u globalnom
nizu _POST. Zatim implementira formulu koja provera traženi uslov i u zavisnosti od toga da li je
forma zadovoljena ili ne, klijentu se šalje odgovarajući sadržaj primenom naredbe echo.
Jedna od mana ove realizacije je u tome što se ne vrši provera validnosti unetih podataka već
se na server prosleđuju „sirovi“ podaci. Neophodno je pre slanja podataka na server, izvršiti
proveru validnosti podataka što se postiže pomoću JS koda. Dakle, neophodno je napraviti JS fajl
(chechForm.js) unutar koga će postojati funkcija koja će se pozivati nakon što se klikne na dugme
„Pošalji“. Ukoliko su podaci ispravni, izvršiće se slanje podataka na server dok je u suprotnom
potrebno obavestiti korisnika o tipu greše i resetovati polja forme. JS kod kojim se implementira
tražena funkcionalnost je sledeći:
Pre nego što krenemo u objašnjavanje principa na kome radi navedeni JS kod, neophodno je
modifikovati formu tako da se dobije kod u nastavku:
function CheckFormData(form){
if(form.elements.poluprecnik.value.length == 0) {
alert("Morate uneti podatke za poluprecnik");
return false;
}
if(isNaN(form.elements.poluprecnik.value)){
alert("Poluprecnik mora biti broj");
return false;
}
if(form.elements.xCoord.value.length == 0) {
alert("Morate uneti podatke za x koordinatu");
return false;
}
if(isNaN(form.elements.xCoord.value)){
alert("x koordinata mora biti broj");
return false;
}
if(form.elements.yCoord.value.length == 0) {
alert("Morate uneti podatke za x koordinatu");
return false;
}
if(isNaN(form.elements.yCoord.value)){
alert("x koordinata mora biti broj");
return false;
}
return true;
}
function Validate(){
Form = document.getElementById("Podaci");
if(CheckFormData(Form)){
Form.submit();
}
else{
Form.reset();
}
}
Primena TCP/IP tehnologija u namenskim sistemima
8
Navedena forma se od prethodne razlikuje po tome što je dodat atribut id na osnovu koda forma
postaje dostupna i iz JS koda. Takođe, izbačen je input tipa submit umesto koga je uveden input
tipa button koji omogućava implementaciju event-a onClick. Kada se desi ovaj event pozvaće se
funkcija validate koja u slučaju ispravno unetih podataka poziva metodu submit koja prosleđuje
podatke na server dok se u suprotnom forma resetuje.
Drugi pristup validaciji unetih podataka je pomoću event-a forme pod nazivom onSubmit. Ovaj
event se poziva kada se klikne na dugme submit a pre nego se pošalju podaci. Da bi bilo moguće
pozivanje funkcije usled ovog event-a neophodno je modifikovati formu i JS kod tako da se dobiju
sledeći kodovi:
<form action="check.php" method="post" id="Podaci">
<p>Poluprečnik: <br>
<input type = "text" name="poluprecnik">
</p>
<p>X koordinata tačke:<br>
<input type = "text" name="xCoord">
</p>
<p>Y koordinata tačke:<br>
<input type = "text" name="yCoord">
</p>
<input type = "button" onClick = "Validate()" value="Pošalji">
</form>
<form action="check.php" method="post" id="Podaci" onsubmit = "return
Validate();">
<p>Poluprečnik: <br>
<input type = "text" name="poluprecnik">
</p>
<p>X koordinata tačke:<br>
<input type = "text" name="xCoord">
</p>
<p>Y koordinata tačke:<br>
<input type = "text" name="yCoord">
</p>
<input type = "submit" value="Pošalji">
</form>
Primena TCP/IP tehnologija u namenskim sistemima
9
Iako postavkom zadatka nije traženo, iz stilskih razloga, bilo bi bolje da se rezultat provere, da
li se tačka nalazi na krugu ili ne, ispisuje na samoj stranici gde se od korisnika uzimaju podaci. Da
bi to bilo moguće neophodno je ceo sadržaj PHP skripte check.php iskopirati ispod forme na
HTML stranici i preimenovati index.html u index.php. Takođe, potrebno je vrednost atributa
action promeniti iz check.php u index.php
Ukoliko nakon navedenih modifikacija pokrenemo index.php stranicu, videćemo da se nakon
prvog pokretanja stranice javljaju obaveštenja koja govore da ne postoje indeksi niza _POST. Već
nakon prvog unošenja podataka u formu i slanja unetih podataka ova upozorenja nestaju jer sada
niz _POST ima vrednosti. Dakle, pre ispisa vrednosti, poželjna je provera da li u promenljivoj ima
neki sadržaj. To se postiže pomoću funkcije empty koja kao argument prima promenljivu a
function CheckFormData(form){
if(form.elements.poluprecnik.value.length == 0) {
alert("Morate uneti podatke za poluprecnik");
return false;
}
if(isNaN(form.elements.poluprecnik.value)){
alert("Poluprecnik mora biti broj");
return false;
}
if(form.elements.xCoord.value.length == 0) {
alert("Morate uneti podatke za x koordinatu");
return false;
}
if(isNaN(form.elements.xCoord.value)){
alert("x koordinata mora biti broj");
return false;
}
if(form.elements.yCoord.value.length == 0) {
alert("Morate uneti podatke za x koordinatu");
return false;
}
if(isNaN(form.elements.yCoord.value)){
alert("x koordinata mora biti broj");
return false;
}
return true;
}
function Validate(){
Form = document.getElementById("Podaci");
if(CheckFormData(Form)){
return true;
}
else{
return false;
}
}
Primena TCP/IP tehnologija u namenskim sistemima
10
povratna vrednost je true ili false u zavisnosti od toga da li promenljiva ima vrednost ili ne. Nakon
navedenih modifikacija index.php ima sledeći sadržaj:
<DOCTYPE !html>
<head>
<title> Tacka i krug</title>
<meta charset="UTF-8">
<script src="checkForm.js"></script>
</head>
<body>
<form action = "index.php" method="post" onsubmit = "return
Validate();">
<p>Poluprečnik: <br>
<input type = "text" name="poluprecnik">
</p>
<p>X koordinata tačke:<br>
<input type = "text" name="xCoord">
</p>
<p>Y koordinata tačke:<br>
<input type = "text" name="yCoord">
</p>
<input type = "submit" value="Pošalji">
</form>
<?php
if(!empty($_POST)){
$r = $_POST["poluprecnik"];
$x = $_POST["xCoord"];
$y = $_POST["yCoord"];
if( $x**2 + $y**2 < $r**2 ){
echo "<p> Tacka se nalazi u krugu <p>";
}
else{
echo "<p> <p> Tacka se ne nalazi u krugu <p> <p>";
}
}
?>
</body>
Primena TCP/IP tehnologija u namenskim sistemima
11
3.2.2. Upis i čitanje iz fajla
Potrebno je napraviti dve PHP stranice: Profesor. php i Student.php. Profesor.php stranica
omogućava dodavanje informacija na server koje se odnose na ostvareni rezultat studenta tokom
jednog semestra. Informacije se čuvaju u fajlu spisak.scv. Informacije koje profesor može da unese
su:
- Ime
- Prezime
- Broj indeksa
- Broj poena na prvom testu
- Broj poena na drugom testu
Nakon unošenja ovih informacija vrši se upisivanje informacija u fajl spisak.cvs. Pored
informacija koje je uneo profesor, u fajl se upisuje i ukupan broj poena koje je student ostvario
tokom semestra. Ukupan broj poena predstavlja zbir poena na prvom i drugom testu. Potrebno je
implementirati potvrdu validnosti unetih podataka, i tek ukoliko podaci imaju validan format, vrši
se njihovo slanje na server i upis u fajl. Takođe, kao rezultat validnosti unetih podataka, korisniku
ove stranice se ispisuje odgovarajuća poruka na stranici koja ga obaveštava o uspešnosti upisa.
Student.php stranica omogućava čitanje informacija sa servera. Informacije se čitaju iz fajla
spisak.csv. Nakon učitavanja stranice, student unosi broj indeksa, i ukoliko postoje informacije
za taj broj indeksa, studentu se ispisuje sledeći sadržaj:
- Ime
- Prezime
- Broj indeksa
- Poeni ostvareni na prvom testu
- Poeni ostvareni na drugom testu
- Ukupni poeni
Ukoliko na serveru ne postoje podaci za uneti broj indeksa, potrebno je korisnika obavestiti o
tome tako što se na stranici ispisuje odgovarajuća poruka.
Rešenje:
Cilj ovog primera je da demonstrira korišćenje fajlova na serveru. Najpre ćemo realizovati
Profesor.php stranicu koja demonstrira unos podataka u Excel fajl. Logički posmatrano, stranica
se sastoji iz dela za unos podataka i php dela koji ima zadatak da, ukoliko su podaci pristigli na
server, izvrši obradu tih podataka i upiše ih u fajl a korisnika obavesti o uspešnosti unosa. Deo
koda stranice, koji je zadužen za prikupljanje podataka od korisnika, dat je u obliku forme i
sadržina tog dela koda je:
Primena TCP/IP tehnologija u namenskim sistemima
12
Navedeni kod predstavlja već dobro poznati kod koji implementira funkcionalnost forme čiji
zadatak je da od korisnika prikupi podatke. Nakon što se podaci prikupe od korisnika, na serveru
se ponovo pokreće skripta Profesor.php ali se ovog puta izvršava php deo stranice koji je dat u
nastavku:
<form action = "Profesor.php" method="post" >
<p>Ime studenta: <br>
<input type = "text" name="Ime">
</p>
<p>Prezime studenta:<br>
<input type = "text" name="Prezime">
</p>
<p>Broj indeksa<br>
<input type = "text" name="BrIndeksa">
</p>
<p>Prvi test<br>
<input type = "text" name="Test1">
</p>
<p>Drugi test<br>
<input type = "text" name="Test2">
</p>
<input type = "submit" value="Pošalji">
</form>
<hr>
<?php
if(!empty($_POST)){
$filename = "spisak.csv";
$file_handle = fopen($filename,"a");
if($file_handle == false){
echo "<p> Problem sa otvaranjem fajla <p>";
}
else{
$Row = $_POST;
$Row["Ukupno"]= $Row["Test1"] + $Row["Test2"];
fputcsv($file_handle,$Row);
echo "Uspesno dodat student<br>";
echo $Row["Ime"];
echo " ";
echo $Row["Prezime"];
echo " ";
echo $Row["BrIndeksa"];
echo " ";
echo $Row["Test1"];
echo " ";
echo $Row["Test2"];
echo " ";
echo $Row["Ukupno"];
echo " ";
echo "<br>";
fclose($file_handle);
}
}
?>
Primena TCP/IP tehnologija u namenskim sistemima
13
Prvim if uslovom izvršena je provera da li su podaci pristigli na server. Ukoliko podaci
postoje na serveru, uslov će biti ispunjen i ulazi se u if granu. Promenljiva filename sadrži ime
fajla u koji će se upisivati studenti i njihovi rezultati. Nakon što definišemo ime fajla, neophodno
je otvoriti fajl u željenom režimu rada. Otvaranje fajla vrši se pomoću funkcije fopen koja kao
prvi argument prima naziv fajla a kao drugi argument prima mod u kome želimo da otvorimo
fajl. Neki od najčešćih modova dati su u tabeli:
Mod Opis moda
r Otvara fajl u modu čitanja i postavlja kursor na početak fajla
r+ Otvara fajl u modu čitanja i pisanja i postavlja kursor na početak fajla
w Otvara fajl u modu upisa i postavlja kursor na poečtak fajla. Ukoliko fajl
postoji, briše se njegov sadržaj a ukoliko fajl ne postoji, kreira se.
w+ Otvara fajl u modu upisa i čitanja i postavlja kursor na poečtak fajla. Ukoliko
fajl postoji, briše se njegov sadržaj a ukoliko fajl ne postoji, kreira se.
a Otvara fajl u modu upisa i postavlja kursor na kraj fajla. Ukoliko fajl ne
postoji, kreira se.
a+ Otvara fajl u modu upisa i čitanja i postavlja kursor na kraj fajla. Ukoliko
fajl ne postoji, kreira se.
U našem primeru, fajl se otvara u modu „a“ jer je potrebno svakog od studenata dodati na kraj
fajla a da se prethodno dodati studenti ne obrišu. Ukoliko otvaranje fajla ne uspe, funkcija fopen
vraća false dok se u suprotnom vraća pokazivač na fajl koji smeštamo u promenljivu file_handle.
Pre nego što izvršimo upisivanje podataka u fajl, neophodno ih je organizovati u jedan niz.
Zbog toga kreiramo pomoćni niz Row u koga kopiramo sadržaj niza _POST a nakon toga u niz
dodajemo element „Ukupno“ koji predstavlja zbir poena sa predhodna dva testa.
Pošto je ekstenzija fajla sa kojim radimo .csv, ovaj tip fajlova ima posebne funkcije za upis i
čitanje. Te funkcije su:
- fputcsv(FileHandle, ArrayToWrite)
Koristi se za upis niza u jedan red u Excel tabeli. Ceo niz će biti upisan u jedan red a
vrednosti elemenata niza biće upisane u susedne ćelije počev od prve ćelije sleva
- fgetcsv(FileHandle)
Koristi se za čitanje jednog reda podataka iz Excel tabele. Povratna vrednost ove funkcije
predstavlja niz čiji elementi imaju vrednosti iz Excel ćelija pročitanog reda.
Nakon što smo pripremili niz koji ćemo upisati u tabelu, pozivom funkcije fputcsv vršimo upis
spremljenog niza u spisak.csv fajl. Nakon toga, korisnika obaveštavamo o uspešnosti upisa
korišćenjem echo komandi koje generišu izlazne stringove koji se šalju do korisnika. Na kraju
zatvaramo fajl pozivom funkcije fclose kojoj, kao argument, prosleđujemo pokazivač na fajl.
Primena TCP/IP tehnologija u namenskim sistemima
14
Sada je neophodno kreirati stranicu Student.php koja treba da demonstrira način čitanja iz
fajlova i obradu pročitanih podataka. Deo koda stranice koji se odnosi na unos podataka je:
Nakon što korisnik unese broj indeksa neophodno je izvršiti pretragu da li za uneti broj indeksa
postoje podaci u fajlu spisak.csv. Provera podataka i čitanje podataka iz fajla vrši se u php delu
stranice koji ima sledeću sadržinu:
Nakon što smo uspešno otvorili fajl u modu čitanja, vrši se čitanje jednog po jednog reda iz
csv fajla. Pročitani podaci se smeštaju u niz Row. Čitanje redova se vrši sve dok funkcija fgetcsv
ne vrati false što označava da ne postoji više redova za čitanje.
<form action = "Student.php" method="post" >
<p>Broj indeksa <br>
<input type = "text" name="BrIndex">
</p>
<input type = "submit" value="Pošalji">
</form>
<hr>
if(!empty($_POST)){
$filename = "spisak.csv";
$file_handle = fopen($filename,"r");
$student_find = false;
if($file_handle == false){
echo "<p> Problem sa otvaranjem fajla <p>";
}
else{
$No = $_POST["BrIndex"];
while (($Row = fgetcsv($file_handle))!== false){
if(strcmp($Row[2],$No) == 0){
echo "Student<br><br>";
echo $Row[0];
echo " ";
echo $Row[1];
echo " ";
echo $Row[2];
echo " ";
echo $Row[3];
echo " ";
echo $Row[4];
echo " ";
echo $Row[5];
echo " ";
echo "<br>";
$student_find = true;
break;
}
}
if($student_find == false){
echo "Ne postoje podaci za studenta";
}
}
fclose($file_handle);
}
Primena TCP/IP tehnologija u namenskim sistemima
15
Nakon što pročitamo red iz csv fajla, i pročitani red smestimo u promenljivu Row, neophodno
je izvršiti proveru da li je drugi element niza, koji predstavlja broj indeksa, jednak unetoj vrednosti
broja indeksa. Ukoliko jeste, ispisuju se podaci za studenta dok se u suprotnom nastavlja
pretraživanje fajla. Ukoliko se pretraži ceo fajl, i ne pronađu se podaci za uneti broj indeksa, na
stranici se ispisuje odgovarajuća poruka.
(Potrebno je da studenti samostalno implementiraju proveru unetih podataka pre nego što se
pošalju na server)
3.2.3. Dinamika PHP stranica
Potrebno je realizovati web stranicu index.php koja omogućava pristup podacima na serveru
ukoliko korisnik unese ispravnu šifru i korisničko ime. Ova web stranica poziva sadržaj LogIn.php
stranice koja implementira unos korisničkog imena i passworda. Elementi koji služe za unos
podataka treba da budu centrirani na stranici i da se nalaze u pravougaoniku dimenzija 400px sa
400px. Boja pozadine ovog pravougaonika treba da bude siva dok veličina slova paragrafa, u
ovom pravougaoniku, treba da bude 18px.
Ukoliko korisnik unese ispravno korisničko ime i password, na stranici index.php, umesto dela
koji zahteva unos podataka, ispisuje se sadržaj stranice SucessfullLog.php. Sadržaj ove stranice
takođe treba da bude ispisan u pravougaoniku istih dimenzija i pozadine ali veličina slova treba
da bude 20px. Slova treba da budu boldovana i zelene boje dok ceo tekst treba da bude centriran.
Ukoliko korisničko ime i šifra nisu validni, na stranici index.php se umesto dela za unos
podataka ispisuje sadržaj stranice ErrorLog.php. Sadržaj ove stranice takođe treba da bude
ispisan u pravougaoniku istih dimenzija i pozadine ali veličina slova treba da bude 20px. Slova
treba da budu boldovana i crvene boje dok ceo tekst treba da bude centriran.
(Korisničko ime je admin i password je admin)
Rešenje:
Cilj ovog primera je da demonstrira dinamičko inkludovanje stranica u već postojeću .php
stranicu. Stranica index.php treba da implementira sledeću ideju:
Nakon učitavanja stranice u web browser otvara se stranica index.php koja u body delu HTML
koda inkluduje LogIn.php stranicu. Kao rezultat inkludovanja LogIn.php stranice dolazi do
ubacivanja koda iz LogIn.php stranice na mestu poziva komande include. Nakon slanja popunjene
forme iz LogIn.php, ponovo se poziva funkcija index.php koja sada treba da proveri da li su uneti
ispravni podaci. Ukoliko su uneti podaci ispravni, učitava se sadržaj stranice SucessfullLog.php
dok se u suprotnom učitava sadržaj stranice ErrorLog.php. index.php stranica ima sledeći kod:
Primena TCP/IP tehnologija u namenskim sistemima
16
Kao rezultat izvršavanja ovog dela koda dobijamo stranicu prikazanu na slici
<DOCTYPE !html>
<head>
<title> Pocetna</title>
<link rel="stylesheet" href="style1.css">
</head>
<body>
<div class="Container">
<?php
if(!empty($_POST)){
if(!empty($_POST["FormID"]))
{
if(strcmp($_POST["FormID"],"LogIn") == 0){
if(( strcmp($_POST["pass"],"admin") == 0 ) and
(strcmp($_POST["user"],"admin") == 0 )){
include "SucessfullLog.php";
}
else{
include "ErrorLog.php";
}
}
}
}
else{
include "login.php";
}
?>
</div>
</body>
Primena TCP/IP tehnologija u namenskim sistemima
17
Prvim if uslovom u php delu stranice proveravamo da li su podaci poslati na server. Ukoliko
nisu, to je znak da treba popuniti formu i u tom slučaju se učitava sadržaj stranice LogIn.php koji
je dat u nastavku:
Ukoliko su podaci poslati na server proveravamo sadržaj polja FormID koji daje jedinstvenu
oznaku forme. Ovaj podatak uveden je kao input element forme, ali njegova vrednost nije vidljiva
korisniku jer je hidden atribut ovog elementa postavljen na true. Ovaj element je uveden da bi se
na prijemnoj strani na jednoznačan način detektovalo koja forma je poslala podatke. Ovaj element
se mogao izbeći, ali zbog skalabilnosti sistema (mogućnosti dodavanja još formi u cilju proširenja
sistema) potrebno je imati mogućnost detektovanja forme koja je poslala podatke.
Ukoliko se poslati podaci podudaraju sa traženom šifrom i korisničkim imenom potrebno je
učitati sadržaj stranice SucessfullLog.php koji je dat u nastavku:
Ukoliko se poslati podaci ne podudaraju sa traženom šifrom i korisničkim imenom potrebno
je učitati sadržaj stranice ErrorLog.php koji je dat u nastavku:
Sadržaj style1.CSS fajla, koji implementira tražene stilske karakteristike stranice, dat je u
nastavku:
<div class = "LogIn">
<form action="index.php" method="post">
<input type="text" name="FormID" value="LogIn" hidden="true">
<p> Unesite korisnicko ime:
<input type="text" name="user">
</p>
<p> Unesite password:
<input type="password" name="pass">
</p>
<input type="submit" value="Login">
</form>
</div>
<div class = "UspesnoLogovanje">
<p>
Uspesno ste prijavljeni
</p>
</div>
<div class = "Greska">
<p>
Pogresna sifra ili korisnicko ime
</p>
</div>
Primena TCP/IP tehnologija u namenskim sistemima
18
.Container{
margin:auto;
width:400px;
height:400px;
background-color:gray;
padding: 10px;
}
.LogIn{
margin:auto;
}
.LogIn p{
font-size: 18px;
}
.UspesnoLogovanje{
color:green;
font-size:22px;
font-weight:bold;
text-align:center;
}
.Greska{
color:red;
font-size:22px;
font-weight:bold;
text-align:center;
}