Utisci korisnika

Veoma sam zahvalna na Vašem brzom odgovoru i želela bih da Vam se zahvalim na pažnji koju ste pokazali. Radica Nedelčev - Beograd

Želeo bih da Vam se zahvalim na Vašoj brzoj pošiljci, sertifikatu i novom kursu, koji sam juče preuzeo putem Post-expresa. Još jedanput Vam se zahvaljujem na Vašoj profesionalnosti.…


Kompletna lista utisaka

Testiranje online

Arhitektura računara

Za one koji žele da znaju više.

Windows OS

Ovo bi svakako trebalo da probate.

Odnosi s javnošću

Koliko znate PR?

Pogledajte još neke od testova

Newsletter

Ukoliko želite da Vas redovno obaveštavamo o novostima sa Link eLearning sajta prijavite se na našu newsletter listu.

Ime:

Prezime:

Email:


Anketa

Arhiva anketa

BAZA ZNANJA


Kurs: PHP programiranje

Modul: Ulaz i izlaz

Autor:

Naziv jedinice: Rad sa fajl sistemom


Materijali vezani uz ovu lekciju:

- Test rad sa fajl sistemom
- Rad sa fajl sistemom (PDF dokument)



Uključivanje fajlova

Korišćenje već napisanog koda je veoma korisna i česta opcija prilikom programiranja. Na primer, ukoliko web sajt sadrži meni koji se ponavlja na svakoj strani, tada je mnogo jednostavnije napisati kod jedanput, a zatim ga dinamički uključiti na strane na kojima treba da se pojavi, nego pisati kod u okviru svake strane. Ovo je moguće korišćenjem tzv. uključivanjem fajlova od strane servera.

Fajlovi koji se uključuju, obično sadrže XHTML ili PHP kod i snimaju se sa ekstenzijom .inc, iako mogu biti snimljeni i sa drugim ekstenzijama. Sadržaj ovakvih fajlova se kodira jedanput, a zatim poziva od strane strana na kojima je potreban. Ukoliko dođe do izmene na originalnom fajlu, one su vidljive na svim stranama na kojima se koristi.

Na primer, dešava se da sve strane jednog web sajta, na svom vrhu, treba da imaju isto zaglavlje. Neka je HTML kod zaglavlja:
<div style="border:ridge 1px;width:95%;background-color:#F0F0F0;padding:5px">
<h3>Dobro dosli na web sajt nase organizacije!</h3>
</div>

 

Ovaj kod je moguće snimiti unutar fajla nazvanog Header.inc. Nakon kreiranja fajla zaglavlja, neophodno je da se on uključi na svaku stranu na kojoj treba da se prikaže. To se postiže pomoću naredbi require() ili include().

<?php
require('header.inc');
echo "<p>Neki tekst.....</p>";
?>

 

Funkcija require() poziva fajl header.inc i čita njegov sadržaj. Ovaj sadržaj se onda prikazuje kao deo strane sa koje je pozvan.

Ukoliko fajlovi koji se uključuju, sadrže neke poverljive informacije, tada bi trebalo da budu snimljeni sa ekstenzijom .php, kako korisnici ne bi mogli da vide njihov originalan sadržaj, već samo HTML kod, koji je rezultat izvršavanja njihovog koda.

Naredba include() radi potpuno isto što i require() osim što, ukoliko dođe do greške prilikom procesa učitavanja eksternog fajla, program nastavlja sa izvršavanjem. To znači da, ukoliko su podaci, koji se nalaze u eksternom fajlu, neophodni za izvršavanje programa, treba koristiti naredbu require, pre nego include.


Rad sa fajl sistemom

Kada govorimo o radu sa fajlovima, sa strane web servera, postoje neke stvari koje je potrebno znati pre samog početka.

Najčešće će server, na kome će se nalaziti naša php aplikacija, biti udaljen i veoma je izvesno da nećemo imati prava na korišćenje fajl sistema izvan okruženja našeg web servera. Zato treba celu strukturu foldera i fajlova formirati u okviru same aplikacije, a ponekad tražiti i od administratora prava na pisanje fajlova čak i na nivou te aplikacije.

Osim toga, rad sa fajlovima je uvek rizičan, što se tiče izvršavanja, jer nikada ne možemo biti u potpunosti sigurni da će fajl koji nam je potreban - biti dostupan. Zato se blokovi koda, u kojima se radi sa fajlovima, dodatno bezbednosno ojačavaju, jer, pucanje aplikacije u ovakvim situacijama može malicioznom korisniku otkriti informacije koje možda ne želimo da damo. Ovu tematiku ćemo konkretnije obraditi u jednoj od narednih lekcija, kada budemo radili sa greškama i izuzecima.


Pisanje u fajlove

Da bismo radili sa nekim fajlom, potrebno je prvo da mu pristupimo. To je moguće uraditi na sledeći način:
<?php
fopen("proba.txt", "w");
?>

 

Ovom linijom, tačnije, funkcijom fopen(), dajemo nalog sistemu da stvori fajl, koji se naziva proba.txt. Obzirom da nismo naglasili celu putanju fajla, on će biti kreiran u folderu gde je i skripta koja ga je kreirala. Za drugi parametar ove funkcije, prosleđujemo karakter, kojim označavamo koju tačno akciju nameravamo da izvršimo na fajlu.

Ukoliko je oznaka „w”, znači da želimo da stvorimo fajl (ukoliko već postoji, novi fajl će biti prepisan preko starog). Oznaka „r” znači da želimo da čitamo iz fajla, dok oznaka „a” znači da želimo da pišemo u već postojeći fajl.

Iako će ova linija koda napraviti fajl, on neće biti funkcionalan u našem kodu, jer nemamo način da se tom fajlu obratimo kroz kod. U tu svrhu, ova funkcija vraća fajl hendler (fajl resurs), odnosno, promenljivu koja u našem kodu predstavlja otvoreni fajl.

<?php
$fh=fopen("proba.txt", "w");
?>

 

Ovaj kod već daje mnogo više mogućnosti za rad na fajlu. Na primer, sada fajl (kome se ubuduće obraćamo putem handle-a) možemo i zatvoriti.

<?php
$fh=fopen("proba.txt", "w");
fclose($fh);
?>

 

Tradicionalan pristup fajlovima, u smislu obaveznog zatvaranja nakon otvaranja, nije obavezan u php-u, jer će fajl automatski biti zatvoren nakon izvršenja i emitovanja skripte. U svakom slučaju, ovo je dobra praksa.

Do sada, napravili smo fajl, otvorili ga i zatvorili. Potrebno je još samo upisati, odnosno, pročitati nešto iz tog fajla. Za to, pored oznaka pri inicijalizaciji fajl objekta, koristimo i funkcije fwrite() i fread().

<?php
$fh = fopen("proba.txt", "w");
fwrite($fh, "probni tekst");
fclose($fh);
?>

 

Izvršenjem koda iznad, biće kreiran fajl proba.txt u folderu aplikacije, čiji će sadržaj biti tekst “probni tekst”. Ovo naravno nije praksa pri pisanju fajlova, već je najbolje, ili tekst i putanju pripremiti pre korišćenja funkcija:

<?php
$putanja= "proba.txt";
$tekst= "probni tekst";
$fh = fopen($putanja, "w");
fwrite($tekst, "probni tekst");
fclose($fh);
?>

 

U HTML-u se novi red označava tagom <br>, ali za tekstualne fajlove i dalje važi pravilo escape karaktera \n za novi red.

Recimo da sada želimo da napravimo jedan xml fajl sa imenima gradova, tako da njegova struktura izgleda ovako:

<?xml version="1.0" encoding="utf-8" ?>
<root>
<grad>
beograd
</grad>
<grad>
london
</grad>
<grad>
pariz
</grad>
</root>

 

a da pri tom od podataka posedujemo samo jedan niz gradova.

Prvo bismo obradili ceo tekst:

<?php

$gradovi = array("beograd","pariz","london");
$tekst="<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n ";
$tekst.="<root>\r\n ";
for($i=0;$i<sizeof($gradovi);$i++)
$tekst.="<grad>".$gradovi[$i]."</grad>\r\n ";
$tekst.="<root>";
?>

 

a zatim bi taj tekst ubacili u željeni fajl.

<?php
$fh = fopen("proba.xml", "w");
fwrite($fh, $tekst);
fclose($fh);
?>

 

Obratite pažnju da se za novi red na nekim sistemima koriste escape kodovi \n , na nekim \r , a na nekim oba.

Isti rezultat mogli smo dobiti, otvaranjem fajla sa opcijom append („a”) i sekvencijalnim upisom direktno u fajl, umesto u string.

Treba u svakom slučaju biti obazriv prilikom rada sa fajlovima na web serveru, jer, za razliku od samog servera, koji praktično instancira svoje procese za svakog korisnika ponaosob. Fajl na kome radimo je samo jedan, tako da, ukoliko više korisnika pokuša da pristupi istom fajlu, može doći do problema.

 

 

Čitanje iz fajlova

Za čitanje fajlova, potrebno je takođe inicijalizovati fajl objekat, po istom principu kao i za pisanje, s tom razlikom što treba naznačiti da je u pitanju čitanje, oznakom „r” u parametrima:
<?php
$fh = fopen("proba.txt", "r");
$tekst = fread($fh, filesize("proba.txt"));
fclose($fh);
echo $tekst;
?>

 

Samo čitanje izvršava se kroz funkciju fread(). Ova funkcija prima fajl objekat i broj bajtova koji će biti pročitan iz fajla. Da bismo pročitali ceo fajl, koristimo funkciju filesize() koja izračunava broj bajtova fajla i prosleđujemo joj putanju našeg fajla kao parametar. Na taj način, dobijamo tačan broj bajtova našeg fajla, odnosno, broj bajtova koje želimo da pročitamo.

Ukoliko želimo da čitamo sekvencijalno, liniju po liniju, umesto celog fajla odjednom, možemo umesto funkcije fread() koristiti funkciju fgets(). U tom slučaju, kod će se nešto razlikovati:

<?php
$fh = fopen("proba.xml", "r");
$linija = fgets($fh);
while($linija!=null)
{
echo $linija;
$linija = fgets($fh);
}
fclose($fh);
?>

 

Ovakav način čitanja je karakterističan za čitanje podataka iz toka, te ovaj blok izgleda najčešće isto u svim programskim jezicima nastalim iz C-a.

 

 

Brisanje fajlova

Brisanje fajlova, vrši se jednom komandom.
<?php
unlink("proba.txt");
?>
Jedino na šta prilikom njenog izvršenja treba obratiti pažnju, jeste da fajl bude zatvoren, inače fajl neće moći da bude obrisan.

Osim pomenutih načina, postoji još jedan način za pisanje i čitanje fajlova u php-u. Ovaj način, iako ne toliko moćan, prilično je jednostava i efikasan. A pre svega, veoma kratak.


Pisanje u fajl, gde je prvi parameter adresa fajla, a drugi, sadržaj za upis.
<?php
file_put_contents("proba.txt","tekst");
?>
Čitanje iz fajla, kao parametar, prima adresu fajla, a kao rezultat vraća string - sadržaj fajla.
<?php
echo file_get_contents("proba.txt");
?>

Rukovanje direktorijumima

Kao i sa fajlovima, putem PHP-a moguće je rukovanje i direktorijumima. Jedina vidljiva razlika je u tome što folderi, za razliku od fajlova, mogu da imaju rekurzivan sadržaj, pa su tako malo problematičniji za čitanje.


Pravljenje direktoriuma

Da bi na web serveru napravili direktorijum, dovoljna je jedna linija koda:
<?php
mkdir("probniDir");
?>
...ali i dosta obazrivosti. Pre svega, kao i sa fajlovima, i ovde na snagu treba staviti najveće moguće bezbednosne mere (staviti kod u obradu izuzetka ili bar prekinuti izvršavanje koda, funkcijom die()).
Konvencije putanja na web serveru su nešto drugačije nego na fajl sistemu, pa se root folder web aplikacije obeležava sa “../” a aktuelni folder “./”. Ukoliko pokušate da kreirate folder na nepostojećoj lokaciji, php će prijaviti grešku.


Brisanje direktoriuma

Brisanje foldera je još jednostavnije od kreiranja:
<?php
rmdir("probniDir");
?>


Listanje direktorijuma

Najpotrebnije u radu sa direktorijumima je svakako listanje njihove sadržine. Da bi izlistali sadržaj foldera, potrebno je: napraviti direktorijum objekat funkcijom opendir i putanjom ciljnog foldera. Čitati fajl po fajl u direktorijumu, sve dok u njemu postoje fajlovi. Obzirom da se čitanje sadržaja direktorijuma vrši sekvencijalno, možemo prilikom svakog kruga while petlje intervenisati na aktuelnom fajlu, čija putanja čini sadržaj promenljive $fajl,
<?php
$dh = opendir("./");
$fajl = readdir($dh);
while (false !== $fajl)
{
echo $fajl;
$fajl = readdir($dh);
}
?>


Najvažnije iz lekcije


  1. Za pridruživanje eksternog fajla aplikaciji, koriste se funkcije include() i require()
  2. Razlika između include() i require() funkcija je u tome što include() za razliku od require() ne prekida izvršenje programa.
  3. Da bi se rukovalo fajlovima ili folderima potreban je fajl objekat (handle)
  4. Fajlovi se mogu čitati sekvencijalno, funkcijom fgets() ili kompletno fread() ili file_get_contents()
  5. Fajlovi se mogu pisati funkcijama fwrite() ili file_put_contents()
  6. Funkcija za brisanje fajlova je unlink()


Smatrate da je ova lekcija korisna?  Preporučite je. Broj preporuka:6