Sunteți pe pagina 1din 22

LUCRUL CU FORMULARE.

MANIPULAREA FIŞIERELOR ŞI A DOSARELOR

Obiective
• prezentarea conceptelor şi elementelor fundamentale specifice formularelor;
• transmiterea datelor către server-ul de Web;
• utilizarea câmpurilor ascunse;
• redirecţionarea utilizatorului către o pagină nouă;
• combinarea codului HTML şi PHP pe o singură pagină;
• includerea fişierelor în documente;
• crearea şi ştergerea unui fişier;
• deschiderea unui fişier şi executarea de operaţii cu acesta;
• manipularea directoarelor.

12.1. Transmiterea datelor către server-ul de Web

Un site web (şi mai ales una interactivă) presupune preluarea şi utilizarea datelor introduse de
utilizator, acest obiectiv realizându-se prin intermediul formularelor. Practic, un utilizator introduce
datele în cadrul unui formular, după care aceste sunt preluate de server în vederea procesării lor. Din
punct de vedere al aplicaţiilor web, procesarea datelor se realizează prin intermediul script-urilor
PHP, ASP, JSP.

Formularele HTML conţin doar elemente simple (butoane radio, căsuţe de selecţie, liste etc.) care
exprimă ce anume va fi transmis pentru prelucrare. Din acest punct intervine script-ul PHP care
primeşte datele transmise de elementele formularului şi le foloseşte pentru a realiza acţiunile dorite.

Prin intermediul formularelor, utilizatorii transmit server-ului de Web diferite informaţii. În cadrul
documentelor HTML, formularul este identificat prin următorul tag:
<form name="nume_formular" method="nume_metodă"
action="URL_script">
unde:
• nume_formular – reprezintă numele dat formularului;
• nume_metodă – reprezintă modul prin care datele introduse în formular se transmit server-
ului de Web;
• URL_script – reprezintă URL-ul script-ului care va prelucra informaţiile introduse în
cadrul formularului.
Metodele prin care se transmit datele server-ului de Web sunt: POST şi GET. Metoda POST preia
datele introduse în cadrul formularului şi le transmite prin intermediul protocolului HTTP. Datele
transmise nu pot fi vizualizate în cadrul adresei URL, ceea ce înseamnă că informaţia este transmisă
într-o manieră ascunsă utilizatorului.

Metoda GET preia datele din elemente formularului, le codifică şi apoi le adaugă în adresa URL,
astfel că numele şi valoarea sa pot fi vizibile. Dacă este specificată metoda GET, atunci datele
introduse vor fi transmise prin perechi de forma: nume=valoare (nume reprezintă numele variabilei
transmise, iar valoare este valoarea dată de utilizator câmpului respectiv).

Pentru exemplificare vom folosi un exemplu, care foloseşte două fişiere: primul este un fişier
HTML care conţine formularul împreună cu elementele sale (câmpul de tip text – pentru nume şi
prenume, câmpul de tip textare – pentru adresă şi butonul de trimitere a datelor) şi un al doilea care
conţine scriptul PHP, numit în cadrul exemplului nostru fisier_prelucrare.php.

Primul fişier, numit Formular.html este prezentat sub forma următoare:


<html>
<body>
<form action="fisier_prelucrare.php" method="post" name="Primul_formular" id="Primul_formular">
<table width="284" border="0" align="center">
<tr>
<td width="122">Nume si prenume</td>
<td width="152"><input name="date_personale" type="text"
id="date_personale"></td>
</tr>
<tr>
<td>Adresa</td>
<td><textarea name="adresa" rows="2" id="adresa"></textarea></td>
</tr>
<tr>
<td colspan="2"><div align="center">
<input type="submit" name="Submit" value="Prelucreaza datele">
</div></td>
</tr>
</table>
</form>
</body>
</html>

Listing 12.1. Transmiterea datelor către server prin metoda POST

Fişierul Formular.html conţine un formular care foloseşte ca metodă de transmitere a datelor,


metoda POST, iar pentru prelucrarea datelor fişierul fisier_prelucrare.php. Acest fişier mai conţine
un câmp de tip text, identificat cu numele date_personale; un câmp de tip textarea, identificat cu
numele adresa şi un buton de transmitere a datelor din formular cu numele Prelucreaza datele.
Figura 12.1. Formularul creat în fişierul Formular.html

Cel de-al doilea fişier care conţine script-ul care realizează prelucrarea datelor transmise de
utilizator (fisier_prelucrare.php) este prezentat în listing-ul 12.2.
<html>
<body>
<?php
echo "Am inregistrat numele si prenumele dvs.: <strong>". $_POST[date_personale] ."</strong>
si va trimitem coletul la adresa <strong>".$_POST[adresa]."</strong>";
?>
</body>
</html>

Listing 12.2. Afişarea datelor transmise server-ului prin metoda POST

Fişierul fisier_prelucrare.php va prelucra datele care au fost introduse în câmpurile din fişierul
Formula.html, adică va afişa în cadrul unei noi pagini un text care va conţine şi valorile celor două
câmpuri care au fost mai înainte. Trebuie menţionat faptul că variabilele care au fost accesate
$_POST[date_personale] şi respectiv $_POST[adresa] sunt referinţe la vectorul superglobal
$_POST.

OBSERVAŢIE: Este foarte important ca varibilele să aibă aceeaşi denumire ca şi câmpurile


care transmit datele introduse în formular, în caz contrar nu vom şti ce variabilă a fost
transmisă.

Figura 12.2. Acţiunea formularului prin metoda POST

În cazul în care metoda de transmitere a variabilelor prin intermediul formularului ar fi de tip GET,
atunci perechile: nume=valoare sunt separate de adresa URL a script-ului care prelucrează
conţinutul formularului prin caracterul ? (care precizează că există informaţie care se transmite către
server), iar între acestea se află caracterul &. Variabilele care vor fi transmise vor fi de forma
$_GET[date_personale] şi respectiv $_GET[adresa] şi se vor modifica atât în listing-ul 12.2., cât şi
în 12.1. în cadrul atributului METHOD, care va deveni GET.
Figura 12.3. Acţiunea formularului prin metoda GET

Pentru a se vizualiza rezultatul obţinut în urma executării celor două exemple este obligatoriu ca
cele două fişiere să fie salvate în directorul rădăcină a server-ului de Web.

12.2. Lucrul cu elemente de formular

În cadrul unui formular nu există doar mijloace care permit introducerea unui text, ci există şi
elemente care permit selecţia uneia sau mai multor opţiuni din cadrul unui grup. Astfel, următorul
exemplu pune în evidenţă utilizarea altor elemente specifice formularelor.
<html>
<body>
<form action="fisier_prelucrare_radio.php" method="post" name="Formular">
<table width="375" border="0" align="center">
<tr>
<td width="129">Nume si prenume</td>
<td width="236"><input name="date_personale" type="text"
id="date_personale"></td>
</tr>
<tr>
<td>Tip persoana </td>
<td><p>
<label>
<input type="radio" name="tip_persoana" value="Persoana Fizica">
Persoana fizica</label><br>
<label>
<input type="radio" name="tip_persoana" value="Persoana Juridica">
Persoana juridica</label><br>
</p></td>
</tr>
<tr>
<td colspan="2"><div align="center">
<input type="submit" name="Submit" value="Prelucreaza datele"> </div></td>
</tr>
</table>
</form>
</body>
</html>

Listing 12.3. Utilizarea butoanelor „radio” în codul HTML


În cadrul listing-ului 12.3 am introdus un nou element al formularului şi anume butonul radio
(Radio Button). Rolul unui astfel de buton (numit în cadrul exemplului nostru tip_persoană) este de
a permite selectarea unei singure opţiuni dintr-un anumit grup. Fiecare opţiune din grup are acelaşi
nume de variabilă, dar valori asociate diferite care vor fi folosite de fişierul de prelucrare (Persoana
Fizica şi Persoana Juridica în cadrul exemplului prezentat). Transmiterea variabilelor se face prin
metoda POST.

Figura 12.4. Formular cu butoane „radio”

Pentru prelucrarea formularului vom crea un nou fişier care va folosi datele introduse de utilizator.
<html>
<body>
<?php
echo "Numele si prenumele dvs. este: <strong>". $_POST[date_personale] ."</strong> si sunteti
<strong>".$_POST[tip_persoana]."</strong>.";
?>
</body>
</html>

Listing 12.4. Prelucrarea datelor asociate butoanelor „radio”

Variabila aferentă butonului „radio” care va fi transmisă fişierului ce realizează prelucrarea datelor
din cadrul formularului va fi accesată prin numele care a fost dat întregului grup (tip_persoana) şi
nu prin valoarea care a fost atribuită fiecărei opţiuni care aparţine grupului definit. În urma selectării
unei opţiuni va fi afişată valoarea care a fost atribuită acesteia.

Figura 12.5. Rezultatul formularului folosind butoane „radio”

Totodată, trebuie să menţionăm că pot exista situaţii în care trebuie să utilizăm un grup de butoane
„radio” în mod dinamicAstfel, pentru realizarea acestui obiectiv vom folosi o structură repetitivă
care are rolul de a prelua valorile în vederea afişării lor.

Pentru exemplificare, am considerat un formular de înscriere a unui cadru didactic într-o bază de
date (numită în acest exemplu curs). Persoana va trebui să aleagă la un moment dat în formular
gradul didactic, care este prezentat într-un grup de butoane „radio”. Gradul didactic s-a considerat că
este o tabelă în cadrul bazei de date, iar realizările ei vor determina conţinutul GroupBox-ului.

<?php
mysql_connect('localhost','root','');
mysql_select_db('curs');
$selectie=mysql_query('select * from grad_didactic');
while($rand=mysql_fetch_array($selectie))
{$grad=$rand['denumire_grad'];
echo'<label>';
echo'<input type="radio" name="grad_didactic" value="'.$grad.'">'.
$grad.'</label>';
echo'<br>';
}
?>

Listing 12.5. Utilizarea butoanelor „radio” în mod dinamic

Prelucrarea datelor din acest formular se va realiza în mod asemănător cu cu cea specifică modului
static, deoarece grupul de butoane are acelaşi nume, modificându-se doar valoarea asociată fiecărei
opţiuni a acestuia.

În cadrul unui formular pot fi utilizate simultan mai multe opţiuni din cele prezentate anterior, acest
lucru materializându-se din punct de vedere practic cu ajutorul casetelor de validare (checkbox) sau
prin intermediul elementelor de tipul SELECT (List/Menu).

Dacă se folosesc căsuţele de selecţie, utilizatorul va bifa caseta sau casetele de validare dorite din
cadrul grupului. Adăugarea casetelor de validare presupune crearea unui formular, care să le
conţină. După cum se poate observa în listing-ul 12.6, fiecare casetă de validare are atât o valoarea
asociată diferită, cât şi un nume individual şi este folosit atunci când opţiunile sunt statice, adică nu
se modifică pe măsură ce se adaugă noi opţiuni.
<html>
<body>
<form action="fisier_prelucrare_checkbox.php" method="post" name="Formular"
id="Formular">
<table width="480" border="0" align="center">
<tr>
<td width="249">Nume si prenume</td>
<td width="221"><input name="date_personale" type="text"
id="date_personale"></td>
</tr>
<tr>
<td>Selectati marcile de produs preferate </td>
<td><p>
<input name="Samsung" type="checkbox" value="Samsung"> Samsung </p>
<p>
<input name="Panasonic" type="checkbox" value="Panasonic"> Panasonic </p>
</td>
</tr>
<tr>
<td colspan="2"><div align="center">
<input type="submit" name="Submit" value="Selecteaza produsele"> </div></td>
</tr>
</table>
</form>
</body>
</html>

Listing 12.6. Utilizarea controalelor „checkbox” în codul HTML

Listing-ul 12.6 va fi salvat în cadrul unui fişier de tip HTML care se va găsi în directorul rădăcină a
server-ului Web. Se va crea apoi un nou fişier cu numele fisier_prelucrare_checkbox.php care va
realiza prelucrarea datelor precizate de utilizator în cadrul formularului, iar acest fişier va fi salvat în
aceeaşi locaţie ca şi fişierul anterior.
<?php
echo "Numele si prenumele dvs. este: <strong>". $_POST[date_personale] ."</strong> si ati ales
urmatoarele marci de produse: ";
if(isset($_POST[Samsung]) and isset($_POST[Panasonic])) echo "Samsung si Panasonic";
else if (isset($_POST[Samsung])) echo "Samsung";
else if (isset($_POST[Panasonic])) echo "Panasonic";
?>

Listing 12.7. Prelucrarea datelor asociate butoanelor „checkbox”

Se deschide browser-ul de Internet şi se accesează adresa unde se află fişierul HTML şi se validează
unul sau mai multe casete de validare şi se apăsa butonul Selecteaza produse. Rezultatul va fi cu cel
din figura 12.:

Figura 12.6. Rezultatul afişat după executarea formularului folosind casete de validare

Funcţia care are rolul de a verifica dacă o casetă de selecţie a fost validată (bifată) este isset(). Însă,
în cazul în care casetele de validare sunt generate în mod dinamic pot apare diferite probleme care
pot fi evitate prin atribuirea de nume diferite acestora şi care să se identifice printr-o cheie.
Ca şi în cazul butoanelor „radio”, generarea casetelor de validare se va face prin intermediul unei
structuri repetitive.

Pentru exemplificare, am afişat toate persoanele din cadrul unei tabele, urmând ca utilizatorul să le
selecteze pe cele pentru care doreşte să modifice anumite caracteristici.

<?php
mysql_connect('localhost','root','');
mysql_select_db('curs');
$selectie=mysql_query('select * from angajat');
while($rand=mysql_fetch_array($selectie))
{$id_angajat=$rand['id_angajat'];
$nume_prenume=$rand[nume_angajat].' '.
$rand[prenume_angajat];
$nume_casuta='c'.$id_angajat;
echo'<p><input type="checkbox" name="'.$nume_casuta.'“
value="'.$nume_casuta.'">'.$nume_prenume.'</p>';
}
?>

Listing 12.8. Prelucrarea datelor asociate butoanelor „checkbox”

După cum se poate observa în listing-ul 12.8, fiecare casetă de validare are câte un nume şi o
valoare asociată distinctă de celelalte. În acest context, s-a creat o variabilă numită $nume_caseta,
care este dată de concatenarea literei c cu câmpul unic ce identifică persoana (cheia primară a
tabelei).

Dacă se va folosi un control de tip SELECT, atunci în script-ul apelat este disponibilă o variabilă
care coincide cu cel al controlului, iar valoarea acesteia este egală cu opţiunea selectată.
<html>
<body>
<form action="fisier_prelucrare_select.php" method="post" name="Formular"
id="Formular">
<table width="480" border="0" align="center">
<tr>
<td width="249">Nume si prenume</td>
<td width="221"><input name="date_personale" type="text" id="date_personale"></td>
</tr>
<tr>
<td>Selectati marcile de produs preferate </td>
<td><p><select name="marca[]" size="3" multiple>
<option value="Samsung">Samsung</option>
<option value="Panasonic">Panasonic</option>
<option value="LG">LG</option>
</select>
</p>
</td>
</tr>
<tr>
<td colspan="2"><div align="center">
<input type="submit" name="Submit" value="Selecteaza produsele"> </div></td>
</tr>
</table>
</form>
</body>
</html>

Listing 12.9. Folosirea controlului SELECT în codul HTML

Acest fişier se va salva în cadrul directorului rădăcină a server-ului Web şi se va crea un nou fişier
care va conţine codul sursă PHP. În cazul în care elementul SELECT ar fi denumit cu un nume
normal, de forma: <select name="marca" size="3" multiple>, atunci script-ul care primeşte datele
are acces doar la una dintre valorile corespunzătoare acestuia. Pentru a accesa mai multe date,
trebuie redenumit elementul astfel încât numele său să se termine cu o pereche de paranteze pătrate,
aşa cum este prezentat în listing-ul 12.9.
În scriptul care procesează datele transmise de către formular, se va observa că cele introduse de
utilizator în elementul marca[] al formularului sunt disponibile în cadrul unui vector numit
$_POST[marca].
<?php
echo "Numele si prenumele dvs. este: <strong>". $_POST[date_personale] ."</strong> si ati ales:
<br>";
if(!empty($_POST[marca]))
{echo "<ul>";
foreach ($_POST[marca] as $value)
{echo "<li> $value";}
echo "</ul>";
}
?>

Listing 12.10. Prelucrarea datelor asociate controlului SELECT

După salvarea fişierului ce conţine script-ul PHP se va scrie în browser adresa locaţiei unde se află
fişierul HTML şi se vor completa datele. Selectarea multiplă se va face prin apăsarea tastei CTRL.
În acest moment se vor prelua datele şi se transmit server-ului Web. Acesta începe prelucrarea
codului PHP astfel: se accesează variabila $_POST[date_personale], care derivă din eticheta
date_personale al formularului. Se va testa şi existenţa variabilei $_POST[marca] prin funcţia
empty() şi dacă aceasta este prezentă, atunci se va parcurge element cu element, preluându-se
valorile acestora (textul care a fost înscris în atributul value al elementului OPTION), urmând să fie
apoi afişate.

Figura 12.7. Rezultatul afişat după executarea formularului folosind controlul SELECT

12.3. Utilizarea câmpurilor ascunse


Câmpurile ascunse sunt similare cu etichetele, însă există o diferenţă semnificativă între ele: acestea
nu apar în cadrul paginii, astfel că utilizatorii nu pot introduce date în cadrul acestor câmpuri.
Această proprietate a câmpurilor ascunse conduce la scopul principal al acestuia şi anume:
transmiterea de informaţii care nu sunt introduse de către utilizator.

Sintaxa unui câmp ascuns este: <input name="nume_camp" type="hidden" value="valoare">,


unde:
• nume_camp – reprezintă numele dat câmpului ascuns;
• valoare – reprezintă valoarea câmpului ascuns, valoare care nu poate fi vizualizată de
utilizatori.
Un exemplu de utilizare a câmpurilor ascunse poate fi atunci când se doreşte contorizarea
încercărilor pentru identificarea unui număr necunoscut sau transmiterea unei chei primare de la o
pagină la alta.

12.4. Redirecţionarea către o pagină nouă


Redirecţionarea către o nouă pagină se face atunci când se doreşte evitarea scrierii unei noi pagini.
În cazul în care un script de pe server comunică cu un client, el trebuie să trimită anteturi care
furnizează informaţii despre tipul de document care urmează. PHP se ocupă automat de aşa ceva,
însă se poate trimite şi de către programator, prin intermediul funcţiei header().

Pentru a apela funcţia header(), este nevoie ca să nu se fi trimis nici un fel de date către browser
până în acel moment. Dacă se doreşte folosirea acestei funcţii în cadrul unui script este absolut
necesar ca înaintea acestui cod să nu se afle nimic care conţine apelul către această funcţie.

OBSERVAŢIE: Funcţia header() trebuie apelată înainte ca orice ieşire să fie apelată, oricare
ar fi tag-urile HTML, linii goale în cadrul fişierului sau din PHP.
<?php
$mesaj="Numele si prenumele dvs. este: <strong>". $_POST[date_personale] ."</strong> si ati ales: ";
if(isset($_POST[Samsung]) and isset($_POST[Panasonic])) {$mesaj=$mesaj."Samsung si
Panasonic";}
else if (isset($_POST[Samsung])) {$mesaj=$mesaj."Samsung";}
else if (isset($_POST[Panasonic])){$mesaj=$mesaj."Panasonic";}
else {header("location:Selectie.html");}
echo $mesaj;
?>
<html>
</html>

Listing 12.11. Folosire funcţiei header() pentru a trimite anteturi brute

După cum se poate observa în listing-ul 12.11, pentru a se putea rula codul trebuie
• să nu existe linii albe înainte de apelarea funcţiei header();
• să nu existe tag-uri HTML înainte de apelarea funcţiei;
• să nu se folosească instrucţiunea de afişare înainte de apelarea funcţiei.
În cadrul listing-ului 12.11, se va apela funcţia header() doar în cazul în care utilizatorul nu
selectează nici o casetă de validare din cele prezetate. Rezultatul obţinut în urma apelului acestei
funcţii este deschiderea unei noi pagini, Selectie.html, care poate include orice element.

12.5. Combinarea codului HTML şi PHP pe o singură pagină

Combinarea codurilor HTML şi PHP se foloseşte atunci când se doreşte prelucrarea datelor din
cadrul unui formular în aceeaşi pagină cu codul HTML static.

Pentru realizarea acestui obiectiv se va crea un formular care va avea ca şi acţiune variabila
$_SERVER['PHP_SELF'], care este echivalentă cu numele script-ului curent. Practic, această
acţiune permite reîncărcarea script-ului.

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">

12.6. Includerea fişierelor în documente

Includerea fişierelor în cadrul documentelor este utilă atunci când se creează funcţii care sunt
utilizate în mai multe documente. Pentru a elimina opţiunea de a scrie funcţia pentru fiecare
document în parte se poate folosi instrucţiunea include(), care permite înglobarea unor fişiere în
documentul PHP. Codul PHP din cadrul fişierelor înglobate va fi executat ca şi cum ar face parte din
documentul principal.

Instrucţiunea include() are nevoie de un singur argument: calea relativă către fişierul care trebuie
inclus şi va fi menţionat între ghilimele („”).
<? php
include(“nume_fisier.php”
)
?>

Listing 12.12. Folosirea instrucţiunii include() pentru a executarea codului PHP din alt fişier

Intrucţiunea include() poate fi folosită şi în cadrul structurilor de control. Dacă se va folosi în cadrul
unei structuri condiţionale, atunci fişierul care trebuie inclus nu va fi executat decât în cazul în care
condiţia este îndeplinită.
<?php
$test=false;
if($test)
{include(„fisier.php”);}
else
{echo 'Variabila nu este adevarata. Nu se va include
fisierul.';}
?>

Listing 12.13. Folosirea instrucţiunii include() în cadrul unei structuri condiţionale

În cadrul acestui exemplu, instrucţiunea include() nu va fi executată niciodată, deoarece variabila


test este falsă.

Dacă se foloseşte intrucţiunea include() în cadrul unei structuri repetitive, atunci aceasta va fi
executată de fiecare dată şi va fi înlocuită la fiecare apel cu conţinutul fişierului referit.

<?php
for ($i=1;$i<=3;$i++)
{$includefisier="fisier$i".".txt";
echo 'Se include fisierul $includefisier:
<br>';
include(„$includefisier”);
echo '<br>';
}
?>

Listing 12.14. Folosirea instrucţiunii include() în cadrul structurii repetitive

Presupunând că există fişierele care se doresc introduse şi au instrucţiuni scrise în cadrul lor,
rezultatul listing-ului de mai sus este:
Figura 12.8. Rezultatul afişat după executarea instrucţiunii include() în cadrul structurii repetitive

O instrucţiune asemănătoare cu include() este require(), care se execută indiferent de modul în care
se desfăşoară script-ul şi de aceea nu trebuie folosită ca parte dintr-o buclă sau instrucţiune
condiţională.

O alternativă la instrucţiunea include() este şi instrucţiunea include_once(). Instrucţiunea


include_once() se asigură că fişierul a fost introdus o singură dată. Această instrucţiune are un
singur argument şi anume calea relativă către fişierul care se include, această cale fiind introdusă
între ghilimele. Instrucţiunea include_once() este foarte utilă atunci când se lucrează cu biblioteci de
coduri şi dacă aceasta este apelată de mai multe ori, fişierul pe care ar trebui să îl introducă nu va
mai fi introdus încă o dată.

Asemănător instrucţiunii include_once() este require_once(), care se comportă ca şi instrucţiunea


require(), dar introduce fişierul o singură dată şi poate fi folosită oriunde în cadrul lui.

<?php
for ($i=1;$i<=2;$i++)
{
echo 'Se include continutul fisierului cu numele <strong> fisier1.txt</strong>:
<br>';
$fisier_inclus=include_once ("fisier1.txt");
echo '<br>';
}
?>

Listing 12.15. Folosirea instrucţiunii include_once()

După salvarea fişierului în cadrul directorului rădăcină a server-ului de Web se va accesa în browser
adresa aferentă fişierului şi rezultatul afişat va fi:

Figura 12.9. Rezultatul afişat după executarea instrucţiunii include_once()


Se poate observa că s-a afişat o singură dată conţinutul fişierului inclus, chiar dacă instrucţiunea
include_once() a fost executată de mai multe ori.

Pentru a asigura portabilitatea unei aplicaţii este foarte utilă folosirea directivei include_path().
Modificarea acestei directive se face în fişierul php.ini (se află în directorul limbajului PHP):

include_path
.:/director1/director2/htdocs/director3/director4/

Directiva include_path() poate conţine mai multe căi de directoare, acestea fiind separate prin punct
şi virgulă (;). Ordinea elementelor din directiva include_path() determină şi ordinea în care fişierul
respectiv este căutat în directoare. Primul punct din cadrul directivei (cel care se află înainte de două
puncte) semnifică directorul curent.

Returnarea unei valori dintr-un document inclus

Fişierele incluse în PHP pot returna valori în mod asemănător funcţiilor. Pentru oprirea execuţiei
unui cod din cadrul fişierului inclus se poate folosi instrucţiunea return. Dacă se foloseşte această
instrucţiune, nu se va mai executa nici codul HTML care urmează.

<?php
$a=56;
<?php
$b=34;
$fisier=include("fisier_return.php");
$c=20;
echo 'Fisierul inclus are ca rezultat valoarea: '. $fisier.'.';
return $c;
?>
$c=$a+$b;
?>

Listing 12.16. Folosire instrucţiunii include() – aplic.php Listing 12.17. Folosirea instrucţiunii return –
fişier_return.php

După salvarea celor două fişiere în cadrul directorului rădăcină a server-ului de Web şi accesând în
browser fişierul aplic.php se va obţine următorul rezultat:

Figura 12.10. Rezultatul afişat după executarea instrucţiunii return

După cum se poate observa rezultatul execuţiei fişierului inclus afişează ultima valoare a variabilei c
înainte de executarea instrucţiunii return.
12.7. Verificarea fişierelor

Înainte de a lucra cu un fişier sau un director, este important să se facă o scurtă recenzie a
principalelor informaţii specifice lui: există, se poate citi, se poate scrie în el, este executabil, ce
dimensiune are.

12.7.1. Verificarea existenţei fişierelor

Pentru a se verifica existenţa unui fişier se foloseşte funcţia file_exists(), care are ca argument un şir
de caractere care reprezintă calea relativă către fişierul care se doreşte verificat. Va returna o valoare
booleană: true - dacă fişierul există şi false în caz contrar.
file_exists("nume_fisier.extensie")
Pentru a ne asigura că o entitate este fişier sau director se vor folosi funcţiile is_file(), respectiv
is_dir(). Funcţia is_file() verifică dacă entitatea este fişier, în timp ce funcţia is_dir() verifică dacă
este director. Ambele funcţii au ca argument numele entităţii care se verifică şi întorc o valoare
booleană: true dacă este fişier/director şi false în caz contrar.
is_file("nume_fisier") is_dir("/director")

12.7.2. Verificare stării unui fişier

După ce s-a verificat dacă fişierul există, trebuie să se verifice starea acestuia. Pentru a realiza acest
lucru se vor folosi următoarele funcţii: is_readable(), is_writable() şi is_executable().

Funcţia is_readable() precizează dacă fişierul poate fi citit şi are nevoie ca argument un şir de
caractere care reprezintă calea relativă către fişier. Funcţia va returna o valoare de tip booleană.
is_readable ("nume_fisier")
Funcţia is_writable() specifică dacă se poate scrie în cadrul fişierului şi are nevoie ca argument un
şir de caractere care reprezintă calea relativă către fişier. Totodată, şi această funcţie va returna o
valoare de tip booleană.
is_writable ("nume_fisier")
Funcţia is_executable() indică dacă fişierul poate fi rulat. Această funcţie are un şir de caractere ca
argument care reprezintă calea relativă către fişier, valoarea returnată fiind tot de tip boolean.
is_executable ("nume_fisier")

Dacă se doreşte aflarea dimensiunii unui fişier, vom folosi funcţia filesize(). Argumentul funcţiei
este reprezentat de calea relativă către fişier şi va returna dimensiunea acestuia în octeţi.
filesize ("nume_fisier")
12.8. Crearea şi ştergerea fişierelor

Dacă un fişier nu există, acesta se poate crea cu ajutorul funcţiei touch(). Funcţia primeşte drept
argument un şir de caractere care reprezintă calea relativă către fişier şi va încerca crearea un fişier
vid. Dacă mai există un fişier cu acelaşi nume nu va aduce modificări asupra acestuia, ci doar va
actualiza data ultimei modificări.
touch ("nume_fisier")

Funcţia care realizează ştergerea unui fişier este unlink(), care la fel ca funcţia touch() primeşte drept
argument un şir de caractere ce reprezintă calea relativă până la fişier.
unlink ("nume_fisier")

Ambele funcţii vor întoarce o valoare booleană, care va fi true – dacă fişierul a putut fi creat/şters
sau false – în caz contrar.

12.9. Deschiderea unui fişier şi executarea de operaţii cu acesta

Pentru a putea realiza operaţii cu un fişier este nevoie ca acesta să fie deschis. Pentru a realiza acest
lucru se va folosi funcţia fopen(). După deschiderea fişierului se pot realiza operaţiile de citire,
scriere, adăugare.

12.9.1. Deschiderea şi închiderea unui fişier

Funcţia fopen() are două argumente: primul argument reprezintă calea relativă până la fişier şi este
exprimat sub formă de şir de caractere, iar cel de-al doilea este un şir de caractere care precizează
modul în care trebuie deschis fişierul.
fopen ("nume_fisier", „mod”)
unde:
• nume_fisier – reprezintă calea relativă până la fişier;
• mod – precizează modul în care se va deschide fişierul. Aceste argumente pot fi:
 „r”: fişierul este deschis pentru citire;
 „r+”: fişierul este deschis pentru citire şi scriere;
 „w”: fişierul este deschis doar pentru scriere, iar conţinutul său este şters. Dacă
fişierul nu există, atunci acesta va fi creat;
 „w+”: fişierul este deschis pentru citire şi scriere, iar conţinutul său este şters. Dacă
fişierul nu există, atunci acesta va fi creat;
 „a”: fişierul este deschis doar pentru scriere, iar pointerul este plasat la sfârşit. Dacă
fişierul nu există, atunci acesta va fi creat;
 „a+”: fişierul este deschis pentru scriere şi citire, iar pointerul este plasat la sfârşit.
Dacă fişierul nu există, atunci acesta va fi creat.
Funcţia fopen() returnează o valoare de tip fişier care se poate utiliza când se va lucra cu fişierul
respectiv.

După ce s-au executat diferite operaţii asupra fişierului, acesta va trebui să fie închis (când nu mai
este utilizat) prin intermediul funcţiei fclose().
fclose ("nume_fisier_deschis")

12.9.2. Citirea unui fişier

Pentru citirea datelor din cadrul unui fişier, limbajul PHP oferă o serie de funcţii care realizează
acest lucru. Aceste funcţii permit citirea fişierelor octet cu octet, linie cu linie sau caracter cu
caracter.

1. Pentru citirea linie cu linie din cadrul unui fişier care este deschis se foloseşte funcţia fgets().
Această funcţie primeşte două argumente:

• o valoare de tip fişier primită în urma operaţiei de deschidere prin fopen();


• o altă valoare de tip întreg care reprezintă numărul de octeţi pe care funcţia trebuie să îi
citească din fişier, dacă nu a găsit mai întâi sfârşitul de linie sau sfârşitul fişierului. Dacă
nu se specifică lungimea, se va stabili o valoare implicită de 1024 bytes (1kb).
fgets ($variabila_fisier_deschis, lungime)
Pentru a testa dacă s-a ajuns la sfârşitul fişierului se va folosi funcţia feof(), care primeşte ca
argument valoare de tip fişier primită în urma operaţiei de deschidere prin fopen(). Funcţia feof() va
returna o valoare booleană.

2. Citirea octet cu octet dintr-un fişier se face prin funcţia fread(). Înainte de a apela funcţia este
nevoie ca fişierul să fie deschis. Funcţia are ca argumente: o valoare de tip fişier şi numărul de octeţi
care se doresc citiţi şi va returna volumul de date solicitate, excepţie făcând cazul în care găseşte
sfârşitul fişierului.
fread ($variabila_fisier_deschis, numar_octeti)
3. Citirea caracter cu caracter se face cu ajutorul funcţiei fgetc(), care este echivalentă cu fget().
Va returna conţinutul fişierului caracter cu caracter. Are un sigur argument care este o valoare de tip
fişier, care s-a obţinut prin operaţia de deschidere a fişierului.
fgetc ($variabila_fisier_deschis)
<?php
$deschidere_fisier=@fopen("index.txt","r") or die("Nu s-a putut
deschide fisierul");
while(!feof($deschidere_fisier))
{$citeste_fisier_linie=fgets($deschidere_fisier, 1024);
echo "$citeste_fisier_linie<br>";
}
fclose($deschidere_fisier);
?>
<?php
$deschidere_fisier=@fopen("index.txt","r") or die("Nu s-a putut
deschide fisierul");
while(!feof($deschidere_fisier))
{$citeste_fisier_octet=fread($deschidere_fisier, 26);
echo "$citeste_fisier_octet<br>";
}
fclose($deschidere_fisier);
?>
<?php
$deschidere_fisier=@fopen("index.txt","r") or die("Nu s-a putut
deschide fisierul");
while(!feof($deschidere_fisier))
{$citeste_fisier_caracter=fgetc($deschidere_fisier);
echo "$citeste_fisier_caracter<br>";
}
fclose($deschidere_fisier);
?>

Listing 12.18. Folosirea funcţiilor de citire din fişiere

În listing-ul 12.18 se poate observa modul în care se comportă cele trei funcţii. Plasarea operatorului
@ înaintea funcţiei fopen() conduce la neafişarea mesajului de avertizare în situaţia în care nu se
poate deschide fişierul. Funcţia die() afişează un mesaj în cazul în care acţiunea funcţiei nu s-a
relizat.

Funcţia fread() permite citirea conţinutului unui fişier, dar nu permite şi stabilirea locaţiei de unde să
pornească aceasta. Pentru a se stabili această locaţie se poate utiliza funcţia fseek() care permite
stabilirea poziţiei curente în cadrul unui fişier. Funcţia fseek() are nevoie de o valoare de tip fişier şi
de un număr întreg care reprezintă decalajul faţă de începutul fişierului.
fseek ($variabila_fisier_deschis, pozitie)
<?php
$deschidere_fisier=@fopen("index.txt","r") or die("Nu s-a putut deschide
fisierul");
$marime_fisier=filesize("index.txt");
$valoare=(int)($marime_fisier/3);
fseek($deschidere_fisier,$valoare);
$citeste_fisier_punct=fread($deschidere_fisier,($marime_fisier-$valoare));
echo $citeste_fisier_punct;
fclose($deschidere_fisier);
?>

Listing 12.19. Folosirea funcţiei fseek()

În listing-ul de mai sus s-a citit o parte din fişierul index.txt, începând de la un punct determinat de
funcţia fseek(). Mai întâi s-a calculat o valoare care va fi pasată funcţiei fseek(), care va determina un
salt până la valoarea obţinută, iar din acest punct va începe citirea. La variabila valoare s-a stabilit
între paranteze tipul rezultatului care se va obţine.

Figura 12.11. Rezultatul obţinut în urma utilizării funcţiei fseek()

12.9.3. Scrierea într-un fişier

Procesul de scriere într-un fişier se poate face cu ajutorul funcţiilor fwrite() sau fputs(). Funcţia
fwrite() acceptă drept argumente o valoare de tip fişier şi un şir de caractere, iar apoi scrie şirul de
caractere în fişier. Funcţia fputs() funcţionează la fel ca şi fwrite().

fwrite ($variabila_fisier_deschis, sir_caractere)


La sfârşitul argumentului sir_caractere trebuie plasat terminatorul de linie „\n”.

<?php
$deschidere_fisier=@fopen("index.txt","w") or die("Nu s-a putut deschide fisierul");
fwrite($deschidere_fisier,"Fwrite scrie un text peste ceea ce deja exista in fisierul
respectiv.
<br>La sfarsitul sirului care este scris se va adauga terminatorul de linie.\n");
fclose($deschidere_fisier);
$deschidere_fisier=@fopen("index.txt","r") or die("Nu s-a putut deschide fisierul");
$citire=fgets($deschidere_fisier,1024);
echo $citire;
fclose($deschidere_fisier);
?>

Listing 12.20. Utilizarea funcţiei fwrite()

Dacă fişierul s-ar salva în directorul rădăcină a server-ului de Web şi apoi ar fi rulat cu ajutorul
browser-ului, rezultatul ar fi următorul:
Figura 12.12. Rezultatul obţinut în urma utilizării funcţiei fwrite()

Pentru a putea folosi funcţia fputs() trebuie ca fişierul să fie deschis pentru adăugarea de date. Ca şi
fwrite(), şi această funcţie are ca argument o valoare de tip fişier şi un şir de caractere care se va
adăuga la sfârşitul fişierului. Şirul de caractere se încheie întotdeauna cu terminatorul de linie.

<?php
$deschidere_fisier=@fopen("index.txt","a") or die("Nu s-a putut deschide
fisierul");
fputs($deschidere_fisier,"Fputs adauga textul la sfarsitul fisierului.\n");
fclose($deschidere_fisier);
$deschidere=@fopen("index.txt","r") or die("Nu s-a putut deschide fisierul");
while(!feof($deschidere))
{$citire=fgets($deschidere);
echo $citire;
echo '<br>';}
fclose($deschidere);
?>

Listing 12.21. Utilizarea funcţiei fputs()

Dacă fişierul s-ar salva în directorul rădăcină a server-ului de Web şi apoi ar fi rulat cu ajutorul
browser-ului, rezultatul ar fi următorul:

Figura 12.13. Rezultatul obţinut în urma utilizării funcţiei fputs()

12.9.4. Blocarea accesului la fişiere

În cazul în care script-urile de citire, modificare, scriere asupra fişierelor sunt folosite de mai mulţi
utilizatori, este nevoie ca acestea să fie protejate. În acest caz se poate folosi funcţia flock() care
blochează un fişier astfel încât alte procese să fie avertizate să nu scrie sau să citească un fişier în
timp ce procesul curent lucrează cu el.
Funcţia flock() primeşte drept argument o valoare de tip fişier şi o constantă care reprezintă tipul de
blocaj care se doreşte aplicat.

flock ($indicator_fisier, int operaţie)


Argumentul operaţie poate fi:

1. LOCK_SH – tip de blocaj partajat, adică permite altor procese să citească fişierul, dar
scrierea este interzisă;
2. LOCK_EX – tip de blocaj exclusiv, adică se interzice oricărui proces atât scrierea, cât şi
citirea;
3. LOCK_UN – tip de blocaj eliberare, adică se eliberează un fişier blocat în modul partajat sau
exclusiv.
Exemplu de contor de vizitatori folosind lucrul cu fişiere

<?php
$fisier_contor="contor.txt";
if(file_exists($fisier_contor))

{$deschide_fisier=@fopen($fisier_contor,"r+");
$contor=@fgetc($deschide_fisier);
$contor=$contor+1;
fclose($deschide_fisier);
$deschide_fisier=@fopen($fisier_contor,"w");
fputs($deschide_fisier,$contor);
}
else
{$creeaza_fisier=@fopen($fisier_contor,"w");
$contor="1";
fwrite($creeaza_fisier,$contor);
fclose($creeaza_fisier);
echo $count;
}
?>

Listing 12.22. Contor de vizitatori

12.10. Manipularea directoarelor

1. Crearea directoarelor se realizează cu ajutorul funcţiei mkdir(). Funcţia primeşte ca argumente:


• un şir de caractere care reprezintă calea către directorul care se doreşte creat;
• un număr întreg octal care reprezintă modul care se atribuie noului director. Numărul octal
se va preciza cu un 0 în faţă şi reprezintă permisiunea pentru proprietarul directorului.
Funcţia mkdir() întoarce o valoare booleană. Numărul întreg octal poate fi 0777 care acordă
permisiune globală pentru citire/scriere, 0755 prin care toţi utilizatorii grupului şi proprietarul
directorului au drept de citire/executare. În plus, proprietarul are şi drept de scriere.

mkdir („nume_dosar”, int permisiune)


2. Ştergerea unui director se face cu ajutorul funcţiei rmdir(). Condiţia care se impune la ştergere
este ca directorul să fie gol. Funcţia are un singur argument care este un şir de caractere ce
reprezintă calea relativă a dosarului care se doreşte şters.

rmdir („nume_dosar”)
3. Deschiderea unui director pentru citire se realizează cu ajutorul funcţiei opendir(). Această
funcţie este necesară dacă se doreşte accesul la fişierele conţinute de un director. Acesteia îi trebuie
un singur argument care este un şir de caractere ce reprezintă calea completă către directorul care se
doreşte deschis. Funcţia va întoarce o valoare de tip manipulator de directoare, în cazul în care a
putut să îl deschidă, în caz contrar va returna false.

opendir („cale_nume_dosar”)
4. Citirea conţinutului unui director se realizează cu ajutorul funcţiei readdir(). Funcţia poate fi
apelată doar dacă directorul a fost deschis. Aceasta are ca argument manipulatorul obţinut în
momentul în care directorul a fost deschis şi returnează numele următorului fişier sau subdirector.

readdir ($manipulator_dosar_deschis)
5. Închiderea unui director deschis anterior prin funcţia opendir() se face cu ajutorul funcţiei
closedir(). Funcţia are ca argument manipulatorul de director returnat de acesta şi nu returnează
nimic.

closedir ($manipulator_dosar_deschis)
6. Modificarea directorului curent de lucru se face cu ajutorul funcţiei chdir(). Această funcţie
permite modificarea directorului curent şi are ca argument numele directorului care se doreşte
accesat. Va întoarce o valoare booleană.

chdir (“nume_dosar”)
7. Aflarea căii complete către un director se face prin funcţia getcwd(). Funcţia nu are nici un
argument şi va returna calea completă pentru directorul curent dacă a putut să fie determinată, în caz
contrar va returna false.

Funcţia scandir() afişează o listă de fişiere şi directoare conţinute de calea specificată. Are ca
argument un şir de caractere care reprezintă numele directorului şi va returna o matrice de fişiere şi
dosare din cadrul directorului.

S-ar putea să vă placă și