P. 1
INVATAM_PHP

INVATAM_PHP

|Views: 293|Likes:
Published by tazy74

More info:

Published by: tazy74 on Feb 15, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

02/26/2014

pdf

text

original

PHP

1.
Unelte de baza - ce aveti nevoie pentru un site profesionist. 2. Despre PHP - ce este şi instrucţiuni pentru începători. 3. Variabile în PHP - ce sunt şi cum se folosesc. 4. Variabile predefinite 5. Domeniul de vizibilitate al variabilelor - Cum se pot accesa variabilele. 6. Tipuri de variabile 7. Afişarea mesajelor în PHP 8. Construieşte un site cu php 9. Câteva informaţii despre documentarea şi depanarea unui script. 10. Operatori PHP 11. Câteva idei utile pentru securitatea paginilor web 12. Structuri de control în PHP 13. Despre funcţii în PHP 14. Clase şi obiecte în PHP 15. Crearea imaginilor thumbnails 16. Autentificarea în paginile restricţionate şi câteva informaţii despre cookie, uploadul fişierelor şi includerea lor în pagini, precum şi informaţii despre starea conexiunii. 17. Descrierea funcţiilor care pot fi utilizate la manipularea tablourilor 18. Lucrul cu fişiere şi directoare 19. Descrierea funcţiilor de prelucrare a fişierelor 20. Funcţii care faciliteaza lucrul cu directoare 21. Valori scalare şi tablouri 22. Lucrul cu formulare 23. Conversia tipurilor de variabile 24. Scrierea instrucţiunilor swich, break şi default 25. Scrierea instrucţiunilor for 26. Scrierea instrucţiunilor while şi do while 27. Introducere în Clase PHP 28. Sesiuni în PHP 29. Crearea şi utilizarea funcţiilor 30. Utilizarea fişierelor incluse 31. Funcţii PHP pentru expresii regulate 32. Utilizarea referinţelor în PHP 33. Lucrul cu funcţii listă 34. Interoperabilitate PHP-Java 35. Transmiterea mesajelor prin e-mail folosind PHP şi PEAR 36. Informaţii despre clasele încărcate 37. Prelucrarea dinamică a imaginilor 38. Funcţii PHP utilizate pentru accesarea şi interogarea bazelor de date MySQL 39. Utilizarea şirurilor 40. Manipularea şirurilor şi scrierea expresiilor regulate 41. Utilizarea variabilelor cookie 42. Expedierea mesajelor de poştă electronică 43. Stocarea unor date ierarhice într-o bază de date 44. PHP 5, Factory 45. PHP 5, SQLite în Factory?

Unelte de baza - ce aveti nevoie pentru un site profesionist.

De ce să folosiţi PHP în loc de HTML sau ASP sau PERL? Pentru că, faţă de alte limbaje, PHP este gratuit. Să spunem că aveţi de făcut un site care va conţine peste 150 de pagini. Dacă ar fi să îl faceţi în HTML, ar dura ceva vreme. Ok. Să zicem că site-ul este gata, dar acum vreţi să schimbaţi fontul şi culorile textului şi ale link-urilor în toate cele 150 de pagini. Vă apucă durerea de cap doar când vă gândiţi ce aveţi de făcut. În schimb, în PHP, acest lucru şi multe altele sunt foarte simple. Dacă site-ul respectiv ar fi fost făcut în PHP pe module, tot ce ar fi trebuit să faceţi este ca în partea care conţine informaţiile despre text să schimbaţi informaţile despre text şi link aşa cum doriţi şi modificarea este aceeaşi pentru toate paginile. Simplu nu? Pentru a rula exemplele şi scripturile existente pe acest site pe calculatorul dvs. de acasă sau pe pagina proprie trebuie să aveţi instalate şi configurate câteva aplicaţii de care o sa vorbim în continuare. Nu trebuie să aveţi cunoştinţe preliminare de baze de date sau programare. Simpla studiere a codului sursa şi aplicarea exemplelor vă poate lămurii ce poate face php. Deci, dacă vă credeţi pregătiţi cititi în continuare...

Unelte de bază
Crearea unor pagini dinamice la un nivel performant, precum şi punerea lor în funcţiune, nu poate fi făcută fără anumite programe. Iată cam de ce aveţi nevoie: Browsere - Pentru testarea paginilor este nevoie de mai multe browsere pentru că nu toate afişează acelaşi rezultat şi este neprofesional să obligaţi vizitatorul să folosească un anumit browser doar pentru că pagina făcută de voi arată şi merge mai bine cu acel browser. Deci vă recomand să instalati 2-3 browsere pentru teste. Dintre cele mai folosite în prezent vă recomand Internet Explorer (folosit pe calculatoare cu sistem de operare Windows), Firefox (se foloseste din ce în ce mai des datorită extensiilor şi faptului că se poate instala atât pe sisteme de operare Windows cât şi pe Mac OS X sau Linux) şi Opera (care are suport pentru mai multe sisteme de operare). Serverul web pentru teste - Dacă lucraţi cu PHP-MySQL sub Windows, sigur aveţi nevoie de triada Apache - PHP - MySQL să fie instalată pe calculatorul local. Pentru aceasta aveţi două posibilităţi: prima ar fi să descărcaţi de pe pagina producătorului fiecare aplicaţie în parte şi să o instalaţi manual, urmând apoi să faceţi configurarea serverelor manual (lucru nerecomandat începătorilor) şi a doua variantă să descărcaţi un program care instalează toate acestea gata configurate pe calculator, urmând ca voi doar să vă apucaţi de lucru. Astfel de aplicaţii sunt EasyPHP de exemplu (pentru Windows 95-98 dar merge şi pe Windows 2000 şi XP) sau recomandarea mea WAMP5 care merge doar pe Windows NT (adica 2000, XP, 2003, Longhorn, etc) dar care are multe alte facilităţi în plus faţă de EasyPHP pe care cu timpul când veţi învăţa mai multe despre PHP si MySQL o să le consideraţi foarte utile (cum ar fi posibilitatea de testare a scripturilor PHP atât pentru versiunea 4 cât si 5). Ultima recomandare, atât pentru cei care folosesc sistemul de operare Windows cât şi Linux, ar fi XAMP care conţine toate pachetele necesare instalării şi configurării unui server de web profesional (inclusiv server de FTP, SSI, DNS şi MAIL), dar pe care nu îl recomand începătorilor pentru că mulţimea de facilităţi oferite vă poate încurca. Editoare web - După ce aţi instalat serverul web şi browserele acum vă mai trebuie un editor bun pentru a scrie cod şi a vizualiza paginile create. Pentru aceasta recomandarea mea este suita Macromedia (Dreamweaver, FLASH şi FreeHAND). Puteţi descărca Dreamweaver (pentru a scrie cod şi a vedea/rula paginile în timp real) de la ei de pe site şi tot de la ei vă mai recomand Fireworks (dacă vă ocupaţi şi cu design-ul paginilor aceasta aplicaţie vă este utilă împreună cu Adobe Photosop sau Corel Draw) şi Flash (dacă doriţi să faceţi animaţie pentru site). Desigur sunt o mulţime de programe care fac aceleaşi lucruri cu ce vă recomand eu, dar dacă doriţi să lucraţi la nivel profesional recomand să lucraţi cu unelte de profesionişti. Bineânţeles că puteţi scrie cod şi în Notepad şi desena în Paint dar aplicaţiile pe care vi le-am recomandat vă uşurează extraordinar de mult munca şi vă semnalează rapid erorile din pagini. Alte editoare pe care vi le recomand să le testaţi sunt: PSPad (un bun înlocuitor al Notepadului, mai ales că este freeware), Zend Studio (destinat profesioniştilor).

După ce aţi făcut rost de tot ce vă trebuie ca să începeţi treaba, vă recomand să citiţi în continuare celelalte articole, eventual să vizitaţi şi pagina de download, sigur găsiţi ceva util acolo pentru început, apoi pagina de link-uri, unde găsiti resurse gratuite şi să discutăm pe forum eventualele probleme pe care le întâmpinaţi.

Despre PHP - ce este şi instrucţiuni pentru începători.

Despre PHP
PHP este limbajul ideal pentru construirea de pagini web dinamice. Este usor de învăţat, opensource, poate fi rulat pe mai multe platforme şi se poate conecta la mai multe tipuri de baze de date. Cel mai important aspect al limbajului este însa posibilitatea de a fi îmbricat cu cod HTML. Putem astfel crea pagini HTML statice şi din loc în loc, acolo unde este nevoie, să introducem dinamism cu ajutorul PHP. Limbajul PHP s-a "născut" în 1994 din nevoia lui Rasmus Lerdorf de a afla câte persoane îi vizitează CV-ul online. El a denumit setul de scripturi create PHP, acronimul pentru Personal Home Page. Pe parcursul următorilor trei ani limbajul a evoluat dar adevăratul succes a început să îl cunoască de când Zeev Suraski si Andi Gutmans au rescris motorul PHP de la cap la coadă, motor care poartă din versiunea 4 a PHP numele Zend, o combinaţie de litere din prenumele creatorilor săi: Zeev şi Andi. Fiind open-source, PHP beneficiază de suport activ din partea comunităţii online, acesta fiind şi motivul creşterii explozive a numărului site-urilor bazate pe PHP. Interpretorul PHP este cel mai cunoscut limbaj de scripting folosit în acest moment pentru crearea site-urilor Web interactive. Denumirea este un "acronim recursiv" pentru Hypertext PreProcessor. Diferenţa esenţială faţă de alte limbaje de scripting (gen JavaScript) este faptul că PHP este un interpretor server-side (operaţiile sunt executate de către server şi nu pe calculatorul utilizatorului). Pentru a putea testa pagini PHP aveţi nevoie de un server de web (Apache) şi de pachetul PHP instalat. PHP permite folosirea unor elemente specifice limbajelor de programare. Ieşirea standard a script-ului PHP devine intrarea standard pentru programul de navigare care vizualizează pagina. Aşadar, la iesirea standard poate fi scris (de exemplu, prin intermediul comenzii echo) orice tip de cod HTML, acesta fiind interpretat de către browser. Pe lângă manipularea conţinutului paginilor de web, PHP poate trimite headere HTTP pentru autentificare, seta cookie-uri sau redirecţiona utilizatorii. Mai mult, cu ajutorul bibliotecilor externe de funcţii poate parsa fisiere XML, crea şi manipula imagini, animaţii Shokwave Flash, PDF-uri sau se poate conecta la un server de mail, iar acestea sunt doar câteva din funcţiile pe care le poate îndeplini. Interpretorul PHP parcurge documentul accesat până în momentul în care întâlneşte un marcaj de deschidere care indică faptul că textul care urmează trebuie interpretat ca fiind cod PHP. În continuare, textul este interpretat ca fiind cod PHP până în momentul în care este întâlnit marcajul de inchidere. Întreg textul care nu este interpretat ca fiind cod PHP este furnizat la iesire în forma în care a fost primit ca intrare de catre interpretor. Există mai multe marcaje care indică începerea unei secvenţe de cod PHP, dar doar două dintre ele sunt folosite de obicei (aceste marcaje depind şi de configurarea serverului de web). Dacă dorim ca documentul să respecte specificaţiile XML, atunci singura posibilitate de inserare a codului PHP este folosirea unei secvente de tipul:

Cod:

<?php //cod PHP

?>
Cea de-a doua posibilitate este utilizarea marcajului <SCRIPT> într-o maniera asemănătoare celei folosite pentru includerea de script-uri JavaScript. Sintaxa este urmatoarea:

Cod:

<SCRIPT language = "php"> //cod PHP </SCRIPT>
Există alte două posibilităţi, dar acestea sunt folosite rar, în situaţii particulare şi depinde în mare măsură de setările serverului de web. Este permisă "iesirea" şi "intrarea" în "modul PHP" de oricâte ori este necesar în pagină. Aceasta este util când se lucrează cu texte de mari dimensiuni. Pentru ca instrucţiunile PHP să fie interpretate corect, acestea trebuie separate prin caracterul ';'. În PHP, comentariile pot fi inserate folosind sintaxele din C, C++ şi shell-urile Unix. Apariţia secventei de caractere '//' sau a caracterului '#' indică faptul că restul liniei reprezintă un comentariu. Pentru a insera comentarii pe mai multe linii, acestea trebuie delimitate de secventa '/*' la început şi de secventa '*/' la sfârşit.

Variabile în PHP - ce sunt şi cum se folosesc.

Variabile în PHP
Programarea de orice fel, nu doar PHP, are două elemente de bază: datele şi instrucţiunile. Pentru a lucra cu datele trebuie să înţelegem ce sunt variabilele şi tipurile, iar pentru a lucra cu instrucţiuni trebuie să aflăm ce sunt structurile de control şi funcţiile. O variabilă este o zonă de memorie căruia i se dă un nume pentru a putea fi recunoscută ulterior şi pentru a ne putea referi mai târziu la ea. În PHP, o variabilă este reprezentată de semnul '$', urmat de numele variabilei. La fel ca în limbajele C/C++ sau Java, pentru denumirea variabilelor se face distincţia între literele mari şi literele mici. Numele unei variabile poate începe cu o liniuţă de subliniere '_' sau o literă. Restul caracterelor care formează numele variabilei pot fi litere, cifre sau liniuţe de subliniere. În PHP, sunt considerate litere toate caracterele cuprinse între 'a' şi 'z', cele cuprinse între 'A' şi 'Z', precum şi cele care au codul ASCII cuprins între 127 şi 255. Începând cu versiunea 4, au fost introduse referinţele; astfel, o variabilă poate referi o alta, astfel încât modificarea valorii uneia duce la modificarea automată a valorii celeilalte. O referinţă la o variabilă este reprezentată de caracterul '&'. Iată un scurt exemplu:

<?php $a = "PHP4 e slab"; $b = &$a; $b = "PHP4 e foarte bun"; echo $a; echo "<br>";

Cod:

adică se poate folosi oriunde în script. fără apelarea ei ca funcţie globală (adică nu trebuie să o cereţi cu global $_SERVER în funcţiile dvs. . Puteţi chiar crea pagini HTML fără pic de cod PHP în ele şi să le daţi extensia php.conţine o serie de variabile ale căror valori sunt setate de server-ul web. majoritatea valorilor variabilelor din acest vector depind de mediul de execuţie al script-ului curent.codul PHP începe întotdeauna cu "<?php" şi se termină cu "?>". Această variabilă superglobală este accesibilă începând cu versiunea 3. Exemplu: Cod: <?php // sa spunem ca avem un formular in care exita un camp numit "camp1" si care se trimite prin metoda POST: // cu register_globals=ON $camp1 = "valoarea campului".. ?> Variabile globale: $GLOBALS . $camp1 = $_POST['camp1'].putem pune diacritice în cadrul unui string însă pentru ca browserul să le afişeze corect va trebui să specificăm în <head> setul de caractere folosit. acest vector este indexat chiar prin numele variabilelor globale. modificarea valorii variabilei $b a dus automat la modificarea automată a valorii variabilei $a.0 $_SERVER . sau informaţii despre vizitator şi browser. Este o variabilă care conţine informaţii cum ar fi headere. În versiunile anterioare se folosea $HTTP_SERVER_VAR . ?> După cum se vede. Omiterea semnului ".1. el va trimite pagina neschimbată către server. El poate fi îmbricat cu cod HTML după cum puteţi vedea în exemplul de mai sus.0 metodele predefinite pentru preluarea variabilelor externe depind de setarea din php.0. .echo $b.. A fost introdusă începând de la versiunea 4.1. la fel ca într-un document HTML.toate instrucţiunile PHP se termină cu punct şi virgulă.valoarea unei variabile poate fi schimbată după necesităţi (aşa cum am schimbat valoarea lui $a) sau ea va fi schimbată automat în funcţie de celelalte variabile de care depinde.ini a variabilelor globale (register_globals)." este cea mai frecventă greşeală pe care o fac programatorii începători. . locaţia scriptului. Este posibil ca în funcţie de setările fiecărui server şi browser să nu fie active toate informaţiile specificate de această variabilă. // cu register_globals=OFF $_POST['camp1'] = "valoarea campului".0. Atâta vreme cât parser-ul PHP nu "vede" tagurile "<? php .) În schimb . Variabile predefinite Începand de la versiunea 4.pot fi accesate toate variabilele globale care sunt accesibile script-ului PHP curent. Această variabilă este de asemenea globală.?> ". Să disecăm codul pentru a învăţa câteva lucruri: . Astfel dacă pe server este setată register_globals=ON (nerecomandat) se pot prelua de exemplu variabilele trimise prin GET şi POST apelând direct variabila.

Conţine tipul de encodare trimis de cerera curentă prin header. Exemplu: ' en '.Conţine informaţii despre conecsiiunea trimisă de cererea curentă prin header.bar . ' GATEWAY_INTERFACE ' . ' HTTP_ACCEPT_ENCODING ' . ' SERVER_SOFTWARE ' .$HTTP_SERVER_VARS conţine aceleaşi informaţii dar nu este o funcţie globală (atenţie $HTTP_SERVER_VARSşi $_SERVER sunt două variabile diferite.Returnează un şir de identificare al server-ului dat în header ca raspuns la cerere.0. $_SERVER['PHP_SELF'] într-un script la adresa http://example. de la pagina care a fost accesată.utf-8 '.Conţine limbajul trimis de cererea curentă prin header. ' HTTP_ACCEPT_CHARSET ' . ' PUT ') ' REQUEST_TIME ' . Este valabilă începând de la versiunea PHP 5. dacă există. ' SERVER_NAME ' . ' HTTP_CONNECTION ' .*.Sirul de interogare. ' DOCUMENT_ROOT ' .Numele şi versiunea protocolului prin care este cerută pagina (exemplu ' HTTP/1. ' HEAD '.conţine numele fişierului unde se execută scriptul curent. va da acces C-style la parametrii liniei de comanda. relativ la rădacină (document root) De exemplu.Conţinutul header-ului acceptat de la cererea curentă. Dacă scriptul rulează pe un host virtual. ' POST '.Conţine un număr al parametrilor liniei de comandă trimise către script (daca este rulat în linie de comanda). Exemplu: ' gzip '.Directorul radăcină unde este rulat scriptul curent. aceasta va conţine valoarea definită pentru acel host virtual.0 ') ' REQUEST_METHOD ' . ' HTTP_ACCEPT_LANGUAGE ' . Constanta __FILE__ conţine toată calea şi numele fişierului curent. acesta va conţine un sir de interogare.returnează metoda utilizată pentru accesarea paginii (exemplu ' GET '.Un array al argumentului trimis către script.Numele server-ului de hosting unde se execută scriptul curent. Exemplu: ' iso-8859-1.php/foo. . dacă există.1. dacă este. Exemplu: ' Keep-Alive '. ' argc ' .. Când este accesat prin metoda GET.Valoarea timestamp dată la pornirea cererii.bar va fi /test.com/test.Conţine setul de caractere acceptate şi care este trimis de header-ul cererii respective. ' QUERY_STRING ' .1 '). dacă este unul.Returneaza versiunea CGI utilizată pe server (exemplu ' CGI/1.php/foo. Când scriptul rulează în linie de comandă. chiar dacă aparent fac aceleaşi lucruri) Dacă directiva register_globals este ON atunci aceste variabile vor deveni la rândul lor variabile globale în cadrul scriptului. dacă exista. aşa cum este definit în fişierul de configuraţie al serverului. Elementele acestor variabile sunt cele de mai jos (atenţie: în funcţie de setările serverului şi browserului unele elemente pot lipsi) ' PHP_SELF ' . ' HTTP_ACCEPT ' . ' argv ' . dacă există. ' SERVER_PROTOCOL ' .

' SCRIPT_FILENAME ' .conf pentru a defini PATH_INFO . ' SCRIPT_NAME ' .Valoarea dată de directiva SERVER_ADMIN (pentru Apache) în fişierul de configurare al web serverului. dacă există. de exemplu ' /index. dacă există. acesta va conţine valoarea definită pentru acel host virtual. de exemplu.Conţine un şir care cuprinde versiunea serverului şi numele hostului virtual dacă este.Portul prin care userul comunică cu serverul web.Când rulaţi sub Apache ca modul.3. şi chiar unele au posibilitatea de a modifica HTTP_REFERER aşa cum vor. De exemplu în Apache va trebui HostnameLookups On în fişierul de configurare httpd. PATH_TRANSLATED nu mai este setat implicit în Apache 2 SAPI în contrast cu situaţia din Apache 1. ' SERVER_PORT ' . ca şi cale relativă. Dacă scriptul rulează pe un host virtual. nu este de încredere.Calea absolută unde se execută scriptul curent. În afară de asta.' HTTP_HOST ' .Calea de bază a sistemul de fişiere (nu rădacina documentului) de la scriptul curent. cum ar fi file. unde este setată aceeaşi valoare ca şi la SCRIPT_FILENAME.conf. Atenţie: Serverul web trebuie configurat pentru a crea această variabila. acesta este ' 80 '. Linux 2.Adresa paginii (dacă este) de unde a venit userul în pagina curentă.Adresa de IP a userului care accesează pagina curentă.Conţine calea către scriptul curent.php . Nu toate browserele setează această valoare. Pe scurt. Aceasta este setată de către browser. ' SERVER_ADMIN ' .2. ' HTTPS ' . Pentru setările standard. $_SERVER['SCRIPT_FILENAME'] va conţine calea relativă specificată de către user./file. pentru SSL.URI care este dat pentru accesarea paginii curente.Conţine semnătura browser-ului trimisă prin header la cererea curentă. U.5 [en] (X11. Este inversul DNSului userului bazat pe REMOTE_ADDR.html '. puteţi utiliza get_browser() pentru a vedea ce capabilitaţi are browserul folosit de user şi astfel să returnaţi pagina specifică pentru acel browser. Un exemplu tipic este: Mozilla/4. ' REMOTE_HOST ' . Această schimbare a fost făcută pentru a fi compatibilă cu specificaţiile CGI în care PATH_TRANSLATED trebuie să existe doar dacă PATH_INFO este definit.. Pentru alte detalii vedeţi şi funcţia gethostbyaddr() . ' HTTP_USER_AGENT ' .php sau . ' PATH_TRANSLATED ' . Acesta este util pentru pagini care trebuiesc definite către ele însuşi. ' PHP_AUTH_DIGEST ' . Atenţie: Dacă scriptul este rulat cu CLI. Utilizatorii Apache 2 pot utiliza AcceptPathInfo = On în fişierul de configuraţie httpd. ' SERVER_SIGNATURE ' .Setează o valoare dacă scriptul a fost cerut printr-un protocol securizat HTTPS ' REMOTE_ADDR ' .Portul de pe server care este folosit pentru comunicare pe web. se va schimba cu oricare port definit în transmisia securizată HTTP.Numele hostului userului care vede pagina curentă. valoarea . ' HTTP_REFERER ' . ' REMOTE_PORT ' . header-ul de la cererea curentă. ' REQUEST_URI ' .2.9 i586) . Constanta __FILE__ conţine calea completă şi numele de fişier al scriptului curent. acţiunea Digest HTTP. după ce serverul a terminat maparea oricăror cai ( virtual-to-real mapping) Atenţie: Începând de la PHP 4.Conţine informaţii despre host.

sub formă de array.Conţine numărul curent al liniei din fisier. sunt 5 constante "magice" pe care le prezint în continuare: __LINE__ . A fost introdusă în versiunea 4. În versiunile anterioare. ' AUTH_TYPE ' . Puteţi folosi $_GET pentru a trimite variabile cu valori prin intermediul linkurilor. informaţiile din $_FILES au fost de asemenea incluse în $_REQUEST Variabile de sesiune: $_SESSION conţine variabile care corespund sesiunii curente a script-ului.1. Variabile de mesaje de eroare: $php_errormsg . Variabilele HTTP coockies: $_COOKIE conţine valorile variabilelor care conţin informaţii referitoare la cookie-urile păstrate pe calculatorul utilizatorului care accesează pagina web. A fost introdusă în versiunea 4. În versiunile anterioare folosiţi $HTTP_SESSION_VARS.1.1. ' PHP_AUTH_PW ' . Variabilele pentru cereri: $_REQUEST conţine variabile disponibile prin intermediul oricărui tip de mecanism cu ajutorul căruia utilizatorul poate introduce date.0. A fost introdusă în versiunea 4. respectiv post. Variabile pentru uploadul fisierelor: $_FILES conţine variabile primite de script prin intermediul încărcărilor de fişiere prin metoda post. Variabilele pentru trimiterea datelor: $_GET este o variabilă array globală. şi $_COOKIE. În versiunile anterioare.este o variabilă ce conţine ultimul mesaj generat de către PHP Această variabilă este folosită în scopul de a vedea ce eroare apare şi doar dacă opţiunile de configurare a erorilor track_errors este pornita (standard este pe OFF) Constante predefinite: PHP conţine un mare număr de constante predefinite pentru fiecare script care rulează. această variabilă seteaza tipul de autentificare. $_POST este de asemenea o variabilă array globală. A fost introdus în versiunea 4. această variabilă conţine numele userului trimis de către user.Când este rulat sub Apache sau IIS (ISAPI pe PHP 5) ca modul.0.acestei variabile este setată în 'Authorization' header trimis către client (care ar trebui utilizat pentru a face o validare corespunzătoare).0. Puteţi folosi $_POST pentru a trimite variabile cu valori prin intermediul formularelor. ' PHP_AUTH_USER ' .3.1. actiunea HTTP authentication. $_GETşi $_POST conţin variabile primite de script prin intermediul unor transferuri care folosesc metodele HTTP get.Când este rulat sub Apache ca modul acţiunea HTTP authenticated .0. Începând de la versiunea 4. Pentru versiunile anterioare se foloseşte $HTTP_GET_VARS care nu este variabilă globală. Totuşi. A fost introdus în versiunea 4. A fost introdusa în versiunea 4.0 şi este de asemenea globală. . De exemplu. Variabilele de mediu $_ENV $_ENV conţine variabile disponibile prin intermediul mediului în care este executat. Este de tip array şi conţine valorile variabilelor $_GET .1. actiunea HTTP authentication.0. Pentru versiunile anterioare se foloseşte $HTTP_POST_VARS care nu este variabilă globală. prin intermediul acestor vectori pot fi accesate valorile câmpurilor dintr-un formular care a fost completat şi transmis folosind una dintre cele doua metode. utilizaţi $HTTP_ENV_VARS . $_POST . În versiunile anterioare se foloseşte $HTTP_POST_FILES care nu este variabilă globală.0. această variabilă conţine parola userului trimisă de către user.1. utilizaţi $HTTP_COOKIE_VARS .0.1. A fost introdus în versiunea 4.Când este rulat sub Apache sau IIS (ISAPI pe PHP 5) ca modul.

) Numele metodei este returnat asa cum este declarat (case-sensitive) Domeniul de vizibilitate al variabilelor .Numele metodei clasei (adaugată în versiunea 5.0) În PHP 5 această constantă returnează numele funcţiei care a fost declarată (case-sensitive).0. function test () { echo $a. deci nu are nici o valoare. ?> O a doua posibilitate de a accesa o variabilă definită în afara funcţiei este folosirea vectorului $GLOBALS: . variabila trebuie redeclarată ca variabilă globală în interiorul funcţiei. ?> Observăm că nu se afişează valoarea 1 deoarece instrucţiunea echo $a se referă la variabila locală $a care nu este definită. pe când în versiunile anterioare conţine calea relativă.3.0. echo $a. este o versiune în care instrucţiunea echo $a va accesa variabila $a definită în afara funcţiei test(): Cod: <?php $a = 1. function test () { global $a. __FUNCTION__ .0. Să considerăm următorul exemplu: Cod: <?php $a = 1. o variabilă definită în exteriorul unei funcţii nu va putea fi accesată în interiorul funcţiei chiar dacă ea nu este redefinită în cadrul funcţiei. în afară de câteva cazuri. Începând de la versiunea 4. } test ().0) În PHP 5 această constantă returnează numele clasei care a fost declarată (case-sensitive). Dacă este folosit în interiorul unui fişier inclus. De exemplu.toată calea şi numele fişierului curent.__FILE__ . În PHP o variabilă poate fi accesată doar în contextul în care a fost definită. o variabilă definită în interiorul unei funcţii nu va putea fi accesată decât de instrucţiunile din interiorul acelei funcţii.Numele funcţiei (adăugat în versiunea 4. va returna numele fişierului inclus.2 conţine întotdeauna calea absolută la fişier. în mod implicit. } test (). În PHP 4 această valoare este întotdeauna lowercased (cu litere mici) __CLASS__ .Cum se pot accesa variabilele. În PHP 4 această valoare este întotdeauna lowercased (cu litere mici) __METHOD__ . Mai mult.3. Pentru ca o funcţie să aibă acces la o variabilă definită în afara ei. În continuare.Numele clasei (adaugată în versiunea 4.

sirul "0".o variabilă de tipul NULL. De asemenea. number şi callback. Mai exista şi tipul double. sau FALSE dacă nu este. integer. convenţiile fiind aceleaşi ca şi în limbajele C/C++ sau Java.un număr real este convertit prin "rotunjire înspre 0". şi astfel vom şti dacă să îi acordăm sau nu acces în secţiunea de administrare. După ce se fac verificările.un obiect fără nici o variabilă membru. . rezultatul operaţiei 3/2 nu va fi numărul întreg 1 (ca în C/C++ sau Java).Cod: <?php $a = 1. ?> Tipuri de variabile Variabilele pot fi de mai multe tipuri. ci numărul real (float) 1. De exemplu. În PHP. iar alte două sunt tipuri speciale (resource şi null). În momentul efectuării unei conversii. function test () { echo $GLOBALS ["a"].numărul întreg 0. din motive de lizibilitate. Aceste numere pot fi specificate în baza 10. . de obicei. Trebuie remarcat faptul că în PHP nu există nici un operator pentru efectuarea de împărţiri întregi. funcţia noastră va returna o valoare de adevar: TRUE dacă este logat. asadar. . două sunt tipuri compuse (array şi object). . Orice altă valoare este convertită la valoarea TRUE (inclusiv resursele). valoarea reală 2.sirul vid. Acest tip se poate folosi de exemplu pentru verificarea logării într-o pagină de administrare. sunt convertite la valoarea FALSE următoarele valori: . Interpretorul PHP nu oferă suport pentru numerele întregi fară semn. în baza 16 sau în baza 8.valoarea logică TRUE este convertită la valoarea întreagă 1.o variabilă nedefinită. PHP are opt tipuri de variabile. .5 Şi pentru numerele întregi există posibilitatea efectuării de conversii: . . Aceste valori pot fi indicate prin cuvintele cheie TRUE sau FALSE (pentru ambele nu se face distincţie între literele mari şi literele mici). . în timp ce valoarea reală -2. ci este stabilit în timpul execuţiei în funcţie de contextul în care este folosită variabila. . . Modul de reprezentare depinde de platforma utilizată.5 va fi convertită la valoarea întreagă 2.0. Cele două denumiri coexistă doar din motive "istorice". } test ().valoarea logică FALSE este convertită la valoarea întreagă 0. de obicei se foloseşte reprezentarea pe 32 de biti. tipul unei variabile nu este specificat de către programator. . Tipul boolean: Variabilele de acest tip pot avea doar două valori: ADEVARAT sau FALS. dacă utilizatorul este logat ca administrator.5 va fi convertită la valoarea întreagă -2. nu doar numere. dar semnificaţia acestuia este aceeaşi cu cea a tipului float.numărul real 0. Patru dintre acestea sunt tipuri scalare (boolean.un vector fără nici un element. Tipul integer: O variabilă de tip integer reprezintă o valoare din mulţimea numerelor întregi. au fost introduse trei pseudotipuri: mixed. float şi string). Există posibilitatea de a converti o variabilă de orice tip la tipul boolean.

instrucţiunea: Cod: $str=<<<SF Acesta este un exemplu de utilizare a sintaxei heredoc SF. semnul dolar ("\$").notaţia heredoc.prin folosirea ghilimelelor simple (exemplu $a='acesta este un sir de caractere').3}") şi secvenţele de caractere pentru specificarea faptului că o expresie regulară este în notaţie hexazecimală ("\x[0-9A-Fa-f]{1. secvenţe de caractere pentru specificarea faptului că o expresie regulară este în notaţie octală ("\[0-7]{1.. Lungimea variabilelor de tip string nu este limitată de către interpretor. La fel ca şi în cazul tipului integer.2. pe lângă caracterele de la varianta anterioara. Tipul float: O variabilă de tip float poate fi specificată folosind fie forma zecimala. iar pentru a putea specifica simbolul "\" acesta trebuie dublat. de asemenea şirul "10 ani" va fi convertit tot la valoarea 10.3. numerele de variabile care apar în interior vor fi transformate în valoarea lor. Literalii de tip şir de caractere pot fi specificaţi în trei moduri diferite: .un sir de caractere este convertit luând în considerare doar primele caractere care conţin informaţii numerice. şi acelaşi identificator pe o altă linie vor constitui valoarea sirului de caractere.în toate celelalte cazuri se realizează conversii la numere întregi care apoi sunt convertite la valorile reale corespunzătoare.prin folosirea ghilimelelor duble." Folosirea operatorului "+" nu va concaterna cele două şiruri. printre care: sfârşit de linie ("\r"). De exemplu dacă $a este o variabilă de tipul integer şi are valoarea 2. fie cea ştiinţifică (cu exponent). Există posibilitatea de a converti o variabilă de orice tip la tipul string. ghilimelele duble ("\""). tab orizontal ("\t"). rezultatul conversiei va fi valoarea 0. Pentru a avea în cadrul şirului simbolul "`". Există posibilitatea de a converti o variabilă de orice tip la tipul float. va avea ca rezultat un şir de caractere format din trei linii de text. . Tipul string: O variabilă de tip string reprezintă un şir de caractere. atunci sirul de caractere "Variabila a are valoarea $a. indicile caracterului care trebuie accesat scris între acolade. dacă primele caractere nu conţin informaţii numerice. .2}"). $str{0} returnează primul caracter din şirul de caractere $str. În cazul în care dorim să concaternăm două şiruri de caractere vom folosi operatorul ". folosind acest mod de specificare a literalilor de acest tip. Pentru numerele reale se pot efectua următoarele conversii: . Un caracter se reprezintă pe un octet.2" va fi convertit la valoarea reală 10. Folosind această notaţie pot fi specificate mai multe caractere speciale. Pentru a accesa un anumit caracter din şirul de caractere se foloseşte. Cel mai important lucru este acela că. aşadar şirul "10" va fi convertit la valoarea întreagă 10. De obicei se foloseşte standardul IEEE 64." va fi transformat în şirul "Variabila a are valoarea 2". rând nou ("\n"). Acest tip de notaţie a fost introdus la versiunea 4 a interpretorului PHP.23E1 ani" va fi convertit la valoarea 12. deci sunt 256 de caractere distincte. . aşadar şirul "10. Pentru şirurile de caractere se pot efectua următoarele conversii: . De exemplu. şirul "1. atunci înaintea acestuia trebuie scris caracterul "\". De exemplu. Acest lucru implică faptul că interpretorul PHP nu oferă suport nativ pentru setul de caractere Unicode. precizia variabilelor de tipul float este dependentă de platforma utilizată. după numele variabilei de tip string.un şir de caractere este convertit luând în considerare doar primele caractere care conţin informaţii numerice. Pentru a specifica un sir de caractere folosind această notaţie trebuie utilizat operatorul "<<<" urmat de un identificator ales de utilizator. Toate caracterele care se află între operatorul "<<<" urmat de un identificator pe o singură linie.

Cheile elementelor vor fi date de denumirile proprietăţilor obiectului (variabilele membru ale obiectului)... Cheia acestuia va fi numărul întreg 5. iar celălalt de tip boolean: $a = array ("ch" => "string". Prin conversia la un vector a unei variabile de tip scalar (boolean. "b" => 12).. ... iar valorile elementelor vor fi valorile proprietăţilor obiectului. atunci acesta este creat automat. $a ["ch"] are valoarea string. atunci noul element va avea cheia 0. Tipul array .. Sintaxa are forma $vector [] = valoare. tabele de dispersie.. De exemplu. float. iar valoarea FALSE va fi convertită la numărul întreg 0. următoarea înstrucţiune PHP va construi un vector cu două elemente. următoarele două secvente sunt echivalente: $a [5] = 1. colecţii. Dacă realizăm o conversie a unei variabile de tip NULL. Cheile pot avea şi valori negative. unde n reprezintă un număr unic ataşat resursei respective de către interpretorul PHP. . 56..) De exemplu.. există posibilitatea de a crea un element nou fără a-i preciza cheia... Fiecarei chei din vector i se ataşează o valoare... Nu se pot folosi pentru chei variabile de tipul array sau object.. la care se adaugă valoarea 1. dintre care unul este de tip string.. cheia acestui element este numărul întreg 0.....obiectele sunt întotdeauna convertite la şirul "Object". array (5 => 43.. în cazul în care vectorul $a nu există. Dacă nu există nici o astfel de cheie. 6 => 32... Acest tip de date este optimizat astfel încât să poată fi folosit în locul următoarelor structuri de date: liste.. iar valoarea sa va fi 42. 12 => TRUE).. cheie => valoare. .. atunci rezultatul va fi un vector vid (care nu conţine nici un element). atunci se va crea un vector cu un singur element. $a [] = 2..un număr întreg va fi convertit la un şir de caractere care reprezintă valoarea numărului în baza 10. Datorită faptului că o valoare poate fi reprezentată de un alt vector. Dacă se converteşte un obiect (variabila de tip object).valoarea logică TRUE va fi convertită la şirul "1". Dacă se foloseşte valoarea logică TRUE ca şi cheie. Pentru început. dicţionare. cozi şi altele.. string) sau resource se creează un vector cu un singur element. integer. următoarele două instrucţiuni sunt echivalente: array (5 => 43. 7 => 56.. În cazul în care nu se specifică o cheie pentru o valoare... .. Variabila $a reprezinta un vector.. . $a [6] = 2. stive.. .... această instrucţiune are ca efect adăugarea unui element a cărui cheie este un numar întreg mai mare cu 1 decât cel mai mare număr întreg care este cheie a unui alt element al vectorului.... $a [5] = 1. Dacă nu există chei de tip integer.. prezint un vector al cărui elemente reprezintă caracteristicile unei portocale: Cod: $a = array ('denumire' => 'portocala'. atunci aceasta va fi convertită la cheia de tip întreg 1. . O variabilă de tip array se poate modifica prin setarea explicită de valori. atunci vectorul rezultat va conţine câte un element pentru fiecare variabilă membru a obiectului.un număr real va fi convertit la un şir de caractere care reprezintă notaţia ştiinţifică a acestuia.. adaugă în vectorul $a valoarea 42 ataşată cheii "x".variabilele de tipul resource sunt convertite la şirul "Resource id #n"... Valoarea unei variabile de tip vector se poate specifica folosind construcţia array (cheie => valoare.. iar $a [12] are valoarea TRUE... "b" => 12).... De exemplu instrucţiunea $a ["x"] = 42. .valoarea NULL este convertită la şirul vid (""). iar valoarea este cea a variabilei convertite.. În continuare sunt prezentate câteva exemple care descriu mai detaliat posibilităţile oferite de folosirea vectorilor în PHP. De exemplu. De asemenea. . Aşadar printr-o instrucţiune de forma $a [5] = 42. atunci valoarea va fi ataşata cheii 0.. atunci acea valoare va fi ataşată unei chei care va fi cheia maximă de tip integer folosită anterior.. Dacă se foloseşte un vector care nu a fost definit anterior... iar valoarea logică FALSE va fi convertită la şirul vid (""). 32..Vectorii în PHP sunt nişte mulţimi formate din chei.. se pot simula foarte uşor arborii n-dimensionali sau tablourile n-dimensionale..

$v['culoare'] = 'portocaliu'. 'culoare' => 'portocaliu'. am putea avea nevoie de o valoare suplimentară căreia nu dorim să îi atribuim nici un nume de identificare (cheie).'familie' => 'citrice'. De exemplu. vom putea defini vectorul astfel: Cod: $a = array ('denumire' => 'portocala'. 'gust' => 'dulce' ). "<b>Acest text este <i>$color!</i>". `blue`. Exemplul următor ilustrează cum puteţi folosi vectorii la afişarea unei pagini cu text colorat: Cod: $colors = array (`red`. 'forma' => 'rotunda'. $v['gust'] = 'dulce'. $v['forma'] = 'rotunda'. foreach { echo echo echo } ($colors as $color) "<FONT size = 4 color = $color>". `silver` ). O alternativă de construire a acestui vector este următoarea: Cod: $v['denumire'] = 'portocala'. `green`. 'culoare' => 'portocaliu'. 'familie' => 'citrice'. Tipul object: Pentru a defini un obiect care poate fi folosit pentru afişarea mesajului SALUTARE LUME! se scrie următoarea secvenţă: Cod: class salutare { function Displaysalutare () . 4). 'gust' => 'dulce'. Putem adăuga şi alte elemente care să reprezinte diferite alte proprietăţi. $v['familie'] = 'citrice'. $v[] = 4. Cheia elementului cu valoarea 4 va fi numărul întreg 0 deoarece nu există nici o altă cheie care este număr întreg. "</b></FONT><br>". 'forma' => 'rotunda'. Pentru ca vectorul să conţina un element suplimentar cu valoarea 4.

Astfel. Sintaxa este: $a = new salutare. Sintaxa pentru varianta scurtă este: <?=$foo?> În cazul de mai sus. . ?> Instrucţiunea de mai sus va afişa în browser mesajul introdus între ghilimele. Orice variabilă de un anumit tip poate fi convertită într-un obiect. atunci ea nu va fi modificată. Pentru afişarea propriuzisă a mesajului va trebui să executăm metoda Displaysalutare() printr-o instrucţiune de tipul $a -> Displaysalutare(). . la fel ca şi print. deoarece nu toate serverele au setată în configuraţia lor . dacă doriţi să trimiteţi mai mulţi parametri către echo. efectul conversiei este crearea unei noi instanţe a clasei stdClass. Pentru conversii vom folosi instrucţiuni de tipul $obiect = (object) "SALUTARE LUME!" După realizarea conversiei vom putea tipări mesajul SALUTARE LUME! folosind instrucţiunea echo $obiect->scalar. De fapt. ci mai degrabă un constructor al limbajului şi nu este nevoie să folosiţi parantezele ca pentru o funcţie.a fost deziniţializată (prin intermediul funcţiei unset() ). Dacă variabila respectivă este un obiect. În caz contrar. Resursele sunt create şi utilizate de anumite funcţii speciale. Există chiar şi o variantă mai scurtă a lui echo. Tipul resource: Variabilele de tip resource sunt folosite pentru păstrarea unor referinţe către anumite resurse externe cum ar fi conexiuni la baze de date. nu este chiar o funcţie.nu a fost iniţializată. dar aceasta funcţionează doar dacă este setat în configuraţia php. Sintaxa corectă este: <?php echo("sir de caractere"). fişiere. În toate celelalte cazuri instanţa va conţine o variabilă membru numită scalar a cărei valoare va fi cea a variabilei convertite. Tipul NULL: Valoarea specială NULL este atribuită oricărei variabile care nu a fost iniţializată.i s-a atribuit constanta NULL.ini directiva short_open_tag pe ON. imediat după deschiderea tagului php se va afişa valoarea variabilei $foo.} { echo "SALUTARE LUME!". Dacă variabila are tipul NULL. Afişarea mesajelor în PHP Limbajul PHP oferă mai multe variante de a trimite la browser mesaje şi şiruri de caractere sau chiar cod HTML. Funcţia echo. etc. Datorită specificului acestui tip de date valoarea nici unei variabile de alt tip nu poate fi convertită la tipul resource. variabila $a devine un obiect ale cărui metode pot fi utilizate. Se consideră că o variabilă are tipul NULL dacă: . Nu recomand această abordare. atunci noua instanţă va fi vidă. Cea mai folosită funcţie este echo(). Această valoare este singura pe care o pot avea variabilele de tip NULL. nu trebuie să includeţi aceşti parametrii între paranteze. } Pentru a utiliza o variabilă de tip obiect va trebui să realizăm o instanţiere prin intermediul instrucţiunii new.

. semnul $) trebuie să le precedaţi cu semnul \. nici aceasta nu este chiar o funcţie ci un constructor al limbajului. şi flush() puteţi găsi în manualul oficial pe care îl puteţi lua gratuit de pe site-ul oficial al PHP . print "Rezultatul inmultirii lui $x cu 1 este $rezultat". La fel ca şi echo. variabilele $x şi $rezultat nu ar fi fost parsate şi output-ul ar fi fost: Rezultatul inmultirii lui $x cu 1 este $rezultat Putem afişa variabilele şi dacă folosim ghilimelele simple. rezultatul fiind uşor diferit. ?> Alte informaţii despre aceste funcţii. ?> Pentru a afişa caracterele speciale folosite de PHP (ghilimelele simple '.php. Dacă doriţi să afişaţi doar valoarea unei variabile. Folosind ghilimelele duble.www. "rupând" stringul şi intercalându-l cu variabile. de genul printf(). Astfel. Exemplu: <?php echo $x. orice variabilă din cadrul stringului este parsată.. într-un string puteţi folosi celelalte ghilimele normal. în forma urmatoăre.').$rezultat. astfel: <?php echo "Semnul dolar \$. backslash-ul \. $rezultat = $x*1. dacă am avea de exemplu: <?php $x = 1.net.$x. Textul ce urmează a fi afişat trebuie introdus între ghilimele simple sau duble. şi nu trebuie să utilizaţi parantezele. O funcţie asemănătoare cu echo este print. ?> Ghilimelele trebuie precedate de semnul \ doar dacă sunt de acelaşi tip cu cele care încadrează string-ul.' cu 1 este '. ghilimelele duble ". . back-slash \\". folosind operatorul "."(punct) de concaternare a stringurilor (şirurilor): <?php print 'Rezultatul inmultirii lui '.short_open_tag pe ON şi nu va funcţiona. puteţi să nu o încadraţi între ghilimele. ?> afişează în browser: Rezultatul inmultirii lui 1 cu 1 este 2 Dacă am folosi ghilimelele simple (print '. precum şi altele asemănătoare cu acestea. În plus.

conţine codul HTML existent între tagurile <body> şi </body> Dacă există. fiecare fac anumite lucruri.php .php . precum şi fişierul care afişează . Am numit fiecare script care se ocupă de o anumită parte a site-ului astfe: head.body. Puteţi vedea acest model într-un fel modular.php . la un site cu 100-200 de pagini chiar şi cea mai mică modificare ar fi însemnat un chin. şi dacă există. va fi mult mai uşor să modificaţi doar scriptul care se ocupa de o anumită parte a paginii.php .head.Construieşte un site cu php În continuare.php .contact.js.conţine partea dintre tagurile HTML <head> şi </head> body. puteţi stabili nivelul 0). se verifică dacă există fisierul head. în cazul unei modificări. dar pe acelaşi principiu se poate adapta ideea la un site care preia datele din baza de date./module/data_ora. css.php index.acest fişier conţine codul CSS folosit pentru formatarea şi afişarea paginii HTML. formează pagina de web generată dinamic.css. Puteţi. Astel. Partea de sus a paginii (head) Partea cu meniul orizontal generat dinamic (partea de body) aici se pot partea in care se afiseaza pune alte meniul continutul paginilor.footer.meniu_vertical. nu am folosit o bază de date. se încarcă şi fişierele care conţin meniul orizontal şi/sau vertical. şi adaptând modelul acesta la necesitaţile voastre.php . este doar o modalitate de a vedea cum se poate construi un site şi cum se preiau sau trimite variabilele prin intermediul site-ului. fiecare script fiind de fapt un modul care execută anumite operaţii specifice. js. Exemplul prezentat nu este un standard.module. în care să includ dinamic conţinutul şi meniul. index. dar puse împreună.php .php . Astfel. În acest exemplu.conţine partea dintre tagurile HTML <body> şi conţinutul paginii footer.php . în forma preferată de dvs.php . fiecare bucată este colorată diferit pentru o mai bună vizualizare.php . o să încerc să vă prezint cum se poate construi un site cu ajutorul limbajului PHP. o să vă prezint fiecare modul în parte.continut.php şi se încarcă sau se opreşte cu un mesaj de eroare.php se includ mai multe module (scripturi) care luate separat.php .php şi body.dacă se foloseşte cod JavaScript în pagini.meniu_orizontal. în funcţie de ce link accesează vizitatorul.php . si alte informatii lateral informatii generate dinamic partea de incheiere a paginii (footer) După cum puteţi vedea alăturat. în pagina index. În exemplul meu.php . pe când daca tot site-ul ar fi fost facut static în HTML. anume index.conţine partea de jos a paginii În continuare.php.Apoi. se încarcă şi fişierele cu cod CSS şi JavaScript folosite în pagină. am preferat să am o singură pagină. head. pentru a putea avea acces rapid la el în cazul în care doriti să faceţi modificări.php . Puteţi introduce în fiecare bucată câte un script php care să genereze respectiva bucată dinamic.php . am despărţit fiecare parte a unei pagini în bucăţi.php .în care se setează nivelul de raportare al erorilor (dacă nu doriţi ca vizitatorii să vada eventualele erori raportate de către php. este de preferat să se salveze codul în acest fişier.în acest fişier se afisează codul html pentru începutul paginii.php . pe baza acestui exemplu. să vă construiţi propriul site.php . body.

Pe langă acestea. se verifică daca acea pagină există şi se încarcă pentru afişare. În continuare. După cum se poate vedea.Un mesaj în care se spune că scriptul conţine o eroare La vizualizarea rezultatelor unui script PHP se pot produce numeroase erori. chiar dacă scriptul în sine e corect.Un mesaj în care se spune că scriptul nu există . De exemplu. care poate include orice caractere doriţi.php . care afişează câteva informaţii despre vizitator. precum şi formulare de contact. în loc de datele de ieşire ale acestuia .php . linia conţine comentariul. verifică ce fişiere există în directorul MODULE şi le încarcă pe fiecare.Textul scriptului.conţine codul HTML pentru meniul orizontal. inclusiv caractere speciale. se include şi fisierul module. Totuşi. puteţi include un comentariu care precizează numele fişierului care conţine scriptul. Dacă se cer pagini externe. Câteva informaţii despre documentarea şi depanarea unui script.este un fişier care atunci când este accesat. . dacă doriţi să bagaţi alte scripturi în pagini. În afară de a furniza nume descriptive fişierelor care conţin scripturile dvs. în funcţie de linkul cerut. cât şi alte informaţii referitoare la script. data_ora. */ Pentru a începe un comentariu alcătuit din mai multe linii. module. meniu_vertical. puteţi scrie orice text doriţi.php .php . Dacă vedeţi textul scriptului sau o casetă de dialog prin care sunteţi întrebat . un comentariu începe cu două caractere slash. cu conţinut HTML sau PHP. astfel încât acesta să apară în versiunile tipărite ale scriptului.este fişierul care afişează în josul paginii numele curent al paginii Acest exemplu îl puteţi descărca de aici şi îl puteţi testa şi modifica pe serverul dvs. O modalitate de a crea un comentariu pe mai multe linii este de a începe fiecare linie cu ajutorul caracterelor //. footer. scrieţi caracterele */ Între cele două perechi de caractere. Iată un exemplu: /* Acesta este un comentariu pe mai multe linii. Poate fi alcatuit dintr-un numar oricat de mare de linii. PHP. folosind oricâte linii doriţi.poate fi o pagina externă.php meniu_orizontal.conţinutul paginii cerute. trebuie să includeţi în fiecare script atât comentarii care să permită unui cititor să determine cu uşurinţă utilitatea scriptului. prin care sunteţi întrebat dacă doriţi să descărcaţi fişierul care conţine scriptul.afişează conşinutul paginilor.php . Uneori.conşine codul HTML pentru meniul vertical continut. contact. dacă preferaţi.php .O casetă de dialog. urmate de un spatiu.este un fişier extern. puteţi vedea unul din următoarele: .php . puteţi crea un comentariu din mai multe linii şi în alte moduri.Un mesaj în care se spune că browserul web nu are permisiunea de a obţine accesul la script . Iată un model sintactic pentru comentariile PHP: // Scrieti aici comentariul dvs. scrieţi caracterele /*. iar pentru a încheia comentariul. în locul datelor de ieşire ale scriptului.

PHP facilitează includerea în şiruri a unor caractere speciale. şirurile pot conţine orice caracter. Dacă vedeţi un mesaj în care se spune că scriptul conţine o eroare. Şirurile şi caracterele speciale Spre deosebire de numere întregi şi de numere duble.O eroare de tastare. de exemplu. astfel: $sir = '<a href="index.O eroare de punctuaţie. Iată secvenţele escape folosite în PHP: \n . care este alcătuită din două caractere backslash.141516". Pentru a introduce ghilimele duble în cadrul unui şir fără a folosi secventa escape. în general. un şir poate conţine date numerice. precum nume şi adrese.ghilimele duble Ca exemplu. şirurile pot fi utilizate pentru stocarea datelor numerice. trebuie să folosiţi secvenţa escape adecvată. Reţineţi că fiecare secvenţă escape începe cu un backslash (\). extensia . cum ar fi paranteze.Un marcaj de comentariu (//) care lipseşte sau a fost introdus gresit. este posibil ca extensia fişierului script să fie incorectă sau ca serverul PHP să nu funcţioneze.php" target="_blank">Prima pagină</a>'.php\" target=\"_blank\">Prima pagină</a>".dacă doriţi să descărcaţi fişierul care conţine scriptul. Pentru a specifica un şir în PHP.salt la linie noua \r . verificaţi dacă nu au apărut următoarele probleme: .Neincluderea sau includerea eronată a liniilor de delimitare a scriptului. Deşi fişierele script PHP trebuie să aibă. folosind un slash numai dacă adresa URL nu se încheie cu un atare caracter. Pentru a include un backslash într-un şir. "3. în speţă <?php şi ?> . . urmat de un salt la linie nouă: "Salut! \r\n". care conţin cu precădere cifre. ghilimele duble sau punct şi virgulă lipsă sau inserate greşit. De asemenea. Sigur. prin furnizarea de secvenţe escape care reprezintă caractere speciale. poate că este necesar să modificaţi permisiunile fişierului script (cmod). După cum observaţi deoarece standardul HTML necesită folosirea ghilimelelor pentru a nu se încurca cu codul php am folosit pentru acest sir ghilimele simple.simbolul dolarului \" . şirul reprezentând numele "Albert Einstein". Verificaţi dacă aţi tastat corect adresa URL precum şi dacă aţi ataşat corect la aceasta numele fişierului care conţine scriptul.retur de car \t . este posibil ca un administrator de sistem să configureze un server PHP astfel încât acesta să impună o altă extensie de fişier. .caracter de tabulare pe orizontală \\ . acest cod se poate scrie şi asa: $sir = "<a href=\"index. şirurile sunt utile pentru stocarea datelor care nu pot fi calculate. de exemplu .php. Dacă vedeţi un mesaj în care se arată că browserul web nu are permisiunea de a obţine accesul la script. Dacă vedeti un mesaj în care se spune că scriptul nu există.backslash \$ . Aşa cum am mai spus. caracterele care alcătuiesc şirul sunt incluse între ghilimele duble. precum caracterele de salt la linie nouă sau retur de car. Ca atare. este posibil ca să fi tastat incorect adresa URL. iată un şir care include un retur de car. puteţi include şirul între ghilimele simple astfel: 'Pe ea o cheama "Nikita"' Aceasta este util când doriţi să introduceţi într-un şir taguri HTML. cum ar fi scrierea greşită a cuvântului echo .

definit prin semnul = Dacă scriem $x = 1 nu înseamnă că $x este egal cu 1 ci că i s-a acordat valoarea 1. . Dacă operatorul rest este aplicat asupra unor numere reale. este operatorul de inegalitate şi se foloseşte în acelaşi scop. if ($x == { print } if ($x != { print $y) "$x este egal cu $y". Cel mai des întâlnit operator este cel de atribuire. Operatori de comparare: Interpretorul PHP pune la dispozitie mai mulţi operatori care pot fi folosiţi pentru compararea a două valori. .scădere ('-'). doua sau trei) şi furnizează ca rezultat o altă expresie (rezultatul operaţiei corespunzătoare).dar personal mi se pare greu inteligibil acest cod şi la un volum mare de date pot apare multe erori datorate scrierii incorecte a codului html în interiorul codului php. . Operatorul de egalitate se foloseşte pentru a compara egalitatea a două valori. . Dacă cel puţin unul dintre operanzi (după efectuarea eventualelor conversii necesare) este un număr real. Expresiile în care apar astfel de operatori au ca rezultat valori logice (true sau false). Dacă scriem $rezultat = $x + $y nu înseamnă că $rezultat este egal cu suma celor două. Există cinci astfel de operatori: . Aceste operaţii se aplică asupra unor valori care reprezintă tipuri numerice.înmulţire ('*'). cu excepţia împărţirii al cărei rezultat este întotdeauna un număr real. Nu este permisă împărţirea la valoarea 0. Pentru a vă lămuri cum stă treaba cu egalitatea şi atribuirea. atunci rezultatul va fi un număr întreg. . Operatori aritmetici: Toţi operatorii aritmetici operează asupra a două expresii (operanzi). atunci rezultatul operaţiei va fi tot un număr real. Dacă unul dintre operanzi nu are tip numeric.rest ('%'). va fi semnalată o eroare. Dacă al doilea operand asupra căruia se aplică unul dintre operatorii '/' sau '%' are valoarea 0. Aceştia operează asupra unor expresii (una. Operatori PHP Interpretorul PHP permite folosirea a nouă tipuri diferite de operatori.împarţire ('/'). pentru a testa egalitatea. testaţi următorul cod: Cod: <?php $x = 1. Dacă ambii operanzi sunt numere întregi. atunci rezultatul este un număr întreg. rezultatul operaţiei de determinare a restului este întotdeauna un număr întreg. $y = 7. Opusul său. cu excepţia operatorului rest. ci că i-am atribuit (acordat) valoarea sumei celor două. Operatorul de egalitate este == si se foloseşte cel mai des în propoziţii condiţionale. $y) "$x este diferit de $y". !=. atunci el va fi convertit automat la o valoare întreagă.adunare ('+').

// pe ecran va fi afisat "Am scris un text oarecare" // concaternarea stringurilor cu variabile .'text'. } if ($x <= $y) { print "$x este mai mic sau egal cu $y". '<' . } ?> '==' .rezultatul este true dacă cele două expresii au valori diferite. Operatori pentru şiruri de caractere: Operatorii pentru stringuri sunt '. '>' .rezultatul este true dacă valoarea primei expresii este mai mare sau egală cu valoarea celei de-a doua expresii. '!=' sau '<>' .?> } Alţi operatori folosiţi pentru compararea valorilor variabilelor sunt: '>' mai mare '>=' mai mare sau egal '<' mai mic '<=' mai mic sau egal Exemplu: Cod: <?php $x = 5.rezultatul este true dacă cele două expresii au aceeaşi valoare. '>=' .rezultatul este true dacă valoarea primei expresii este mai mare decât valoarea celei dea doua expresii. Pe lângă acestea există şi operatorul condiţional '?' care are forma expresie1? expresie2:expresie3 şi are ca rezultat valoarea expresiei expresie2 dacă valoarea expresiei expresie1 este true (eventual după conversia la tipul boolean) sau valoarea expresiei expresie3 în caz contrar. print $test.=' (punct şi egal) pentru atribuirea concaternării.rezultatul este true dacă valoarea primei expresii este mai mică sau egală cu valoarea celei de-a doua expresii.rezultatul este true dacă cele două expresii au valori diferite sau au tipuri diferite. '!==' . Aceşti operatori sunt folosiţi pentru a unii stringuri. $y = 4. if ($x > $y) { print "$x este mai mare ca $y".rezultatul este true dacă valoarea primei expresii este mai mică decât valoarea celei dea doua expresii.' (punct) pentru concaternare şi '.rezultatul este true dacă cele două expresii au aceeaşi valoare şi au acelaşi tip. '===' . '<=' . în felul urmator: Cod: <?php // concaternarea stringurilor $test = 'Am scris un '.'oarecare'.

. valoarea este convertită la o valoare booleană. Operatori de atribuire: Primul operand asupra căruia este aplicat un astfel de operator de atribuire trebuie să fie o variabilă.$nr. Operatorii logici vă vor veni la îndemână în execuţia scriptului atunci când aveţi nevoie să lucraţi cu valori de adevăr. Operatorul '&&' returnează TRUE doar dacă ambele valori verificate sunt TRUE. dacă atât numele cât şi parola sunt valide putem acorda utilizatorului acces în secţiunea de administrare.. .= "si numarul ". În acest exemplu de pseudocod dacă numele ar fi valid dar parola nu. Aceştia sunt: . Scriptul PHP ar putea verifica aceste informaţii pentru a autoriza accesul în secţiune folosind operatorii logici astfel: . print $text. El returnează FALSE dacă oricare dintre ele este FALSE (sau dacă amândouă sunt FALSE).operatorul '||' (OR) if (numele_este_valid) || parola_este_buna) . ceea ce nu este de dorit. . parola nu este bună.operatorul '!' (NOT) if (!parola_e_buna) . Operaţia Varianta scurtă Varianta standard adunare ('+=') $a += 2 $a = $a + 2 . // pe ecran va fi afisat "Am scris numarul 5 si un text oarecare" // atribuirea concaternarii $nr = 6. Returnează FALSE doar dacă amândouă sunt FALSE.deplasare la dreapta ('>>'). . . Trebuie să fim siguri că şi numele şi parola sunt valide.SAU exclusiv (XOR). accesul este permis Operatorul '!' returneaza TRUE dacă valoarea iniţială de adevăr e FALSE şi FALSE dacă valoarea iniţială este TRUE.SI (AND). . dacă operatorii au alt tip.disjuncţie ('|') .= "oarecare ". Pentru contruirea expresiilor logice operanzii trebuie să aibă tipul boolean.. $text .' oarecare'.disjuncţie exclusivă ('^') . .$nr.NU (NOT). print 'Am scris numarul '. // pe ecran va fi afisat "Un text oarecare si numarul 6" ?> Operatori pe biţi şi operatori logici: Interpretorul PHP pune la dispoziţie şase operatori care operează asupra biţilor unui număr întreg sau ai unui şir de caractere.$nr = 5.operatorul 'xor' (SAU exclusiv) Expresia în care apare operatorul 'xor' va avea valoarea true dacă exact unul dintre operanzi are valuarea true .negaţie ('~') .. accesul este interzis if (!parola_nu_e_buna) . returnează valoarea de adevăr TRUE.' si un text '. iar al doilea poate fi o expresie.operatorul '&&' (AND) if (numele_este_valid && parola_este_buna) .deplasare la stânga ('<<').. $text = "Un text ". parola e bună. . $text .conjuncţie ('&') .SAU (OR). verifică dacă numele sau parola sunt valide şi dacă oricare dintre ele este. Operatorul '||' returnează TRUE dacă oricare din valorile verificate e TRUE. i-am acorda utilizatorului acces mai departe... Să presupunem că la intrarea în secţiunea de administrare avem un formular care cere numele şi parola de acces în secţiune..

2. $a /= $b. . 2. $a *= $b. "<br>$a ^= $b = ". $a &= $b. $a ^= $b. $a %= $b. echo "<TT>$a += $b = ". $a -= $b. "<br>$a /= $b = ". "<br>$a *= $b = ". 1. 2. $b = 2.scădere ('-=') înmulţire ('*=') împărţire ('/=') rest ('%=') conjuncţie ('&=') disjuncţie ('|=') disjuncţie exclusivă ('^=') deplasare la stânga ('<<=') deplasare la dreapta ('>>=') concaternare ('. 2. "<br>$a |= $b = ". $a |= $b. 1. 1. 1. 2. 1.= "2" $a $a $a $a $a $a $a $a $a $a = = = = = = = = = = $a $a $a $a $a $a $a $a $a $a -2 *2 /2 %2 &2 |2 ^2 << 2 >> 2 . $a = 1. "<br>$a -= $b = ". "<br>$a &= $b = ". "2" <?php $b = 2. echo $a += $b. "<br>$a %= $b = ". $b = $a = echo echo $b = $a = echo echo $b = $a = echo echo $b = $a = echo echo $b = $a = echo echo $b = $a = echo echo $b = $a = echo echo 2. 1. 1.=') Exemplu: Cod: $a $a $a $a $a $a $a $a $a $a -= 2 *= 2 /= 2 %= 2 &= 2 |= 2 ^= 2 <<= 2 >>= 2 . 2.

Exemplu: . Operatorul de incrementare duce la creşterea cu 1 a codului ASCII a ultimului caracter din şir dacă acesta este o litera sau cifră. Tipul variabilei poate fi întreg sau real. dacă operatorul precede variabila. echo "<br>$a <<= $b = ". Dacă variabila precede operatorul.$a = 1. atunci valoarea variabilei este mai întâi modificată şi apoi utilizată. 1. sau cifra '0' şi se încearcă incrementarea penultimului caracter. "<br>$a . "</TT>". "<br>$a >>= $b = ". 1. respectiv 'Z'.= $b. În acest ultim caz. iar cel de decrementare (--) are ca efect scăderea cu 1 a valorii variabilei. În cazul în care litera este 'z'. 2.= 2 = 12 Operatori de incrementare şi decrementare: Operatorul de incrementare (++) are ca efect creşterea cu 1 a valorii unei variabile. atunci ea devine 'a'. Incrementarea nu are nici un efect pentru caracterele care nu sunt cifre sau litere. echo $a <<= $b. 'z' sau 'Z' se aplică acelaşi procedeu şi se trece la antepenultimul caracter. Acestea sunt incrementate sau decrementate potrivit regulilor pentru valorile numerice. Procedeul continuă până în momentul în care se ajunge la un caracter care nu este '9'. iar dacă variabila precede operatorul. sau cifra este '9'. la începutul şirului se adaugă caracterul '1'. valorile variabilelor rămânând nemodificate. Dacă aceasta este tot '9'. Există o singură excepţie şi anume şirurile care reprezintă numere întregi sau reale. $a >>= $b. $a . 'a' sau 'A'. Dacă operatorul precede variabila. Rezultatul codului de mai sus este: 1 1 1 1 1 1 1 1 1 1 1 += 2 = 3 -= 2 = -1 *= 2 = 2 /= 2 = 0. 'z' sau 'Z' sau se ajunge la începutul şirului. Decrementarea şirurilor de caractere nu are nici un efect. $b = $a = echo echo $b = $a = echo echo echo ?> 2.= $b = ". atunci rezultatul expresiei este valoarea variabilei înaintea incrementării sau decrementării. Aceşti operatori pot fi utilizaţi şi pentru variabile care conţin şiruri de caractere. atunci rezultatul expresiei este valoarea obţinută după incrementare sau decrementare.5 %= 2 = 1 &= 2 = 0 |= 2 = 3 ^= 2 = 3 <<= 2 = 4 >>= 2 = 0 . Cu alte cuvinte. respectiv 'A'. atunci valoarea ei este mai întâi utilizată şi apoi modificată.

echo $a++. echo --$a. echo ++$a. echo ": </tt><i>Rezultatul operatiei </i><tt>++a</tt><i> este </i><tt> ".". echo "<br>a = $a".". echo "</tt>. echo "<br>a = $a".5. echo ++$a.". <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t t>$a. echo $a--.". echo "<br>a = $a". echo "</tt>. echo "</tt>.". echo "<br>a = $a". echo "</tt>. echo ": </tt><i>Rezultatul operatiei </i><tt>a--</tt><i> este </i><tt> ". <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t t>$a. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t t>$a.Cod: <?php $a = 7. echo "<br>a = $a". echo $a++. echo "</tt>. echo ": </tt><i>Rezultatul operatiei </i><tt>a++</tt><i> este </i><tt> ". echo ": </tt><i>Rezultatul operatiei </i><tt>a++</tt><i> este </i><tt> ". echo ": </tt><i>Rezultatul operatiei </i><tt>--a</tt><i> este </i><tt> ". echo --$a. $a = 7. $a = "PHP". echo $a--. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t t>$a. echo "<tt>a = $a". <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t t>$a. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t t>$a. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t t>$a. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t t>$a.". . echo "<br>a = $a". echo "<br>a = $a". echo "<br>a = $a". echo ": </tt><i>Rezultatul operatiei </i><tt>--a</tt><i> este </i><tt> ".". echo "</tt>. echo "</tt>. echo ": </tt><i>Rezultatul operatiei </i><tt>++a</tt><i> este </i><tt> ". echo ": </tt><i>Rezultatul operatiei </i><tt>a++</tt><i> este </i><tt> ". echo ": </tt><i>Rezultatul operatiei </i><tt>a--</tt><i> este </i><tt> ". echo "</tt>.".

5. Comanda respectivă este cuprinsă între apostroafele inverse (tasta de lângă 1 deasupra tastei tab). <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t t>$a. iar rezultatul acestei comenzi este un şir de caractere care reprezintă şi rezultatul expresiei. PHR.5. echo "</tt>". Noua valoare a variabilei a este 9. Noua valoare a variabilei a este PHR: Rezultatul operatiei --a este PHR.5: Rezultatul operatiei --a este 7. Dacă este aplicat asupra unei expresii care ar duce la afişarea unui mesaj de eroare. echo $a--. echo "<br>a = $a". echo "</tt>.este 9. (scriptul îl gândiţi voi.5. PHR. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t t>$a. echo "</tt>.". echo "<br>a = $a". 8. 8: Rezultatul operatiei ++a este 9.echo $a++. Noua valoare a variabilei a este 8. scriptul incrementează cu 1 şi afişează valoarea. Noua valoare a variabilei a este 9. Noua valoare a variabilei a este PHQ: Rezultatul operatiei ++a este PHR.5: Rezultatul operatiei a++ este 7. atunci mesajul respectiv nu va fi afişat. Noua valoare a variabilei a este 7. PHQ. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t t>$a. echo ": </tt><i>Rezultatul operatiei </i><tt>--a</tt><i> este </i><tt> ". ?> Rezultatul codului de mai sus este: a a a a a a a a a a a a = = = = = = = = = = = = 7: Rezultatul operatiei a++ este 7. 9. Noua valoare a variabilei a este 8. echo ": </tt><i>Rezultatul operatiei </i><tt>a--</tt><i> este </i><tt> ".". echo ++$a.este PHR.5. 9: Rezultatul operatiei a-. 8: Rezultatul operatiei --a este 7. . Noua valoare a variabilei a este 8. Noua valoare a variabilei a este PHP: Rezultatul operatiei a++ este PHP. Noua valoare a variabilei a este PHR: Rezultatul operatiei a-.este 9. Noua valoare a variabilei a este 8. Noua valoare a variabilei a este 8. echo "</tt>. echo "</tt>. dacă doriţi să ştiţi de câte ori a fost descărcat un fişier dintr-o anumită pagină. Operatori de execuţie: Interpretorul PHP permite executarea unor comenzi sistem prin intermediul operatorului (` `) . La fiecare accesare a fişierului. echo "<br>a = $a". <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t t>$a.". echo --$a.5: Rezultatul operatiei ++a este 9.5.5: Rezultatul operatiei a-. Aceşti operatori sunt utili de exemplu pentru monitorizarea unui download. PHR.5.". echo ": </tt><i>Rezultatul operatiei </i><tt>++a</tt><i> este </i><tt> ". 7. doar nu vreţi totul la tavă) Operatori pentru controlul erorilor: În PHP există un operator (@) care permite ignorarea erorilor.5. 7.5. Urmatorul script PHP determină execuţia pe server a comenzii help /? şi afişarea rezultatului în fereastra programului de navigare.

$y[2] = 200. $z = $x + $y. din categorii diferite. Toţi operatorii cu aceeaţi precedentă au aceeaşi tip de asociativitate. Trebuie observat faptul că. pentru a modifica ordinea implicită de efectuare a operaţiilor pot fi folosite paranteze pentru a indica faptul că o anumită operaţie trebuie efectuată înaintea altora. De exemplu. ?> Rezultatul codului de mai sus este: 100 2 300 4 5 7 Ordinea operaţiilor: Evident. atunci este păstrat doar elementul din vectorul care reprezintă primul operand. datorită asociativităţii de la dreapta spre stânga a operatorilor de atribuire. Pentru aceasta a fost definită precedenta şi asociativitatea operaţiilor. expresiile de tipul $a = $b = 1 sunt valide. $y[3] = 300. Mai întâi se va efectua atribuirea $b = . o expresie poate conţine mai mulţi operatori. Evident. echo "$z[1] $z[2] $z[3] $z[4] $z[5] $z[7]". datorită faptului că operatorul '*' are precedenta mai mare decât cea a operatorului '+'. Dacă cei doi vectori conţin elemente cu aceeaşi cheie. Exemplu: Cod: <?php $x[2] = 2. trebuie stabilită o ordine a operaţiilor. $x[5] = 5."</PRE>". $x[7] = 7. Dacă o expresie sau o subexpresie conţine numai operatori cu aceeaşi precedentă. $y[4] = 400. Operatori pentru vectori: Singurul operator care poate fi aplicat asupra vectorilor este cel de concaternare (+) Rezultatul concaternării a doi vectori este un vector care conţine elementele din cei doi vectori. ?> Atenţie! Pe unele configuraţii de server nu se permite executarea de comenzi prin intermediul PHP (ca măsură de siguranţă.Cod: <?php echo "<PRE>". $y[5] = 500. atunci operaţiile se vor efectua în ordinea determinată de asociativitatea acestor operatori care poate fi de la dreapta la stânga sau de la stânga la dreapta. $x[4] = 4.`help /?`. pentru expresia 1 + 2 * 3 va fi efectuată mai întâi înmulţirea 2 * 3. Pentru a indica ordinea în care trebuie efectuate calculele. Valoarea expresiilor corespunzătoare operatorilor cu precedenta mai mare va fi calculată înaintea valorilor expresiilor cu o precedentă mai mică. chiar dacă acestea din urmă au o precedentă mai mare. altfel oricine ar putea da un format sau reboot la server prin intermediul unui script PHP). $y[1] = 100.

1. în continuare se va efectua atribuirea $a = 1. deci nu sunt echivalenţi din toate punctele de vedere. de de de de de la la la la la Tip asociativitate stânga la dreapta stânga la dreapta stânga la dreapta stânga la dreapta stânga la dreapta Tip unar binar binar binar binar Operanzi . (selectare) or xor and print = += -= *= /= . deci şi variabila $a va primi tot valoarea 1. (concaternare) * / % ! ~ ++ -(int) (float) (string) (array) (object) de la stânga la dreapta binar de de de de de de la la la la la la stânga stânga stânga stânga stânga stânga la la la la la la dreapta dreapta dreapta dreapta dreapta dreapta ternar binar binar binar binar binar binar fără asociativitate fără asociativitate de la stânga la dreapta de la stânga la dreapta de la stânga la dreapta de la stânga la dreapta binar binar binar binar unar . deşi operatorii '&&' şi 'and'. datorită faptului că rezultatul unei operaţii de atribuire este valoarea atribuită variabilei care reprezintă primul operand. în sensul că un operator are aceeaşi precedentă cu operatorii de pe linie în care apare şi o precedentă mai mare decât oricare operator aflat pe o linie anterioară. ei au precedente diferite. respectiv '||' şi 'or' realizează aceeaşi operaţie. Liniile tabelului indică precedenta.= %= &= |= ^= ~= <<= >>= ?: || && | ^ & == != === !== < <= > >= << >> + . În acest tabel se observă faptul că. variabila $b va primi valoarea 1 şi. Tabelul de mai jos conţine o listă cu majoritatea operatorilor din PHP.

.) .) . . $punctaj3). care preia mai multe argumente: $punctaj_castigator = max($punctaj1. ceil(x) . Un alt exemplu calculează aria unui cerc de rază dată: Cod: <?php $raza = 2. 1. Acest exemplu calculează lungimea laturilor unui pătrat. În continuare este prezentat modul de utilizare al funcţiei max.0. echo "<br>arie = ".returnează valoarea x. cei binari asupra a două expresii şi singurul operator ternar asupra a trei expresii. echo $raza. rotunjită la întregul imediat inferior.returnează numărul x. $punctaj2. Întotdeauna verificaţi datele trimise către server şi "curăţaţi-le" înainte de a le utiliza..returnează valoarea absolută a lui x. ridicat la puterea specificată n. n) . max(x. min(x. strftime(f) . y. $pi = 3. În continuare sunt câţiva operatori care execută operaţii utile: abs(x) .returnează valoarea x. rotunjită la întregul imediat superior. sqrt(x) .. $arie = $pi * $raza * $raza. Menţionez că cele scrise aici sunt doar noţiuni generale.returnează valoarea minimă a unui set de valori. Pentru aceasta trebuie să luaţi în considerare câteva posibile "găuri" de securitate.14159. formatată conform conţinutului parametrului f. Operatorii unari acţionează asupra unei singure expresii.. floor(x) . . echo $arie. pentru o securitate ridicată ar trebui sa aveţi noţiuni specializate de baze de date şi de administrare a serverelor web. dacă este cunoscută aria pătratului. ?> Câteva idei utile pentru securitatea paginilor web Regula numărul unu a securităţii online este: nu vă încredeţi niciodată în utilizator. y.returnează valoarea maximă a unui set de valori. pow(x.ini setate pe ON puteţi accesa datele trimise prin formulare . Variabilele globale Având variabilele globale din php.returnează rădăcina pătrată a lui x Mai jos sunt cateva exemple: $lungime = sqrt($arie).returnează data curentă.de la stânga la dreapta fără asociativitate unar unar @ [ new În tabel este prezentat şi numărul expresiilor asupra cărora acţionează un operand. echo "raza = ".

Dacă variabilele globale sunt OFF în php.rau. afişa informaţii confidenţiale sau sterge baza de date. Cineva care ştie numele de utilizator ar putea încerca să vă găsească parola foarte usor. Implicit în php. Nu includeţi fişiere străine. În acest caz va trebui să puneţi o protecţie suplimentară care să nu permită mai mult de X încercări consecutive eşuate de logare pentru un nume de utilizator. verificaţi acest lucru şi nu dacă interogarea s-a executat cu succes. ghilimelele din input vă pot crea probleme serioase. Includere Încercaţi să evitaţi includerea "vizibilă" a fişierelor în forma http://site. În exemplul de mai sus. PHP poate "include" fişiere aflate pe alte servere decât cel care rulează dacă setarea URL fopen wrappers este activată în php. Cu puţină neatenţie din partea voastră atacatorul ar putea accesa astfel de informaţii sensibile din cadrul sistemului. Când valoarea acesteia trece de 3 (încercări nereuşite) nici măcar nu mai interogaţi baza de date pentru a verifica datele trimise.ro/fisier. şi ar introduce comentariul lui (exemplu "blabla") în baza voastră de date fără să treacă propriuzis prin site. de fapt). Dacă scriptul nu este foarte bine gândit. Verificarea provenienţei cererilor către server este foarte importantă şi în alt caz: formularele de loghin. Din acest motiv php. un atacator ar fi putut accesa adresa http://site. un utilizator rău intenţionat ar putea accesa adresa dvs. Nu permiteţi includerea fişierelor din altă parte decât de pe serverul vostru. sesiunea va fi închisă şi va putea de alte X ori să se logheze. În momentul când cineva încearcă să trimita numele şi parola din formular putem seta o variabilă de sesiune $_SESSION['login_count'] care să ţină minte numărul de încercări.ini este distribuit cu globals=off în ultimele versiuni.ini magic_quotes_gpc sunt OFF folosiţi funcţia addslashes pentru a preceda ghilimelele din datele trimise de utilizatori cu caracterul \.ini.php pentru a include în fisier un script localizat pe alt server şi astfel obţine acces către toate resursele sistemului la care are acces PHP.ro/fisier. De cele mai multe ori acestă măsură de siguranta este suficientă pentru a preveni încercările de aflare a parolelor. Mai mult. 4. la fel şi pentru POST sau FILES. . Variabila de sesiune va rămâne în memorie cât timp browserul este deschis şi sesiunea activă (opţiunea implicită a PHP de menţinere a sesiunilor active este de o oră).php?file=http://www. 3. Dacă magic_quotes_gpc sunt ON. În acest caz.ini magic_quotes_gpc sunt ON pentru a vă proteja de astfel de atacuri. Dacă atacatorul aşteaptă o ora sau îşi închide browserul.mai simplu: $variabila în loc de $_GET['variabila']. PHP adaugă automat caracterul \ înainte de ghilimele dar dacă ele sunt OFF. Aşa vă puteţi trezi că nu mai aveţi spaţiu pe server iar în baza de date sunt câteva milioane de comentarii care spun acelaşi lucru "blabla". Ca exemplu. folosind parola 'OR' 1=1 oricine poate avea acces pe site deoarece interogarea SELECT * FROM user WHERE nume='un nume oarecare' AND parola=" OR '1=1' este executată cu succes şi returnează un rezultat (toate înregistrarile din baza de date. utilizatorul este logat.ini sau metoda de transmitere a formularului este GET. dar este bine să verificaţi înainte de a renunţa la addslashes.php? file=cutare. putând rula comenzi de sistem. Ghilimele "magice" Dacă în php. Formulare Folosiţi metoda POST în formulare atunci când informaţia din acestea urmează să fie introdusă în baza de date. atunci când vă aşteptaţi ca baza de date să returneze un singur rând. variabilele globale pot prezenta un risc major de securitate. 2. Setaţi allow_url_fopen=OFF în php.ini. Această problemă se rezolva uşor folosind sesiunile.html pentru a include fişiere în cadrul unei pagini.ro/scriptultau. să presupunem că interogarea SQL de verificare a numelui şi a parolei pentru înregistrarea pe site este SELECT * FROM users WHERE nume='$nume' AND parola='$parola' şi dacă interogarea este executată cu succes.

un utilizator ar putea accesa paginile din secţiunea de administrare fără să treacă prin formularul de înregistrare. PHP nu parsează fişierele cu extensia .fiecare cu câte 3 setări .txt) În programul TOTAL COMMANDER (pe care eu îl folosesc şi pentru FTP) setarea atributelor pe server se face din meniul FILES . vom folosi variabile de sesiune pentru a păstra în memorie câteva informaţii despre autentificare.CHANGES ATTRIBUTES.inc şi dacă acestea sunt apelate direct ele sunt trimise plain text către browser. pentru o şi mai mare siguranţă. if ($_SESSION ['key_admin'] != session_id ()) { print 'Acces neautorizat!'. Pe lângă acestea. spunem scriptului să încarce prima pagină din secţiunea de administrare: header ("location: admin. $_SESSION ['parola_encriptata'] = $parolaEncriptata.txt. exit. dacă sunt accesate direct.WORLD . Pornim întâi sesiunea după care trecem la salvarea informaţiilor în ea ca în exemplul de mai jos: session_start().txt trebuie să îi daţi dreptul de a se putea scrie în el.GROUP .setarea atributelor Comanda CHMOD (abreviere pentru change mode permissions of a file) este folosită pentru a schimba modul de acces (de permitere) a fişierelor şi directoarelor de pe server. . Folosiţi pentru aceste fişiere extensia .html care pot fi accesate şi văzute. În continuare pentru a împiedica accesul neautorizat la paginile din această secţiune.inc fişierelor care conţin biblioteci de funcţii ce urmează a fi incluse şi folosite în cod. 7. unde accesul este restrictionat doar la membrii de exemplu.EXECUTE Este bine ca la WORLD să nu daţi decât acces la citire (pentru a putea accesa paginile de pe site) dar nu şi drepturi de scriere sau execuţie (pentru că nu doriţi ca oricine să vă scrie ce vrea în respectivul fişier . } 8. Loguri de acces . Comanda CHMOD .WRITE . vor fi rulate fără să afişeze informaţiile conţinute în ele.READ . sau cum se poate executa un fişier pe server. Setarea poate afecta modul cum poate fi citit. sau . Cookies Dacă aveţi o secţiune de administrare pe site. vom salva id-ul sesiunii în altă variabilă.php").OWNER . dacă aveţi un fişier .5. 6.txt trebuie să îi daţi dreptul să poata fi executat iar la fişierul . atunci când accesăm alte pagini din cadrul secţiunii de administrare.inc.php care trebuie să execute o comandă de scriere pe server într-un fişier . Extensii O practică obişnuită este de a acorda extensia . Fiecare program de FTP are în meniul lui setare pentru atributele fişierelor de pe server. Aveti 3 tipuri de acces . $_SESSION ['nume_admin'] = $_POST ['nume']. pentru a le verifica mai târziu. Toate sesiunile au un id unic. este bine ca în toate paginile din această secţiune să încludă o pagină de verificare a accesului.php care. Cu autentificare făcută. scriem un mic script de verificare a datelor sesiunii înainte de a încărca orice pagină din secţiunea de administrare: session_start(). Această pagina va verifica la fiecare accesare dacă utilizatorul este înregistrat şi are acces pe pagina respectivă şi permite rularea paginii doar dacă utilizatorul este înregistrat. De exemplu. După autentificarea propriu-zisă. un string care seamănă cu rezultatul unei criptări MD5: $_SESSION ['key_admin'] = session_id(). Fără această verificare. Nu puneţi informaţii sensibile (precum nume şi parola) în fişiere cu extensia .

Pentru o verificare ulterioară a persoanelor care încearcă să intre în paginile restrictionate de pe site. toată lumea are acces.php care să facă redirectarea automat către pagina principală a site-ului.1 nu doriţi să aibă acces la acel director scrieţi Deny from 192.php în subdirectoare Dacă aveţi mai multe directoare şi subdirectoare pe server este recomandat pentru a preveni accesul la datele aflate în aceste directoare să introduceţi în fiecare director o pagină numită index.tutoriale. 12.htaccess) În cazul în care după de aţi pus fişierul pe server nu îl vedeţi.ro User-agent: * Disallow: /cache/ Disallow: /admin disallow: /search unde pentru fiecare director sau fişier se specifică locaţia şi numele.htaccess (cu punct înainte) în care să introduceţi ip-ul care doriţi să îl blocaţi (sau care să aibă acces) Order Deny. INSERT INTO admin VALUES ("administrator".html sau index. să nu vă blocaţi singuri ip-ul la site. trebuie să creaţi un fişier numit robots.txt care să se afle în directorul principal de pe site (nu în subdirectoare). Pagina index. (la subdirectoare ştergeţi directorul sau salvaţi un alt fişier .htaccess. Fişierul . că altfel trebuie să luaţi legătura cu administratorul serverului să steargă fişierul ca să puteţi intra din nou pe site. Dacă de exemplu ip-ul 192. . astfel dacă cineva încearcă să citeasca parolele le va vedea criptate. Roboţii de căutare Motoarele de căutare pot indexa tot ce se află la voi pe site. În el scrieţi următoarele comenzi: # robots.Allow Allow from all În exemplul de mai sus.txt for http://www.1. parola criptata.far-php.1 Atenţie. md5("parola")). sau sa scrieti prin FTP un nou fişier .168. el este acolo dar serverul seteaza acest nume de fişier ca fişier ascuns. data. Criptarea parolelor cu MD5 Parolele care sunt salvate în baza de date este recomandat să le ţineţi criptate. ora. Criptarea folosind md5 nu este reversibila (şi astfel nici dvs. nici altcineva nu o va putea afla chiar dacă are acces la baza de date). Astfel minimizati riscul să intre cineva şi să vadă tot ce este în aceste subdirectoare.. Pentru mai multă siguranţă. semnătura browserului şi ip-ul.168. Aşa veţi ştii cine a încercat să vă spargă site-ul şi puteţi crea un script care sa verifice de exemplu ip-ul şi dacă corespunde cu unul din cele care sunt blocate să nu aibă acces la nici una din pagini (chiar dacă găseşte userul şi parola corecte) 9. 10.htaccess Pentru a bloca accesul la un anumit director (sau chiar la tot site-ul) puteti crea un fişier numit . 11. este bine să salvăm în baza de date (sau într-un fişier text) numele.1. am găsit pe web un mic script care verifică tipul de browser şi dacă nu este un browser cunoscut nu permite accesul (dacă cineva încearcă să citească paginile cu programe spion sau gen web offline). Dacă doriţi ca un fişier sau director să nu fie indexat de către motoarele de căutare.

Construcţia if . elseif (conditie #n) instructiune #n else instructiune #n+1 Limbajul PHP permite folosirea unei prescurtări şi anume construcţia elseif. Practic. În PHP sintaxa acestei structuri este următoarea: if (conditie) instructiune Folosirea unei astfel de structuri indică faptul că instrucţiunea se va executa dacă şi numai dacă valoarea expresiei conditie (eventual după conversia la tipul boolean) este true. cele spuse mai sus nunt doar cateva indicii şi idei pentru a vă putea proteja mai bine paginile. separate prin caracterul '. Astfel.. Aşadar un bloc de instructiuni (o instrucţiune compusă). În PHP.Cum am specificat şi la începutul acestui articol.else în acest scop. Folosind construcţii de tipul if . instrucţiunile compuse au următoarea sintaxa: { instructiune #1 instructiune #2 . Structura if Una dintre cele mai importante structuri în orice limbaj este cea alternativa. obţinem instrucţiunile compuse care sunt formate din mai multe instrucţiuni simple.else În foarte multe cazuri dorim să executăm o altă instrucţiune dacă valoarea expresiei condiţie este false. suntem nevoiţi să folosim structuri alternative îmbricate în diferite scopuri..else vom obţine o secvenţă de tipul: if (conditie #1) instructiune #1 elseif (conditie #2) instructiune #2 else . Sintaxa este: if (conditie) instructiune #1 else instructiune #2 Construcţia elseif Uneori. instructiune #n } Instrucţiunile care formează instrucţiunea compusă pot fi de orice tip: orice structură de control. codul anterior poate fi scris astfel: if (conditie #1) instructiune #1 elseif (conditie #2) instructiune #2 . În PHP putem utiliza o construcţie de tipul if . aceasta înlocuieste un else urmat de un if. este delimitat de acolade. în PHP. suntem nevoiţi să grupăm mai multe instrucţiuni pentru a forma un bloc.. Folosind această structură.'. instrucţiunile PHP sunt separate prin caracterul '..'. Deseori. alte instrucţiuni compuse etc. Structuri de control în PHP După cum ştiţi.

putem înlocui acolada deschisa prin caracterul ':' şi acolada închisă printr-un cuvânt cheie opţinut prin adăugarea prefixului end la cuvântul cheie care indică structura de control... dorim să folosim bucle posterior condiţionate. Trebuie observat faptul că else şi elseif nu sunt structuri. Sintaxa acestei proceduri este: while (conditie) instructiune Efectul acestei structuri este executarea instrucţiunii atât timp cât valoarea expresiei condiţie (eventual după conversia la tipul boolean) este true. pentru o structură if vom scrie: if (conditie): instructiune #1 instructiune #2 . Structura do . instructiune #n endif Practic. De exemplu.while Uneori. în PHP avem la dispoziţie structura do . Trebuie observat faptul că este posibil ca instrucţiunea să nu fie executată niciodată. atunci ar trebui să folosim instrucţiunile compuse. Din acest motiv.elseif . Aşadar. pentru orice structură de control PHP. elseif (conditie #n) instruciune #n else instructiune #n+1 Sintaxe alternative Dacă dorim să se execute mai multe instrucţiuni când este indeplinită o anumită condiţie. elseif (conditie #n) grup instructiuni #n else grup instructiuni #n+1 endif. ele fiind simple construcţii folosite în cadrul structurii if. În acest scop. sintaxa alternativă pentru o structură if în care se folosesc construcţii else şi elseif este următoarea: if (conditie #1) grup instructiuni #1 elseif (conditie #2) grup instructiuni #2 elseif . ci doar endif-uri.while a cărei sintaxă este: do instructiune while (conditie). Structura while Majoritatea script-urilor PHP vor conţine cicluri.. Si pentru această structură avem la dispoziţie o sintaxă alternativă şi anume: while (conditie): grup instructiuni endwhile. Pentru a folosi o buclă anterior condiţionată vom utiliza structura while. . nu vom avea niciodată endelse sau endelseif....

codul PHP pentru cele trei variante este prezentat mai jos. Pentru structura for poate fi folosită şi următoarea sintaxă alternativă: for (expresie #1.Singura diferenţă faţă de structura while este faptul că valoarea condiţiei este determinată. instrucţiunea va fi executată cel puţin o dată. echo "> $i </font></b>". Putem utiliza oricare dintre cele trei structuri repetitive. Sintaxa este foarte asemănătoare cu cea din limbajele C/C++ şi Java şi anume: for (expresie #1. iar celelalte cu albastru. Instrucţiunea este executată cât timp cea de-a doua expresie are valoarea true. $i <= 15. Oricare dintre cele trei expresii poate lipsi. else echo "blue". ?> Cod: <?php // Structuri alternative si repetitive . Nu există o sintaxă alternativă pentru această structură. după executarea instrucţiunii. Numerele pare vor fi scrise cu roşu. Exemple În continuare aveţi un exemplu care afişează numerele cuprinse între 1 şi 15. De fiecare dată. Vom folosi o structură repetitivă pentru a afişa numerele şi o structură alternativă pentru a determina culoarea cu care vor fi afişate. $i++): echo "<b><font size = 3 ". expresie #2. după executarea instrucţiunii. elseif ( ! ($i % 3)) echo "green". expresie #2. echo "color = ". iar cele impare care sunt divizibile cu 3 cu verde. if ( ! ($i % 2)) echo "red". Structura for O alternativă cu o funcţionalitate mai ridicată pentru utilizarea buclelor este structura repetitivă for. Ca urmare. expresie #3): instructiune endfor. expresie #3) instructiune Prima expresie este evaluată o singură dată. endfor. Cod: <?php // Structuri alternative si repetitive // Bucla for // Exemplu for ($i = 1. înainte de începerea execuţiei ciclului. în cazul în care o expresie lipseste. de fiecare dată. este evaluată cea de-a treia expresie. se consideră că ea are valoarea true.

} ?> Cod: <?php // Structuri alternative si repetitive // Bucla do . echo "> $i </font></b>".while // Exemplu $i = 1. $i++. do { echo "<b><font size = 3 ". elseif ( ! ($i % 3)) echo "green". else echo "blue". $i++. if ( ! ($i % 2)) echo "red". echo "color = ". } while ($i <= 15). Există două sintaxe acceptate pentru această structură şi anume: foreach (expresie_vectoriala as $valoare) instructiune . ea nu poate fi folosită decât împreună cu vectorii. utilizarea sa asupra unei variabile de alt tip duce la apariţia de erori. ?> Rezultat: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Structura foreach Această structură poate fi folosită pentru a realiza o iteraţie printre toate elementele unui vector. else echo "blue".// Bucla while // Exemplu $i = 1. Aşadar. while ($i<=15) { echo "<b><font size = 3 ". if ( ! ($i % 2)) echo "red". echo "color = ". echo "> $i </font></b>". elseif ( ! ($i % 3)) echo "green".

"doi" => 2. Execuţia ciclului se încheie în momentul în care nu mai există alte elemente în vector. // un vector obisnuit $a = array (1. } /* un vector ale carui elemente sunt identificate prin chei */ $a = array ( "unu" => 1. $b[1][1] = "d". 3. /* parcurgerea vectorului. "zece" => 10 ). Cod: <?php // structura foreach echo '<table width="100%"><tr><td with="50%">'. } // o matrice $b[0][0] = "a". $b[0][1] = "b". atunci la fiecare iteraţie valoarea elementului curent este atribuită variabilei $valoare şi apoi se trece la elementul următor (a cărui valoare va fi atribuită variabilei la următoarea iteraţie). 2. $b[1][0] = "c". foreach ($a as $k => $v) { echo "<li><tt>\$a[$k] => $v</tt>\n". . echo "</ul><td><width = 50%><b>Parcurgere cu afisarea cheilor: </b><ul>" . foreach ($a as $v) echo "<li><i>Valoarea curenta este </i>:<tt>$v</tt>\n<br>". "trei" => 3. echo "</ul><b>Parcurgerea unei matrice:</b><br><tt>". 10). echo "</ol><b>O alta parcurgere: </b><ul>".sau foreach (expresie_vectoriala as $cheie => $valoare) instructiune Dacă se utilizează prima variantă. În continuare este un exemplu de folosire a celor doua sintaxe ale structurii foreach. Singura diferenţa care apare în cazul utilizării celei de-a doua variante este faptul că la fiecare iteraţie valoarea cheii elementului curent este atribuită variabilei $cheie. foreach ($a as $v) { echo "<li><tt>\$a[$i] => $v</tt>\n <br>". echo "<b>Parcurgerea unui vector:</b><br><ol>". $i++. contorizarea elementelor si afisarea num arului de ordine al elementului curent */ $i = 0.

". echo "<br>". 2. 3. secvenţa de cod va fi următoarea: if ($variabila == instructiune #1 elseif ($variabila instructiune #2 elseif ($variabila instructiune #3 elseif ($variabila instructiune #4 else instructiune #5 valoare #1) == valoare #2) == valoare #3) == valoare #4) .&nbsp.". O soluţie ar fi folosirea unor structuri if îmbricate sau a uneia singure în care apar mai multe construcţii elseif. 4. } echo "</tt><br><b>Parcurgerea unui vector generat dinamic: </b><br><tt> &nbsp. Valoarea curenta este :1 Valoarea curenta este :2 Valoarea curenta este :3 Valoarea curenta este :10 • • • • $a[unu] => 1 $a[doi] => 2 $a[trei] => 3 $a[zece] => 10 O alta parcurgere: Parcurgerea unei matrice: • • • • $a[0] => 1 $a[1] => 2 $a[2] => 3 $a[3] => 10 a b c d Parcurgerea unui vector generat dinamic: 1 2 3 4 5 Structura switch În anumite cazuri trebuie să efectuăm anumite operaţii în funcţie de anumite valori ale unei expresii.&nbsp. 4. 3. 2. 5) as $v) echo "$v\n". ?> Rezultatul codului de mai sus este: Parcurgerea unui vector: Parcurgere cu afisarea cheilor: 1.foreach ($b as $v1) { echo "&nbsp. foreach ($v1 as $v2) echo "$v2\n". // un vector generat dinamic foreach (array (1. Dacă folosim structura if. echo "</tt></td></tr></table>". Să presupunem că o anumită variabilă poate avea cinci valori distincte şi pentru fiecare valoare trebuie executată o anumită instrucţiune.

Folosind structura switch. Următoarea secvenţă de cod PHP realizează parcurgerea elementelor unui vector de numere întregi până în momentul în care se întâlneşte un număr negativ. ?> Mai departe aveţi cazul în care este întreruptă execuţia mai multor cicluri. numere reale sau şiruri de caractere. Dacă valoarea expresiei nu corespunde nici uneia dintre valorile corespunzătoare construcţiilor case.. Instrucţiunea poate fi urmată de un argument care indică numărul de structuri îmbricate a căror execuţie se încheie. deci se întrerupe execuţia unei singure structuri. care va fi prezentată mai jos. Cod: <?php foreach ($a as $v) if ($v < 0) break. case valoare #4: instructiune break. secvenţa echivalentă este: swich ($variabila) { case valoare #1: instructiune break. toate instrucţiunile începând cu cea corespunzătoare valorii respective (până la sfârşitul blocului swich) vor fi executate. Dacă aceasta lipseste. atunci nu se execută nici o instrucţiune.. case valoare #5: instructiune break. Valoarea implicită este 1. Trebuie precizat faptul că valorile corespunzătoare construcţiilor case pot fi numere întregi. case valoare #3: instructiune break. nu pot fi utilizate obiecte sau vectori. . Instrucţiunea break Această instrucţiune poate fi folosită pentru a întrerupe forţat execuţia unui ciclu sau a secvenţei de instrucţiuni corespunzătoare unei structuri switch. } #1 #2 #3 #4 #5 Prezentăm în continuare sintaxa generală a structurii switch: switch (expresie) { case valoare #1: grup instructiuni #1 case valoare #2: grup instructiuni #2 . case valoare #n: grup instructiuni #n [default: grup instructiuni #n + 1] } Pentru început se determină valoarea expresiei şi apoi se verifică dacă aceasta apare ca valoare pentru una dintre construcţiile case. se execută instrucţiunile corespunzătoare construcţiei default. case valoare #2: instructiune break. În caz afirmativ. Execuţia acestor instrucţiuni poate fi întreruptă dacă este folosită instrucţiunea break. vom considera că parcurgem elementele unei matrice pătratice cu n elemente şi n coloane până în momentul în care întâlnim o valoare nulă.

În cazul instrucţiunii for.Cod: <?php for ($i = 0. while. înainte de următoarea iteraţie se evaluează (execută) expresia de incrementare (expresia #3 din sintaxa generală). echo $v. foreach. $j < $n. while ($i++ <5) { echo "Ciclul #1 <br>\n".<br>\n". ?> Instrucţiunea break poate fi utilizată pentru întreruperea execuţiei secvenţelor de instrucţiuni corespunzătoare structurilor for.while şi switch. } ?> Următorul exemplu ilustrează efectul folosirii argumentelor pentru instrucţiunea continue. Instrucţiunea continue Această instrucţiune este folosită pentru a întrerupe execuţia secvenţei de instrucţiuni din interiorul unui ciclu şi trecerea la următoarea iteraţie. $i < $n. Exemplul următor realizează afişarea elementelor unui şir de numere întregi care sunt mai mari decât 1000. $i++) for ($j = 0. Cod: <?php $i = 0. continue 3. Cod: <?php foreach ($a as $v) { if ($v <= 1000) continue. La fel ca şi în cazul instrucţiunii break. } echo "Acest mesaj nu va fi afisat niciodata. $j++) if ( ! $a [$i] [$j] ) break 2. . poate apărea un argument care indică numărul structurilor îmbricate asupra cărora are efect. while (1) { echo "??Ciclul #2 <br>\n". do . while (1) { echo "??Ciclul #3<br>\n".

Despre funcţii în PHP În PHP funcţiile pot fi definite de către utilizator folosind următoarea sintaxă: function numef ($param1. Funcţiile PHP trebuie să utilizeze instrucţiunea return pentru a furniza un rezultat. Vom aminti acum câteva dintre ele: Structurile include. şi. Argumentele unei funcţii trebuie separate prin virgulă.. Pentru ca funcţia să returneze un rezultat se foloseşte construcţia return care primeşte ca parametru o expresie care reprezintă valoarea funcţiei.<br>\n". $paramN) { // instructiuni } În PHP o funcţie poate fi definită oriunde în cadrul script-ului şi în interiorul unei funcţii poate să apară orice secvenţă validă de cod care include definirea de alte funcţii şi definiţii de clase. Interpretorul PHP consideră că secvenşa din fişierul inserat se află în fişierul din care s-a "comandat" inserarea în poziţia în care apare structura de inserare. implicit.. include_once şi require_once pot fi utilizate pentru a "insera" anumite instrucţiuni care sunt păstrate într-un alt fişier (document). $param2. pătratul unui număr.?> } echo "Nici acest mesaj nu va fi afisat niciodata.. În momentul în care este întâlnită construcţia return. execuţia funcţiei se încheie. } Rezultatul codului de mai sus este: Ciclul #1 Ciclul #2 Ciclul #3 Ciclul #1 Ciclul #2 Ciclul #3 Ciclul #1 Ciclul #2 Ciclul #3 Ciclul #1 Ciclul #2 Ciclul #3 Ciclul #1 Ciclul #2 Ciclul #3 Alte structuri PHP Există mai multe alte structuri PHP care pot fi utilizate în anumite scopuri. require. În exemplul următor se calculează cu ajutorul unei funcţii PHP. . Cod: . acestea sunt transmise prin valoare. O altă structură este declare care permite crearea unor directive în execuţie.

script: Iesire din modificExt: Iesire din a doua functie. echo "<b>In script: </b>"."<br>".<?php function patrat($n) { return $n * $n. echo "<b>In modificInt: </b>". } function modificExt (&$s) { $s .= " a doua functie.$s. se foloseşte operatorul '&' înaintea numelui parametrului formal. echo "<b>In script: </b>". script: Iesire din a doua functie. în momentul definirii funcţiei. echo "<b>In modificExt: </b>".= " prima functie.". modificInt ($s). . ?> Rezultatul codului va fi: 4^2=16 Transmiterea parametrilor prin referinţă Pentru a transmite parametri unei funcţii prin referinţă.$s. echo "<b>In script: </b>"."<br>".patrat(4). } $s="Iesire din ". ?> Rezultat: In In In In In script: Iesire din modificInt: Iesire din prima functie.$s."<br>".$s. modificExt ($s)."<br>"."</b>".". } echo "4^2=<b>".$s. Următorul exemplu indică modul în care se modifică valoarea unei variabile în interiorul unie funcţii şi modul în care această modificare este resimţită în exteriorul acesteia: Cod: <?php function modificInt ($s) { $s . de redefinire a ei după ce aceasta a fost definită în cadrul scriptului respectiv şi nu există nici posibilitatea de anulare a unei funcţii."<br>". fapt care implică modificarea valorii parametrilor şi păstrarea noii valori după ce execuţia funcţiei s-a încheiat. Nu există posibilitatea de supraâncărcare a unei funcţii.

$s. echo comanda("suc"). a cărei valoare implicită este 10.Parametri cu valori implicite În PHP parametrii formali pot avea valori implicite. $nr) si care returnează rezultatul transformării lui $nr din baza 16 în baza $baza. Aceste funcţii se definesc la fel ca cele prezentate anterior. dacă această funcţie este apelată din exteriorul unei funcţii definite de utilizator se va genera un mesaj de avertizare.func_get_arg(arg_num) . ?> Rezultat: Ati comandat cafea. ci parametrului $baza şi generează o eroare deoarece lipseste valoarea parametrului $nr. în cazul în care parametrul actual lipseşte.func_get_args( ) . şi. Ati comandat suc. dar pentru a putea accesa parametri se vor folosi următoarele funcţii predefinite: . În cazul în care se folosesc parametri cu valori implicite este necesar ca orice parametru care are o valoare implicită să se afle în partea dreaptă a tuturor parametrilor pentru care nu se folosesc valori implicite. Funcţii cu număr variabil de parametri O altă facilitate a limbajului PHP este aceea că oferă programatorului posibilitatea de a utiliza funcţii care au un număr nedeterminat de parametri. . Următorul exemplu ilustrează modul de folosire al funcţiilor când acestea au parametri formali cu valori implicite: Cod: <?php function comanda($s='cafea') { return "Ati comandat ".".returnează un tablou unidimensional care conţine valorile parametrilor pe care funcţia apelantă i-a primit.returnează valoarea parametrului care se află pe pozitia arg_num în lista de parametri. interpretorul nu atribuie valoarea 50 parametrului $nr. primul parametru are numărul de ordine 0. De exemplu. atunci se va considera că are valoarea implicită. .". . dacă această funcţie este apelată din exteriorul unei funcţii definite de utilizator se va genera un mesaj de avertizare.func_num_args( ) . Funcţiile care folosesc un număr variabil de parametri nu au nici o particularitate în ceea ce priveşte definirea lor. dacă avem o funcţie a cărei declaraţie este function transform ($baza=10.această funcţie returnează numărul parametrilor funcţiei care a apelat-o. dacă se apeleaza transform (50). dacă este apelată din exteriorul unei funcţii definite de utilizator se va genera un mesaj de avertizare. } echo comanda(). în caz contrar interpretorul PHP nu poate să decidă cărui parametru să-i atribuie valoarea de pe o anumită poziţie din lista de parametri. echo "<br>".

2. Primul exemplu afişează lista parametrilor funcţiei folosind funcţia func_num_argsşi func_get_arg. 2. iar al doilea exemplu afişează aceeaşi listă folosind numai funcţia func_get_args. "procesoare". 3)). $i++) { print_r(func_get_arg($i)). 1. Pentru ca o funcţie să poată returna o referinţă. array("local". } } echo lista_parametrii ("Comanda:". echo "<br>". "procesoare". "calculator". array("local". $i<func_num_args().În continuare aveţi 2 exemple de utilizare a acestor funcţii. } } echo lista_parametri("Comanda:". "con figuratie". echo "<br>". ?> Cod: <?php function lista_parametrii() { foreach(func_get_args() as $i) { print_r ($i). O funcţie poate să returneze chiar şi liste sau obiecte. Cod: <?php function lista_parametri() { for ($i=0. 2. aceasta trebuie declarată folosindu-se operatorul '&' înaintea numelui funcţiei. 1. 2. 3)). "c onfiguratie". ?> Rezultat: Comanda: 1 calculator 2 procesoare configuratie Array ( [0] => local [1] => 2 [2] => 3 ) Valorile returnate de funcţii Rezultatul obţinut după apelarea unei funcţii poate avea orice tip. "calculator". Acest operator trebuie să apară înaintea numelui funcţiei şi în . În PHP există un caz special de rezultat numit referinţă.

în anumite cazuri. Variabilele de tip funcţie nu funcţioneaza cu construcţii ale limbajului ca echo. return $s. o execută. . În exemplul următor se defineşte o funcţie al cărui rezultat îl constituie o referinţă: Cod: <?php function &refer() { global $s. Pentru a atribui un nume de funcţie unei variabile în PHP se foloseşte aceeaşi construcţie ca în cazul atribuirii unui şir de caractere. Spre deosebire de majoritatea limbajelor de programare moderne. $b) { return $a + $b. $rez = $operatie(4. Mai jos aveţi un exemplu care ilustrează modul de lucru cu variabilele de tip funcţie. 5). unset. şi anume. În cazul în care interpretorul PHP găseşte un nume de variabilă urmată de o listă de parametri. acesta caută funcţia pe care variabila o referă şi în cazul în care există.momentul când o variabilă primeşte ca valoare referinţa rezultată din apelul funcţiei. Cod: <?php function produs($a. o funcţie PHP poate să returneze o referinţă la o variabilă care a fost declarată în interiorul funcţiei. însă acest lucru nu este indicat deoarece. o variabilă va primi ca valoare numele funcţiei scris între ghilimele simple sau duble. Acest lucru este util atunci când se folosesc liste de funcţii pentru prelucrarea anumitor tipuri de date. În alte limbaje de programare efectele devin uneori fatale. Variabilele de tip funcţie O altă facilitate a limbajului PHP în ceea ce priveşte funcţiile este aceea că suportă variabile de tip funcţie. empty. include etc.". poate duce la efecte neaşteptate ale executării unui script PHP. $b) { return $a * $b. ?> Rezultat: Acesta este continutul variabilei referite cu ajutorul functiei. } $s = "Acesta este continutul variabilei referite cu ajutorul functiei. } $operatie = 'produs'. isset. echo $z. $z = &refer(). } function suma($a.

În PHP funcţiile ale căror identificatori încep cu _ sunt considerate funcţii magice şi utilizarea acestora nu este recomandată. ?> Rezultat: 4 * 5 = 20 4+5=9 Clase şi obiecte în PHP O clasă este o colecţie de variabile şi funcţii care operează asupra variabilelor respective.. $operatie = 'suma'. 5)."</b><br>". $rez = $operatie(4.."</b><br>".. // definirea functiei } } ?> Pentru numele unei clase poate fi utilizat orice identificator permis în PHP cu o singură excepţie: sdtclass. echo "4 + 5 = <b>"..$rez.echo "4 * 5 = <b>". Sintaxa folosită pentru declararea unei clase în PHP este: Cod: <?php class nume_clasa { // date membre var nume_variabila_1 .. Mai jos aveti un exemplu de clasă în care initializările nu sunt corecte: Cod: <?php .. var nume_variabila_m // metode function nume_functie_1 (parametri) { . Pentru a iniţializa variabilele cu valori care nu sunt constante trebuie folosit un constructor.. // definitia functiei } . În PHP.$rez.. datele membre nu pot fi iniţializate decât cu valori constante. function nume_functie_n (parametri) { . acest identificator este folosit de PHP în scopuri interne.

pentru a afişa suma sau produsul celor două numere vom putea apela cele două metode astfel: echo $aritm -> Suma ( ). . var $nume = $prenume. Vom obţine rezultatele 5. în urma modificării apelam din nou metodele Suma( ) şi Produs( ). Cod: <?php class Aritmetica { var x = 2.'Claudiu'. Pentru a crea o variabilă al cărei tip este o clasă trebuie utilizat operatorul new. function Suma () { return $this -> x + $this -> y. respectiv 20. } function Produs() { return $this -> x * $this -> y. ele pot fi privite ca fiind "amprentele" variabilelor propriu-zise. var y = 3. Acum putem utiliza metodele clasei. rezultatele vor fi 9. var $obiecte = array ("minge". În continuare vom defini o clasă Aritmetica cu două date membre x şi y care sunt numere întregi şi două metode care realizează adunarea. } ?> Obiecte În PHP clasele sunt considerate a fi tipuri de date. respectiv 6. Valorile datelor membre pot fi şi ele modificate prin instrucţiuni de tipul: $aritm -> x = 5.class Nepermis { var $data = date("Y-m-d"). Dacă. $aritm -> y = 4. echo $aritm -> Produs ( ). } } ?> Pentru a crea un obiect de tipul Aritmetica vom utiliza o instrucţiune de tipul: $aritm = new Aritmetica. "pantof"). var $dest = 'Mihai '. respectiv înmulţirea lor.

Cod: <?php class PHP4 { var $salut = "Salut PHP4!". O clasă derivată va păstra toate proprietăţile şi metodele clasei pe care o extinde şi poate conţine diferite proprietăţi şi metode noi. o să adaug încă o variabilă şi o să crez două noi funcţii: una pentru calculul sumei celor trei variabile şi una pentru calcularea produsului lor: Cod: <?php class Aritmetica3 extends Aritmetica { var z = 4. Pentru a usura definirea unor astfel de clase a fost introdus conceptul de extindere (derivare) a claselor. în PHP nu este permisă moştenirea multiplă. echo $salutare -> Salut(). ή următorul exemplu voi extinde clasa Aritmetica. } } ?> . Aceasta este folosită pentru a indica faptul că se operează asupra unei date membre a obiectului curent. } function Produs3() { return $this -> x * $this -> y * $this -> z. function Salut() { return $this -> salut. Nu există nici o posibilitate de a elimina din clasa derivată anumite proprietăţi sau metode ale clasei de bază. O anumită clasă poate avea o singură clasă părinte. Pentru a extinde o anumită clasă se utilizează cuvântul cheie extends. } } $salutare = new PHP4. aşadar. ?> Rezultatul codului de mai sus este: Salut PHP4! În acest exemplu a fost utilizată pseudo-variabila $this. Extinderea claselor Deseori este necesară definirea unor clase cu proprietăţi (date membre) şi metode asemănătoare. function Suma3() { return $this -> x + $this -> y + $this -> z."<br>".

echo $aritm3 -> Suma()."<br>". echo $aritm3 -> Produs(). $aritm3 -> y = 4. } } $aritm3 = new Aritmetica3. echo "Suma primelor doua numere: ". echo $aritm3 -> Produs(). var $y = 3. echo $aritm3 ->Suma().Dacă definim un obiect prin intermediul unei instrucţiuni de genul: $aritm3 = new Aritmetica3. echo "<br>". atunci pentru acest obiect vom putea utiliza atât metodele definite în cadrul clasei Aritmetica3: Suma3( )şi Produs3( ). $aritm3 -> x = 5. } } class Aritmetica3 extends Aritmetica { var $z = 4. } function Produs() { return $this -> x * $this -> y."<br>"."<br>". } function Produs3() { return $this -> x * $this -> y * $this -> z. echo "<b>Inainte de modificare. function Suma() { return $this -> x + $this -> y. $aritm3 -> z = 3.</b>". echo "Produsul primelor doua numere: ". ."<br>". Cod: <?php class Aritmetica { var $x = 2. În continuare aveţi un exemplu care ilustrează modul în care pot fi create şi utilizate clasele derivate. echo "Produsul celor trei numere: ". echo "<br><br>". cât şi metodele definite în cadrul clasei de bază Aritmetica: Suma( )şi Produs( ). function Suma3() { return $this -> x + $this -> y + $this -> z. echo "Suma celor trei numere: ".

"<br>". Suma primelor doua numere: 5 Produsul primelor doua numere: 6 Suma celor trei numere: 5 Produsul celor trei numere: 6 Dupa modificare.echo echo echo echo echo echo echo echo echo echo ?> "<b>Dupa modificare. $aritm3 -> Produs3(). aşadar clasa părinte va fi definită întotdeauna înaintea clasei fiu. se recomandă stabilirea unor valori implicite pentru toate argumentele constructorului. orice funcţie care are acelaşi nume cu clasa în interiorul căreia este definită."<br>". "Suma primelor doua numere: "."<br>". "<br>". "Produsul primelor doua numere: ". În cazul în care nu este definit un constructor pentru o anumită clasă. De exemplu. va fi apelat constructorul clasei A. În PHP. Constructorii pot fi folosiţi pentru iniţializarea datelor membre cu valori care nu sunt constante. pentru următoarea secvenţă de cod. $aritm3 -> Produs3(). Cod: <?php class A { function A() . în momentul creării obiectului corespunzător variabilei $b. Rezultatul codului de mai sus este: Citat: Inainte de modificare. iar acestea pot fi optionale. "Suma celor trei numere: ". se utilizează constructorul clasei de bază. Pentru a putea utiliza clasa fără a specifica nici un parametru în momentul creării unui obiect."<br>". Constructori Un constructor este o metodă (funcţie) a unei clase care este apelată automat în momentul în care este creată o nouă instanţă a clasei (cu ajutorul operatorului new). Ei pot avea argumente. dacă aceasta există.</b><br>". este considerată ca fiind un constructor. $aritm3 -> Suma3(). Suma primelor doua numere: 12 Produsul primelor doua numere: 60 Suma celor trei numere: 12 Produsul celor trei numere: 60 În PHP clasele trebuie definite înaintea utilizării lor. "Produsul celor trei numere: ". $aritm3 -> Suma3().

În PHP nu există destructori.<br>". $b -> exemplu(). $b = new B. În majoritatea limbajelor de programare există funcţii speciale numite destructori care sunt apelate automat în momentul "distrugerii" unui obiect.{ echo "Constructorul clasei A<br>". $b = new B.<br>". } } class B extends A { function C() { echo "O functie obisnuita a clasei B. ?> . <br>". Operatorul :: Uneori este utilă folosirea unor metode sau variabile ale clasei de bază sau ale unei clase care nu a fost instanţiată încă. } } A :: exemplu(). A :: exemplu(). } function B() { echo "O functie obisnuita a clasei A. } } ?> În PHP apelul constructorului clasei de bază trebuie să fie explicit dacă este necesară executarea operaţiilor corespunzătoare. } } class B extends A { function exemplu() { echo "Functia redefinita<br>\n". În acest scop a fost introdus operatorul :: Pentru a descrie modul de utilizare al acestui operator voi prezenta mai întâi un exemplu: Cod: <?php class A { function exemplu() { echo "Functia clasei de baza.

În exemplul anterior. deci nu putem scrie o instrucţiune de tipul $a -> exemplu( ). Putem avea funcţii ale claselor. dar nu putem avea variabile ale claselor. Aşadar. în momentul unui astfel de apel nu se creeaza nici un obiect care este instanţă a clasei respective. este apelată metoda exemplu( ) a clasei A. De fapt. Ca urmare. În locul utilizării denumirii clasei de baza poate fi folosită denumirea specială parent care este o referinţă la clasa de bază definită în cadrul construcţiei extends. definiţia clasei B poate fi rescrisă astfel: Cod: <?php class B extends A { function exemplu() { echo "Functia redefinita<br>\n". } } ?> Serializarea obiectelor Prin serializare se înţelege crearea unui şir de octeţi care conţin reprezentarea internă (binară) a variabilei respective. deoarece funcţiile nu reprezintă valori. În plus. nu şi metodele. aşadar se afişează mesajul 'Functia clasei de baza' cu toate că nu există nici un obiect care este o instanţă a acestei clase. Pentru a deserializa un obiect se foloseşte funcţia pereche unserialize( ). În acest caz este suficientă o singură modificare în cadrul construcţiei extends. Folosirea denumirii speciale este utilă în cazul în care ierarhia de clase se modifică. parent :: exemplu(). Dacă este serializat un obiect sunt salvate doar proprietăţile acestuia (variabilele membre) şi numele clasei din care face parte. Pentru ca o astfel de operaţie să funcţioneze corect este necesară definirea clasei din care face parte obiectul respectiv. Accesarea clasei de baza În exemplul anterior am utilizat o funcţie a clasei de bază. în cadrul clasei B este redefinită funcţia exemplu( ). Aşadar.Prin intermediul instrucţiunii A :: exemplu( ). Aşadar. Funcţia returnează valoarea variabilei serializate. Pentru a serializa un obiect este utilizată funcţia serialize( ) care returnează şirul de octeţi care conţine reprezentarea binară. În exemplul . serializarea permite "salvarea" valorilor unei variabile. În schimb apelăm metoda $b -> exemplu( ). o funcţie a unei clase nu poate opera asupra unor proprietăţi ale clasei. fără a mai fi necesare modificări în interiorul clasei derivate. o astfel de funcţie nu poate utiliza pseudo-variabila $this. definiţia "originală" (din cadrul clasei A) nu poate fi accesată în interiorul clasei B decât dacă ne referim la ea explicit prin intermediul operatorului ::. ca "o funcţie a clasei" şi nu ca "o funcţie a unui obiect". dar poate utiliza variabile locale sau globale.

În PHP denumirile variabilelor şi conţinutul acestora nu sunt unul şi acelaşi lucru. dupa deserializare obiectul poate fi folosit -> show_one(). } } // $s $a // $a ?> citirea sirului din fisier = implode ("". @file ("fisier")). De obicei serializarea şi deserializarea sunt realizate în documente php diferite deoarece aeste operaţii nu au aproape nici o utilitate dacă sunt folosite în cadrul aceluiaşi document. // salvarea sirului intr-un fisier $fp = fopen ("fisier". = unserialize ($s). fputs ($fp. } } $a = new A. fclose ($fp). Spre deosebire de limbajul C. $s). $s = serialize ($a). Primul document în care se realizează serializarea trebuie să conţină o secvenţă asemănătoare cu următoarea: Cod: <?php class A { var $msg = "Salutare lume". ci alias-uri într-o tabela de simboluri. Şirul de octeţi obţinut în urma serializării va fi scris într-un fişier şi va fi citit din fişierul respectiv pentru efectuarea deserializării. function scrie() { echo $this -> msg. Referinţele pot fi utilizate pentru a accesa conţinutul unei variabile folosind mai multe nume. în PHP referinţele nu sunt pointeri. .următor aveţi prezentat modul în care poate fi serializat şi deserializat un obiect. function scrie() { echo $this -> msg. Aşadar este posibil ca acelaşi conţinut să aibă denumiri diferite. ?> Pentru deserializare al doilea document va conţine următoarea secvenţă: Cod: <?php class A { var $msg = "Salutare lume". "w").

Un parametru transmis prin referinţă poate fi: . După apel variabila locală $var şi variabila din contextul apelant $a indică spre acelaşi conţinut. ?> Iniţial valoarea variabilei $a este 5. De exemplu.Utilizarea referinţelor Referinţele PHP permit unor variabile cu denumiri diferite să corespundă unui acelaşi conţinut.. Să luăm în considerare următorul exemplu: Cod: <?php function inc(&$var) { $var++.o variabilă.o instrucţiune new. Dacă unei astfel de funcţii i se transmite ca parametru un alt tip de expresie rezultatul este nedefinit. pentru o funcţie care are un parametru transmis prin referinţă nu se poate folosi o constantă în momentul apelului. Valoarea păstrată în locaţia de memorie respectivă este incrementată (devine 6) prin intermediul instrucţiunii $var++. Referinţa $this În cadrul unei metode a unui obiect $this este întotdeauna o referinţă spre obiectul care utilizează funcţia (obiectul curent).o referinţă returnată de o funcţie. inc($a)./em> au acelaşi statut. Aşadar. . O altă posibilitate de utilizare a referinţelor este transmiterea prin referinţă a parametrilor unei funcţii. această instrucţiune este echivalentă cu $var = &$GLOBALS ["var"]. } $a = 5. Datorită faptului că cele două variabile au acelaşi conţinut. pentru funcţia inc( ) prezentată anterior nu este permis un apel de forma inc(5). Cu alte cuvinte. . . În această situaţie $a şi $b<. Referinţe globale În momentul declarării unei variabile globale (printr-o instrucţiune de tipul global $var) se creează de fapt o referinţă spre o variabilă globală. instrucţiunea $a = &$b are ca efect faptul că $a şi $b referă aceeaşi variabilă. Cu alte cuvinte. valoarea variabilei $a va fi 6 după executarea funcţiei. Efectul unei astfel de transmisii este crearea unei variabile locale care referă spre acelaşi conţinut ca variabila din contextul apelant. Nu se poate spune că $a referă $b sau invers..

$open_thumbnails = opendir("thumbnails"). În primul rând avem nevoie de două foldere: unul pentru imaginile originale. } } closedir($open_thumbnails). Astfel pentru fiecare poză care exista în folderul pictures dar nu se află şi în folderul thumbnails îi vom crea o poză în miniatură cu dimensiunile stabilite prin . ?> Vom reţine apoi în două variabile de tip vector numele pozelor care se află în folderul pictures dar nu se află în folderul thumbnails. GIF sau PNG însă scopul principal al acestui tutorial este acela de a vă face să întelegeţi care sunt paşii pe care trebuie sa îi urmaţi când faceţi un asemenea script. } } closedir($open_pictures). while($file = readdir($open_thumbnails)) { if(substr($file. while($file = readdir($open_pictures)) { if(substr($file. altfel veţi întâmpina o eroare prin care vă va fi adus la cunoştinţă că funcţia pentru imagini nu poate fi găsită.') { $thumbnails[] = $file. 0. Dacă librăria GD2 nu este activă o puteţi activa în felul următor în mediul WINDOWS: adăugaţi liniile următoare în php. Odată apăsat un thumbnail vom deschide poza originală. cât şi pozele care se află în folderul thumbnails dar nu se afla în folderul pictures. Să vedem în continuare cum vom face acest lucru posibil. 1) != '. Este evident că putem adapta scriptul pentru orice format de imagine. 0. } else { $thumbnails = array(). Thumbnail-urile sunt nişte imagini în miniatură de o rezoluţie mai mică. şi îl vom denumi pictures şi unul pentru thumnail-uri pe care îl vom denumi thumbnails.') { $pictures[] = $file. PHP-ul pe care îl rulaţi trebuie să aibă activată libraria GD2 pentru a rula acest script.dll Vom deschide directorul pictures şi thumbnails şi vom citi numele fiecărui fişier care există în aceste directoare şi le vom memora în vectorul $pictures şi $thumbnails Cod: <?php $open_pictures = opendir("pictures").Crearea imaginilor thumbnails Acest tutorial vă va învăţa cum să creaţi thumbnail-uri ale unor imagini mai mari ca dimensiune.ini: extension=php_gd2. Ceea ce este foarte important este că în aceste două foldere nu trebuie să se găsească decât imagini de tip JPG altfel vom întâmpina erori. 1) != '.

$image. $max_height = 100. $thumbnail_height = $image_attribs[1] * $ratio. $thumbnail_heig ht). 0. Cod: $image = imagecreatefromjpeg($image_name). $thumbnail_height. acestea nu sunt necesare şi le vom şterge cu ajutorul funcţiei unlink(). 0. foreach($diff_pic as $key => $value) { $image_name = 'pictures/'. $thumbnail_name = 'thumbnails/'. Pentru început vom returna o imagine din poza originală cu ajutorul funcţiei imagecreatefromjpeg() după care vom crea o imagine neagră cu dimensiunile calculate mai sus pentru thumbnail. imagecopyresampled($image_new. Vom crea imaginea jpg în calea specificată în variabila $thumbnail_name cu ajutorul funcţiei imagejpeg(). $thumbnail_name). astfel încât dacă lungimea pozei originale este mai mare decât înălţimea. true). imagedestroy($image). $pictures). $image_attribs = getimagesize($image_name). $thumbnails). apoi vom copia imaginea originală peste imaginea thumbnail păstrând proporţiile. imageantialias($image_new. În continuare vom crea acele thumbnail-uri ale pozelor prin aplicarea funcţiilor PHP pentru imagini.$value. } ?> Este posibil ca în directorul thumbnails să se afle imagini ale pozelor care nu se mai află în directorul pictures. $max_width = 100. $thumbnail_width. Cod: <?php $diff_pic = array_diff($pictures. Calea către thumbnail o vom ţine într-o variabilă $thumbnail_name.variabila $max_width şi $max_width bineânţeles păstrând proporţiile pozei originale calculate cu ajutorul variabilei $ratio. $thumbnail_width = $image_attribs[0] * $ratio. Numele pozei în miniatură va fi acelaşi cu numele pozei originale numai că o vom salva în alt director. imagejpeg($image_new. $image_attribs[0]. iar în caz contrar $ratio va lua valoarea înălţimii maxime setate pentru thumbnail împărţite la înălţimea pozei originale. Vom afla în continuare noile dimensiuni ale pozei în miniatură calculate în variabilele $thumbnail_width şi $thumbnail_height prin îmulţirea dimensiunilor pozei originale cu $ratio. $image_new = imagecreatetruecolor($thumbnail_width. $ratio = ($image_attribs[0] > $image_attribs[1]) ? $max_width / $im age_attribs[0] : $max_height / $image_attribs[1]. $image_attribs[1]).$value. 0. Rezoluţia pozei originale o aflăm cu ajutorul funcţiei getimagesize() care returnează un vector cu atributele pozei. $diff_tumb = array_diff($thumbnails. atunci $ratio va lua valoarea lungimei maxime setate în variabila $max_width împărţită la lungimea pozei originale. 0. Vă amintiţi că mai sus am aflat care sunt pozele care se afla în directorul thumbnails dar nu .

1) != '. $thumbnails). $diff_pic = array_diff($pictures.org/TR/xhtml1/DTD/xhtml1-transitional.$value). Cod: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.w3. Mai jos aveţi întreg codul sursă pentru crearea imaginilor thumbnail şi afişarea acestora în pagină. } else { $thumbnails = array(). } } closedir($open_thumbnails). 1) != '. .se afla în directorul pictures cu ajutorul funcţiei array_diff() care face diferenţa dintre valorile primului vector analizat şi cel de-al doilea vector. cu link către pozele originale. } } closedir($open_pictures). while($file = readdir($open_thumbnails)) { if(substr($file. 0. Cod: <?php foreach($diff_tumb as $key => $value) { unlink("thumbnails/". 0.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html.w3. $open_thumbnails = opendir("thumbnails"). charset=iso-8859-1" /> <title>Thumbnails</title> </head> <body> <?php $open_pictures = opendir("pictures"). while($file = readdir($open_pictures)) { if(substr($file.') { $pictures[] = $file.') { $thumbnails[] = $file.0 Transitional//EN" "http:// www. } ?> În acest moment avem create thumbnail-urile imaginilor originale şi le vom afişa în pagină încadrate într-un tabel cu $modulo celule.dtd"> <html xmlns="http://www.

'" target="_blank" title="Click to enlarge!" >'. $max_width = 100. echo '</a></td>'.1) { echo '</tr>'. $k++) { . $unfinished = $l % $modulo. 0. $thumbnail_heig ht). $l = 0. $image_attribs[0]. $max_height = 100.') { if($l % $modulo == 0) { echo '<tr>'.$diff_tumb = array_diff($thumbnails. 1) != '. } if($l % $modulo == $modulo . 0. $image_attribs = getimagesize($image_name). echo '<td align="center" valign="middle"><a href="pictures/' .$value.$file. $image_attribs[1]). imagedestroy($image). imagejpeg($image_new. imageantialias($image_new. foreach($diff_pic as $key => $value) { $image_name = 'pictures/'.'" alt="thumbnail" borde r="0" />'. $pictures).$file. $thumbnail_name = 'thumbnails/'. $thumbnail_width. $thumbnail_name). true). $ratio = ($image_attribs[0] > $image_attribs[1]) ? $max_width / $im age_attribs[0] : $max_height / $image_attribs[1].$value. $image. } foreach($diff_tumb as $key => $value) { unlink("thumbnails/". $image_new = imagecreatetruecolor($thumbnail_width. } $open_thumbnails = opendir("thumbnails"). 0. $k < $modulo. $modulo = 4. $thumbnail_height = $image_attribs[1] * $ratio. } $l++. imagecopyresampled($image_new. if($unfinished != 0) { for($k = $unfinished. $image = imagecreatefromjpeg($image_name). 0. echo '<img src="thumbnails/'. 0. while($file = readdir($open_thumbnails)) { if(substr($file. echo '<table border="0" align="center">'. $thumbnail_width = $image_attribs[0] * $ratio. } } closedir($open_thumbnails).$value). $thumbnail_height.

echo 'Pentru accesarea continutului este necesara o autentificare!' . Nu este posibilă decât autentificarea de tip "Basic". După cum probabil ştiţi. echo "<p>Salut <b><i>{$_SERVER['PHP_AUTH_USER']}</i></b>!</p>".0 401 Unauthorized'). } echo '</tr>'. După introducerea informatiilor necesare va fi accesată din nou pagina web dar. precum şi informaţii despre starea conexiunii. parola. Pentru a trimite mesajul care cere autentificarea este utilizată funcţia header() . Una dintre variantele prin care poate fi verificat faptul dacă un anumit utilizator are dreptul de a accesa un anumit site este cererea introducerii unui nume de utilizator şi a unei parole în momentul în care persoana respectivă încearcă să acceseze aceste informaţii. variabilele predefinite PHP_AUTH_USER. } ?> . de această data.opaq.</p>". echo "</head><body>". PHP_AUTH_PW şi PHP_AUTH_TYPE vor conţine numele de utilizator. } echo '</table>'. anumite site-uri au accesul restricţionat şi conţinutul lor poate fi accesat numai de către anumite persoane autorizate. Un exemplu în care este prezentată o autentificare înaintea accesării informaţiilor este prezentat în continuare: Cod: <?php if (!isset($_SERVER['PHP_AUTH_USER'])) { header ('WWW-Authenticate: Basic realm="php4"'). În momentul acceasării paginii web este trimis un mesaj care indică faptul că autentificarea este necesară. ?> </body> </html> Articol preluat de la http://boo. header ('HTTP/1.org Autentificarea în paginile restricţionate şi câteva informaţii despre cookie. exit. } else { echo "<html><head>".</td>'. echo "<p>Parola introdusa este <b><i>{$_SERVER['PHP_AUTH_PW']}</i>< /b>. echo "<title>Autentificare</title>". echo "</body></html>". respectiv tipul autentificării. Programul de navigare va afişa o casetă de dialog care permite introducerea unui nume de utilizator şi a unei parole. uploadul fişierelor şi includerea lor în pagini.echo '<td>&nbsp.

O altă variantă este de a seta directiva output_buffering din php. numele de utilizator şi parola sunt afişate. accesa cooke-ul atunci cookie va fi accesibil doar pentru fişierele şi scripturile din directorul /foo/ (de pe server) înclusiv toate sub-directoarele acelui director. headerele trebuiesc trimise primele. de obicei printr-o interogare a unei baze de date.0 şi 401 trebuie să existe exact un spaţiu. cookie va fi accesibil cale generică a fişierelor care pot pentru întreg domeniu. Valoarea standard este setată . setcookie() va genera un mesaj de eroare de tipul FALSE. În practică. puteţi folosi funcţiile ob_start() la începutul scriptului şi ob_end_flush() la sfârşitul scriptului pentru a se genera un buffer cu tot ce trebuie trimis la browser. În PHP există o funcţie specială care poate fi folosită pentru crearea cookie-urilor şi anume setcookie(). nu se poate trimite conţinutul paginii şi apoi headerul. sau puteţi folosi mktime(). când se cere închiderea buffer-ului prin apelarea celei de-a doua funcţii . se va verifica validitatea lor. cum ar fi /foo/bar/.ob_end_flush() . iar la sfârşit. Dacă este setat ca '/foo/'. iar între HTTP/1. Funcţia setcookie() are şase parametri. Dacă nu e setat. începând cu headerele şi continuând cu restul paginii. În situaţia în care este apăsat butonul Cancel. valoarea cookie-ului (informaţia valoarea va fi preluată prin corespunzătoare). valoarea pentru realm trebuie să fie cuprinsă între ghilimele (nu între apostrofuri). cookie va expira la cookie-ul nu va mai putea fi terminarea sesiunii curente (când se închide utilizat. securitate). Aceasta nu indică dacă userul a acceptat sau nu cookie. expirare. Valoarea este în format browserul) "Unix timestamp". şi astfel la sfârşit se vor trimite toate odată. În acest exemplu.. buffer-ul se va genera pe măsură ce primeşte date. Funcţia defineşte un cookie care va fi trimis împreună cu celelalte headere HTTP. cale. Începând de la php4. ci doar că a fost generat şi trimis cu succes. headerele se vor trimite primele apoi restul buffer-ului). va returna TRUE. Dacă a fost trimis ceva la browser (chiar şi un simplu spaţiu blank) înainte de apelarea acestei funcţii. Parametru Descriere Exemplu nume şir de caractere care reprezintă 'nume_cookie' va fi apelat ca numele cookie-ului $_COOKIE['nume_cookie'] valoare şir de caractere care reprezintă Presupunând că numele este 'cookiename'. care va fi $_COOKIE['cookiename'] salvat pe calculatorul clientului (nu trimiteţi date sensibile. Sintaxa este: setcookie(nume. adică se poate seta folosind funcţia time() plus numărul de secunde până când doriţi să expire. valoare. înaintea oricărui mesaj). cookies trebuie trimis înaintea oricărui caracter din script (aceasta deoarece există o restricţie de protocol. indiferent dacă în script aţi trimis întâi text şi apoi headere (folosind prima funcţie. Funcţia setcookie. pagina web generată va conţine un mesaj de avertizare.ini (în fişierul de configurare al serverului). cale şir de caractere care reprezintă o Dacă este setată ca '/'. doar prezenţa primului parametru fiind obligatorie.Rezultatul codului de mai sus îl puteţi vedea dând clik aici. gen parola) expirare un număr întreg care indică time()+60*60*24*30 va seta cookie să expire momentul de timp în care în 30 de zile. Dacă setcookie() a putut genera cu succes cookie-ul. cuvântul Basic trebuie scris cu majusculă. Ca şi alte headere. Pentru o compatibilitate cât mai mare. domeniu.

// expiră dupa o oră de la creare . şir de caractere care reprezintă Pentru a face cookie disponibil pentru toate domeniul pe care trebuie stocate subdomeniile. Setarea de bază este 0 (FALSE) Dacă unul dintre parametri este prezent.example. time()+3600).com'. Următoarele exemple ilustrează modul în care poate fi realizată această operaţie: setcookie ("TestCookie". dacă are 0 sau 1 valoarea 1 (TRUE). "cookietwo"). Cu ajutorul funcţiei setcookie() este posibilă şi ştergerea cookie-urilor.domeniu securitate ca directorul curent (directorul curent adică directorul în care există scriptul care a setat acel cookie).php4. Setând ca www. "/comenzi/". "Test". atunci toţi parametrii anteriori trebuie să fie prezenţi. În continuare sunt prezentate câteva exemple de apeluri prin care sunt create cooke-uri: .php4.com puteţi fişierele care pot accesa cookie.domeniu.ro". ". . setcookie ("cookie[one]".setcookie ("TestCookie". if (isset ($cookie)) { while (list($name. se va folosi în poziţia respectivă fie şirul vid.as. număr întreg care. Pentru alte detalii vedeţi specificaţiile de aici. de exemplu domeniu. "cookiethree"). time()-3600.$value)=each($cookie)) { echo "$name == $value<br>". arată că informaţia poate fi transmisă doar folosindu-se o conexiune HTTPS securizată. ".setcookie ("TestCookie". dar îl face compatibil cu mai multe browsere. 1). Punctul dinainte nu ul este neaparat necesar.as. Dacă unul dintre aceştia nu este utilizat. "/articole/". Se observă că momentul expirării este setat ca fiind anterior momentului executării operaţiei de stergere. sau setcookie ("TestCookie". fie valoarea 0. "".1). "PHP4"). Există posibilitatea de a crea şiruri de cookie-uri prin simpla introducere a parantezelor drepte în denumiri.setcookie ("TestCookie". time()-3600). time()+3600. "".com veţi face cookie-ul disponibil doar pentru sub-domeniul www. } } ?> . "Site". Un exemplu de creare şi utilizare a unor astfel de şiruri este prezentat în continuare: Cod: <?php setcookie ("cookie[three]".ro".seta astfel '. setcookie ("cookie[two]". "cookieone").

. } ?> Fişierele pot fi încărcate pe un server dacă utilizatorul foloseşte un program de navigare compatibil RFC-1867. URL-ul care este folosit ca valoare pentru atributul action al marcajului <from> trebuie să reprezinte documentul php care va realiza încărcarea. Voi prezenta în continuare un exemplu cu ajutorul căruia se generează o pagină care conţine denumirile şi valorile tuturor cookie-urilor. este disponibil vectorul $_COOKIE. folosind limbajul HTML standard. avem controlul total asupra utilizatorilor care pot încărca fişiere şi asupra operaţiilor efectuate cu fişierul încărcat. informaţiile referitoare la fişierul încărcat vor fi .Pentru a accesa cookie-urile stocate pe calculatorul unui vizitator al paginii Web. cât şi a celor binare. Folosind autentificarea PHP şi funcţiile de manipulare a fişierelor. Pentru a manipula fişierele poate fi utilizat tabloul $_FILES. pot fi utilizate ultimile versiuni ale celor mai cunoscute browsere. Un astfel de formular poate fi creat. Pentru script-ul care prelucrează formularul prezentat anterior. de exemplu. Este posibilă specificarea fişierului precizând exact calea în caseta de text afişată. În continuare este prezentat un document HTML care generează o pagina web care permite alegerea unui fişier şi încărcarea sa pe un server. Este posibilă încărcarea atât a fişierelor text. formularul prin intermediul căruia este ales fişierul va fi prelucrat de către un script PHP. Cod: <?php foreach ($_COOKIE as $cheie=>$valoare) { echo "$cheie = $valoare<br>". Formularul de încarcare (upload) Pentru ca utilizatorul să poată încărca un fişier. Operatia de încarcare (upload) Aşadar.php" method="post"> Alegeti fisierul: <br> <input name="fisier" type="file"> <input type="hidden" name="MAX_FILE_SIZE" value="1024"><br> <input type="submit" value="Trimite fisierul!"> </form> </body> </html> Butonul Browse. el trebuie să aibă la dispoziţie un formular care să permită alegerea fişierului.. poate fi utilizat pentru alegerea unui fişier care urmează a fi încărcat. Cod: <html> <head> <title>Incarcarea unui fisier pe server</title> </head> <body> <form enctype="multipart/form-data" action="upload.

3. Versiunea 4.$_FILES['fisier'] ['type'] tipul fişierului în cazul în care programul de navigare furnizează această informaţie. Fişierul va fi stocat pe server în directorul care conţine fişierele temporare. exprimată în bytes.$_FILES['fisier'] ['name'] numele pe care îl are fişierul pe calculatorul utilizatorului. Codurile de eroare care pot fi generate sunt următoarele: . În funcţie de codul de eroare generat în urma operaţiei. operaţia de încărcare s-a încheiat cu succes. Codul de eroare poate fi accesat prin intermediul elementului ['error'] al vectorului care păstrează informaţiile despre fişier.$_FILES['fisier'] ['fisier'] ['error'] un cod de eroare generat în urma efectuării încărcării.$_FILES['fisier'] ['size'] dimensiunea fişierului. ?> Coduri de eroare Începând cu versiunea PHP 4. trebuie realizate diferite acţiuni. } ?> O variantă alternativă ar fi: Cod: <?php move_uploaded_file($_FILES['fisier']['tmp_name']. .0. ."/directorul/dorit"). O secvenţă de instrucţiuni PHP care poate fi folosită pentru a prelucra fişierul încărcat şi a-l muta în directorul dorit este următoarea: Cod: <?php if (is_uploaded_file($_FILES['fisier']['tmp_name')) { copy($_FILES['fisier']['tmp_name']. un exemplu ar putea fi image/gif.acceasate folosind variabila $_FILES['fisier'] care este tot un vector.0 introduce constante predefinite pentru fiecare dintre aceste coduri. Elementele acestui vector sunt prezentate în cele ce urmează: . .$_FILES['fisier']['name'].UPLOAD_ERR_OK (0) nu a fost semnalată nici o eroare în timpul transferului.2.$_FILES['fisier'] ['tmp_name'] numele temporar pe care îl are fişierul pe server după încheierea procesului de încărcare. în urma efectuării unui transfer."/directorul/dorit"). sunt generate anumite coduri de eroare. } else { echo "Eroare de transfer ". . .

GIF. Să presupunem că avem un fişier numit HELLO. . pe lângă faptul că este incomodă. $_FILES['fisiere']['name'][0] va avea valoarea POZA1. problema este destul de importantă. De asemenea. poate fi utilizată directiva include(). .GIF şi DOC1.. această valoare este specificată prin intermediul unui câmp ascuns al cărui text este MAX_FILE_SIZE. mai multe pagini web pe care le creăm trebuie să conţină secvenţe identice.. În acest caz.TXT cu următorul conţinut: Cod: . Pentru a accesa un astfel de fişier.INI).UPLOAD_ERR_NO_FILE (4) nu a fost încărcat nici un fişier. duce la un consum mărit de spaţiu pe server şi. Evident.PDF.UPLOAD_ERR_FORM_SIZE (2) dimensiunea fişierului este mai mare decât valoarea maximă indicată de directiva MAX_FILE_SIZE care este specificată în formular. respectiv $_FILES['fisiere']['size'][1].UPLOAD_ERR_PARTIAL (3) fişierul a fost încărcat doar parţial. din punct de vedere logic.UPLOAD_ERR_INI (1) dimensiunea fişierului este mai mare decât valoarea maximă permisă (această valoare este specificată în momentul configurării server-ului şi poate fi schimbată modificând fişierul PHP.PDF. în cazul în care secvenţele sunt lungi sau sunt folosite în foarte multe pagini. dar această varianta. Un exemplu este prezentat în continuare: Cod: <?php <form action="upload. Pentru aceasta. Încărcarea mai multor fişiere Există posibilitatea de a încărca mai multe fişiere dacă sunt folosite nume diferite pentru marcajul <input> utilizat pentru afişarea casetei de text şi a butonului folosite pentru alegerea fişierului. la numele folosite trebuie adaugate caracterele ' [ ] '. Practic.php" method="post" enctype="multipart/form-data"> Alegeti fisierele:<br> <input name="fisiere[]" type="file"> <br> <input name="fisiere[]" type="file"> <br> <input type="submit" value="Trimite fisierele"> </form> ?> Să presupunem că am ales să încărcăm fişierele POZA1. Interpretorul PHP permite păstrarea secvenţelor comune în fişiere separate şi accesarea acestora din cadrul altor documente PHP. . este posibil ca fişierele încărcate să fie organizate automat într-un vector. în timp ce $_FILES['fisiere'] ['name'][1] va avea valoarea DOC1. Dimensiunile celor două fişiere pot fi determinate folosind valorile $_FILES['fisiere']['size'][0]. tot conţinutul fişierului inclus este inserat în poziţia în care apare directiva. putem copia secvenţele dintr-un fişier în altul. Includerea fişierelor Deseori. Sintaxa acestei directive este include(fisier).

Dacă fişierul HELLO. După interpretarea textului din fişierul inclus se intră din nou în modul PHP.TXT ar conţine doar secvenţa echo "Pagina de test". Aşadar. ?> În continuare aveţi un model în care puteţi vedea cum poate fi inclus acest fişier într-un document php. Cod: <head> <title>Pagina cu fisier inclus</title> </head> <body> <?php include("HELLO. ci ca fişier html. ?> este necesară pentru ca textul să fie interpretat corect. atunci acesta nu ar fi interpretat ca fiind cod php. prezenţa construcţiei <?php..TXT")..<?php echo "Pagina de test". acesta trebuie obligatoriu să indice faptul că secvenţele de text din cadrul său reprezintă instrucţiuni php. Pentru a . ?> </body> </html> Pentru ca fişierul inclus să fie interpretat. folosirea celor două fişiere este echivalentă cu utilizarea următorului fişier: Cod: <head> <title>Pagina cu fisier inclus</title> </head> <body> <?php echo "Pagina de test". atunci se consideră că toate instrucţiunile din cadrul fişierului inclus fac parte din corpul funcţiei. În concluzie. domeniul de vizibilitate al variabilelor folosite în fişierul inclus este acelaşi cu domeniul pe care l-ar fi avut dacă ar fi apărut în cadrul funcţiei. Aşadar.. Aceasta se datorează faptului că în momentul includerii unui fişier se iese din modul PHP şi tot textul este interpretat ca fiind cod HTML. ?> </body> </html> Includerea în cadrul funcţiilor Dacă directiva de includere apare în cadrul unei funcţii.

ilustra acest aspect vom considera un fişier var.txt care conţine secvenţa:
Cod:

<?php $culoare = "verde"; $fruct = 'mar'; ?>

şi următorul document PHP:

Cod:

<?php function fructe() { global $culoare; include('var.txt'); echo "un $fruct $culoare<br>"; } fructe(); echo "un $fruct $culoare<br>; ?>

Rezultatul va fi: un mar verde un verde După cum se poate vedea, variabilele definite în cadrul fişierului inclus au domeniul de vizibilitate corespunzător funcţiei fructe(). Din aceste motive valoarea variabilei $fruct nu este disponibilă în afara funcţiei. Valoarea variabilei $culoare este disponibilă şi în afara funcţiei, deoarece a fost declarată ca fiind o variabilă globala. Aşadar, instrucţiunea echo din cadrul funcţiei duce la afişarea mesajului un mar verde, deoarece ambele valori ale variabilelor sunt disponibile, iar instrucţiunea din afara funcţiei duce la afişarea mesajului un verde, deoarece, în afara funcţiei, variabila $fruct nu a fost definită anterior şi este automat iniţializata cu şirul vid. Includeri prin HTTP După cum aţi observat, directiva include are ca parametru un şir de caractere care conţine numele fişierului care va fi inclus. Acesta

poate fi orice URL valid, aşadar este posibilă includerea unui fişier aflat pe un alt server. Un exemplu ar putea fi include("http://www.site-ul.meu/pagina.mea");. O astfel de directivă funcţioneaza doar dacă se foloşeste PHP 4.3.0 sau o versiune ulterioară. Includerea unui fişier o singură dată Uneori, mai ales în situaţiile în care se folosesc variabile pentru numele fişierelor incluse, este posibil ca anumite fişiere să fie incluse de mai multe ori. De obicei, fişierele incluse conţin definiţii ale unor funcţii sau clase, motiv pentru care este de dorit ca un astfel de fişier să nu fie inclus de mai multe ori. Pentru ca un fişier să fie inclus o singură dată, se utilizează o directiva alternativă numită include_once. După cum rezultă din denumire, un fişier va fi inclus o singură data. Cu alte cuvinte, în momentul în care se cere includerea unui fişier, se verifică dacă acesta a fost deja inclus şi în această situaţie directiva nu are nici un efect (fişierul nu este inclus încă o dată). Alternative: Pe lângă directivele includeşi include_once există două alte directive a căror utilizare are un efect aproape echivalent. Acestea sunt require (echivalentă cu include) şi require_once (echivalentă cu include_once). Singura diferenţa dintre include şi require (respectiv dintre include_onceşi require_once) este dată de modul în care este tratată situaţia în care fişierul care se doreşte a fi inclus nu există sau nu este disponibil. În cazul directivelor include şi include_once este generat un avertisment şi execuţia script-ului continuă fără ca fişierul să fie inclus. Practic, din punct de vedere logic, este ignorată directiva. În cazul directivelor require şi require_once este generată o eroare fatală şi execuţia script-ului este întreruptă. Aşadar, în situaţiile în care este absolut necesară existenţa fişierului, pentru a nu apărea efecte bizare, trebuie utilizată directiva require, respectiv require_once. Starea conexiunii În PHP, conexiunea poate avea una dintre cele trei stări posibile: - NORMAL (0) starea normală de funcţionare; - ABORTED (1) utilizatorul care accesează pagina generată de script-ul aflat în execuţie s-a deconectat (de obicei prin apăsarea butonului Stop al programului de navigare); - TIMEOUT (2) a fost atinsă limita de timp impusă de PHP. Pentru fiecare dintre cele trei stări există un indicator (flag) care este setat sau nu în funcţie de starea conexiunii. În funcţie de script, este necesar sau nu ca execuţia acestuia să se incheie în momentul în care este întreruptă conexiunea. De exemplu, în cazul în care script-ul actualizează o bază de date ar fi de dorit ca execuţia să continue. În principiu, este indicat ca script-urile să îşi încheie execuţia chiar dacă datele de ieşire nu vor mai fi trimise utilizatorului. Pentru a decide dacă execuţia script-ului se va încheia în momentul întreruperii conexiunii puteţi (sau nu!) să apelaţi funcţia

ignore_user_abort(). Implicit, în momentul în care conexiunea este întreruptă, se întrerupe şi execuţia script-ului. Este posibil (chiar recomandabil!) să fie definită o funcţie care va fi executată înaintea întreruperii execuţiei script-ului. Aceasta poartă denumirea de funcţie de dezactivare (shutdown function) şi este definită la fel ca orice altă funcţie. Pentru a specifica faptul că o anumită funcţie trebuie apelată înaintea intreruperii execuţiei, aceasta trebuie înregistrată ca fiind funcţie de dezactivare. Aceasta se realizează printr-un apel al funcţiei registrer_shutdown_function(). În cadrul funcţiei se poate testa dacă execuţia a fost determinată de întreruperea conexiunii prin apelarea funcţiei connexion_aborted(). Aceasta va returna valoarea TRUE dacă a fost întreruptă conexiunea. Funcţia de dezactivare va fi apelată automat şi în cazul în care este depăşită limita de timp. În cadrul funcţiei se poate testa dacă un astfel de eveniment a avut loc prin apelarea funcţiei connection_aborted() care returnează valoarea TRUE în cazul depăşirii acestei limite. Există posibilitatea de a testa ambele indicatoare printr-un singur apel al funcţiei connection_status(). Funcţia va returna un număr întreg ai cărui biţi reprezintă indicatoarele. De exemplu, dacă sunt setate indicatoarele ABORTED şi TIMEOUT, valoarea returnată va fi 3. Trebuie remarcat faptul că este posibil ca indicatorii ABORTED şi TIMEOUT să fie ambii setaţi la un moment dat. Această situaţie poate apărea în cazul în care întreruperea conexiunii este ignorată. PHP va detecta faptul că a fost întreruptă conexiunea şi va seta indicatorul corespunzător. Totuşi, execuţia script-ului va continua şi este posibil să expire şi limita de timp, moment în care este setat şi indicatorul TIMEOUT. Implicit, limita de timp este de 30 de secunde, dar ea poate fi modificată folosind funcţia set_time_limit(). Fişiere aflate la distanţă Aşa cum am spus în secţiunea dedicată includerii fişierelor, începând cu versiunea PHP 4.3.0 este posibilă includerea de fişiere aflate pe alte servere. Evident, este posibilă utilizarea de fişiere aflate pe alte servere şi în alte scopuri. Practic, în aproape toate funcţiile care manipulează fişiere, pot fi folosite atât fişiere locale, cât şi fişiere aflate la distanţă. În continuare este prezentat modul în care pot fi citite date dintr-un fişier aflat pe server:

Cod:

<?php // accesam fisierul si setam atributul r de la citire (read) $file = fopen("locatia/fisierului/nume_fisier.extensia", "r"); if(!$file) { echo "Fisierul nu poate fi accesat!\n"; exit; } // citirea datelor din fisier // inchiderea fisierului fclose ($file); ?>

Pentru a scrie în fişier se poate folosi o secvenţă de tipul:

Cod:

<?php // accesam fisierul si setam atributul w de la scriere (write) $file=fopen("locatia/fisierului/nume_fisier.extensia", "w"); if(!$file) { echo "Fisierul nu poate fi accesat!\n"; exit; } // scrierea datelor in fisier // inchiderea fisierului fclose ($file); ?>

Puteţi folosii aceste idei pentru a creea o pagină cu acces restricţionat, şi unde să scrieţi într-un fişier pe server datele vizitatorului (cum ar fi adresa lui de ip, host, timpul cât a stat pe pagina respectivă, ce pagini a vizitat etc...).

Descrierea funcţiilor care pot fi utilizate la manipularea tablourilor

Funcţia array_change_key_case Această funcţie realizează conversia tuturor literelor care apar în cadrul denumirilor cheilor elementelor unui tablou. Funcţia are doi parametri: un tablou asupra căruia se vor efectua modificările şi un întreg care arată dacă se vor converti toate literele mari în litere mici sau invers. Pentru acest parametru pot fi utilizate constantele predefinite CASE_UPPER (conversie la litere mari) şi CASE_LOWER (conversie la litere mici). Acest parametru poate lipsi, caz în care va avea valoarea implicită CASE_LOWER , deci va realiza conversia tuturor literelor mari în litere mici. Următorul script PHP ilustrează modul în care poate fi utilizată această funcţie.

Cod:

<?php $a = array("Pagina" => "Pagina", "de" => "de", "Php" => "Php"); echo "<TABLE cellpadding= 5> <TR><TD><B>Tabloul initial:</B><TD> <TT>"; print_r($a); echo "</TT> <TR><TD><B>Tabloul dupa conversia implicita:</B><TD><TT>"; $b = array_change_key_case($a); print_r($b); echo "</TT><TR><TD><B>Tabloul dupa conversia la litere mari: </B><TD><TT>"; $b = array_change_key_case($a,CASE_UPPER);

2. print_r(array_chunk($vector. echo "<p>". echo "<pre>". 2)). în acest caz are valoarea implicită false. 2. valorile acestora rămânând nemodificate. Ea are trei parametri. În cazul funcţiei array_diff( ) sunt eliminate elemente din primul tablou dacă în celelalte există elemente cu aceeaşi valoare. vectorul $rez va conţine trei elemente. 1. echo "</TT><TR><TD><B>Tabloul dupa conversia la litere mici: </B><TD><TT>". În cazul functiei array_diff_assoc( ) sunt eliminate elemente din primul tablou dacă în celelalte există elemente cu aceeaşi valoare şi aceeaşi cheie. echo "</TT></TABLE>". iar valoarea elementului respectiv este dată de numărul apariţiilor. "Pagina" . "Pagina" ). Acestea au ca parametri mai multe tablouri şi returnează un tablou care conţine toate elementele din tabloul reprezentat de primul parametru care nu apar în nici unul dintre tablourile corespunzatoare celui de-al doilea parametru. respectiv 1. Funcţia va returna un tablou al bucăţilor (un tablou de tablouri). "d". În continuare este prezentat un exemplu care arată utilizarea acestei funcţii: Cod: <?php $vector = array("a". Pentru fiecare valoare se va genera un singur element (chiar dacă valoarea apare de mai multe ori). print_r($b). şi anume: vectorul care urmează a fi împărţit. print_r(array_chunk($vector. De exemplu. deci nu se vor păstra cheile elementelor). În cazul în care numărul elementelor tabloului iniţial nu este multiplu al dimensiunii unei bucăţi. $rez = array_count_values ($tablou). "b". funcţia are efect doar asupra cheilor elementelor. TRUE)).print_r($b). $b = array_change_key_case($a. "e"). Funcţiile array_diff şi array_diff_assoc Uneori dorim să eliminăm dintr-un tablou anumite elemente.CASE_LOWER). ?> După cum se poate vedea. echo "</pre>". "mea" . în acest scop pot fi utilizate funcţiile array_diff( ) şi array_diff_assoc( ) . atunci ultima bucată va fi mai "scurtă" . acestea vor avea cheile 1. . dimensiunea unei bucăţi (numărul de elemente) şi un indicator care arată dacă se păstrează sau nu cheile elementelor (acesta poate lipsi. "c". Paginaşi mea. în urma execuţiei unei secvenţe de forma: $tablou = array (1. iar valorile vor fi 2. ?> Funcţia array_count_values Această funcţie are ca parametru un tablou şi returnează un alt tablou ale cărui elemente au chei date de valorile elementelor tabloului transmis ca parametru. Funcţia array_chunks Această funcţie poate fi utilizată pentru a împărţi un tablou în mai multe bucăţti (chunks).

pentru tabloul definit prin $tablou = array("A" => "Pagina" . în urma executării apelului $b = array_flip($tablou) tabloul $b va avea forma . "7"). iar cel de-al treilea indică valoarea cu care se completează elementele. al doilea reprezintă numărul elementelor completate. în urma conversiei la tipul boolean). ?> Funcţia array_flip Această funcţie are ca parametru un tablou şi returnează un alt tablou în care a fost realizată o interschimbare a cheilor elementelor cu valorile. 'Pagina mea! ' ). Cu alte cuvinte. În cazul în care funcţia returnează valoarea true (eventual. "B" => "de" . } function par($var) { return 1 . pentru fiecare element va fi creat un element a cărui cheie va fi vaIoarea elementului în tabloul iniţial şi a cărui valoare va fi cheia elementului din tabloul iniţial. 9 si 10). "4". acesta este eliminat. echo "<p>". 6. Cod: <?php function impar($var) { return $var % 2. print_r(array_filter($vector. "5". în urma executării instrucţiunii $a = array_fill(5. Funcţia array_filter Această funcţie realizează o filtrare a elementelor unui vector pe baza unei funcţii. vom avea un tablou cu sase elemente (cheile acestora sunt 5. par)). 8. "C" => "php"). Funcţia are trei parametri: primul reprezintă indicele la care începe completarea. Funcţia array_filter( ) returnează vectorul obţinut după eliminarea elementelor. echo "<pre>". În continuare este prezentat un exemplu în care se utilizează această funcţie pentru a filtra elementele unui vector în funcţie de paritatea acestora.$var % 2. în caz contrar. elementul este păstrat.Funcţia array_fill Această funcţie poate fi utilizată pentru a completa cu o anumită valoare elementele unui tablou. impar)). Această funcţie trebuie să fie definită şi va fi apelată pentru fiecare element al vectorului. 6. echo "</pre>". } $vector = array("2". valorile tuturor acestora fiind Pagina mea! . De exemplu. 7. Funcţia array_filter( ) are ca parametri un tablou şi identificatorul funcţiei care este utilizată pentru filtrare. print_r(array_filter($vector. De exemplu.

?> În urma executării secvenţei. 4. Pentru funcţia array_keys( ). Un artificiu interesant permite crearea unor vectori de vectori folosind funcţia array_map( ). dacă vectorul conţine un element cu cheia respectivă. 27. iar pentru parametrul care reprezintă cheia poate fi folosită orice valoare care poate fi cheie într-un vector. aşa cum sugerează şi numele. } $a = array(l. în cazul în care se foloseste un parametru suplimentar. Funcţiile array_intersect şi array_intersect_assoc Aceste funcţii au un comportament similar funcţiilor array_diff( ). În acest caz. Funcţia array_keys şi array_values Aceste funcţii returnează un vector care conţine ca valori toate cheile (respectiv toate valorile) elementelor unui tablou transmis ca parametru. 2. vor fi eliminate toate aceste elemente. datorită faptului că elementele unui vector trebuie să aibă chei distincte. şi el. Funcţia array_map Această funcţie realizează o transformare a elementelor unui vector pe baza unei funcţii. Există posibilitatea de a transmite mai multe tablouri ca parametri. vectorul rezultat va conţine doar cheile elementelor care au valoarea egală cu cea indicată de acest parametru. Pentru aceasta vom utiliza valoarea null pentru funcţia transmisă ca parametru. Vom prezenta în continuare un exemplu: . Singura diferenţă este dată de faptul că tabloul rezultat va conţine toate elementele care se află în fiecare dintre tablourile transmise ca parametri (pentru funcţia array_diff( ) elementele trebuie să aibă aceeaşi valoare. Funcţia returnează o valoare logică. tablourile mai "scurte" vor fi completate cu elemente nule. Iată un exemplu: Cod: <?php function cub($n) { return $n * $n * $n. Funcţia este transmisă ca parametru şi este aplicată tuturor elementelor unui vector care este. numărul argumentelor funcţiei utilizate trebuie să fie egal cu numărul tablourilor transmise şi se recomandă ca tablourile să aibă acelaşi număr de elemente. "de" => "B" . în timp ce pentru funcţia array_diff_assoc( ) ele trebuie să aibă aceeaşi cheie şi aceeaşi valoare). respectiv array_diff_assoc( ).array("Pagina" => "A" . 3. 8. 5). $b = array_map("cub". Funcţia array_key_exists Această funcţie are doi parametri (o cheie şi un vector) şi verifică. 64 şi 125. "php" => "C") În cazul în care în vectorul transmis ca parametru există mai multe elemente care au aceeaşi valoare. În caz contrar. cu excepţia ultimului. vectorul $b va avea cinci elemente ale căror valori vor fi 1. $a). transmis ca parametru.

Cod: <?php $a = array("unu". "three"). $c = array("un". Vectorul $d va avea urmatoarea structura: Citat: Array ( [0] => ( [0] [1] [2] ) [1] => ( [0] [2] [3] ) [2] => ( [0] [1] [2] ) ) Array => unu => one => un Array => doi => two => deux Array => trei => three => trois Funcţiile array_merge şi array_merge_recursive Aceste funcţii realizează o "interclasare" a două sau mai multe tablouri prin adăugarea elementelor unui vector la sfârşitul tabloului anterior. şi anume primul întâlnit în timpul interclasării. "two". În cazul în care cheia identică este reprezentată de un număr. În cazul în care tablourile conţin elemente care sunt tablouri. În cele ce urmeaza vom prezenta un exemplu care ilustrează diferenţele dintre cele două funcţii. "deux". dar valoarea corespunzătoare unei chei care apare deja în tablou va avea cheia reprezentată de cel mai mic număr mai mare decât cheia iniţială care nu apare înca în tabloul rezultat. $c). În cazul în care există elemente cu aceeaşi cheie (reprezentată de un şir de caractere) în tabloul rezultat va apărea un singur element cu cheia respectivă. "doi". ?> "trei"). $b = array("one". . $b. $a. în tabloul rezultat vor apărea ambele valori. "trois"). $d = array_map(null. Cod: <?php $v1 = array( "culoare" => array( "preferata" => "rosu"). atunci funcţia este array_merge_recursive( ) şi are ca efect şi interclasarea acestor tablouri (care sunt elemente ale altor tablouri) şi procedeul continua recursiv.

echo "<br>". print_r(array_merge($v1. "2" şi 3. ?> Funcţia array_multisort Această funcţie poate fi utilizată pentru a sorta mai multe tablouri sau un tablou multidimensional. indicatori de tip: SORT_REGULAR: elementele sunt comparate fără a efectua conversii.indicatori de ordine: . Primul tablou reprezintă criteriul de baza. Pentru valori egale în primul tablou se ia în considerare al doilea criteriu (reprezentat de al doilea tablou). SORT_STRING.(5)). SORT_NUMERIC. "a"). Primul parametru al funcţiei trebuie să fie un tablou. 100. . $v2 = array( 10. Funcţia returnează o valoare logică ce indică dacă operaţia de sortare sa încheiat cu succes. 1.SORT_DESC: sortare în ordine descrescătoare. Se observă că elementele din al doilea vector corespunzătoare elementelor cu valori egale din primul vector (3 şi "2" corespund celor două elemente cu valoarea 100 din primul vector) au fost şi ele sortate. În cazul în care indicatorii lipsesc. $v[l]. nu este permisă specificarea pentru un tablou a indicatorilor SORT_NUMERIC şi SORT_STRING). SORT_ASC. echo "</PRE>"."2". SORT_STRING: elementele sunt comparate după ce sunt convertite în şiruri de caractere. În urma unui apel de forma: array_multisort($v[0]. Exista două categorii de indicatori de sortare: . 100.3. array(1. 100. "2". "culoare" => array( "preferata" => "verde". Vom prezenta acum un exemplu în care vom sorta un tablou bidimensional definit prin: $v = array(array("10". SORT_DESC). 3. $v2 = array(1. Să considerăm doi vectori definiţi astfel: $v1 = array("10". $v2)). vectorul $v1 va conţine elementele "10". "a"). iar următoarele pot fi tablouri şi indicatori de sortare. Tablourile transmise ca parametri sunt considerate a fi coloane într-o matrice care trebuie sortată pe linii. 100 şi 100. 100. Pentru un tablou nu pot fi specificaţi doi indicatori care fac parte din aceeaşi categorie (de exemplu. . Pentru valori egale în primele două tablouri se ia în considerare al treilea criteriu şi aşa mai departe. $v2)).SORT_ASC: sortare în ordine crescătoare. sunt utilizate valorile implicite SORT_ASC şi SORT_REGULAR. echo "<PRE>". în timp ce vectorul $v2 va conţine elementele 1. $v2). "albastru")). "a". print_r(array_merge_recursive($v1. În urma execuţiei apelului array_multisort($v1.11)). 1). Nu este obligatorie specificarea ambelor tipuri de indicatori pentru fiecare tablou. SORT_NUMERIC: elementele sunt comparate după ce sunt convertite la valori numerice. Fiecare indicator de sortare descrie caracteristici ale sortării pentru cel mai apropiat tablou aflat înaintea indicatorului în lista de parametri.

tabloul va fi completat la stânga. -7. funcţia va returna cheia acestuia. În acest moment. În cazul în care se alege un singur element. dimensiunea pe care trebuie să o aibă tabloul completat şi valoarea cu care este completat tabloul. "2" şi 1 (pentru valori egale în prima linie. [nu este adăugat nici un element] Funcţiile array_pop şi array_push Aceste funcţii permit utilizarea tablourilor similar stivelor. 5. Funcţia array_push( ) va returna întotdeauna noua dimensiune a vectorului. 0. elementele de pe a doua au fost sortate descrescător ca valori numerice). 3) acesta va conţine elementele 1. Funcţia returnează tabloul obţinut după completare. 2 şi 3. 1 . 7. caz în care are valoarea implicită 1. În caz contrar. $r = array_pad($v2. 100. 5) : (2. În urma execuţiei apelului array_push( $v . 2 . 4 .prima linie a tabloului va conţine elementele "10". un apel de forma array_pop($v) va returna valoarea 3. 5. Dacă valoarea absolută a acestui parametru este mai mică sau egală cu dimensiunea tabloului transmis ca parametru. 4. atunci nu sunt adăugate elemente. . 7). 100 şi "a" (au fost sortate crescător ca şiruri de caractere). Funcţia array_pop( ) este utilizată pentru a elimina un element al tabloului (ultimul). iar vectorul $v va conţine elementele 1 şi 2. În cazul în care vectorul transmis ca parametru este vid. În continuare este un exemplu care ilustrează modul de utilizare a acestei funcţii. -1. -1) : (2. 0. -1). 5. Să considerăm vectorul definit prin: $v = array(2 . 2. În continuare vom prezenta câteva apeluri ale funcţiei şi vectorii returnaţi de aceasta: $r = array_pad($v2. 7). 5. Funcţia are trei parametri: tabloul care trebuie completat. 4. astfel încât să aibă o dimensiune specificată. 3. Acest al doilea parametru poate lipsi. În cazul în care valoarea acestui parametru este pozitivă. Funcţia array_rand Această funcţie permite alegerea aleatoare a unui număr de elemente dintr-un vector. Funcţia are ca parametri un vector şi o valoare numerică ce indică numărul elementelor care vor fi alese. Funcţiile array_shift şi array_unshift Perechile funcţiilor array_pop( ) şi array_push( ) sunt array_shift( ) şi array_unshift( ). Executarea acestor funcţii va duce la modificarea cheilor întregi astfel încât acestea să înceapă de la 0. 7). tabloul va fi completat la dreapta. funcţia va returna un tablou care va conţine cheile elementelor alese. Acestea pot fi utilizate pentru a insera sau elimina elemente la începutul unui tablou. 7). funcţia array_pop( ) returnează valoarea null. 4. iar funcţia array_push( ) pentru a adăuga în tablou unul sau mai multe elemente. Funcţia array_pad Această funcţie poate fi utilizată pentru a completa un tablou cu o valoare dată. iar cea de-a doua va conţine elementele 1. Cod: <?php $v = array(2. 4. Tabloul va fi completat astfel încât dimensiunea sa să fie egală cu valoarea absolută a celui deal doilea parametru. iar dacă aceasta este negativă. 3. 5 . 0) : (0. $r = array_pad($v2. Să considerăm ca vectorul $v este vid. 6.

2). $x = array( ). $w) { return $v + $w. Valoarea acestui element este <B>$v[$a]</B>.<BR><BR>". respectiv 1 (datorita faptului ca vectorul $x este vid). echo "Au fost alese elementele ale caror chei sunt <B>$a[0]</B> si <B>$ a[1]</B>. funcţia transmisă ca parametru este apelată pentru primele două elemente ale tabloului. 10) . rezultatul apelului va fi această valoare iniţială. array("martie". $a = array_rand($v. 5.$v[$a[0]]. $c = array_reduce($a. echo "A fost ales elementul a carui cheie este <B>$a</B>. 2800 (10*2*4*5*7). } function P($v. echo "A fost ales elementul a carui cheie este <B>$a</B>. Exista şi posibilitatea de a transmite o valoare iniţială pentru efectuarea operaţiilor.$v[$a[0]]. În cazul în care tabloul este vid. Valorile acestor elemente sunt <B>". În acest caz funcţia transmisă ca parametru va fi apelată pentru valoarea iniţială şi primul element al tabloului. $c şi $d vor fi 18 (2+4+5+7). Procedeul continuă până în momentul în care vectorul conţine o singură valoare care este returnată."</B> si <B>". $a = array_rand($v). valorile variabilelor $b. În cazul în care este prezent un al doilea parametru şi valoarea acestuia este TRUE (eventual după o conversie). l) .$a = array_rand($v). Valoarea acestui element este <B>$v[$a]</B>."</B>. Mai exact. 4. "P".<BR><BR>".$v[$a[1]]. "programare". echo "Au fost alese elementele ale caror chei sunt <B>$a[0]</B> si <B>$ a[1]</B>. 7). Să considerăm funcţiile definite astfel: function S($v. 2004)). Cele două elemente sunt eliminate şi în tablou este inserat pe prima poziţie rezultatul apelului funcţiei. $a = array_rand($v. $b = array_reduce($a."</B>. $v[$a[1]]. Funcţia array_reverse Această funcţie inversează ordinea elementelor unui vector transmis ca parametru. 2).<BR><BR>". Să considerăm tabloul definit astfel: $v = array("Pagina".". Valorile acestor elemente sunt <B>". $d = array_reduce($x. "S". ?> Funcţia array_reduce Această funcţie aplică o altă funcţie transmisă ca parametru asupra elementelor unui tablou până în momentul în care tabloul este redus la o singură valoare. atunci se păstrează corespondenţa dintre chei şi valori."</B> si <B>" . } În urma executării instrucţiunilor: $a = array(2. . "de". "S") . $w) { return $v + $w. Funcţia returnează tabloul obţinut după inversare.

În cazul în care acesta există şi are valoarea TRUE. . În cazul în care valoarea celui de-al treilea parametru este pozitivă. iar al doilea este vectorul în care este căutata valoarea respectivă. DisplayArray($v). al doilea reprezintă poziţia la care începe porţiunea preluată. poziţia de început este determinată relativ faţă de începutul tabloului. foreach($v as $val) { echo "$val<BR>". În cazul în care valoarea celui de-al doilea parametru este pozitivă. echo "<TT>Vectorul initial:". Funcţia array_slice Această funcţie poate fi utilizată pentru a prelua o porţiune a unui tablou. Această funcţie ignoră cheile elementelor şi ia în considerare pozitiile "reale" ale elementelor în tablou. } echo "</B><BR>". caz în care sunt preluate toate elementele. "c". dacă un astfel de element există. atunci în timpul căutării se verifică şi egalitatea tipurilor. returnează cheia acestuia. poziţia este determinată relativ faţă de sfârşitul tabloului. atunci valoarea sa absolută va indica poziţia faţă de sfârşitul vectorului la care se va "opri" preluarea elementelor. Acest parametru poate lipsi. ea va indica numărul elementelor preluate. Primul parametru al funcţiei este valoarea căutată. Funcţia permite folosirea unui al treilea parametru care este opţional. Dacă ea este negativă. "d". În caz contrar funcţia returnează valoarea FALSE. În continuare este prezentat modul în care poate fi utilizată această funcţie pentru a prelua porţiuni ale unui vector. "e"). până la sfârşitul tabloului. Funcţia va returna un tablou care va conţine elementele preluate. TRUE) tablourile $a şi $b vor avea forma prezentată mai jos: Array ( [0] => ( [0] => [1] => ) [1] => [2] => [3] => ) Array ( [3] => ( [0] => [1] => ) [2] => [1] => [0] => ) Array martie 2004 programare de Pagina Tabloul $a Array martie 2004 programare de Pagina Tabloul $b Funcţia array_search Această funcţie verifică dacă un vector conţine un element care are o anumită valoare şi.În urma apelurilor $a = array_reverse($v) şi $b = array_reverse($v. } $v = array("a". "b". Primul parametru reprezintă tabloul. Pentru o valoare negativă. iar al treilea indica numărul elementelor preluate. Cod: <?php function DisplayArray($v) { echo "<B>".

sortează un tablou folosind o "ordine naturală" făcând distincţie între literele mari şi literele mici. .sortează un tablou în ordine crescătoare şi păstrează asocierile dintre indici. Apoi. ?> Funcţia array_splice Efectul acestei funcţii este similar efectului funcţiei array_slice( ). pentru fiecare valoare care apare de mai multe ori.1)). $b = array("a" => 1. Pentru a elimina elementele.echo "array_slice(\$v. se va afisa: sum(a) = 20 sum(b) = 6.3 . rezultatul va fi un număr întreg sau un număr real.natsort( ) . "c" => 3."\n". .asort( ) .rsort( ) . Funcţia array_sum Această funcţie calculează suma elementelor unui tablou.2):". În funcţie de tipul elementelor.-2.0.sortează un tablou în ordine descrescătoare în funcţie de valorile elementelor acestuia. diferenţa constând în faptul că porţiunea preluată este eliminată din tablou şi înlocuită cu elementele unui al patrulea parametru care reprezintă un vector. . Pentru valorile nenumerice se încearcă efectuarea unei conversii la numere întregi sau reale şi în cazul în care valorile pot fi convertite (rezultatul conversiei nu este 0) ele sunt luate în considerare în momentul calculării sumei. va păstra prima cheie întâlnită în şirul sortat.sortează un tablou folosind o "ordine naturală" fără a face distincţie între literele mari şi literele mici. . . "b" => 2."\n". echo "suma(a) = ".-2. De exemplu. . echo "array_slice(\$v.2)).2 .3):".array_sum($a). funcţia le sortează mai întâi considerandu-le şiruri de caractere.natcasesort( ) . . echo "array_slice(\$v.sort( ) . . Funcţii de sortare Interpretorul PHP pune la dispozitie o mulţime de funcţii care pot fi utilizate pentru a sorta elementele unui tablou. DisplayArray(array_slice($v. echo "array_slice(\$v.sortează un tablou în ordine crescătoare în funcţie de cheile elementelor acestuia. în urma executării secvenţei: $a = array(2.2. DisplayArray(array_slice($v.sortează un tablou în ordine descrescătoare şi păstrează asocierile dintre indici. 8).4). Acestea sunt (în ordine alfabetică): . DisplayArray(array_slice($v.arsort( ) . echo "</TT>". 6. DisplayArray(array_slice($v.1):".sortează un tablou în ordine descrescătoare în funcţie de cheile elementelor acestuia. 4.0.3)).krsort( ) .-1):".sortează un tablou în ordine crescătoare în funcţie de valorile elementelor acestuia. echo "sum (b) = ".2.array_sum($b).-1)).9 Funcţia array_unique Această funcţie elimină dintr-un vector toate valorile care apar de două sau mai multe ori şi returnează vectorul obţinut în urma eliminării.ksort( ) .

Funcţiile count şi sizeof Aceaste funcţii returnează numarul elementelor unui vector transmis ca parametru.usort( ) .returnează valoarea elementului curent al tabloului. Cheile elementelor vor deveni identificatori de variabile. Nu există nici o diferenţă între aceste funcţii. . rsort( ) şi sort( ) permit utilizarea unui al doilea parametru (opţional) care este un indicator de tip. Funcţii pentru elementul curent Fiecărui vector îi este asociată o referinţă care indică elementul curent.GIF.current( ) . .uasort( ) .EXTR_OVERWRITE : dacă variabila există deja.reset( ) . .deplasează referinţa la elementul anterior al tabloului. IMG2. sunt tablouri. Funcţia verifică dacă cheile reprezintă identificatori valizi ai variabilelor sau dacă se încearcă crearea unei variabile care exista deja.returnează valoarea elementului curent al tabloului (are acelaşi efect ca şi funcţia current( ) ). Funcţia extract Această funcţie este utilizată pentru a crea variabile pe baza valorilor elementelor unui vector.GIF. asort( )..sortează un tablou în funcţie de cheile acestuia folosind pentru comparări o funcţie indicată de utilizator. .returnează cheia elementului curent al tabloului.sortează un tablou folosind pentru comparări o funcţie indicată de utilizator. ksort( ). iar valorile elementelor vor deveni valorile variabilelor respective. un algoritm "clasic" (bazat pe ordinea lexicografică) ar stabili ordinea: IMG1. . Functiile arsort( ). Teoretic. . dar în acest caz se va returna valoarea 1 (doar tablourile pot conţine mai multe elemente). iar dacă tablourile conţin elemente care.each( ) .returnează cheia şi valoarea elementului curent şi deplasează referinţa la elementul următor.GIF. . valoarea curenta nu va fi modificată.deplasează referinţa la ultimul element al tabloului. atunci procedeul se aplică recursiv şi asupra acestora. celelalte două au cheile 1şi value şi conţin valoarea elementului. Valorile posibile pentru acest parametru sunt următoarele: . Există mai multe funcţii care pot utiliza această referinţă. Funcţia compact Această funcţie are ca argumente un număr variabil de şiruri de caractere sau tablouri. parametrul poate să nu fie un vector.deplasează referinţa la primul element al tabloului. Funcţiile natsort( ) şi natcasesort( ) nu permit utilizarea unui alt parametru şi stabilesc ordinea aşa cum ar face o fiinţă umană (ordine naturală).GIF şi IMG12. iar valorile elementelor corespunzătoare vor fi valorile variabilelor). .deplasează referinţa la următorul element al tabloului. .sortează un tablou folosind pentru comparări o funcţie indicată de utilizator şi păstrează asocierile dintre indici. .GIF şi IMG2 . dar algoritmul care foloseste ordinea naturala nu ar efectua nici o modificare. krsort( ). funcţia returnează un tablou cu patru elemente: două dintre ele au cheile 0şi key şi conţin cheia elementului. De exemplu. IMG10. IMG10 . Al doilea parametru al funcţiilor uasort( ).prev( ) . . valoarea curenta va fi suprascrisă. Toate funcţiile necesită un parametru care reprezintă vectorul care trebuie sortat. În cazul tablourilor. GIF. Acestea sunt (în ordine alfabetică): .EXTR_PREFIX_SAME: dacă variabila există deja.key( ) . IMG12 .GIF. Valoarea implicită a acestuia este SORT_REGULAR.next( ) . la randul lor.GIF. Ea creează un tablou în care va insera toate şirurile care reprezintă o variabilă (aceste şiruri vor fi chei. denumirea noii variabile va fi prefixată cu . Aceste situaţii sunt tratate în funcţie de valoarea unui al doilea parametru care reprezintă un indicator şi este opţional. pentru şirurile de caractere IMG1. vor fi luate în considerare toate elementele care sunt şiruri de caractere.uksort( ) .pos( ) .end( ) . uksort( ) şi usort( ) reprezintă identificatorul funcţiei care va fi folosită pentru comparare.EXTR_OVERWRITE : dacă variabila există deja.

.10)). prin intermediul lor pot fi modificate şi elementele vectorului. Cod: <?php function DisplayArray($v) { echo "<B>". iar următoarele vor avea valorile st + 1. } echo "<TT>". echo "</TT>". 'k')). caz în care are valoarea implicită EXTR_OVERWRITE. denumirea cheii va fi prefixată. DisplayArray (range('k'. singura diferenţă fiind faptul că. dacă st > dr. .4. În cele ce urmeaza este prezentat un document PHP care ilustrează modul de utilizare a acestei funcţii. aşadar. Primul element al vectorului va avea valoarea st. 'a')). dar modifică ordinea elementelor tabloului. st . respectiv st . DisplayArray (range(1.EXTR_PREFIX_INVALID : în cazul în care o cheie nu reprezintă un identificator de variabilă validă. Cel de-al treilea parametru al funcţiei trebuie să apară doar dacă valoarea celui de-al doilea este unul din indicatorii ai cărui identificator conţine secvenţa PREFIX. nu este returnată cheia elementului găsit.1. ?> Funcţia shuffle Această funcţie poate fi utilizată pentru a "amesteca" elementele unui tablou.EXTR_REFS : variabilele create reprezintă referinţe. se creează o nouă variabilă prefixată. ci valoarea TRUE. Funcţia range Această funcţie returnează un vector care conţine toate valorile cuprinse între două limite date (st şi dr).EXTR_PREFIX_ALL : denumirile tuturor variabilelor vor fi prefixate. în cazul în care căutarea se încheie cu succes.EXTR_IF_EXISTS : nu sunt create variabile noi. acest indicator poate fi utilizat împreuna cu oricare dintre celelalte cu ajutorul unei disjunctii logice. Începând cu versiunea PHP 4. . DisplayArray (range('a'.EXTR_PREFIX_IF_EXISTS : în cazul în care cheia reprezintă denumirea unei variabile. st + 2 etc. . foreach ($v as $val) { echo "$val<BR>".1)).2 etc. Funcţia in_array Această funcţie este similară funcţiei array_search( ). Ea nu returnează nici o valoare. .un prefix transmis ca al treilea parametru al funcţiei. ci sunt doar suprascrise valorile variabilelor care există deja. Al doilea parametru poate lipsi. dacă nu există o astfel de variabilă. . dacă st < dr. nu este creată o variabilă nouă.0 exista şi posibilitatea de a crea şiruri în care diferenţa dintre doua elemente să fie diferită de 1. DisplayArray (range(10. } echo "</B><BR>".

bineînţeles cu exemplele aferente. Sunt sigur că unii dintre voi la început când puneaţi fişierele pe server vă întrebaţi de ce nu merg anumite pagini deşi link-ul era corect şi pagina era pusă pe server.php şi INDEX. Un nume de fişier UNIX poate avea o lungime aproape nelimitată şi poate include aproape orice caracter.. problema era diferenţa dintre majuscule şi minuscule. echo "Sirul amestecat:<BR>&nbsp. Voi începe în acest articol să va prezint sistemul de fişiere UNIX (asemănător cu LINUX). } echo "<TT>Sirul initial:<BR>&nbsp. Acest fapt este valabil chiar dacă foloşiţi PHP sub Microsoft Windows.Cod: <?php function DisplayArray($v) { echo "<B>". Un fişier este o serie de octeţi stocaţi pe o unitate de hard-disc. emiteţi comanda: . îl voi împarţi în mai multe subcapitole pentru a putea înţelege mai bine ideile prezentate. Spre deosebire de numele de fişiere Windows. cifre. Deci. ?> Lucrul cu fişiere şi directoare Încerc în continuare să vă prezint lucrul cu fişiere şi directoare (foldere) prin intermediul scripturilor php. să încep: Sistemul de fişiere UNIX Pentru a înţelege cum trebuie utilizat limbajul PHP pentru a lucra cu fişiere şi cataloage. $a = range(l. numele fişierelor trebuie să înceapă cu o minusculă sau cu o cifră. Vizualizarea informaţiilor despre fişiere Pentru a vizualiza informaţii care descriu un fisier.". caractere de subliniere şi cratime în numele fişierelor. ca atare. deoarece modelul folosit de PHP pentru lucrul cu fişiere şi directoare este bazat pe UNIX. echo "</TT>". shuffle($a). index. Pentru a evita problemele. Fişierele primesc nume pentru a se putea face cu uşurinţă referire la acestea. puncte. de asemenea. DisplayArray($a). DisplayArray($a). numele de fişiere UNIX sunt sensibile la diferenţa între majuscule şi minuscule. Totuşi pentru compatibilitate nu vă recomand să creaţi fişiere cu nume mai lungi de 255 de caractere şi să nu conţină caractere speciale sau diacritice.". trebuie să folosiţi minuscule. Deoarece va fi un articol destul de lung.PHP se referă la fişiere UNIX diferite. mai ales atunci când deplasaţi fişiere între UNIX şi Windows. } echo "</B><BR>". CD-ROM sau alt mediu de stocare. apoi voi continua cu vizualizarea informaţiilor despre fişiere.. În articolele viitoare voi continua cu descrierea funcţiilor php de prelucrare a fişierelor şi a directoarelor. trebuie să înţelegeti sistemul de fişiere UNIX. 10). foreach ($v as $val) { echo "$val<BR>". proprietăţile şi privilegiile ce se pot acorda fişierelor sau directoarelor continuând apoi cu exemplificări.

Grup: Numele grupului care este posesorul fişierului . Puteţi determina posesorul unui fişier prin emiterea comenzii ls. trei triade. Rulaţi într-un script sub windows comanda următoare: Cod: <?php $comanda = `dir`. . Cea de-a doua triadă indică privilegiile acordate membrilor grupului care este posesorul fişierului.Numele fişierului: numele atribuit fişierului. cunoscut sub numele de posesor al fişierului. În afară de calitatea de posesor al fişierului. sau pur şi simplu grupuri.x.w.tipul fişierului şi permisiunile de acces.legături: numărul legăturilor hard asociate acestui fişier.ls -1 nume_fisier unde nume_fisier este numele fişierului. Utilizatorul care creează un fişier devine posesorul fişierului. Un utilizator poate fi membru al unui număr oricât de mare de grupuri. Privilegii de fişier Privilegiile asociate unui fişier determină operaţiile pe care utilizatorii le pot efectua cu fişierul respectiv. utilizatorul care emite comanda trebuie să fie un membru al grupului grup. care reprezintă seturi de utilizatori. Fiecare legătură hard stabileşte un nume după care este cunoscut fişierul respectiv. se poate scrie în fişier . Administratorii de sistem UNIX pot defini grupuri de utilizatori. Fiecare caracter al unei triade de privilegii poate fi o literă sau o cratimă.Data modificării: data şi ora ultimei modificări a fişierului. cu alte cuvinte. cu alte cuvinte. Privilegiile sunt date sub forma a trei grupuri alcătuite din câte trei caractere fiecare. echo $comanda. iar grup este numele grupului. .Dimensiunea fişierului exprimată îin octeţi. Privilegiul x este semnificativ numai pentru fişierele care includ un conţinut executabil. În general putem ignora acest câmp.r. Prima triadă indică privilegiile acordate posesorului fişierului. conţinutul fişierului poate fi executat. Dacă fişierul nu a suferit modificări recente. //pentru ghilimele folositi tasta de langa 1 // deasupra tastei tab nu caracterul asta '. Datele de ieşire includ următoarele câmpuri: . Literele au următoarele semnificaţii: . Cu toate acestea. prin emiterea comenzii chown (este şi comandă php). cum . persoanelor care nu sunt nici posesoare ale fişierului şi nici nu sunt membre ale grupului care care este posesorul fişierului. . Posesorul unui fişier poate atribui unui fişier un nou grup posesor prin emiterea comenzii chgrp: chgrp grup nume_fisier unde nume_fisier este numele fişierului. fişierul poate fi citit . Cea de-a treia triadă indică privilegiile acordate altor utilizatori. În Windows. un administrator de sistem poate atribui un fişier unui alt utilizator. ?> Pentru a funcţiona această comandă trebuie introdusă în ghilimele simple ` (a nu se folosi ghilimelele ' ) Proprietatea asupra fişierelor Fiecare fişier are un cont de utilizator asociat. o comanda asemănătoare ar fi comanda dir.Utilizator: numele utilizatorului care este posesorul fişierului . vor fi afişate data şi anul. .

r-x. Similar. Forma comenzii chmod care foloseste cifre în octal este următoarea: chmod mod nume_fisier unde mod este numărul din trei cifre scris în octal care indică privilegiile. care indică utilizatori alţii decât posesorul şi membrii grupului posesor.are valoarea 4. cealaltă vă permite să le specificaţi folosind litere. Numerele asociate privilegiilor sunt: r. iată o . chmod utilizatori operatie privilegii Între argumentele comenzii nu sunt permise spaţii. formaţi un număr din trei cifre scris în octal.o. calculaţi valoarea numerică a fiecărei triade.w. însumaţi numerele corespunzătoare fiecărui privilegiu disponibil din cadrul triadei. dar nu pot scrie în fişier .r.x. avem un fişier cu privilegiile următoare: rwxr-xr-Aceste caractere au următoarea semnificaţie: . Argumentul operatie este unul din următoarele: . fiecare specificaţie trebuie separată de următoarea cu ajutorul unei virgule. mai multe operaţii şi mai multe grupuri. privilegiul r-x are valoarea 4+1 = 5. privilegiile rwxr-xr-. iar privilegiul r-. privilegiul rwx are valoarea 4+2+1 = 7. dar nu pot scrie în fişier sau executa conţinutul fişierului.g. pentru a acorda posesorului acces complet la fişierul test şi pentru a acorda altor utilizatori numai acces de citire. scrie sau executa fişierul . Daca o anumită literă este înlocuită de o cratimă. Această formă alternativă vă permite să specificaţi privilegii. care indică utilizatorul posesor al fişierului . Caracterele unei triade apar întotdeauna în secvenţa rwx. iar nume_fisier este numele fişierului căruia urmează a i se aplica privilegiile.sunt fişierele binare executabile sau anumite categorii de scripturi. în fişier este permisă scrierea . Posesorul unui fişier poate modifica privilegiile asociate fişierului emiţând comanda chmod. alti utilizatori pot citi fişierul. membrii grupului posesor al fişierului pot citi sau executa fişierul. Pentru a specifica privilegiile folosind cifre în octal. precum şi să adaugaţi sau să extrageti privilegii dintr-un fişier.4 w-2 x-1 De exemplu. După ce aţi calculat valoarea numerică a fiecărei triade. conţinutul fişierului poate fi executat Se pot specifica mai mulţi utilizatori. De exemplu. De exemplu. De exemplu. Această comandă are două forme. Pentru aceasta. care indică pe membrii grupului posesor al fişierului .u. fişierul poate fi citit . emiteţi comanda: chmod 744 test Majoritatea utilizatorilor găsesc mai comodă utilizarea acelei forme a comenzii chmod care le permite specificarea privilegiilor folosind litere. O formă vă permite să specificaţi privilegiile folosind cifre scrise în octal.rwx. privilegiul asociat nu este utilizabil. De exemplu.r--. Argumentul utilizatori include între una şi trei dintre următoarele litere: .corespund valorii în octal 754. posesorul fişierului poate citi.

Administratorul unui sistem este. pentru a şterge directorul "home/tutoriale/teste/vechi".php se află în directorul /home/tutoriale/articole şi dorim să includem în el un alt fişier numit test. De exemplu. De exemplu.g=r.php) sau numele directorului care urmează a fi creat. în caz contrar. Privilegii pentru directoare Ca şi fişierele. pentru a crea un director denumit "test" şi pentru a-i atribui privilegiile "rwxr-x--x". returnează false. Crearea unui director (folder sau catalog) Pentru a crea un director. directoarele au privilegii asociate. Ştergerea unui director Pentru a şterge un director./test.php aflat cu un director mai sus îl putem accesa relativ la locaţia prezentă astfel . care poate obţine acces la fişiere şi le poate manipula fără nici un fel de restricţii. Sistemele UNIX furnizează un cont special de utilizator. Uneori. Calea relativă se referă la calea unui fişier sau director începând de la directorul curent de lucru. nici privilegiile de citire şi de execuţie ale celorlati utilizatori. modifică temporar identitatea utilizatorului deţinător al acestui privilegiu care ruleaza un fişier program. literele au semnificaţii . dacă fişierul index. Privilegiile unui director se notează folosind aceleaşi litere care indică privilegiile fişierelor.o=r test Iată o comandă care retrage privilegiile de scriere fiecărui utilizator. care are următoarea formă: mkdir(nume_director. Funcţia va returna zero în cazul producerii unei erori. se foloseşte funcţia rmdir(). administratorii de sistem folosesc numeroase privilegii speciale astfel că pot apărea şi alte privilegii în afară de r. respectiv adăuga privilegiile de executare la privilegiile posesorului fişierului: chmod u+x. prima cifră a argumentului mod trebuie să fie 0. folosite de programatorii aplicaţiilor PHP..go-w test Această comandă nu modifică nici privilegiile de citire şi de scriere ale posesorului fişierului. Asemenea privilegii speciale nu sunt. iar mod atribuie privilegiile care trebuie acordate noului director. cu toate acestea. 0751) Puteţi folosi funcţia rename() pentru a modifica numele unui director. În mod normal. singura persoană autorizată să utilizeze contul rădăcină. cunoscut sub numele de setuid. De exemplu.comandă care atribuie privilegiile rwxr--r-. transferându-i ca argument calea sau numele directorului care urmează a fi şters. în general. în general. invocaţi functia mkdir() astfel: mkdir("test". Funcţia returneaza true dacă creează directorul. astfel încat PHP să-l perceapă ca pe o valoare scrisă în octal. De exemplu. Fiecare director din listă este separat de directorul următor de un caracter slash orientat înainte (/). mod) unde nume_director este calea absolută sau relativă (O cale absolută este calea care începe de la directorul rădăcină urmând structura arborescentă a directoarelor şi sub-directoarelor acestuia până se ajunge la directorul dorit. cu excepţia posesorului fişierului.pentru fişierul test: chmod u=rwx. denumit radacina (root) sau superutilizator (superuser). invocaţi funcţia rmdir() astfel: rmdir("home/tutoriale/teste/vechi") Se pot sterge numai directoare vide. invocaţi funcţia mkdir(). un privilegiu special..w şi x.

Pentru a schimba directorul curent de lucru.r.oarecum diferite atunci când se aplică asupra directoarelor: . care are următoarea formă: chdir(nume_director) unde nume_director este calea sau numele directorului de lucru dorit. sub-directoarele şi fişierele pe care le conţine pot fi create în catalog şi apoi şterse de acolo. cu alte cuvinte. invocaţi funcţia chdir(). cu alte cuvinte. sub-directoarele şi fişierele pe care le conţine pot fi afişate .w. Iată un exemplu care prezintă modul de utilizare a funcţiei pathinfo(): .php". funcţia va returna "home/tutoriale/teste". De exemplu. pentru a face din /teste directorul curent de lucru. implicit. precum şi extensia fişierului (dacă există) asociată rezultatului invocării funcţiei basename() având ca argument calea respectivă. Funcţia nu necesită argumente şi. returnează false. în caz contrar. returnând numai componenta finală a căii specificate. Funcţia are următoarea formă: dirname(cale) Funcţia basename() execută operaţia complementară. cu alte cuvinte. rezultatul invocării funcţiei basename() având ca argument calea respectivă. De exemplu. mai puţin componenta finală a căii specificate.php". directorul se poate folosi. funcţia va returna "test. dacă se dă calea "home/tutoriale/teste/test. Funcţia returnează true dacă operaţia reuşeşte.x. dacă este dată calea "home/tutoriale/teste/test. De exemplu. funcţia vă ajută să izolaţi numele fişierului de restul căii. poate fi utilizată astfel: $director_curent = getcwd(). În cazul în care componenta finală este un fişier.") } Manipularea căilor de acces Funcţia dirname() preia calea de acces la un fişier şi returnează toată calea. Funcţia are următoarea formă: basename(cale) Dacă doriţi să executaţi mai multe operaţii cu o cale. folosind ca argument un fişier sau un director. invocaţi funcţia chdir() după cum urmează: $schimba_dir = chdir("/teste"). directorul poate fi citit. Puteţi vedea privilegiile de director utilizând funcţia fileperms(). Obţinerea şi modificarea directorului de lucru Functia getcwd() returnează un şir care conţine directorul curent de lucru. Vizualizarea şi modificarea privilegiilor de director Puteţi invoca funcţia chmod(). if (!$schimba_dir) { die("<br>A aparut o eroare la schimbarea directorului curent de lucru.php". directorul poate fi scris. funcţia pathinfo() vă poate fi de folos. . sub-directoarele şi fişierele pe care le conţine sunt accesibile. Această funcţie returnează un tablou asociativ care include trei elemente: rezultatul invocării funcţiei dirname() având ca argument calea respectivă.

php"). care citeste o intrare dintr-un director .php extension => php Versiunea PHP 4. while ($citire) { echo "<br>$citire". care închide directorul. ?> Acest exemplu afişează conţinutul directorului "/home/tutoriale/teste" (atât sub-directoarele cât şi fişierele) Obţinerea atributelor unui fişier .closedir(). $citire = readdir($director). if (!$director) { die("A aparut o eroare la deschiderea directorului"). } $citire = readdir($director). } closedir($director). Se pare că acest defect de program a fost remediat în versiunea PHP 4. Aceste funcţii sunt: . ca şi cum directorul ar fi un fişier.05 Citirea conţinutului unui director PHP furnizează trei funcţii care vă permit să citiţi conţinutul unui director. Exemplu: Cod: <?php $director = opendir("/home/tutoriale/teste").04pl1 işi încheie execuţia dacă invocaţi funcţia pathinfo() pe o cale din care lipseste extensia fişierului.opendir(). } ?> Datele de ieşire ale exemplului vor fi: Citat: dirname => /home/tutoriale/teste basename => test. foreach ($info as $nume=>$valoare) { echo "<br>$nume => $valoare".Cod: <?php $info = pathinfo("/home/tutoriale/teste/test. eliberând resursele alocate de funcţia opendir() Rezultatul apelării funcţiei readdir() este un şir care conţine numele următorului fişier sau subdirector al directorului deschis. Funcţia returnează false atunci când au fost citite toate intrările din catalog. care permite citirea unui director .readdir().

în speţă "fifo". Funcţiile fileowner() şi filegroup() returnează fiecare un identificator numeric. fileowner() returnează identificatorul numeric de utilizator al fişierului fileperms() returnează permisiunile fişierului <. $rezultat = posix_getgrgid(filegroup($nume_fisier)). echo "<br>fileowner(): $rezultat". $rezultat = fileatime($nume_fisier). "dir". "file" sau filetype() "unknown".php". în octeţi. returnează false. echo "<br>filesize(): $rezultat". echo "<br>filetype(): $rezultat". $rezultat = file_exists($nume_fisier). în caz is_writable() contrar. $rezultat)./tr> returnează dimensiunea fişierului. returnează true dacă fişierul specificat există şi este un director. returnează true dacă fişierul specificat există şi poate fi citit. respectiv false în caz contrar. în caz is_file() contrar. $rezultat = filetype($nume_fisier). returnează true dacă fişierul specificat există şi se poate scrie în acel fişier. $rezultat = posix_getpwuid(fileowner($nume_fisier)). $rezultat = $rezultat["name"]. . în caz contrar is_readable() returnează false. în caz contrar is_dir() returnează false returnează true dacă fişierul specificat există şi este un fişier obişnuit. Funcţie Descriere file_exists() returnează true dacă fişierul specificat există. filesize() Cod: <?php $nume_fisier = "pagina_demo. Un exemplu al acestor funcţii este dat mai jos. $rezultat = filesize($nume_fisier). $rezultat = date("m-d-Y H:i". "char". Tabelul de mai jos rezumă cele mai cunoscute dintre aceste funcţii. "link". fileatime() returnează timpul de acces la fişier sub formă de amprentă de timp UNIX returnează timpul de modificare al i-nodului (structura de date care conţine filectime() informaţii despre fişierele UNIX) sub formă de amprentă de timp UNIX filegroup() returnează identificatorul numeric al grupului care deţine fişierul filemtime() returnează momentul de timp al modificării fişierului sub formă de amprentă de timp UNIX.PHP furnizează numeroase funcţii care vă permit să obţineţi informaţii care descriu un fişier. echo "<br>filegroup(): $rezultat". returnează tipul fişierului. $rezultat = $rezultat["name"]. "block". respectiv a funcţiei posix_getgrgid() cu un identificator de grup. puteţi converti identificatorul numeric într-un şir prin invocarea funcţiei posix_getpwuid() cu un identificator de utilizator. returnează false. echo "<br>file_exists(): $rezultat".

nu valoarea 10. . valoarea literală 010 are valoarea 8.specificând valoarea 0640. iar grup este numele sau identificatorul numeric al grupului.echo "<br>fileatime(): $rezultat". Pentru ca funcţia să se execute cu succes. iar argumentul mod specifică privilegiile dorite. o funcţie ale cărui argumente sunt asemănatoare celor folosite în linia de comandă UNIX: chmod(nume_fisier. Funcţia returnează true în caz de reuşită. invocaţi funcţia chgrp(). echo "<br>is_readable(): $rezultat". $rezultat = date("m-d-Y H:i". echo "<br>is_writable(): $rezultat". respectiv false în caz contrar. $rezultat = is_dir($nume_fisier). Funcţia returnează true în caz de reuşită. Modificarea proprietăţii asupra unui fişier Pentru a modifica grupul posesor al unui fişier. Deşi PHP include o funcţie chown() care modifică proprietatea asupra unui fişier. în general funcţia chown() nu este disponibilă. $rezultat = filemtime($nume_fisier). Funcţia chgrp() nu funcţionează sub Windows. $rezultat). contul de utilizator sub care rulează PHP trebuie să fie posesor al fişierului şi să fie membru al grupului specificat de argumentul grup. mod) unde nume_fisier specifică numele sau calea de acces a fişierului ale cărui privilegii urmează a fi modificate. $rezultat = filectime($nume_fisier). respectiv false în caz contrar. echo "<br>fileperms(): $rezultat". Deoarece acesta este un procedeu nesigur şi rareori folosit. prefixaţi valoarea folosind cifra 0. $rezultat). Pentru ca funcţia chmod() să se execute cu succes. $rezultat = decoct($rezultat). puteti atribui unui fişier privilegiile rw-r----. PHP trebuie să ruleze sub contul utilizatorului posesor al fişierului. ?> Modificarea privilegiilor unui fişier Pentru a modifica privilegiile unui fişier. $rezultat = date("m-d-Y H:i". $rezultat = fileperms($nume_fisier). echo "<br>filemtime(): $rezultat". echo "<br>filectime(): $rezultat". PHP trebuie să ruleze folosind contul rădăcină pentru ca această funcţie să poată da rezultate. Ca atare. De exemplu. echo "<br>is_dir(): $rezultat". $rezultat = is_readable($nume_fisier). grup) unde nume_fisier este numele sau calea fişierului. $rezultat = is_file($nume_fisier). echo "<br>is_file(): $rezultat". În general se preferă exprimarea privilegiilor sub forma unui număr scris în octal. care are forma: chgrp(nume_fisier. invocaţi chmod(). Funcţia chmod() nu funcţionează sub Windows. Pentru aceasta. $rezultat = is_writable($nume_fisier).

denumit cale de includere. "rb". această valoare conţine un întreg care se numeşte identificator de fişier. specificaţi "b" ca al doilea caracter al modului. PHP trebuie să ruleze sub contul unui utilizator care dispune de suficiente privilegii pentru a executa operaţiile indicate de modul respectiv. argumentul nume_fisier trebuie să fie alcătuit dintr-un nume de fişier sau o cale relativă.ini. Deci. În caz contrar. Valoarea modului funcţiei fopen() determină valoarea iniţială a pointerului de fişier. care indică amplasarea octetului din fişier unde se va produce următoarea operaţie (citire sau scriere). PHP va căuta fişierul într-un director special. de exemplu. De exemplu. Mod "r" "r+" "w" "w+" "a" "a+" Citire x x x x Scriere x x x x x x x x x x x Creare Trunchiere Pointer Început Început Început Început Sfârşit Sfârşit Pentru ca funcţia fopen() să se execute cu succes. write (scriere) şi append (adăugare). în caz contrar. De exemplu.txt pentru citire: $fisier = fopen("text. iar mod indică tipul de acces dorit. care se foloseşte pentru identificarea unui fişier de către funcţiile care execută operaţii cu fişiere. Dacă nu procedaţi astfel. dacă acesta nu există. cale). mod. fişierele ASCII şi fişierele binare sunt tratate în mod diferit. În mod prestabilit. "r"). Verificarea finalizării unei operaţii cu un fişier Operaţiile cu fişiere pot eşua dintr-o varietate de motive. Dacă argumentul cale are valoarea "1". Cu toate acestea. citirile din fişier şi alte operaţii se vor încheia prematur sau vor eşua. mod) unde nume_fisier specifică numele sau calea spre fişierul care urmează a fi deschis.Deschiderea unui fişier Înainte de a putea citi sau scrie într-un fişier. Sub Windows.txt". Funcţia fopen() returnează valoarea false dacă PHP nu a reuşit să deschidă fişierul. Modul "r" permite accesul la citire. Administratorul PHP configurează identitatea căii de includere. nu dintr-o cale absolută. este important să verificaţi . Fiecare fişier are un pointer asociat. Modurile "w" şi "a" permit accesul la scriere.04pl1 raportează că este configurată calea de includere. calea de includere nu va fi folosită. instrucţiunea următoare deschide fişierul text. este necesară stabilirea manuală a valorii variabilei include_path din fişierul php. Când deschideţi un fişier binar sub Windows. Literele care desemnează modurile corespund cuvintelor read (citire). PHP trebuie să ruleze ca utilizator cu acces de scriere la catalogul în care urmează a fi creat fişierul. Tabelul de mai jos prezintă valorile argumentului mod care pot fi transmise funcţiei fopen(). pentru a putea crea un fişier. care preia trei argumente: fopen(nume_fisier. Modurile care includ semnul "+" permit ambele tipuri de acces. Dacă specificaţi argumentul cale. PHP furnizează o formă alternativă a funcţiei fopen(). trebuie să deschideţi fişierul folosind funcţia fopen(): fopen(nume_fisier. Unele moduri determină PHP să încerce a crea fişierul. PHP 4.

?> Funcţia fclose() returnează valoarea true dacă fişierul a fost închis cu succes. Când un script a terminat de utilizat un fişier. În acest caz. scriptul trebuie să închidă fişierul. Testarea acestei . ori de câte ori este posibil.txt". Iată o modalitate în care puteţi verifica: Cod: <?php $fisier = fopen("text. returnat la deschiderea acestuia. sunt formele folosite de programatorii PHP cu experienţă: Cod: <?php $fisier = fopen("text. Totuşi. PHP inchide în mod automat fişierele deschise. } ?> Funcţia fopen() returnează false dacă nu reuşeşte să deschidă fişierul. } // Aici se introduc instructiunile care folosesc fisierul deschis @fclose($fisier). if (!$fisier) { die("Nu se poate deschide fisierul pentru citire"). scriptul invocă funcţia die() pentru a afişa un mesaj şi pentru a-şi încheia execuţia.txt". if (!$fisier) { die("Nu se poate deschide fisierul"). "r")) || die("Nu se poate deschide fisierul pentru citire"). "r") or die("Nu se poate deschide fisierul pentru citire").txt". La sfârşitul unui script. eliberând aceste resurse. dar şi posibil mai derutante. în programare se recomandă să închideţi fişierele mai rapid. Cu mult mai compacte. "r"). ?> Închiderea unui fişier Un fişier deschis consumă resursele sistemului. ?> sau aceeaşi instrucţiune mai complexă: Cod: <?php ($fisier = fopen("text. Pentru a închide un fişier invocaţi funcţia fclose(): fclose(identificator_fisier) unde identificator_fisier este identificatorul fişierului.br> Cod: <?php $fisier = fopen("text. De exemplu: <.dacă fiecare operaţie s-a încheiat cu succes.txt". "r").

lungime) Argumentul identificator_fisier este valoarea returnată de funcţia fopen(). $citire = fread($fisier. fclose($fisier). minus o unitate. echo "<br>Citeste: $citire". echo "<br>Citeste: $citire". Octeţii citiţi din fişier sunt returnaţi sub formă de valoare de tip şir. ?> Citirea unei linii de text O linie de text este o serie de caractere urmate de un caracter de terminare a liniei. fclose($fisier). PHP va returna mai puţin de lungime octeţi. 256). Citirea dintr-un fişier PHP furnizează o varietate de funcţii pentru citirea fişierelor. cu toate acestea. astfel: Cod: <?php $nume_fisier = "text. Dacă operaţia de citire întâlneşte sfârşitul fişierului. filesize($nume_fisier)). Prima dintre acestea este fread() care are următoarea formă: fread(identificator_fisier. pentru a permite includerea caracterului de terminare a liniei. folosiţi funcţia filesize() pentru a furniza valoarea argumentului lungime. argumentul identificator_fisier este o valoare returnată de funcţia fopen(). Funcţia are următoarea formă: fgets(identificator_fisier. În exemplul următor este prezentat modul de citire şi de afişare a primei linii a unui fişier: . denumită fgetc(). lungime) Ca şi în cazul funcţiei fread(). Funcţia fgets() citeşte o linie dintr-un fişier. ?> Exemplul citeşte maximum 256 de octeţi din fişier. modificaţi valoarea argumentului lungime al funcţiei fread(). care citeşte un octet din fişierul specificat. PHP include o funcţie conexă. Pentru a citi şi a afisa întregul conţinut al fişierului. Pentru a citi un număr mai mare sau mai mic de octeţi. "r") OR die("Nu se poate deschide fisierul pentru citire"). "r") OR die("Nu se poate deschide fisierul pentru citire").txt". iar argumentul lungime specifică numărul maxim de octeţi care vor fi citiţi. deoarece nu se mai pot face prea multe după ce s-a ratat o încercare de a închide un fişier. argumentul lungime specifică numărul maxim de octeţi care vor fi citiţi.txt". Exemplu: Cod: <?php $fisier = fopen("text. $fisier = fopen($nume_fisier. Octeţi citiţi din fişier sunt returnaţi ca valoare de tip şir. $citire = fread($fisier.valori este rareori necesară.

Cod:

<?php $nume_fisier = "text.txt"; $fisier = fopen($nume_fisier, "r") OR die("Nu se poate deschide fisierul pentru citire"); $citire = fgets($fisier, 256); echo "<br>Citeste: $citire"; fclose($fisier); ?>
În exemplul de mai sus s-a presupus că linia cea mai lungă a fişierului conţine mai puţin de 256 octeţi. Pentru a permite lungimi de linie mai mari, modificaţi valoarea argumentului lungime al funcţiei fgets(). Citirea linie cu linie a unui întreg fişier Funcţia feof() este folosită pentru a determina momentul când fişierul a fost citit în totalitate. Funcţia returnează o valoare care arată dacă s-a ajuns sau nu la sfârşitul fişierului. Funcţia are următoarea formă: feof(identificator_fisier) Argumentul identificator_fisier este valoarea returnată de funcţia fopen(). Funcţia feof() returnează true dacă fişierul specificat este la sfârşit; în caz contrar returnează false. Iată cum se poate folosi funcţia feof() pentru a controla procesul de citire a unui întreg fişier, linie cu linie:

Cod:

<?php $nume_fisier = "text.txt"; $fisier = fopen($nume_fisier, "r") OR die("Nu se poate deschide fisierul pentru citire"); $citire = fread($fisier, filesize($nume_fisier)); while (!feof($fisier)) { echo "<br>Citeste: $citire"; $citire = fread($fisier, filesize($nume_fisier)); } fclose($fisier); ?>
Instrucţiunea while asigură faptul că funcţia fgets() este apelată în mod repetat, până la citirea tuturor liniilor. O modalitate mai simplă de a citi linie cu linie un întreg fişier constă în a folosi funcţia file(). Această funcţie returnează un tablou în care fiecare element conţine o linie a fişierului text specificat. Iată un exemplu:

Cod:

<?php $tablou = file("text.txt"); foreach ($tablou as $citire) {

echo "<br Citeste: $citire"; } ?>
Această metodă nu este adecvată pentru fişiere de foarte mari dimensiuni, deoarece în tablou este încărcat întregul conţinut al fişierului, ceea ce poate necesita o cantitate de memorie superioară celei disponibile. Afişarea conţinutului unui fişier PHP furnizează două funcţii care facilitează afişarea conţinutului unui fişier. Una dintre funcţii, fpassthru(), necesită un argument care specifică identificatorul fişierului care urmează să fie afişat: $fisier = fopen("text.txt", "r"); fpassthru($fisier); După ce a afişat fişierul, funcţia îl închide automat. Cealaltă funcţie, readfile(), necesită numai numele sau calea fişierului: readfile("text.txt"); Navigarea printr-un fişier Aşa cum am mai spus, fiecare fişier are un pointer asociat care indică poziţia octetului unde se va produce următoarea operaţie. Puteţi folosi funcţia rewind() pentru a readuce pointerul la începutul fişierului. Funcţia are următoarea formă: rewind(identificator_fisier) unde identificator_fisier este identificatorul de fişier returnat de funcţia fopen(). Nu se poate readuce pointerul unui fişier la începutul propriu-zis al unui fişier dacă fişierul a fost deschis pentru un acces de tip ataşare, adică într-unul din modurile "a" sau "a+". Dacă se produce o eroare, funcţia rewind() returnează zero. Deşi funcţia rewind() este utilă în caz de nevoie, necesitatea de a readuce un pointer de fişier la începutul fişierului nu este chiar atât de frecventă. Funcţia fseek() furnizează o mai mare flexibilitate, permiţându-vă să poziţionaţi pointerul de fişier astfel încât să puteţi citi sau scrie în orice punct al fişierului. Funcţia are două forme, cea mai simplă fiind următoarea: fseek(identificator_fisier, offset) unde identificator_fisier este identificatorul de fişier returnat de funcţia fopen(), iar offset este poziţia dorită a pointerului de fişier, specificată în octeţi, în raport cu începutul fişierului. În caz de reuşită, funcţia fseek() returnează 0; în caz contrar, returnează -1. O formă alternativă a funcţiei asigură un grad superior de flexibilitate: fseek(identificator_fisier, offset, baza) unde baza ia una dintre următoarele valori: - SEEK_SET, care stabileşte poziţia pointerului de fişier în raport cu începutul fişierului - SEEK_CUR, care stabileşte poziţia pointerului de fişier în raport cu valoarea curentă a pointerului - SEEK_END, care stabileşte poziţia pointerului de fişier relativ la sfârşitul fişierului. Valoarea argumentului offset poate fi pozitivă, negativă sau zero. De exemplu, pentru a poziţiona pointerul cu 10 octeţi înainte de sfârşitul fişierului, emiteţi următorul apel de funcţie: fseek($fisier, -10, SEEK_END)

unde $fisier este identificatorul fişierului al cărui pointer doriţi să-l repoziţionaţi. Pentru a obţine valoarea curentă a pointerului de fişier, invocaţi functia ftell(), care are următoarea formă: ftell(identificator_fisier) Funcţia returnează valoarea curentă a identificatorului de fişier, respectiv valoarea zero dacă funcţia eşuează. Scrierea într-un fişier Spre deosebire de varietatea de funcţii furnizate pentru citirea fişierelor, PHP oferă o singură funcţie pentru scrierea în fişiere, şi anume fwrite(), care are următoarea formă: fwrite(identificator_fisier, data) unde identificator_fisier este identificatorul de fişier returnat de funcţia fopen(), iar data este o valoare şir care determină datele ce urmează a fi scrise. Dacă execuţia funcţiei reuşeşte, returnează numărul octeţilor scrişi; în caz contrar, returnează valoarea -1. Iată un exemplu de scriere a datelor într-un fişier:

Cod:

<?php $nume_fisier = "text.txt"; $fisier = fopen($nume_fisier, "a") OR die("Nu se poate deschide fisierul pentru citire"); $scriere = fwrite($fisier, "Un rand de text atasat la fisier.\n"); echo "<br>Rezultatul scrierii: $scriere"; fclose($fisier); ?>
Scriptul scrie în fişier o linie de text. Deoarece fişierul a fost deschis folosind modul "a", datele sunt ataşate la fişier; cu alte cuvinte, datele sunt scrise după toate datele existente în fişier. Dacă lucraţi cu fişiere text, în general trebuie să includeţi un caracter de terminare a liniei la sfârşitul fiecărei linii scrise în fişier (în exemplul de mai sus am pus \n la sfârşitul liniei). Scriptul din exemplul de mai sus scrie în fişier o singură linie de text. Totuşi, puteţi scrie mai multe linii, dacă doriţi. Dacă apelaţi funcţia fwrite() din interiorul unei bucle, aveţi posibilitatea să scrieţi mai multe linii. După ce aţi scris toate liniile de care aveţi nevoie, închideţi fişierul prin apelarea funcţiei fclose(). PHP mai furnizează şi o formă alternativă a funcţiei fwrite(): fwrite(identificator_fisier, data, lungime) Această formă include un al treilea argument, şi anume lungime, care vă permite să specificaţi numărul maxim de octeţi care vor fi scrisi. Argumentul lungime trebuie utilizat atunci când se scrie în fişiere binare sub Windows. De asemenea, Windows preferă secvenţa de terminare a liniei "\r\n". PHP dispune de o altă funcţie pentru scrierea fişierelor, în speţă fputs(). Totuşi, în afară de nume, fputs() este una şi aceeaşi funcţie cu fwrite() (reprezintă una şi aceeaşi funcţie dar cu nume diferite). Obţinerea accesului exclusiv la un fişier Uneori, accesul simultan la un fişier poate avea ca rezultat deteriorarea fişierului. Să ne imaginăm că avem un contor de pagini asociat unei pagini web. Dacă 2 sau mai mulţi vizitatori intră simultan pe pagină scriptul de contorizare va deschide fişierul pentru scriere în acelaşi timp pentru toţi utilizatorii şi ce credeţi că va scrie în el? În loc să incrementeze contorul cu o

unitate pentru fiecare vizitator este posibil sa dea eroare şi informaţiile din fişier să se piardă. Pentru a evita astfel de probleme, este necesar ca fiecare proces să obţină acces exclusiv la fişierul care conţine contorul din pagină. Astfel, accesul la fişier este succesiv: fişierul va fi folosit mai întâi de un proces, şi apoi de celălalt. Atâta vreme cât procesele sunt împiedicate să obţină simultan accesul la fişier, contorul nu va indica valori eronate. Funcţia flock() permite unui proces să obţină un acces exclusiv la un fişier, acordând procesului o blocare a fişierului. Funcţia are forma: flock(identificator_fisier, operatie) unde identificator_fisier este identificatorul de fişier returnat de funcţia fopen(). Argumentul operatie este o constantă sau o expresie care specifică operaţia dorită, după cum urmează: Operaţie Descriere Obţine o blocare partajată a fişierului specificat. Mai multe procese pot deţine o blocare partajată; pentru un fişier însă, nici un proces nu poate obţine o blocare partajată în timp ce un alt proces deţine o blocare exclusivă. Procesul va aştepta până când are posibilitatea de a obţine blocarea cerută. Obţine o blocare exclusivă pentru fişierul specificat. Un singur proces poate deţine o blocare exclusivă a unui fişier. Procesul va aştepta până când are posibilitatea de a obţine blocarea cerută. Încearcă să obţină o blocare partajată a fişierului specificat; totuşi, nu aşteaptă obţinerea blocării, dacă aceasta nu este disponibilă imediat. Încearcă să obţină o blocare exclusivă pentru fişierul specificat; totuşi, nu aşteapta obţinerea blocării, dacă aceasta nu este disponibilă imediat. Eliberează blocarea fişierului specificat.

LOCK_SH

LOCK_EX

LOCK_SH + LOCK_NB

LOCK_EN + LOCK_NB LOCK_UN

Funcţia flock() returnează true în caz de reuşită, respectiv false când blocarea solicitată nu poate fi obţinută (LOCK_SH şi LOCK_EX) sau eliberată (LOCK_UN). Blocarea este o activitate care se desfăşoară în comun. Procesele nu au niciodată accesul interzis la fişiere, ci numai la blocări. Ca atare, un proces care nu încearcă să blocheze un fişier poate obţine acces la fişier chiar dacă un alt proces a cerut şi a obţinut o blocare exclusivă a fişierului. Unele servere Web, inclusiv IIS de la Microsoft, rulează un singur proces multifir. În asemenea situaţii, funcţia flock() nu va reuşi să furnizeze acces exclusiv la fişiere. Copierea unui fişier PHP furnizează o funcţie care facilitează copierea fişierelor, şi anume funcţia copy(). Funcţia copy() are următoarea formă: copy(sursa, destinatie) unde sursa este numele sau calea fişierului care urmează a fi copiat, iar destinatie este numele sau calea unde se va copia. Funcţia returnează true dacă operaţia de copiere reuşeste; în caz contrar, returnează false. Exemplu:

Cod:

<?php $copiaza = copy("text.txt", "text.bak"); if (!$copiaza) { die("<br>A fost produsa o eroare la copierea fisierulu

"text. if (!$redenumeste) { die("<br>A fost produsa o eroare la redenumirea fi sierului"). if (!$sterge) { die("<br>A fost produsa o eroare la stergerea fisierulu i"). în caz contrar. Funcţia returnează true dacă operaţia de modificare a numelui a reuşit.bak". nume_nou) unde nume_vechi este numele sau calea originală a fişierului.txt"). dacă acesta există.txt"). PHP trebuie să aibă acces de scriere la directorul în care se va afla fişierul cu numele modificat. Pentru a crea un . iar nume_nou este numele sau calea dorită. PHP nu va putea modifica numele fişierului. PHP trebuie să aibă acces de scriere la directorul în care se va afla copia. respectiv false în caz contrar. Funcţia are forma: unlink(nume_fisier) unde nume_fisier este numele sau calea fişierului care urmează a fi şters. functia unlink() "sar putea să nu funcţioneze" în sistemele Windows. şi anume unlink(). Ştergerea unui fişier PHP furnizează o funcţie care vă permite să ştergeţi un fişier. Funcţia returnează true dacă operaţia de ştergere a avut succes. } ?> Exemplul crează o copie de siguranţă a fişierului "text. } ?> Reţineţi că PHP trebuie să aibă acces de scriere la directorul în care se află fişierul. Funcţia copy() va suprascrie fişierul destinaţie.txt". în caz contrar. atribuindu-i numele "text. returnează false. } ?> Exemplul modifică numele fişierului "text.txt". Modificarea numelui unui fişier PHP furnizează o funcţie care vă permite să modificati numele unui fişier. funcţie care are următoarea formă: rename(nume_vechi. La fel ca la funcţia copy(). cu numele "text. în caz contrar. PHP nu va putea crea copia. Exemplu: Cod: <?php $sterge = unlink("text. dacă acesta există. şi anume rename(). Ca şi în cazul comenzii UNIX mv. în caz contrar. În conformitate cu manualul PHP.bak".bak". funcţia rename() va suprascrie fişierul destinaţie. Încărcarea unui fişier în server Pe anumite pagini cu formulare HTML se poate încărca un fişier pe server. Exemplu: Cod: <?php $redenumeste = rename("text. PHP nu va putea şterge fişierul.i").

De exemplu: Cod: <?php $rezultat = move_uploaded_file ($HTTP_POST_FILES["fisier_utilizator"] ["tmp_name"]. ?> Funcţia move_uploaded_file() vă impune să specificaţi calea fişierului încărcat şi calea unde doriţi să fie mutat fişierul. Momentan mă opresc aici cu prima parte a acestui tutorial.php" ENCTYPE="multipart/form-data"> Incarca un fisier: <INPUT NAME="fisier_utilizator" TYPE="FILE"> <BR><BR> <INPUT TYPE="SUBMIT" VALUE="Trimite"> </FORM> </BODY> </HTML> Când utilizatorul apasă pe butonul de trimitere. În continuare o să încerc sa detaliez lucrul cu fişierele şi să discut ceva mai mult despre cele mai folosite funcţii care se ocupă de fişiere. "/home/tutoriale/upload/nume_fisier. La terminarea execuţiei scriptului. Iată un exemplu: Cod: <HTML> <HEAD> <TITLE>incarcare fisier</TITLE> </HEAD> <BODY> <FORM METHOD="POST" ACTION="incarca. puteţi invoca funcţia move_uploaded_file(). sper că aţi aflat lucruri interesante până acum. Limbajul PHP oferă un set de funcţii . specificaţi ENCTYPE="multipart/form-data" în eticheta FORM şi includeţi un control de introducere a datelor cu atributul TYPE="FILE". respectiv false în caz contrar. Scriptul vostru PHP poate obţine accesul la calea fişierului încărcat astfel: $HTTP_POST_FILES["fisier_utilizator"]["tmp_name"] unde fisier_utilizator este valoarea atributului NAME asociat controlului INPUT folosit pentru încărcarea fişierului. Dacă doriţi să salvaţi fişierul.astfel de formular de încărcare. PHP şterge în mod automat fişierul încărcat.ext"). $rezultat = $rezultat ? "true" : "false". echo "<br>move_uploaded_file(): $rezultat". Funcţia returnează true dacă operaţia reuşeşte. Descrierea funcţiilor de prelucrare a fişierelor În articolul precedent am discutat despre sistemul de fişiere si am generalizat despre fisiere si directoare. browserul încarcă fişierul în server.

"a+" . în timp ce fişierele php://output. poziţionează pointer-ul la începutul acestuia şi sterge conţinutul. . dacă fişierul nu există. Pe sistemele de operare *nix nu are nici un efect. pentru a deschide fişierul cu numele "test.deschide fişierul pentru citire şi scriere şi poziţionează pointer-ul la sfârşitul acestuia. . La sfărşitul şirului care reprezintă modul de deschidere a fişierului mai poate apărea şi caracterul "b". . . printre numele funcţiilor se regăsesc şi nume cunoscute pe platformele de operare *nix şi Microsoft Windows. dacă fişierul nu există. dacă fişierul nu există. Acest identificator va fi transmis tuturor funcţiilor pe care le veţi utiliza pentru a accesa date din fişier. dintre care ultimii doi sunt opţionali. . FTP (File Transfer Protocol) sau FTPS (Secure FTP). Dacă dorim să scriem date în fişier. în schimb pentru portabilitate este indicată folosirea lui.php://stderr .pentru a facilita accesul la conţinutul fişierelor.php://input . -"w" . atunci îl putem deschide folosind următorul cod: $f = fopen("test.php://stdout . Funcţia are patru parametri. vom folosi următoarea linie de cod sursa: $f = fopen("test.cu ajutorul acestui identificator se pot scrie date direct în pagina web. . Fişierele standard de intrare şi ieşire pot fi accesate folosind următorii identificatori: . De exemplu. în cazul în care numele acestuia nu include şi o cale absolută. cu care interpretorul a fost configurat.deschide fişierul pentru citire şi poziţionează pointer-ul la începutul acestuia.deschide fişierul pentru scriere.deschide fişierul pentru scriere şi poziţionează pointer-ul la sfârşitul acestuia. php://stdout şi php://stderr pot fi deschise numai pentru scriere. însă fără a şterge conţinutul. HTTPS (Secure HTTP). pentru a găsi fişierul care se doreşte a fi deschis. "r"). Primul parametru îl reprezintă numele fişierului care urmează a fi deschis. Fişierele php://input şi php://stdin pot fi deschise numai în scopul citirii. acesta este creat. Un fişier este recunoscut de PHP a fi la distanţă dacă este accesibil printr-unul dintre protocoalele HTTP (Hyper Text Transfer Protocol). Cel de-al treilea parametru este de tip întreg şi poate avea valorile 0 sau 1 şi indică funcţiei faptul că se poate folosi (valoarea 1) sau nu (valoarea 0) lista de directoare. Funcţia fopen Această funcţie se foloşte pentru deschiderea unui fişier în vederea citirii sau scrierii datelor din/în acesta. acesta este creat. Datorită faptului că limbajul PHP este independent de platformă. Sintaxa majorităţii dintre acestea este similară funcţiilor de manipulare a fişierelor prezente în limbajul C/C ++. -"r+" . În cazul în care deschiderea fişierului nu poate avea loc din diferite motive. atunci funcţia returnează valoarea logică FALSE. Scrierea datelor în fişierul php://output are acelaşi efect ca şi utilizarea funcţiilor print şi echo.txt".php://output . poziţioneaza pointer-ul la începutul acestuia şi sterge conţinutul. -"w+ " . însă fără a şterge conţinutul.txt". dacă fişierul nu există. -"a" . acesta este creat.php://stdin .fişierul standard de intrare pentru procesul curent creat de PHP.deschide fişierul pentru citire şi scriere şi poziţionează pointer-ul la începutul acestuia. Fişierul poate fi şi unul aflat la distanţă.txt" pentru a citi date.fişierul standard de ieşire pentru procesul curent creat de PHP. Cel de-al doilea parametru este de tipul şir de caractere şi reprezintă modul de deschidere a fişierului care poate fi: -"r" .fişierul standard de erori pentru procesul curent creat de PHP. acesta este creat.deschide fişierul pentru citire şi scriere. "w"). Acesta este util atunci când se doreşte deschiderea fişierului în mod binar şi nu în mod text. Cel de-al patrulea parametru este de tipul resource şi este folosit în scopul optimizării unor operaţii. Funcţia fopen returnează un număr întreg care reprezintă identificatorul de acces la fişierul care tocmai a fost deschis.cu ajutorul acestui identificator se poate accesa conţinutul datelor transmise paginii prin intermediul metodei POST.

Funcţia fclose are un singur parametru de tip întreg. ?> Funcţia fread Această funcţie se foloseşte pentru citirea datelor din fişiere binare.Funcţia tmpfile Această funcţie realizează crearea şi deschiderea unui fişier temporar pentru scriere şi citire.txt" dorim să citim un număr şi un şir de caractere separate printr-un spaţiu.txt". Funcţia returnează valoarea logică TRUE dacă închiderea fişierului a reuşit şi valoarea logica FALSE în caz contrar. Primul parametru este de tip întreg şi reprezintă identificatorul de acces la fişierul din care se face citirea. Ceilalţi parametri reprezintă referinţele la variabilele care vor conţine rezultatul citirii. care reprezintă identificatorul de acces la fişierul care se doreşte a fi închis."r").$sir."<BR>".$nr. să se adauge caracterul "b" la parametrul care reprezintă modul de deschidere a fişierului. pentru citire. Funcţia feof Această funcţie verifică dacă s-a ajuns la sfârşitul fişierului sau nu. echo "Am citit numarul: ". Functia fclose Această funcţie realizează închiderea unui fişier care a fost deschis cu ajutorul funcţiilor fopen sau tmpfile. Pentru compatibilitate cu toate sistemele de operare se recomandă ca la deschiderea fişierului. list($nr. Funcţiile fscanf Această funcţie citeşte date dintr-un fişier text şi are doi parametri obligatorii. Fişierul temporar va fi şters în mod automat în momentul în care este închis sau când script-ul îşi încheie execuţia. De exemplu. Funcţia returnează valoarea logică TRUE dacă am ajuns la sfârşitul fişierului şi valoarea logică FALSE în caz contrar. care reprezintă identificatorul de acces la fişierul care se doreşte a fi închis. atunci vom folosi următorul cod: Cod: <?php $f = fopen("c:\\test. Formatul acestuia din urmă este similar formatului folosit pentru funcţia fscanf prezentă în limbajul C/C++. dacă din fişierul "c:\test. $sir) = $rez. Funcţia . Un exemplu de apel al acestei funcţii este fclose($fd) unde fd reprezintă identificatorul de acces la fişierul care se doreşte a fi închis. fclose($f). $rez = fscanf($f. echo "si sirul: ". Apelul acestei funcţii este identic cu cel al funcţiei fopen cu parametrii: un nume de fişier temporar (de obicei generat aleator) şi "w+b" ca mod de deschidere a fişierului. deci prezenţa variabilelor nu mai este obligatorie ca în cazul limbajului C/C++. Funcţia feof are un singur parametru de tip întreg. Funcţia tmpfile nu are parametri şi returnează un număr întreg care reprezintă identificatorul de acces al fişierului temporar. iar cel de-al doilea parametru este de tipul şir de caractere şi indică funcţiei formatul intrării. "%d %s \n"). Funcţia returnează un vector cu valorile citite.

"r").txt". Primul parametru este de tip întreg şi reprezintă identificatorul de acces al fişierului din care se doreşte să se citească date. şi anume. În continuare este un exemplu de folosire a acestei funcţii. "rb"). Cod: <?php $fisier = "test. echo $continut.txt".fread are doi parametri obligatorii. echo $car. Funcţia are un singur parametru de tip întreg care reprezintă identificatorul de acces la fişierul din care se doreşte să se facă citirea. Cod: <?php $fis = "test. Sintaxa acestei funcţii este similară cu cea a funcţiei fread. funcţia fgets returnează valoarea logică FALSE. reprezintă numarul de octeţi care se doresc a fi citiţi. Funcţia fgetc returnează un şir de caractere. în momentul întâlnirii unui sfârşit de linie sau în momentul în care s-a ajuns la sfârşitul fişierului. În cazul în care în fişierul din care se citesc date nu mai este disponibil numărul de octeţi specificat în cadrul celui de-al doilea parametru. $car = fgetc($fd). în cazul în care nu s-a ajuns la sfârşitul fişierului. cu menţiunea că cel de-al doilea parametru este opţional. filesize($fis)). format dintr-un singur caracter. ?> Funcţia fgets Această funcţie se foloseşte pentru a citi o linie dintr-un fişier de tip text. $continut = fread($fd. În cazul în care ne aflăm la sfârşitul fişierului. Cod: <?php $fisier = "test. fclose($fd). cel citit din fişier. În cazul în care ne aflăm la sfârşitul fişierului. atunci funcţia returnează toţi octeţii disponibili de la poziţia curentă din fişier şi până la sfârşitul acestuia. Codul este compatibil cu toate sistemele de operare pe care limbajul PHP poate fi instalat. iar al doilea parametru. echo "Continutul fisierului este: ". Rezultatul returnat de această funcţie este de tip şir de caractere care este format din octeţii care s-au citit din fişierul de intrare. $fd = fopen($fis. tot de tip întreg.txt". Funcţia fgets returnează un şir de caractere care conţine datele citite. echo "Primul caracter din fisier este: ". funcţia fgetc returnează valoarea logică FALSE. fclose($fd). Citirea datelor din fişier se încheie în momentul în care s-a citit un număr de caractere egal cu valoarea celui de-al doilea parametru (în cazul în care acesta este prezent). $fd = fopen($fisier. ?> Funcţia fgetc Această funcţie citeşte următorul caracter disponibil din fişierul de intrare. .

filesize($fis))) { echo $linie. } fclose($fd). while (!$linie = fgetss($fd. ?> În cazul în care fişierul test. în cazul în care nu ne aflăm la sfârşitul fişierului de intrare. " (virgula).$fd= fopen($fisier. În continuare este prezentat un exemplu de utilizare a acestei funcţii pentru un fişier CSV în care fiecare linie nu are o lungime mai mare de 1000 de caractere: Cod: . echo "Prima linie din fisier este: ". este de tip şir de caraetere şi reprezintă o listă de marcaje HTML sau PHP pe care funcţia nu trebuie să le elimine în momentul citirii. şirul returnat devine vid. de unde şi numele acestui tip de fişier. iar al treilea parametru este de tip şir de caractere care trebuie să aibă lungimea 1 şi reprezintă separatorul care se va folosi la procesarea datelor. un tablou de şiruri de caractere care reprezintă valorile citite. Funcţia returnează. Primul parametru este de tip întreg şi reprezintă identificatorul de acces la fişierul de intrare. echo $linie. Spre deosebire de funcţia fgets."<br>". Funcţia fgetcsv are trei parametri dintre care primii doi sunt obligatorii. $linie = fgets($fd). funcţia fgetss are trei parametri. În cazul în care ne aflăm la sfârşitul fişierului. fclose($fd) . Un fişier de tip CSV are formatul text şi conţine mai multe înregistrări. "r").valori separate prin virgula). Cel de-al treilea parametru este opţional. iar pe ecran se vor afişa multe rânduri goale. al doilea parametru este de tip întreg şi reprezintă numărul maxim de octeţi care se vor procesa la o citire şi trebuie să aibă o valoare mai mare decât lungimea celei rnai mari linii din fişierul CSV. Funcţia fgetcsv Această funcţie citeşte date dintr-un fisier CSV (Comma Separated Values . Este o reprezentare textuala a unui fişier de tip tabelar. De obicei acest separator este caracterul " . Pe fiecare linie a unui astfel de fişier se află mai multe valori ale unor câmpuri care sunt delimitate printr-un separator.html conţine multe linii cu marcaje html. prin eliminarea lor. Citirea datelor se încheie în momentul în care s-au citit atâtea caractere câte indică cel de-al doilea parametru sau în momentul în care am ajuns la sfârşitul fişierului. Funcţia fgetss Această funcţie citeşte o linie dintr-un fişier HTML. echo "Continutul fisierului HTML este: ". funcţia fgetcsv returnează valoarea logică FALSE. Primii doi parametri sunt identici cu cei folosiţi în cazul funcţiei fgets.html". $fd = fopen($fis. Această funcţie returnează un şir de caractere care reprezintă datele din fişierul HTML care au fost citite."r"). Cod: <?php $fis = "test. ?> În acest exemplu am omis cel de-al doilea parametru.

"r"). a unui fişier. Funcţia filesize Această funcţie se foloşeste pentru a afla dimensiunea.")) { $num = count($date). "dir". iar cel deal doilea parametru este opţional şi indică dacă pentru găsirea fişierului se va folosi sau nu lista de directoare predefinită. fiecare dintre acestea constând într-o linie din fişierul primit ca parametru. pentru scriere. cel de-al doilea parametru este de tip şir de caractere şi reprezintă datele care se vor scrie în fişier. Funcţia file Această funcţie citeşte conţinutul unui fişier de tip text şi are aceeaşi sintaxă cu funcţia file_get_contens. dar rezultatul returnat de aceasta este un tablou de şiruri de caractere.csv". Funcţia filesize are un singur parametru de tip şir de caractere. Funcţia filetype are un singur parametru de tip şir de caractere. "block". $c<$num. while ($date = fgetcsv($fp. "link". Funcţia fwrite Această funcţie se foloseşte pentru a scrie date într-un fişier text sau binar. Funcţia returnează un număr întreg care reprezintă numărul de octeţi pe care a reuşit să-i scrie în fişier. echo "<p>$num campuri pe linia $lin: <br>". for ($c=0. "file"."<br>". ?> Funcţia file_get_contents Această funcţie citeşte conţinutul unui fişier de tip text şi are doi parametri. Valorile posibile pentru tipul unui fişier sunt "pipe". 1000. În continuare este un exemplu de utilizare a acestei funcţii: . $lin++. "char". în cazul în care nu au apărut erori şi valoarea logică FALSE în caz contrar. Funcţia returnează un şir de caractere care conţine toate datele din fişierul primit ca parametru în cazul în care citirea s-a efectuat cu succes şi valoarea logică FALSE în caz contrar. Funcţia fwrite are trei parametri. să se adauge caracterul "b" la parametrul care reprezintă modul de deschidere a fişierului.<?php $lin = 1. Pentru compatibilitate cu toate sistemele de operare. Funcţia filetype Această funcţie returnează un şir de caractere care reprezintă tipul unui fişier. $fp = fopen("test. iar cel de-al treilea parametru este de tip întreg. se recomandă ca la deschiderea fişierului. şi "unknown". $c++) { echo $date[$c]. "fifo". opţional şi reprezintă numărul de octeţi din şirul de caractere care se vor scrie în fişier. Primul parametru este de tip întreg şi reprezintă identificatorul de acces la fişierul în care se doreşte să se scrie date. exprimată în octeţi. } } fclose($fp). ". mai exact numele fişierului pentru care dorim să determinăm dimensiunea. mai exact numele fişierului pentru care dorim să determinăm tipul. Primul parametru este de tip şir de caractere şi reprezintă numele fişierului al cărui conţinut se va citi.

Cod: <?php $fis = "test.se foloseşte împreună cu una dintre primele trei constante dacă nu se doreşte ca funcţia flock să întrerupă execuţia script-ului până în momentul în care va reuşi să efectueze operaţia cerută. Primul parametru reprezintă identificatorul de acces la conţinutul fişierului. Modificarea poziţiei de citire sau scriere se poate face în trei moduri pentru care sunt definite constante: . fwrite($fp. şi are acelaşi comportament. iar al treilea parametru este de tip referinţă la întreg şi va primi valorea logică TRUE în cazul în care funcţia flock va opri execuţia script-ului până în momentul în care va reuşi să blocheze fişierul.se foloseşte în cazul în care se doreşte deblocarea unui fişier. În limbajul C/C++ functia fwrite este folosită pentru a scrie un şir de octeţi într-un fişier. Funcţia fseek are trei parametri. Funcţia are trei parametri. tot de tip întreg. . care reprezintă identificatorul de acces al fişierului pentru care se doreşte golirea zonelor tampon. Necesitatea utilizării funcţiei flock apare în momentul în care mai multe procese doresc să acceseze acelaşi fişier şi nu se vrea afectarea integrităţii acestuia.LOCK_NB .LOCK_UN .LOCK_SH . Funcţia fseek Această funcţie se foloseşte pentru modificarea poziţiei de citire sau scriere în interiorul unui fişier. echo "Am scris ($sir) in fisierul ($fis).se foloseşte în cazul în care fişierul se blocheaza în mod partajat pentru citirea datelor.se foloseşte în cazul în care fişierul se blocheaza în mod exclusiv pentru scrierea datelor. cel de-al doilea parametru reprezintă tipul operaţiei de blocare a fişierului. "a"). pentru compatibilitate cu limbajul C/C++. Funcţia returnează valoarea logică FALSE în caz de eroare şi valoarea logică TRUE în caz contrar . . $sir = "Scriere in fisier".txt". Funcţia fflush Această funcţie forţează salvarea pe disc a conţinutului zonelor tampon folosite pentru scrierea într-un fişier. Primul parametru este de tip întreg şi reprezintă identificatorul de acces la un fişier. această constantă se adună la una dintre primele trei. iar al treilea parametru. este opţional şi specifică modul în care se va face modificarea.LOCK_EX .". Se observă că cel de-al doilea parametru poate avea şi valori negative. în limbajul PHP sunt disponibile constantele: . al doilea parametru este de tip întreg şi indică numărul de poziţii cu care se va face modificarea. fclose($fp). . ?> Funcţia fputs Această funcţie este o redenumire a funcţiei fwrite. Funcţia flock Această funcţie se foloşeste pentru a bloca sau debloca accesul la un fişier. $fp = fopen($fis. unde şirul de octeţi este reprezentat chiar de şirul de caractere. Pentru cel de-al doilea parametru. spre deosebire de PHP. $sir). Funcţia returnează valoarea logică TRUE în caz de succes şi valoarea logică FALSE în cazul unui eşec. Funcţia fflush primeşte un singur parametru de tip întreg.

Funcţia ftruncate Această funcţie realizează redimensionarea fişierului cu o valoare primită ca parametru. iar al doilea parametru este de tip întreg şi reprezintă noua dimensiune a fişierului.relativ la pozitia curentă . pe disc. relativ la începutul acestuia. Funcţia rewind Această funcţie schimbă poziţia de citire sau scriere într-un fişier la începutul acestuia şi are un singur parametru care specifică identificatorul de acces la fişier. În acest articol se află descrierea celor mai importante funcţii şi clase oferite de limbajul PHP pentru manipularea directoarelor. Trebuie ţinut cont de faptul ca în cazul în care cel deal doilea parametru are o valoare mai mare decât dimensiunea curentă a fişierului. Funcţia ftell Această funcţie se foloseşte pentru a afla poziţia curentă de la care se va face următoarea citire sau scriere într-un fişier.. În cazul în care ştergerea nu s-a putut efectua. Primul dintre aceştia este identificatorul de acces al fişierului care se redimensionează.relativ la sfârşitul fişierului . Rezultatul returnat de funcţia rewind este acelaşi cu cel returnat de funcţia fseek. Funcţii care faciliteaza lucrul cu directoare În articolele anterioare am discutat despre structura de fisiere şi felul cum sunt ele salvate pe server şi am detaliat funcţiile php care se ocupă de fişiere. Apelul acestei funcţii este echivalent cu apelul funcţiei fseek cu primul parametru având ca valoare identificatorul de acces al fişierului. . spaţiu suplimentar care nu va fi iniţializat. Funcţia ftruncate are doi parametri. Funcţia ftell primeşte ca parametru identificatorul de acces al fişierului pentru care se aplică şi returnează o valoare întreagă reprezentând poziţia din fişier. al doilea parametru având valoarea 0 şi cel de-al treilea parametru având valoarea SEEK_SET chiar dacă lipseşte. Funcţia returnează o valoare întreagă egală cu 0. funcţia returneză valoarea logică FALSE.constanta SEEK_CUR. în caz de succes sau valoarea logică FALSE în caz de eşec. care se foloseşte pentru a şterge un fişier de pe disc. În cazul în care cel de-al treilea parametru lipseste se va folosi ca valoare pentru acesta constanta SEEK_SET.relativ la începutul fişierului . Funcţia delete a fost inclusă în pachetul de funcţii oferit de limbajul PHP pentru cei care au programat în limbaje precum Pascal şi nu au avut la dispoziţie funcţia unlink.constanta SEEK_SET. Funcţia delete Această funcţie este mai degrabă o redenumire a funcţiei unlink. În urătorul articol o să încerc să detaliez funcţiile php care se ocupă de manipularea directoarelor. Această funcţie nu poate fi folosită pentru fişiere care sunt accesate folosind unul dintre protocoalele HTTP sau FTP. va fi alocat. şi egală cu -1 în caz contrar. se vor pierde. Funcţia unlink primeşte ca parametru un nume de fişier şi returnează valoarea logică TRUE în cazul în care ştergerea s-a efectuat cu succes. atunci toate datele din fişier. în cazul în care nu au aparut erori. În cazul în care cel de-al doilea parametru are o valoare mai mica decât dimensiunea curentă a fişierului. .constanta SEEK_SET. . care se află după poziţia indicată de noua valoare.

Aceasta functie returneaza un identificator de acces la continutul directorului si este de tipul resursa. Functia opendir are un singur parametru de tip sir de caractere care reprezinta numele directoruiui al carui continut se va prelucra. ?> Funcţia chdir Această funcţie se foloseşte pentru a schimba directorul curent şi primeşte ca parametru un şir de caractere care reprezintă noul director. Ea are un singur parametru de tip resursă. Funcţia closedir Această funcţie se foloseşte pentru a închide un director care a fost deschis pentru citire folosind funcţia opendir. Această funcţie nu returnează nici o valoare. functia returneaza valoarea logica FALSE. Funcţia chroot Această funcţie se foloseşte pentru a schimba directorul rădăcină pentru procesul curent şi primeşte ca parametru un şir de caractere care reprezintă noul director rădăcină. In cazul in care nu se reuseste deshiderea directorului. readdir şi closedir: Cod: <?php . ea având tipul void. Această funcţie nu este implementată pe platformele de operare Microsoft Windows şi nu este recomandată folosirea ei decat în cazul în care interpretorul PHP este utilizat folosind metoda de execuţie CGI. Funcţia chroot returnează valoarea logică TRUE atunci când schimbarea directorului rădăcină s-a efectuat cu succes şi valoarea logică FALSE în caz contrar. În continuare este un exemplu de utilizare a funcţiilor opendir. Funcţia chdir returnează valoarea logică TRUE atunci când schimbarea directorului curent s-a efectuat cu succes şi valoarea logică FALSE în caz contrar.Funcţia getcwd Această funcţie returnează un şir de caractere care reprezintă directorul curent. În continuare este un exemplu de utilizare al acestei funcţii: Cod: <?php $cdir = getcwd(). echo "Directorul curent este: ". care reprezintă identificatorul de acces al directorului din care se va citi.$cdir. Functia opendir Aceasta functie se foloseste pentru a deschide un director in scopul citirii continutului sau. Funcţia getcwd nu are nici un parametru. Funcţia readdir Funcţia readdir se foloseşte pentru a citi următoarea intrare disponibilă într-un director. Funcţia closedir are un singur parametru de tipul resursă. care reprezintă identificatorul de acces al directorului care se doreste a fi închis. Funcţia readdir returnează un şir de caractere reprezentând numele următoarei intrări din director. în cazul în care nu am ajuns la sfârşitul acestuia sau nu au aparut erori şi valoarea logică FALSE în caz contrar.

. care reprezintă identificatorul de acces al directorului din care se va citi şi nu returnează nici o valoare. } closedir($dh). rewind şi close din cadrul acestei clase au acelaşi comportament cu funcţiile readdir. while (false!==($fis=readdir($dh))) { echo "$fis<BR>". rewinddir. $dh = opendir($dir). Funcţiile read. deoarece identificatorul de acces la director este de asemenea încapsulat în cadrul clasei dir. closedir. Funcţia are un singur parametru de tipul resursă.$dir = "E:\\". readdir şi rewinddir. Clasa dir Această clasa încapsulează funcţiile opendir. şi anume. atunci se va returna prima intrare din director. În continuare este prezentat un exemplu de utilizare a acestei clase care reprezintă implementarea cu clase a exemplului anterior: Cod: <?php $d = dir("E:\\"). respectiv closedir şi se deosebesc de acestea prin simplul fapt că nu mai au parametri. Structura acesteia este următoarea: Cod: class dir { dir (string directory) string path resource handle string read (void) void rewind (void) void close (void) } Constructorul clasei dir primeşte ca parametru un şir de caractere care reprezintă numele directorului care se va citi şi apelează funcţia opendir. dacă după un anumit număr de citiri este apelată această funcţie şi după aceeea se mai citeşte o intrare din directorul respectiv. ?> Funcţia rewinddir Această funcţie resetează poziţia curentă dintr-un director. echo "Continutul directorului $dir<BR>".

echo "Numele fisierului fara sufix: <BR>". Directorul care se doreşte a fi şters trebuie să nu conţină nici un fişier sau subdirector. Funcţia returnează valoarea logică TRUE în caz de succes şi valoarea logică FALSE în caz de eşec. iar al doilea este opţional şi reprezintă sufixul fişierului. Primul parametru reprezintă o cale către un fişier sau director.html". echo basename($cale). echo $cale. Funcţia basename Această funcţie returnează numele de bază al unui fişier sau director sub forma unui şir de caractere. Funcţia returnează valoarea logică TRUE în caz de succes şi valoarea logică FALSE în caz de eşec.html". echo "Numele fisierului cu sufix:<BR>". În continuare este un exemplu de utilizare a acestei funcţii: Cod: <?php $cale = "c:\\test. Funcţia are doi parametri de tip şir de caractere.echo "Continutul directorului $d -> path <BR>". În continuare este prezentat un exemplu de utilizare a acestei funcţii: Cod: <?php $cale= "c:\\test. } $d -> close()." este ". echo "Directorul parinte pentru ".". while (false !== ($fis = $d -> read())) { echo "$fis<BR>". Funcţia are un singur parametru de tip şir de caractere care reprezintă o cale către un fişier sau director. echo basename($cale. ?> Funcţia pathinfo . Funcţia rmdir Această funcţie se foloseşte pentru a şterge un director de pe disc şi primeşte ca parametru un şir de caractere care reprezintă numele directorului care va fi şters. ?> Funcţia mkdir Această funcţie se foloseşte pentru a crea un director nou şi primeşte ca parametru un şir de caractere care reprezintă numele directorului care se va crea şi atributele acestuia (parametru de tip întreg) în format *nix.html").dirname($cale). ?> Funcţia dirname Această funcţie returnează numele directorului părinte al unui fişier sau director sub forma unui şir de caractere."<BR>".

fiecare element are o cheie asociată. echo "Informatii despre $cale:<BR>". ?> Funcţia file_exists Această funcţie se foloseşte pentru a determina dacă un fişier există sau nu pe disc. Primul dintre aceştia reprezintă numele fişierului sursă şi cel de-al doilea reprezintă numele fişierului destinaţie. iar valorile individuale se numesc elementele tabloului. Această funcţie nu poate fi folosită pentru fişiere aflate la distanţă decât dacă sunt partajate de pe o platformă Microsoft Windows pe care a fost configurată componenta File and Print Sharing sau dacă sunt partajate pe o platformă *nix pe care a fost instalat pachetul Samba."<BR>". echo $info["extension"]. Primul parametru reprezintă numele fişierului şi cel de-al doilea reprezintă noul numele al acestuia. echo "Director: ". $info = pathinfo($cale). Funcţia returnează valoarea logică TRUE în caz de succes şi valoarea logică FALSE în caz de eşec. Funcţia copy Această funcţie se foloseşte pentru a copia un fişier şi are doi parametri de tip şir de caractere. Funcţia pathinfo primeşte ca parametru un şir de caractere care reprezintă calea către un fişier sau director. Exemplu: Cod: <?php $cale = "c:\\test. Similar. Elementele "dirname" şi "basename" au valori identice cu cele returnate de funcţiile cu acelasi nume. echo $info["dirname"]. nu unul câte unul.Aceasta funcţie se foloseşte pentru a afia informaţii referitoare la o cale către un fişier sau director. iar elementul "extension" conţine extensia fişierului. echo "Extensie: ". "basename" şi "extension"."<BR>". Combinaţia dintre numele ."<BR>". Variabilele care au o singură valoare se numesc scalare. Funcţia rename Această funcţie se foloseşte pentru a redenumi un fişier şi are doi parametri de tip şir de caractere. deseori este convenabilă stocarea mai multor valori într-o variabilă. Funcţia returnează valoarea logică TRUE în caz de succes şi valoarea logică FALSE în caz de eşec. echo $info["basename"]. Funcţia returnează un tablou ale cărui valori sunt de tipul şir de caractere şi care conţine elementele " dirname ". O asemenea variabilă se numeşte tablou. Funcţia file_exists are un singur parametru de tip şir de caractere care reprezintă numele fişierului pentru care se verifică existenţa fizică pe disc. Funcţia returnează valoarea logică TRUE în caz de succes şi valoarea logică FALSE în caz de eşec. echo "Nume fisier: ".html". Valori scalare şi tablouri Majoritatea cumpărătorilor preferă să cumpere ouăle în ambalaje de câte 10. Pentru a fi posibil accesul individual la fiecare element al unui tablou.

tabloului şi valoarea unei chei identifică un element al tabloului. De exemplu: Cod: <?php $specialitatea_zilei = $preferinta["vizitator1"]. ?> Elementele unui tablou cu chei non-numerice sunt accesibile în acelaşi mod ca şi elementele unui tablou cu chei numerice. Pentru a crea un tablou. se atribuie unui element al tabloului o valoare şi o cheie: Cod: <?php $variabila[1] = "valoarea_a". Puteţi atribui o valoare unei variabile dintr-un tablou sau puteţi invoca funcţia array(). ?> Această instrucţiune creează un tablou denumit $variabila şi un element cu valoarea "valoarea_a" identificat prin cheia 1. ?> Pentru a obţine acces la un element al tabloului. specificaţi numele tabloului şi valoarea cheii: Cod: <?php echo $variabila[1]. . Cod: <?php $preferinte["vizitator1"] = "scripturi free". Pentru a stoca în tablou o a doua valoare. $preferinte["vizitator2"] = "articole". puteţi folosi următoarea instrucţiune de atribuire: Cod: <?php $variabila[2] = "valoarea_b". nici macăr nu trebuie să fie numere. ?> Cheile folosite pentru identificarea elementelor unui tablou nu trebuie să fie numere consecutive. Crearea tablourilor Se poate crea un tablou PHP în două moduri principale. ?> atribuie variabilei $specialitatea_zilei valoarea "scripturi free".

Iată rezultatul tabloului: Citat: 0 => valoare A 1 => valoare B 2 => valoare C Simbolul => arată că unei valori îi este asociată o cheie. $variabila[1] = "valoare B". Puteţi asocia tabloul cu un tabel. $variabila[] = "valoare C". începând de la $variabila[0]. ?> Parantezele drepte care urmeaza după numele variabilei indică limbajului PHP că variabila $variabila este o variabilă de tip tablou. cheia 0 este asociată cu valoarea "valoare A". puteţi scrie o instrucţiune de atribuire care specifică o valoare cheie. În acest caz. cheia 1 este asociată cu valoarea "valoare B". $variabila[] = "valoare B". De exemplu: Cod: <?php $variabila[0] = "valoare A". De exemplu: Cod: <?php $variabila[] = "valoare A". iar cheia 2 este asociată cu valoarea "valoare C". astfel încât să puteţi asocia o valoare cu un anumit element al tabloului. $variabila[] = "valoare C". ?> Observaţi că instrucţiunea finală de atribuire nu include nici o valoare de index. PHP stocheaza în mod automat valorile atribuite tabloului în celule numerotate succesiv. caz în care exemplul anterior arată astfel: 0 valoare A 1 valoare B 2 valoare C Dacă doriţi. PHP asociază valoarea "valoare C" cu următorul element consecutiv al tabloului: Citat: 0 => valoare A 1 => valoare B 2 => valoare C .Crearea unui tablou folosind atribuiri Modalitatea cea mai simplă de a crea un tablou este de a atribui o valoare unei variabile de tip tablou.

Iată un exemplu care creează un tablou având drept chei valori întregi consecutive: Cod: . $variabila['d'] = "ceva 3". cu alte cuvinte. $variabila[] = "valoare C". Puteţi crea un tablou asociativ. $variabila[15] = "valoare B".Elementele unui tablou nu trebuie asociate unor chei consecutive. cunoscut şi sub numele de tablou indexat cu siruri. $variabila['cc'] = "ceva 2". Utilizarea funcţiei array() Dincolo de utilizarea instrucţiunilor de atribuire. În PHP nu trebuie să folosiţi numere întregi pe post de chei. următoarele chei au fost atribuite următoarelor valori: Citat: a => ceva 1 cc => ceva 2 d => ceva 3 Semnificaţia utilizării pe post de chei a unor valori întregi consecutive este aceea că puteţi folosi o buclă for simplă pentru a parcurge iterativ tabloul. prin specificarea drept chei a unor şiruri: Cod: <?php $variabila['a'] = "ceva 1". pentru a examina valorile fiecăruia dintre elementele sale. Iată un exemplu: Cod: <?php $variabila[10] = "valoare A". ?> Rezultatul va fi: Citat: 10 => valoare A 15 => valoare B 16 => valoare C Remarcaţi că la fel ca în exemplul anterior că valoarea "valoare C" este asociată următorului element consecutiv din tablou. ?> Prin instrucţiunile de mai sus. cealaltă modalitate principală de creare a unui tablou PHP constă în utilizarea funcţiei array().

valorile cheilor nu trebuie să fie consecutive şi nici măcar întregi: Cod: <?php $o_variabila = array("a"=>"ceva". ?> Această instrucţiune creează următorul tablou: Citat: a => ceva cc => php d => ceva html Un tablou multi-dimensional poate fi asimilat. "php".<?php $o_variabila = array("ceva". "cc"=>"php". astfel: Cod: <?php $o_variabila = array(10=>"ceva". pur şi simplu. puteţi folosi operatorul =>. unui tablou ale cărui celule conţin valori ale unui tablou. un tablou de tablouri. "d"=>"ceva html"). De exemplu un tablou asemănător: Pagina pagina 1 Trafic mic Procent 10 . "php". ?> Care va creea următorul tablou: Citat: 10 => ceva 11 => php 12 => ceva html Ca şi în cazul utilizării unei instrucţiuni de atribuire pentru creearea unui tablou. "ceva html"). cu alte cuvinte. "ceva html"). ?> Acest script creeaza un tablou care conţine: Citat: 0 => ceva 1 => php 2 => ceva html Dacă doriţi să asociaţi unei valori o anumită cheie.

$date["pagina 3 "] = array("mare". avem: Cod: <?php $a[0] = 1. ?> Puteţi obţine acces la valoarea asociată cheii 1 prin intermediul unei instrucţiuni asemănătoare: Cod: <?php $y = 3 * $a[1]. ?> Similar. echo $y. "30")). "pagina 2" => array("mediu". $a[1] = 10. puteţi obţine acces la valoarea unui element al tabloului sau îi puteţi modifica valoarea prin intermediul cheii asociate elementului. $a[2] = 1000. "10").pagina 2 pagina 3 mediu mare 20 30 Puteţi reprezenta aceste date sub forma unui tablou PHP denumit $date. puteţi modifica valoarea asociată cheii 2 prin intermediul unei instrucţiuni ca aceasta: Cod: <?php . ?> Parcurgerea iterativă a unui tablou Când aţi stocat date într-un tablou. "20"). De exemplu. echo $a[1]. ?> Sau puteţi scrie astfel cu acelaşi rezultat: Cod: <?php $date = array("pagina 1" => array("mic". prin instrucţiunile de mai jos: Cod: <?php $date["pagina 1"] = array("mic". "pagina 3" => array("mare". "20"). $date["pagina 2 "] = array("mediu". "30"). "10").

doriţi să obţineti accesul la mai multe elemente ale tabloului. 2=>"valoare 3"). Iată un exemplu: Cod: <?php $test = array(0=>"valoare a". totuşi. corpul instrucţiunii include o instrucţiune echo care afişează cheia şi valoarea fiecărui element din tablou. valoarea cea mai mică a unei chei dintr-un tablou secvenţial este zero. altfel spus. Operaţii de acest gen implică parcurgerea iterativă a tabloului sau. accesul la fiecare element al tabloului. iniţializaţi variabila de buclă la valoarea cea mai redusă a cheii.$w<$maxim. ?> Uneori. Pentru aceasta. 1=>"valoare b".$w++) { echo "<br>$w => $test[$w]". } ?> Prima instrucţiune creează tabloul. Folosiţi funcţia count() pentru a forma expresia de test a buclei. Să presupunem că tabloul reprezintă salarii şi doriţi să măriţi fiecare valoare cu 10 procente. $cautare = "valoare b". În continuare o să încerc o scurtă prezentare a modului de iteraţie prin tablouri secvenţiale şi non-secvenţiale. . De exemplu. în loc de a obţine accesul la un singur element al unui tablou sau de a-l modifica. 2=>"valoare 3"). // se cauta in tabloul $test valoarea $cautare $maxim = count($test). puteţi crea un tablou secvenţial folosind valoarea unu sau orice altă valoare întreagă ca valoare minimă a cheii. Cea de-a doua instrucţiune obţine numărul elementelor din tablou. Parcurgerea iterativă a unui tablou secvenţial Un tablou al cărui chei sunt valori întregi consecutive se numeşte tablou secvenţial. În general. să presupunem că doriţi să determinaţi dacă în tablou există o anumită cheie sau valoare. În cazul în care cunoasteţi valoarea minimă a cheii unui tablou secvenţial. puteţi parcurge iterativ tabloul folosind o buclă for. Funcţia count() returnează numărul elementelor dintr-un tablou. Datele de ieşire arată astfel: Citat: 0 => valoarea 1 1 => valoarea 2 2 => valoarea 3 Căutarea într-un tablou secvenţial Exemplu: Cod: <?php $test = array(0=>"valoare a". for ($w=0. 1=>"valoare b". $maxim = count($test). Instrucţiunea for foloseşte variabila buclă $w pentru a parcurge iterativ tabloul.$a[2] = 100.

Instrucţiunea if testează fiecare element şi afişează un mesaj dacă valoarea elementului este una şi aceeaşi cu valoarea variabilei $cautare. Desigur. fără a afecta rezultatele operaţiei. } } ?> Acum. de data aceasta însă. Datele . execuţia căutării poate fi sistată după găsirea elementului dorit. tabloul nu va fi iniţializat cu valori literale imediat anterior operatiei de căutare. if ($cautare == $test[$w]) { echo "<br>A fost gasit cuvantul $cautare in tabel la nr. for ($w=0. Iată cum ar arăta exemplul anterior cu o instrucţiune break: Cod: <?php for ($w=0. se caută în tablou valoarea stocată în variabila $cautare.". instrucţiunea break provoacă sistarea buclei for.echo "<br>Se cauta cuvantul $cautare in tabloul test. Într-o aplicaţie reală. $w < $maxim. în exemplu. după stabilirea unei identităţi. Pentru a oprii execuţia puteţi folosi instructiunea break. $w++) { echo "<br>Se compara cuvantul cu $test[$w]". 1 Se compara cuvantul cu valoare 3 Instrucţiunea break Observaţi în exemplul dat mai sus că se continuă căutarea chiar şi după stabilirea unei identităţi. următoarea instrucţiune obţine numărul elementelor din tablou şi stochează această valoare în variabila $maxim. continuarea căutării în tablou nu face decât să irosească resursele calculatorului. break. Cea de-a doua instrucţiune atribuie valoarea "valoare b" variabilei $cautare. $w < $maxim. care determină încheierea imediată a buclei care o conţine. corpul ei conţine alte instrucţiuni şi se execută o altă operaţie. O instrucţiune echo afişează valoarea fiecărui element al tabloului pe masură ce bucla for avansează. $w++) { echo "<br>Se compara cuvantul cu $test[$w]". Când se caută într-un tablou. $w". conţinutul tabloului este supus la variaţii. într-o aplicaţie iterativă reală. Instrucţiunea for funcţioneaza ca mai înainte. } } ?> Prima instrucţiune creează tabloul în care se va căuta. $w". Iată rezultatul acestui exemplu: Citat: Se cauta cuvantul valoare b in tabelul test Se compara cuvantul cu valoare a Se compara cuvantul cu valoare b A fost gasit cuvantul valoare b in tabel la nr. După comentariu. if ($cautare == $test[$w]) { echo "<br>A fost gasit cuvantul $cautare in tabel la nr.

Instrucţiunea continue sistează rularea curentă a buclei. folosită pentru a număra numele scurte găsite. de cele folosite anterior. echo "<br>$test[$w] are $n caractere lungime. desigur. Valoarea variabilei $n este stabilită ca fiind egală cu numărul caracterelor care compun cuvântul. bucla for îşi încheie execuţia. să presupunem că doriţi să cautaţi în tabloul $test pentru a determina numărul valorilor cu nume scurte. 1=>"bbb". } echo "<br> Au fost gasite $scurt cuvinte cu nume scurte. folosind funcţia strlen(). la zero.". dacă nu au mai rămas elemente în tablou. Iată rezultatul: Citat: a are 1 caractere lungime bbb are 3 caractere lungime ccccc are 5 caractere lungime Au fost gasite 2 cuvinte cu nume scurte. Corpul acestei instrucţiuni diferă. care calculează lungimea unui sir. PHP 4 include o instrucţiune foreach care simplifică căutările de . if ($n > 4) continue. Parcurgerea iterativă a unui tablou non-secvenţial În unele limbaje de programare. 2=>"ccccc"). 1 Instrucţiunea continue O instrucţiune corelată cu instrucţiunea break este continue. // numara numele scurte $scurt = 0. Iată un exemplu: Cod: <?php $test = array(0=>"a". Instrucţiunea continue determină trecerea căutării la următorul element din tablou.". $limita = count($test). parcurgerea unui tablou non-secvenţial este o operaţie complicată. o instrucţiune echo afişează numărul cuvintelor scurte găsite în tablou.de ieşire vor arăta astfel: Citat: Se cauta cuvantul valoare b in tabelul test Se compara cuvantul cu valoare a Se compara cuvantul cu valoare b A fost gasit cuvantul valoare b in tabel la nr. Instrucţiunea for se aseamănă celor folosite anterior. se execută instrucţiunea continue. Dacă instrucţiunea if stabileşte că elementul curent al tabloului face referire la un cuvânt lung. determinând evaluarea imediată a expresiilor de incrementare şi de test. $w < $limita. $w++) { $n = strlen($test[$w]). Cu toate acestea. $scurt++. adică nume alcatuite din maxim 4 caractere. ?> O instrucţiune de atribuire stabileste valoarea iniţială a variabilei $scurt. Ca un exemplu. La finalizarea căutării. for ($w = 0.

20=>"metal". } ?> Pentru a căuta într-un tablou multi-dimensional. "20"). stabilind valori adecvate pentru valorile variabilelor $cheie şi $valoare aferente fiecărui element al tabloului. ?> Comanda care afişează conţinutul tabloului este: Cod: <?php foreach ($date as $continut => $valoare) { foreach ($valoare as $cheie => $rezultat) { echo "<br>$continut: $rezultat". $date["pagina 2 "] = array("mediu". foreach ($test as $index => $continut) { echo "<br>$index => $continut". se folosesc instrucţiuni foreach îmbricate. "10"). Iată un exemplu: Cod: <?php $test = array(10=>"mere". Să luăm de exemplu tabloul următor: Pagina pagina 1 pagina 2 pagina 3 Trafic mic mediu mare Procent 10 20 30 Tabloul poate fi creat folosind următoarele instrucţiuni PHP: Cod: <?php $date["pagina 1"] = array("mic". "30"). 21=>"Nume"). Instrucţiunea foreach are următoarea formă generală: Cod: <?php foreach ($tablou as $cheie => $valoare) {corp} ?> Instrucţiunea parcurge în mod iterativ tabloul denumit $tablou. } .acest gen. $date["pagina 3 "] = array("mare".

" value=cauta size=15 maxLength=30> .). 2 etc.time()). ?> "> <br> <br> <input type="submit" name="Submit" value="Trimite"> </form> După cum observaţi. Dacă doriţi să apară un mesaj în interiorul câmpului dar să dispară când un utilizator vrea să introducă propriul lui text. Iată rezultatul: Citat: pagina 1: mic pagina 1: 10 pagina 2: mediu pagina 2: 20 pagina 3: mare pagina 3: 30 Lucrul cu formulare Utilizarea scripturilor php în formulare Odată am avut nevoie într-un formular să fie afişată iniţial data din ziua completării formularului. Iată ce trebuie să faceţi: Cod: <form name="form1" method="post" action="pagina_de_test. codul ar fi cam aşa: Cod: <form> <INPUT name=test id="test" onclick="this.value=''. acesta o afişează în câmpul de text corespunzător.. la valoarea câmpului "data" am introdus un mic script php care citeşte data curentă de pe server şi o timite browserului. Mă gândesc că uneori o să aveţi şi voi nevoie de anumite date (de exemplu la o comandă într-un formular să apară într-un câmp doar ceea ce există în acel moment pe stoc.. Puteţi încerca şi voi să citiţi anumite date dintr-un fişier txt sau din baza de date şi să le afişaţi în formular. instrucţiunea foreach interioară parcurge iterativ conţinutul. echo $data.?> } Instrucţiunea foreach exterioară obţine tabloul asociat cu fiecare pagină (pagina 1. care stoc se găseşte în baza de date mysql de pe server).php"> Data curenta: <input name="data" type="text" id="data" value=" <?php $data=date("d-h-Y".

charset=iso-88591"> </head> <body> <!-.aici incepe formul de votare --> .$vot. } // afisare continutul variabilei vot echo "<br>Continutul casutei de vot este: ". dar probabil sunt mult mai multe) Cod: <?php if (isset($_POST['Submit'])) // deoarece verificarea se face in aceeasi pagina cu formul // se verifica inainte daca a fost apasat butonul submit { // preluare variablile (daca sunt trimise) @$vot = $_POST['vot']. } if ($vot == "vot_3") // daca e selectat vot 3 afiseaza si eventual trimite pe e-mail.". } if ($vot == "vot_1") // daca e selectat vot 1 afiseaza si eventual trimite pe e-mail. { echo "<br>Ai votat numarul 2. { echo "<br>Ai votat numarul 1.<INPUT name="submit" type=submit id="submit" value=GO> </form> Dacă cineva încearcă să scrie ceva.. Problema pe care însă am întâmpinato a fost că un grup de butoane radio trimite doar o valoare. Mai jos aveţi codul de la script cu una din rezolvări (eu am gasit 3 variante de rezolvare a acestui script. // verificare if ($vot == "") // aici se verifica daca a fost selectat ceva { echo "<br>Nu ai votat. Simplu spun eu şi mă apuc de treabă.".". Preluarea şi verificarea datelor dintr-un formular în aceeaşi pagină cu formularul De curând cineva mi-a cerut să fac un formular cu un grup de butoane radio care să trimită datele pe e-mail... } if ($vot == "vot_2") // daca e selectat vot 2 afiseaza si eventual trimite pe e-mail.. indiferent ce buton e selectat. Incearca din nou. textul "caută" va dispare şi va fi înlocuit cu mesajul introdus de utilizator.". } ?> <html> <head> <title>Formular de vot</title> <meta http-equiv="Content-Type" content="text/html. { echo "<br>Ai votat numarul 3...

aici se incheie formularul de vot --> </body> </html> După cum observaţi. } ?> . Prima parte este codul php care verifică dacă a fost apăsat butonul "Submit" şi dacă a fost apăsat se preia valoarea butonului radio şi se verifică. Pentru început o să explic cum se trimit şi cum se preiau datele din formular în aceeaşi pagină. } } if (!isset($_POST['camp1'])) // daca nu a fost trimis { // se initializeaza variabilele $camp1 = ''. Dacă nu a fost apăsat butonul "Submit" se sare peste codul php şi se trece direct la partea html unde se afişează butoanele radio. scriptul este împărţit în 2 părţi.php"> <p> <label> <input type="radio" name="vot" value="vot_1"> vot a</label> <br> <label> <input type="radio" name="vot" value="vot_2"> vot b</label> <br> <label> <input type="radio" name="vot" value="vot_3"> vot c</label> <br> <input type="submit" name="Submit" value="Voteaza"> <br> </p> </form> <!-. Avem următorul formular: Cod: <?php // aici se verifica daca a fost trimis un camp din formular if (isset($_POST['camp1'])) // daca a fost trimis { // se preiau datele trimise $camp1 = $_POST['camp1']. // se verifica daca a fost scris ceva if (empty($camp1)) { echo "<br>Nu a fost introdus nimic". } else { echo "<br>A fost introdus: ". Lucrând recent cu câteva formulare am întâmpinat unele dificultăţi pe care vreau să le descriu mai jos pentru a avea un punct de plecare în cazul în care mai am astfel de probleme.$camp1.<form name="formular_vot" method="post" action="test_vot.

value='' "> þÿ </form> Preluarea datelor dintr-un câmp cu select multiplu În cazul în care în formular trebuie să existe şi un textfield din care se pot selecta simultan mai multe câmpuri.<form name="form1" method="post" action=" <?php $_SERVER['PHP_SELF'] ?> "> <div align="center"> <input name="camp1" type="text" id="camp1" value=" <?php echo $camp1. în caz că se încarcă pagina prima data şi formularul încă nu a fost trimis se iniţializează valoarea variabilei pentru câmpul respectiv. Dacă nu ar fi făcută verificarea de setare a unei valori din formular (rândul if(isset($_POST['camp1']) ) şi s-ar fi încercat preluarea direct a valorii (rândul $camp1 = $_POST['camp1']. atunci recitiţi articolul şi vedeţi încă odată sursa până înţelegeţi :-P ) Afişarea unui text într-un câmp în form care dispare în cazul în care se introduce ceva în acel câmp De multe ori. În cazul în care nu se iniţializează valoarea şi se încearcă afisarea ei directă va apărea un mesaj de eroare (dacă serverul e setat să afişeze mesajele de eroare). Aşa ceva se poate face simplu cu o scurtă funcţie javascript: Sursa: Exemplu: <form name="form2" method="post" action="pagina. va merge intotdeauna). Acum. şi anume: . În cazul când serverul are setat register_global = off este mai sigur să folosiţi astfel preluarea variabilelor pentru a nu vâ da eroare.php"> <input name="textfield" type="text" value="acest text dispare" onmousedown=" this. ?> "> textfield<br> <input type="submit" name="Submit" value="Trimite"> </div> </form> Să explic puţin codul de mai sus. Mai departe. dar în realitate este la fel de simplu ca şi până acum. am un formular în care vreau să scriu ceva într-un anumit câmp iar dacă vizitatorul doreste să completeze acel câmp să nu stea să şteargă mesajul meu ci să dispară automat textul introdus de mine şi să rămână doar ce a introdus vizitatorul. Dacă există ceva atunci afişeaza mesajul împreună cu ceea ce a fost introdus. dacă sunteţi lămuriţi ce se întâmplă acolo să trecem mai departe (iar dacă nu. Prima oară când se accesează pagina este logic că nu se trimite nici o valoare din formular. // aceasta comanda nu va merge pentru ca am uitat sa inchid ghilimelele pe cand asa echo '$camp1'. preluarea datelor poate părea mai complicată. Observaţi că la preluarea variabilei trimise prin post se foloseşte un mic truc şi anume numele variabilei este acelaşi cu numele câmpului trimis prin POST.. ) ar fi dat o eroare (dacă aveţi configurat serverul să vă arate toate erorile) În schimb. Puteţi lucra şi direct cu valoarea POST dar personal prefer să scriu mai puţin folosind de fiecare dată numele variabilei ( $camp1 ) nu tot şirul dat de valoarea POST ( $_POST['camp1'] ) E mai puţin de scris iar dacă folosesc variabila în alte locuri evit erorile generate de lipsa unei ghilimele (de genul echo 'ceva aici $_POST['camp1'].. aşa aţi evitat o eventuală eroare şi scriptul rulează corect indiferent de setările serverului. În continuare următorul rând verifică dacă valoarea preluata din formular conţine ceva sau nu.

Conversia tipurilor de variabile PHP este ceea ce se numeste un limbaj de programare cu tipuri dinamice. echo $z. PHP determină tipul variabilei în funcţie de tipul ultimei valori atribuite variabilei. $y = 2. Conversia automată de tip Să luăm ca exemplu următorul script: $x = 1. O consecinţă a caracterului dinamic al tipurilor de variabile aferente limbajului PHP este aceea că nu trebuie să specificaţi tipul variabilelor. dacă mai aveţi întrebări discutăm în forum.Cod: <?php if (isset($_POST['select'])) { foreach ($_POST['select'] as $cheie => $valoare) { echo "<br>A fost selectata valoarea ". PHP execută conversia automată de tip.$valoare. caracterul dinamic al tipurilor nu vă scuteşte de problemele legate de tipuri. } } ?> <form name="form3" method="post" action=" <?php $_SERVER['PHP_SELF'] ?> "> <div align="center"> <select name="select[]" size="5" multiple> <option value="1">valoarea 1</option> <option value="2">valoarea 2</option> <option value="3">valoarea 3</option> <option value="4">valoarea 4</option> <option value="5">valoarea 5</option> </select> Selectati mai multe valori<br> <br> <input type="submit" name="Submit2" value="Submit"> </div> </form> Momentan mă opresc aici cu prezentarea trucurilor în lucrul cu formulare.5. În continuare este o descriere a tipurilor acceptate şi ceea ce se întâmplă când în cadrul expresiilor se folosesc două sau mai multe tipuri. Când o expresie aritmetică foloseşte mai multe tipuri. Cu toate acestea. . $z = $x + $y.

(integer) (real). tipul valorii rezultante este un întreg. valoarea şirului este dată de valoarea numerică respectivă. (float) (string) (array) (object) Rezultat Conversie forţată la întreg Conversie forţată la dublu Conversie forţată la şir Conversie forţată la tablou Conversie forţată la obiect Numeroase funcţii furnizează înca o modalitate de a trata o variabilă ca şi cum ar fi de tip specificat. rezultatul va fi 3. iar valoarea acesteia devine 2. care este 1. . valoarea şirului este zero.5 o valoare de tip dublu. chiar dacă PHP o tratează ca o valoare de tip dublu pentru a executa calculele. în loc de 2. Dacă şirul începe cu o valoare numerică. Valoarea afişata este 2. şi anume (integer).5.Dacă oricare dintre operanzi este de tip dublu. variabila $x rămâne de tip întreg. Dacă un punct zecimal sau un exponent (e sau E). Conversia manuală de tip Dacă preferaţi. $z = $x + (integer) $y. Valoarea numerică şi tipurile unui şir sunt determinate prin respectarea următoarelor reguli: 1. Dacă toti operanzii unei expresii sunt întregi. puteţi prelua controlul conversiei de tip sau puteţi modifica tipul unei variabile. Şirurile pot fi de asemenea supuse unei conversii de tip. adică suma dintre valoarea variabilei $x şi valoarea numerică a şirului text. $y = $x + "1 more". tipul variabilei rezultate este dublu. în caz contrar. $y = 2. echo $y. puteţi converti forţat un operand de la un tip la altul. aceştia sunt pur şi simplu trataţi ca şi cum ar fi fost de alt tip. PHP tratează ceilalti operanzi ca şi cum ar fi de tip dublu. 2. Tabelul următor prezintă succint aceste funcţii. Este important de reţinut că prin conversia de tip nu se modifică tipurile operanzilor unei expresii. PHP execută calculul şi returnează rezultatul sub forma de întreg. în caz contrar. În cadrul exemplului. determină tratarea variabilei $y ca pe un întreg. Tabelul următor indică şi alte conversii forţate de tip care se pot folosi: Conversia forţată (int). echo $z. Conversia forţată de tip. execută calculele şi returnează rezultatul ca valoare de tip dublu. Pentru a prelua controlul conversiei de tip. care este valoarea reală a variabilei $z. proces cunoscut sub numele de conversie forţată de tip sau pur şi simplu conversie forţată.5. Funcţie doubleval() intval() strval() Exemplu: Operaţie Tratează argumentul ca fiind de tip dublu Tratează argumentul ca fiind de tip întreg Tratează argumentul ca fiind de tip şir. Să examinăm următorul exemplu: $x = 1. este asociat cu valoarea numerică. (double). În exemplul de mai sus. În continuare aveţi un exemplu de conversie de tip: $x = 1.

Ambele mecanisme determină tratarea operanzilor ca şi cum ar fi de un alt tip. au acelaşi efect: $x += 1. "integer"). echo gettype($x). $x = $x + 1. puteţi folosi anumiţi operatori.double .array . $x în cazul exemplului nostru. Totuşi. în ambii membri ai instrucţiunii de atribuire. Puteţi obţine acelaşi rezultat cu următoarea instrucţiune de atribuire. Valorile posibile pentru al doilea argument al funcţiei settype(). settype($x. echo $x.string . modificarea tipului unei variabile este posibilă prin utilizarea funcţiei settype(). $x.$x = $y = echo echo 1.object O funcţie conexă. care indică tipul variabilei $x: $x = 1. furnizând un exemplu pentru fiecare operator şi o instrucţiune de atribuire echivalentă. una normală şi una "rapidă". $y.integer .5 este afişată ca valoare a variabilei $x. Valoarea afişata a variabilei $x este egală cu unitatea. intval($x). Instrucţiuni de atribuire În cazul în care doriţi o modalitate rapidă de a scrie o instrucţiune de atribuire. iar valoarea 1 este afişată ca valoare a variabilei $y. Valoarea 1. deoarece fracţia zecimală se pierde atunci când funcţia settype() converteşte valoarea dublă la o valoare întreagă. sunt: .5. Nici conversia normală şi nici cea forţată nu modifică tipul unui operand. Tabelul următor rezumă operatorii "rapizi" de atribuire pentru operaţiile aritmetice şi pentru şiruri. şi anume argumentul care specifică tipul dorit. şi anume gettype(). returnează un şir care indică tipul variabilei specificate.5. Scriptul următor afişeaza şirul "integer". Acest procedeu este ilustrat în continuare: $x = 1. care foloseşte o conversie forţată: $x = (integer) $x. Următoarele două instrucţiuni de atribuire. Această instrucţiune de atribuire "rapidă" vă scuteşte de efortul de a scrie o variabilă. Instrucţiune de atribuire "rapidă" x += y x -= y x /= y x *= y x %= y Instrucţiune de atribuire normală x=x+y x=x-y x=x/y x=x*y x=x%y .

fapt nedorit în majoritatea cazurilor. case(2): echo "numar mediu". Pentru a putea lua o decizie în mai multe sensuri.x . break. break. numere cu virgulă mobilă sau şiruri. Cu toate astea. break şi default Instrucţiunea if vă permite să luaţi o decizie în două sensuri. De exemplu. când doriţi ca programul dvs. default: echo "Acesta nu este un numar valabil". transferând controlul următoarei instrucţiuni secvenţiale care succede instrucţiunii switch. Numele variabilei este dat între parantezele care urmează după cuvântul cheie switch. Nu este necesar să folosiţi numere întregi consecutive în instrucţiunile case. Se pot folosi numere întregi non-consecutive. Parantezele acolade delimitează o serie de instrucţiuni case şi o instrucţiune default opţională.y Scrierea instrucţiunilor swich. Un procedeu de programare indicat constă în aceea că fiecare instrucţiune case din cadrul unei instrucţiuni switch să se încheie cu o instrucţiune break.(adică se continuă cu restul codului din script) În absenţa instrucţiunii break. fiecare dintre instrucţiunile cuprinse între paranteze putând avea instrucţiuni asociate. } ?> Acţiunea unei instrucţiuni switch este determinată de valoarea unei expresii întregi. Când este executată. puteţi folosi mai multe instrucţiuni if. reprezentând respectiv dimensiunile mică. instrucţiunea switch este o opţiune mai convenabilă. 2 sau 3. să aleagă dintr-un set de alternative care pot fi reprezentate prin valori întregi. else sau elseif.= y x=x. . instrucţiunea switch încearcă să stabilească o identitate între valoarea variabilei sale asociate şi valoarea asociată unei instrucţiuni case. Dacă valoarea variabilei din instrucţiunea switch nu corespunde nici uneia dintre valorile asociate instructiunilor case. Iată un mic program care afişează dimensiunile asociate valorilor variabilei $numar: Cod: <?php switch ($numar) { case(1): echo "numar mic". Instrucţiunea break determină încheierea exeuţiei instrucţiunii switch. break. medie şi mare. să presupunem că valoarea variabilei $numar este 1. execuţia trece la următoarea instrucţiune case sau default. Se vor executa instrucţiunile asociate primei instrucţiuni case pentru care identitatea respectivă este valabilă. case(3): echo "numar mare". se vor executa instrucţiunile asociate instrucţiunii default. nu de valoarea unei expresii condiţionale. dacă există o asemenea instrucţiunie.

operatorul condiţional returnează valoarea valoareadevarat. Cod: <?php switch ($meniu) { case 1: $submeniu = 5. incluzând instrucţiunile if. elseif şi switch.operatorul condiţional ?:. Instrucţiunea for este o instrucţiune buclă sau o instrucţiune iterativă. $submeniu primeşte valoarea 0. El constituie o altă modalitate de a scrie decizii în PHP. De exemplu. în caz contrar. să luăm următoarea instrucţiune de atribuire: $a = ($b > $c) ? 1 : 2 Această instrucţiune de atribuire compară valorile variabilelor $b şi $c. else. Iată sintaxa de utilizare a acestuia: expresie-conditionala ? valoare-adevarat : valoare-fals Se observă cum semnul întrebării este separat de caracterul două puncte prin valoarea valoare-adevarat. Dacă valoarea variabilei $b este mai mare decât aceea a variabilei $c. Operatorul condiţional vă permite să specificaţi deciziile într-o manieră foarte concisă. case 2: $submeniu = 10. denumit uneori şi operator ternar sau operator întrebare-două puncte. Mai există însă şi alt mecanism de luare a deciziilor . pe care o folosesc destul de des în ultima vreme. Scrierea instrucţiunilor for Revin în acest articol la detalierea instrucţiunii for. default: $submeniu = 0. break. $submeniu primeste valoarea 5. altfel. atunci variabilei $a îi este atribuită valoarea 1. returnează valoarea valoare-fals. Iată un exemplu de utilizare a unei instrucţiuni for: . variabilei respective îi este atribuită valoarea 2. break. Operatorul condiţional formează o expresie care se poate folosi în multe contexte PHP. cu alte cuvinte. dacă $meniu este 2. o instrucţiune care execută în mod repetat instrucţiunile asociate. Instrucţiunea atribuie variabilei $submeniu o valoare după cum urmează: dacă $meniu este 1. $submeniu primeste valoarea 10.În exemplul următor aveţi o instrucţiune switch care testează valoarea variabilei $meniu. în caz contrar. Dacă expresia este evaluată la valoarea true (adevărat). Operatorul condiţional îşi evaluează expresia condiţionala. } ?> PHP include numeroase instrucţiuni condiţionale.

cunoscute sub numele de corpul instrucţiunii for. Se execută corpul buclei. Pentru aceasta. se execută o instrucţiune for care incrementează în mod repetat valoarea variabilei $suma. În general. expresia de iniţializare atribuie valoarea 1 variabilei $n. 2. Secvenţa de execuţie a unei instrucţiuni for este următoarea: 1. aceasta modifică una sau mai multe variabile la care se face referire în expresia test. ?> În exemplul de mai sus se calculează suma întregilor cuprinşi între 1 şi 3. fiecare expresie este separată de vecina sa printr-un caracter punct şi virgulă. În consecinţă. 4. instrucţiunea for include o instrucţiune sau un grup de instrucţiuni. să examinăm componentele instrucţiunilor for. 7. De asemenea. În exemplul de mai sus. Se evaluează expresia pas. expresia pas incrementeaza valoarea variabilei $n. instrucţiunile while şi do while reprezintă versiuni "manuale" ale instrucţiunii for. Se evaluează expresia test. face referire la variabila de ciclare. echo "<br>Suma intregilor de la 1 la $numar este $suma. Se evalează expresia de iniţializare. instrucţiunea $suma += $n este corpul instrucţiunii for. prin executarea următoarei instrucţiuni secvenţiale. mai întâi se iniţializează variabila $suma la valoarea 0. Aşa cum se întâmplă de obicei. Pentru a vedea cum funcţionează mecanismul aestei instrucţiuni. Să examinăm mai amănunţit cele trei expresii: . $n <= 3. .". for ($n = 1. Dacă rezultatul evaluării expresiei test este false. o instrucţiune while sau do while are una singură. Se încheie execuţia instrucţiunii for. o instrucţiune for operează în acelaşi mod ca o instrucţiune while. 5. În acest site de exemplu am folosit instructiunea for pentru a trimite către fiecare user înscris la newsletter căte un e-mail de fiecare dată când este actualizat acest site.Prima expresie este expresia de iniţializare. Aceasta este o expresie condiţională care indică dacă se execută sau nu corpul instrucţiunii. 3. următoarele două instrucţiuni sunt echivalente: . $n++) $suma += $n. 6. variabilă denumită variabila de ciclare sau index. În cadrul exemplului. În exemplu. În cadrul exemplului. În general.Cod: <?php $suma = 0. Scrierea instrucţiunilor while şi do while Practic. Aceasta se execută atunci când PHP ajunge la instrucţiunea for. fără o expresie de iniţializare sau o expresie pas. Instrucţiunea for include trei expresii. se execută etapa 7. Se trece la etapa 2. expresia de test compară valoarea variabilei $n cu valoarea 3. şi anume expresia de test. care apar între paranteze. expresiile unei instrucţiuni for sunt opţionale. Instrucţiunea for este utilă pentru numărare şi executarea în mod repetat a unor acţiuni. .A doua expresie este expresia de test. Dacă o instrucţiune for are trei expresii. Apoi. Expresia de test este evaluată pentru prima data imediat după evaluarea expresiei de iniţializare.Cea de-a treia expresie este expresia pas.

instrucţiunea while este mai clară decât o instrucţiune for degenerată. Instrucţiunea do while este oarecum asemănătoare instrucţiunii while. prin executarea următoarei instrucţiuni secvenţiale. Se execută corpul buclei. incrementează valoarea variabilei bucla $n. iniţializează bucla şi că instrucţiunea $n++. Astfel. $i <= 3. Diferenţa este aceea că instrucţiunea do while îşi execută corpul înainte de a-şi evalua expresia de test. ?> Când folosiţi o instrucţiune while. 4. ?> Remarcaţi că instrucţiunea $n = 0. Se evaluează expresia de test. Se evaluează expresia test. Dacă rezultatul este adevărat. corpul buclei unei instrucţiuni do while este întotdeauna executată cel puţin o dată. $n++. Se execută corpul buclei. } echo "Suma este $suma. care actualizează variabilele la care se face referire în expresia de test. se trece la etapa 1. Secvenţa de execuţie a unei instrucţiuni while este următoarea: 1. Se trece la etapa 1. Iată un exemplu care utilizează instrucţiunea while: Cod: <?php $n = 0. Se încheie execuţia buclei. 5. Instrucţiunea while este cea mai utilă atunci când un alt program necesar execută deja aceste funcţii. $suma = 0. analog expresiei de incrementare a instrucţiunii for. Se părăseşte bucla. în asemenea situaţii. căreia îi lipsesc una sau mai multe dintre expresiile sale obişnuite. Iată un exemplu care foloseşte o instrucţiune do while. ) $suma += $i.Cod: <?php for ( . while ($i <= 3) $suma += $i.". sunteţi responsabil cu iniţializarea tuturor valorilor folosite în expresia de test. Dacă rezultatul este false. 4. trebuie să furnizaţi un mecanism oarecare. se trece la etapa 5. 3. De asemenea. corpul unei instrucţiuni while este omis dacă expresia de test are iniţial valoarea false. 2. 3. Observaţi că amplasarea expresei de test imediat după corpul buclei vă reaminteşte faptul că executarea corpului are loc înainte de evaluarea expresiei de test: . while ($n <= 3) { $suma = $suma + $n. Secvenţa de execuţie a unei instrucţiuni do while este următoarea: 1. 2. prin executarea următoarei instrucţiuni secvenţiale.

nu de necesitate. } while ($n <= $numar). Se pot scrie aplicaţii php folosind doar instrucţiuni while. echo "<br>Suma intregilor cuprinsi intre 1 si $numar este $suma. ?> şi funcţia va afişa la ieşire "Salut.Cod: <?php $suma = 0. Introducere în Clase PHP Când începi să lucrezi cu PHP.". $n++. Utilizarea instrucţiunii do while este o chestiune de comoditate. asta economisind ceva timp atunci când veţi vrea să refolosiţi codul. Metoda este similară celei de mai jos: Cod: <?php function Functia_Mea($variabila) { // Foloseste $variabila aici: echo $variabila. $n = 1. Pur şi simplu declaraţi o funcţie şi îi spuneţi acelei funcţii ce informaţie vreţi să folosească. bine ai venit pe site" . } ?> Şi apoi doar apelezi funcţia atunci când ai nevoie de ea: Cod: <?php Functia_Mea("Salut. bine ai venit pe site"). îţi dai seama că sunt multe locuri în care trebuie să scrii aceaşi bucată de cod. ?> Instrucţiunile while şi do while sunt foarte asemănătoare. Unii dintre voi probabil s-au prins că aceasta se poate rezolva cu o funcţie. do { $suma += $n.

Vă voi face o introducere în Clase şi vă voi da câteva exemple unde pot fi folosite. atunci când sunt gândite şi când e scris codul bine. Dar haideti să lăsăm vorbăria şi să începem să ne stocăm funcţiile în interiorul Claselor. "". priviti mai jos pentru exemplul $email pe care îl vom folosi. Codul va fi stocat în spatele site-ului. else return(false). să aruncăm o privire pe clasă: Cod: <?php class Clasa_mea { var $email. . Mai întâi trebuie să declarăm o clasă: class Clasa_mea { Vom crea nişte variabile ce pot fi folosite în oricare din funcţiile din interiorul clasei fără să trebuiască să fie specificate pentru fiecare funcţie. poţi începe să pui acele funcţii în nişte "cutii" unde sunt stocate şi folosite. Acesta nu este singurul motiv pentru care poţi folosi clasele. după un timp se vor aduna prea multe funcţii şi te vei aglomera. return $cevahtml. } // Folosim o functie cu variabile function scoate_imag($cevahtml) { $cevahtml = preg_replace("/(<img)(. Clasele PHP s-au dovedit a fi foarte valoroase. Structura Clasei Când vă gândiţi la clase v-aş încuraja să vă gândiţi ca la "codul din spate".*?)(>)/si". Vom face asta prin "var $nume_var". OK.. Sper ca la sfârşitul acestui tutorial te vei gândi să implementezi nişte clase proprii economisind astfel timp în viitoarele proiecte.+$". $cevahtml). Folosind Clase PHP.+\. iar în faţă va fi un bloc de cod foarte uşor de înţeles. $this -> email)) return(true).+@. Vom analiza funcţiile pentru a înţelege despre ce este vorba aici. iar scriptul care foloseşte acea clasă va fi mai uşor de înţeles pentru că va avea un cod "curat". // folosim o functie fara variabile function verifica_email() { if (ereg("^.Ei bine. Voi pune toate rutinele complicate în clasa ta. dar este motivul pentru care eu le folosesc. } } ?> Clasa de mai sus a fost compusă din 2 funcţii simple.

+\. închidem clasa noastră şi suntem gata s-o folosim! . Funcţia aceasta validează mail-ul introdus de utilizator. } ?> Uitându-vă la funcţia de mai sus. $cevahtml). Voi explica şi acest lucru mai încolo. Nota: puteţi de asemenea folosi în interiorul unei funcţii dintr-o clasă. Mai jos veţi vedea o funcţie pe care am introdus-o în această clasă. vom returna "TRUE". această funcţie va accepta o variabilă ca parametru şi trebuie să aibă acea variabilă definită atunci când o apelezi.+@.. Voi explica asta puţin mai târziu. Doar introduceţi $this->numele_functiei($vars). La început am definit var $email. } ?> Acum. Dacă adresa de email trece de această verificare şi este o adresă validă. altfel vom returna "FALSE". else return ( false ). Pentru a vă da un exemplu că puteţi pune aproape orice doriţi în interiorul unei clase. În continuare. aţi remarcat că am folosit " $this->email " unde $this-> e un constructor special care indică în interiorul clasei către o variabilă sau o altă funcţie. Această funcţie va prelua variabila $email definită în scriptul nostru care apelează clasa şi verifică validitatea email-ului.*?)(>)/si" . Iată funcţia mai jos: Cod: <?php // Folosim o functie cu variabile function scoate_imag($cevahtml) { $cevahtml = preg_replace( "/(<img)(. şi funcţii din interiorul aceleiaşi clase se pot folosi reciproc.+ $ " . funcţie care elimină tag-urile unei imagini dintr-un string (şir de caractere). Caută text în ambele părţi ale simbolului "@" care este structura unei adrese de email. Am vrut să vă arăt această clasă şi pentru că este o metodă diferită de a apela funcţia. să analizăm prima funcţie. Cod: <?php // folosim o functie fara variabile function verifica_email() { if (ereg("^. $this -> email)) return ( true ). o altă funcţie ce se află în aceeaşi clasă. am făcut această clasă "cu scop general" ce poate fi utilizată în mai multe scopuri. acum avem $this->email .var $email. Veţi vedea cum să atribuiţi o valoare lui $this->email când vom folosi "efectiv" scriptul ce apelează clasa . return $cevahtml. "" .

avem variabila "$email" ce stă degeaba în Clasa_Mea. . Folosirea acestei Clase în Scripturile voastre PHP Primul lucru pe care trebuie să-l facem este să includem clasa. vei vedea că dacă un "!" sau "Eroare" este detectat pe şirul de caractere din $verifica_email. } else { echo "Adresa de email este valida!". dacă nu a trecut testul va returna FALSE. adresa conţinută în variabila $email pe care i-am spus s-o verifice a trecut testul. sau orice vreţi cu ea. dacă verifica_email returnează TRUE. aşa ca îi vom atribui o valoare: $clasa_mea -> email = "tu@undeva. Tineţi minte ce a spus mai devreme. Acum putem începe distractia :) Avem clasa noastră inclusă în script şi trebuie să iniţializăm un obiect pe care să-l atribuim unei variabile. Astea fiind făcute.com" . Tineţi minte că puteţi face: $clasa_mea->email = $_POST['email']. Nu este mare lucru. } ?> Tot ce am făcut este să atribuim o variabilă funcţiei verifica_email() şi apoi am făcut nişte verificări de erori pe baza acelei variabile. Întâi vom crea un string cu HTML în interior. Haideţi să ne uităm cum folosim funcţia scoate_imag. Iată cum se face: $clasa_mea = &New Clasa_Mea.} Să numim acest fişier: "clsClasa_Mea. if (!$verifica_email) { echo "Adresa de email nu este valida!". Privind instrucţiunea if de mai sus. doar includeţi-o folosind: <? include "Clasa_Mea. vom afişa "Adresa de email este valida!". Am creat un obiect numit $clasa_mea şi acum putem accesa elementele din interiorul clasei Clasa_Mea pe care am creat-o mai devreme.php". Să rulăm funcţia verifica_email în interiorul clasei Clasa_Mea: Cod: <?php $verifica_email = $clasa_mea -> verifica_email().php" şi să vedem cum îl vom folosi în pagina următoare.

Ele sunt calea câtre "Object Oriented Programming" sau "Programarea Orientata pe Obiecte" . Când veţi privi $html_vechi şi $html_nou.php este valabila doar în acea pagină. echo "Aici este html-ul nou $html_nou <br /><br />" . Aşa cum am spus mai devreme. clasele s-au dovedit a fi foarte eficiente.OOP. felicitările mele. Lucrul cu sesiuni nu este complicat. PHP foloseşte în mod nativ sesiuni. Referinte: Iată câteva link-uri pe care le puteţi vizita când vă dezvoltaţi clasele: PHP PHP PHP PHP PHP Manual Manual Manual Manual Manual Classes and Objects Extends Exending Classes Using Parents Classes using :: operator Serialize and Unserialize Objects Închei aici această introducere în Clasele PHP.jpg" height="100" width=" 200" >' . Acum că avem $html_vechi şi ştim că are o imagine în interiorul HTML-ului. Modalităţile de păstrare a informaţiilor pe tot parcursul aplicaţiei sunt: . te sfătuiesc să mai citeşti acest tutorial încă o dată. Fiecare sesiune trebuie declarată la începutul paginii. Dacă ai înţeles ce s-a întâmplat până acum. Îl vei înţelege până la urmă. o variabilă locală declarată într-o pagina . echo "Aici este html-ul vechi $html_vechi <br /><br />" . să scoatem acea imagine afară şi să returnăm rezultatul: $html_nou = $clasa_mea -> scoate_imag($html_vechi). cu ajutorul funcţiei: . Toate cele bune! Sesiuni în PHP În mod normal.variabile globale . Cu OOP puteţi economisi foarte mult timp şi puteţi crea o arhivă de obiecte sau clase pe care le puteţi folosi mereu. dacă nu intervenim într-un fel pentru a o transfera şi pe alte pagini unde avem nevoie de ea. veţi vedea că imaginea a fost eliminată cu succes.$html_vechi = '<strong>Am o imagine aici: <img src="/imaginea_mea. aşa cum fac şi limbajele ASP şi ColdFusion.cookies . tocmai ai învăţat noţiunile elementare ale claselor! Dacă nu.sesiuni .transferul variabilelor locale prin forme sau în header-ul unei alte pagini Ce este o sesiune? O sesiune reprezintă una din căile de a păstra datele de lucru ale unei aplicaţii atunci când se face transferul de la o pagină la alta.

14".session_start(). Folosirea sesiunilor este o cale mult mai uşoara de lucru decât să transferăm variabilele de la pagină la pagină. În php. session_register("variabila_mea").ini pot fi setate diferite valori pentru parametri legaţi de sesiune cum ar fi (după semnul egal am pus valorile implicite) : session. <?= se poate folosi cu orice variabilă. session.php?<?=SID?">Click catre pagina mea</a> <?= este un mod mai scurt de a scrie comanda echo. Exemplu: $sesiunea_mea = "Lucian". Această funcţie face ca PHP să înregistreze un identificator unic al sesiunii (ID). // etc. atât timp cât cookie alocat acelei sesiuni este activ (nu expiră). iar acel identificator este trimis utilizatorului printr-un cookie. Pot fi create oricâte variabile. pe server se crează un fişier care va reţine valorile variabilelor folosite în această sesiune.Florilor nr. Totodată. sau $sesiunea_mea["id"] = 1. Apoi trebuie declarată variabila (sau variabilele) cu care lucrăm în cadrul acestei sesiuni. $variabila_mea = "Aceasta este cursul online de PHP". definite pe un domeniu dat. // cazul unui array $sesiunea_mea["nume_utilizator"] = "Lucian". şi altele . session. nu doar cu sesiuni. Variabila $sesiunea_mea poate fi o variabilă simplă sau un tablou (array). pentru identificarea unei sesiuni se poate folosi identificatorul acesteia.name = "PHPSESSID".cookie_path = "/".cookie_lifetime = "0". $sesiunea_mea["adresa"] = "Str. Putem adăuga acest identificator în stringul care aplează o pagină: <a href = "pagina_mea. În acest caz. Există posibilitatea ca un utilizator să nu accepte setarea de cookies pe computerul său. Iată un exemplu de definire al unei sesiuni: <? session_start(). session. ?> $variabila_mea va putea fi folosită apoi pe toate paginile aplicaţiei respective. Variabilele definite în acest mod pot fi folosite pe toate paginile unei aplicaţii. // valoarea 0 înseamnă că cookie pentru sesiune e valabil până când browserul se va închide. Un identificator PHPSESSID arată ca o înşirurire aleatoare de caractere alfanumerice: PHPSESSID = 02993ab99sac988da9753330af72201 Dacă PHP este compilat cu opţiunea enable-trans-id. Fişierul are numele la fel cu identificatorul ID al sesiunii. session_register('sesiunea_mea'). atunci identificatorul sesiunii este adăugat automat la fiecare pagină.cookie_domain = "". // variabila simplă .

majoritatea funcţiilor returnează valori. Primul argument al funcţiei indică valoarea întreagă cea mai mică pe care o va returna funcţia. dacă specificaţi mai mult de un argument. scrieţi numele funcţiei. De exemplu. Pentru a folosi o funcţie. funcţia este obligată să returneze o valoare cuprinsă între 100 şi cel mai mare rezultat posibil. Dacă doriţi. Dacă se trimite altceva către browser înainte de folosirea lor atunci vor exista erori la folosirea sesiunii sau a cookieurilor. care pot fi specificate sau omise. Definirea unei funcţii În afară de a utiliza funcţiile din biblioteca de funcţii a limbajului PHP. reprezentând valori de intrare care influenţează operarea şi rezultatul funcţiei. Uneori. urmat de o pereche de paranteze. Când se produce o eroare în timpul execuţiei unei funcţii. astfel încât valoarea să fie accesibilă în mod repetat fără a se invoca funcţia de mai multe ori. Majoritatea funcţiilor preiau argumente. ca şi setcookie() trebuie folosite întotdeauna chiar la începutul fişierului. De exemplu. puteţi specifica primul argument. pentru a ascunde mesajele de eroare care pot apărea în timpul execuţiei funcţiei f(). De exemplu. Puteţi folosi într-o expresie valoarea returnată de o funcţie. al doilea argument indică valoarea cea mai mare. apelarea sau invocarea funcţiei. în conformitate cu intenţiile dumneavoastră. funcţia rand() are două argumente opţionale. asemenea mesaje de eroare sunt nedorite. funcţia rand(). poate fi apelată astfel: rand(). Ca şi rand(). invocaţi această funcţie astfel: $a = @f(b). acestea se inserează între paranteze. care generează un număr întreg aleator. Astfel. Articol scris de Curs http://php.intercer. PHP generează mesaje de eroare. Unele funcţii PHP au argumente opţionale. Pentru a specifica argumente. omiţându-l pe al doilea: rand(100). Dacă omiteţi ambele argumente. În acest caz. De exemplu: $test = rand(1. Această comandă îi spune PHP-ului să verifice dacă există o sesiune şi atunci să folosească variabilele acelei sesiuni ca variabile globale.Observaţie importantă: Variabilele definite în sesiuni pot fi folosite într-o pagină doar după ce a fost executată comada session_start(). o variabilă sau o expresie. 15). Argumentul unei funţii poate fi o valoare literală. puteţi suprima generarea mesajelor de eroare prin prefixarea numelui funcţiei invocate cu ajutorul caracterului @.net) Crearea şi utilizarea funcţiilor Procesul de executare a unei funcţii se numeşte utilizarea. fiecare argument trebuie separat de vecinul său prin intermediul unei virgule. vă puteţi defini şi folosi . funcţia returnează o valoare cuprinsă între 0 şi cel mai mare rezultat posibil. O situaţie foarte frecventă în care se procedează astfel o constituie utilizarea valorii returnate de o funcţie într-o expresie de atribuire.net (preluat de la phpromania. Funcţiile session_start().

Cuvântul cheie function. corpul unei funcţii poate conţine un număr arbitrar de instrucţiuni.4). De exemplu: $aria = calculeaza_aria(2. iată o funcţie care calculează aria unui dreptunghi: function calculeaza_aria($inaltime. care se comportă ca şi cum ar fi fost scrisă astfel: return 2 * 4. Atenţie!! În PHP3. puteţi omite nume_argument. fiecare argment fiind separat de vecinul său prin intermediul unei virgule. Valorile argumentelor efective 2 şi 4 le înlocuiesc pe acelea ale argumentelor formale din corpul funcţiei calculeaza_aria. nume_functie este numele funcţiei. În PHP4. Termenul de corp al funcţiei se referă la instrucţiunile incluse între parantezele acolade care urmează după antetul funcţiei. trebuie să determinaţi funcţia să execute o instrucţiune return care furnizează valoarea respectivă. numele funcţiilor nu prezintă sensibilitate la diferenţa între majuscule şi minuscule. Apelarea unei funcţii O funcţie definită de utilizator poate fi apelată în acelaşi mod ca o funcţie încorporată. . } Lista cu argumente a funcţiei calculeaza_aria include argumentele $latime şi $inaltime. În cazul în care doriţi să sistaţi prelucrarea unui întreg script. Parantezele şi numele argumentelor incluse între acestea poartă numele de lista cu argumente. Pentru a defini o funcţie. iar nume_argument este numele argumentului funcţiei. Dacă doriţi ca funcţia să returneze o valoare. Corpul funcţiei este alcătuit dintr-o singură instrucţiune. nu este necesar ca aceasta să fie ultima instrucţiune fizică din corpul funcţiei. puteţi invoca funcţia exit(). În PHP. definiţia unei funcţii poate fi plasată fie anterior liniei de program care apelează funcţia. Terminarea execuţiei unei funcţii O instrucţiune return determină sistarea execuţiei funcţiei care o conţine. Ca exemplu.propriile funcţii. f() şi F() reprezintă referiri la aceeaşi funcţie. Iată un exemplu: function stop() { exit(). respectaţi modelul următor: function nume_functie(nume_argument) { // aici se introduce corpul functiei } În acest exemplu. ca atare. Instrucţiunea return determină sistarea executării funcţiei. Dacă definiţi o funcţie care nu are nici o instrucţiune return. cu toate acestea. puteţi include argumente suplimentare după nume_argument. $latime) { return $inaltime * $latime. dacă doriţi să definiţi o funcţie cu mai multe argumente. fie după aceasta. Înstrucţiunile din corpul funcţiei sunt executate atunci când funcţia este apelată. Dacă doriţi să definiţi o funcţie care nu are argumente. definiţia unei funcţii trebuie să preceadă linia de program care apelează funcţia. numele funcţiei şi lista cu argumente alcătuiesc antetul funcţiei. funcţia va returna valoarea specială NULL.

specificată drept al doilea argument al funcţiei. la prima invocare a funcţiei. echo "Impozit = $impozit<br>". Dacă apelaţi funcţia şi furnizaţi un singur argument. Prin apelarea funcţiei stop() se execută corpul funcţiei respective. valoarea argumentului respectiv se consideră ca fiind valoarea argumentului $cantitate. Astfel. echo "Cumparaturi = $cumparaturi<br>". care se auto-invoca instantaneu. O funcţie care procedează astfel se numeşte functie recursiva. Astfel. argumentul ia o valoare prestabilită specificată. Exemplu: function impozit_vanzari($cantitate.07) { echo "Cantitate = $cantitate<br>". puteţi scrie accidental o asemenea funcţie şi de aceea recomand să citiţi în continuare.45. aceasta invocă imediat funcţia recursor(). $rata are valoarea 0.} echo "Prima linie<br>". Funcţia impozit_vanzari preia două argumente: un argument obligatoriu. denumit $rata. return $suma * $rata.07 se foloseste ca valoare a argumentului $rata. $rata=0. Dacă invocaţi o funcţie care are un argument prestabilit. Funcţii recursive Este posibil ca o funcţie din PHP să se auto-apeleze. se încheie cu o depăşire în sens pozitiv a stivei. echo "Linia 3<br>". Este recomandat să nu scrieţi funcţii recursive.08. funcţia recursor() este invocată în mod repetat. 0. La invocarea funcţiei recursor(). stop(). Cu toate . dar nu şi a liniei 3. $impozit = impozit_vanzari($cumparaturi). Definirea argumentelor prestabilite PHP4 va permite să definiţi funcţii cu argumente prestabilite. denumit $cantitate. până când se produce o eroare cunoscută sub numele de depăşire în sens pozitiv a stivei (stack overflow).45 echo "Cumparaturi = $cumparaturi<br>". iar valoarea 0. echo "Linia 2<br>". Exemplu: function recursor() { return recursor(). şi un argument prestabilit. Cu toate acestea. la invocarea funcţiei exit(). dar nu furnizaţi nici o valoare pentru argumentul respectiv. } $cumparaturi = 123. echo "Rata = $rata". Rezultatul acestui script este afişarea primelor 2 linii. Dacă programul dvs. } $a = recursor(). $cumparaturi = 123. echo "Impozit = $impozit<br>". $impozit = impozit_vanzari($cumparaturi.08). execuţia scriptului se încheie. o posibilă cauză poate consta într-o recursie incorectă.

Cu alte cuvinte. Instrucţiunea require vă poate scuti de un mare volum de muncă.inc.inc"). Una din variante o constituie instrucţiunea require. . nu puteţi folosi o expresie pentru a specifica numele fişierului care urmează a fi inclus de către o instrucţiune require. la începutul fiecărui script. dar rezultatul este deseori confuz. deoarece este specificată valoarea unui singur argument. În consecinţă. Pentru aceasta folosim următoarea comandă: require("valori. Unii programatori PHP preferă să folosească extensia de fişier php pentru toate fişierele pe care le creează. Utilizarea fişierelor incluse Funcţiile PHP vă permit să obţineţi accesul la programe PHP scrise anterior. cel mai bine este să evitaţi problema prin definirea unui singur argument prestabilit şi prin poziţionarea unui argument prestabilit pe ultima poziţie în lista cu argumente. dar regulile respective pot fi derutante. iar fiecare script afişează o pagina HTML care conţine informaţii standard în partea de sus a paginii. Este posibil ca o funcţie să aibă mai multe argumente prestabilite. care conţine doar partea de sus a pagini (pentru exemplificare citiţi şi vedeţi scriptul de la articolul "Contruieste un site cu php") Prin inserţia instrucţiunii: require ("antet.acestea. Puteţi crea un fişier script special. Deşi se obişnuieşte ca un fişier de includere să primească extensia de fişier inc.cunoscut sub numele de fişier de includere . care are următoarea formă: require(numele_fisierului). Acest procedeu poate simplifica intreţinerea programului. Exemplu: function test($valoare1 = 1. trebuie să includă etichetele <?php şi ?>. denumit antet. $valoare2 = 2) Care credeţi că va fi rezultatul dacă este invocată următoarea funcţie? x=test(3). Dacă fişierul de includere conţine linii de program PHP.07. De exemplu. De exemplu dorim să accesăm datele din fişierul numit valori. la a doua invocare a funcţiei. înlocuind instrucţiunea require. Atentie!!! Instrucţiunea require este prelucrată la încărcarea scriptului PHP asociat. amplasate în locaţiile adecvate.inc"). Când este încărcat un script PHP care conţine o instrucţiune require. determinaţi programul PHP să includă conţinutul acelui fişier ca şi cum conţinutul respectiv ar face parte din acel script. $rata are valoarea 0.inc. argumentul trebuie folosit ca valoare a variabilei $valoare1 sau ca valoare a variabilei $valoare2? PHP are reguli care controlează asemenea situaţii. conţinutul fişierului specificat . Totuşi. înaintea legrii valorilor la variabilele corespunzătoare.este inserat în script. ceea ce le face uşor de localizat şi revizuit. nu este obligatoriu să procedaţi astfel. deoarece informaţiile standard pot fi rezidente într-un singur fişier. Ca atare. să presupunem ca scrieţi o aplicaţie PHP care este alcătuită din mai multe scripturi.

include ("pagina".reprezintă orice caracter [ ] .puteţi folosi instrucţiunea include. În cazul în care creaţi fişiere de includere care folosesc instrucţiunea require pentru a include conţinutul altor fişiere de includere. ( ) .inc").zero sau mai multe caractere + . care este o instrucţiune executabilă ce determină evaluarea scriptului PHP dintr-un fişier specificat.".orice altceva decât caracterele din interval ^. Funcţii PHP pentru expresii regulate Funcţie ereg ereg_replace Descriere execută o identificare cu o expresie regulată înlocuieşte un sub-şir care corespunde unei expresii regulate execută o identificare cu o expresie regulată insensibilă la diferenţa între eregi majuscule şi minuscule înlocuieşte un sub-şir care corespunde unei expresii regulate insensibile la eregi_replace diferenţa între majuscule şi minuscule split divide un şir într-un tablou folosind o expresie regulată divide un şir într-un tablou folosind o expresie regulată (insensibilă la diferenţa spliti între majuscule şi minuscule) crează o expresie regulată insensibilă la diferenţa între majuscule şi minuscule sql_regcase dintr-un şir care conţine o expresie regulată. instrucţiunea include din următorul program evaluează fişierul pagina1. x trebuie întotdeauna definit. instrucţiunile PHP pe care le conţine sunt executate ca şi cum ar fi apărut în textul scriptului apelant.nu trebuiesc precedate de backslash (\) în expresii regulate dacă sunt în interiorul parantezelor pătrate [ ] Exemple: .operatorul SI (OR) . Sintaxa: function ereg Semnificaţia caracterelor ce se pot afla în şablon: ^ .[$()|*+?{\ .Început de şir $ .y}.zero sau un character {x. puteţi găsi instrucţiunea require_once utilă.Sfârşit de şir * .orice caracter din intervalul specificat ^ în [ ] . Instrucţiunea corelată require_once asigură faptul că fişierul specificat este inclus o singură dată într-un script dat. La evaluarea fişierului de includere.$fisier.Secvenţe de caractere | . De exemplu. (punct) . unde x şi y sunt doi întregi reprezentând limita inferioară şi superioară a numărului de caractere necesare.unul sau mai multe caractere ? .inc $fisier = 1.

.2} urmat de un underscore opţional. a+$ Echivalenţe: * .număr cuprins între 1 şi 6 [c-h] .} .} ? .{0.majusculă cuprinsa între D şi M Un exemplu mai complicat: ^.2}_?[0-9]*([1-6]|[a-f])[^1-9]{2}a+$ Exemplul de mai sus se traduce prin: Un şir care începe cu oricare 2 caractere.orice altceva înafară de litere [1-6] . a(bc){1..{2}[a-z]{1. Forma mai complexă a funcţiei ereg() include un al treilea argument."abbb".ab* .... În scriptul de mai jos. Funcţia returnează true dacă expresia regulată corespunde unui sub-şir al şirului subiect. care corespunde expresiei regulate.. etc."abb".orice şir cu exact 3 caractere [_a-zA-Z] .. ab? .underscore sau orice literă din alfabetul latin [^a-zA-Z] .."abcbcbc" (a|b) . etc."abcbcbc"."abcbc". [^1-9]{2} urmat de unul sau mai multe litere "a" la sfârşitul şirului. este reprezentat modul de utilizare a acestei forme a funcţiei ereg(). $subiect="La noi in sat"."a". $subiect)."abcbc". [0-9] urmat de fie un număr între 1 şi 6 sau o literă minusculă cuprinsă între a şi f..{3}$" . *([1-6]|[a-f]) urmat de 2 caractere care nu sunt cifre. etc.4} . returnează false.. etc."abbb". _? urmat de zero sau mai multe cifre. $rezultat=ereg($model."bef" sau "cdef" "^.. pe care o foloseşte pentru a determina dacă un şir conţine o adresă de e-mail corect formată."ab"."ab".doar "abc"."abbb"."abb"."abb".{2} urmat de 1 sau 2 litere minuscule.} + .{1. ab{2.3} ."abbb".doar "abb"... Variabila $rezultat primeşte valoarea true.{0. ."abc". deoarece şirul subiect conţine sub-şirul "sat". în caz contrar.1} Forma simplă a funcţiei ereg() preia două argumente: un şir care conţine o expresie regulată şi un şir subiect. Iată un exemplu mai simplu: $model="[sml]at"..doar "a".minuscul cuprins între c şi h [D-M] . "abbbb" a(bc)* ."a" sau "b" hi|hello . [a-z]{1. ^. un tablou care primeşte sub-şiruri ce corespund porţiunilor scrise între paranteze ale modelului.doar "abb" ab{2. ab+ . "abbbb"."hi" sau "hello" (b|cd)ef ."ab" ab{2} .

funcţia sscanf() citeşte un şir. echo "<br>Componente: ".$model. } $gasit = ereg($model.php"> Sir: <input type="text" name="sir"> <br> Expresie regulata: <input type="text" size=64 name="model" value="^([_a-zA-Z0-9-]+)@([a-zA-Z0-9-]+(. 2005". for ($i=0. . echo "<br>Expresie regulata: ".$sir.$model.$i<count($echivalente). $sir.01. Exemplu: Cod: <?php $subiect = "01.$i++) { echo "<br>$echivalente[$i]".$sir. $echivalente). îl interpretează prin referirea la un şir de formatare şi stabileşte valorile variabilelor specificate în funcţie de conţinutul şirului. // Afisare date echo "<br>Sir: ".Cod: // formularul html <form method="post" action="script_2. $model = $_POST['model']. ?> Funcţia PHP sscanf().[a-zA-Z0-9-]+)*)$"> <br> <input type="submit"> </form> <?php // preluare valori din formular $sir = $_POST['sir']. 31. // verificare if (get_magic_quotes_gpc()) { echo "<br>Eliminarea ghilimelelor magice". echo "<br>". adăugată în versiunea PHP 4. if ($gasit) { echo "<br>Valabil: true". echo "<br>Sir: ". este complementară funcţiei printf(). $model = stripslashes($model). $sir = stripslashes($sir). Dacă funcţia printf() generează date de ieşire formatate. echo "<br>Expresie regulata: ". } } else echo "<br>Valabil: false".

argumentul va fi prefixat cu un caracter ampersand (&) (mai cunoscut ca AND). &$zi. &$luna. } function prin_referinta(&$x) { $x = 1. ceea ce înseamnă că valorile argumentelor sunt copiate şi funcţiile utilizează copii ale valorilor argumentelor lor. $y=0. valoarea sa nu este copiată. Acest fapt este în general util. prin referinta($y). specificând ca argumentul să fie transferat prin referinţă. Ca o consecinţă. $y = 0. } $y = 0.$n = echo echo echo echo ?> sscanf($subiect. "<br>Au fost gasite $n valori:". . %d. o funcţie PHP nu poate modifica valorile argumentelor sale. "%d. echo "<br>\$y=$y". Iată un exemplu care prezintă apelul prin valoare şi apelul prin referinţă: Cod: <?php function prin_valoare($x) { $x = 1. deoarece astfel funcţiile devin mai uşor de înţeles dacă se limitează la a returna o valoare. "<br>an=$an". Puteţi ataşa acest prefix la argument în antetul funcţiei sau în apelul la funcţie. Pentru a specifica faptul că un argument urmează a fi transferat prin referinţă. prin_valoare(&$y). echo "<br>\$y=$y". funcţia lucrează cu valoarea argumentului şi are libertatea de a modifica acea valoare. %d". Când un argument este transferat prin referinţă. fără a modifica valori. "<br>zi=$zi". puteţi stabili ca o funcţie să aibă posibilitatea de a modifica valoarea unui argument. prin_valoare($y). argumentele transferate unei funcţii PHP sunt transmise prin valoare. "<br>luna=$luna". Totuşi. Datele de ieşire ale acestui exemplu sunt: Citat: Au fost gasite 3 valori: luna=1 zi=31 an=2005 Utilizarea referinţelor în PHP În mod prestabilit. &$an). nu argumentele în sine.

echo "<br>\$y=$y; ?>
Dacă rulaţi acest script, veţi obţine următoarele date de ieşire:

Citat: $y=0 $y=1 $y=1

Reţineţi că scriptul conţine două funcţii, şi anume prin_valoare() şi prin_referinta(). Fiecare funcţie preia un singur argument, denumit $x. Antetul funcţiei prin_referinta() specifică faptul că argumentul sau este transferat prin referinţă; argumentul funcţiei prin_valoare() este transferat prin valoare, în conformitate cu practica prestabilită folosită în limbajul PHP. Fiecare funcţie încearcă să modifice valoarea argumentului său. Primul paragraf al programului invocă funcţia prin_valoare(), transferând argumentul prin valoare. În consecinţă, funcţia lucrează cu o copie a argumentului său, iar valoarea variabilei $y nu se modifică. Cel de-al doilea paragraf al programului invocă de asemenea funcţia prin_valoare(); cu toate acestea, foloseşte un caracter ampersand pentru a determina transferul prin referinţă al valorii variabilei $y. În consecinţă, funcţia modifica valoarea argumentului său, care se transforma din 0 în 1. Cel de-al treilea paragraf al programului invocă funcţia prin_referinta(). Antetul funcţiei respective foloseşte un caracter ampersand pentru a specifica faptul că valoarea argumentului sau este transferată prin referinţă. În consecinţă, funcţia modifică valoarea argumentului sau, care se transformă din 0 în 1. Prin utilizarea referinţelor se evită suprasarcina de copiere a valorilor argumentelor şi implicit se obţine o viteză mai mare de execuţie a programului. Cu toate acestea, programele devin astfel mai dificil de înţeles, iar referinţele sau apelurile prin referinţă pot cauza erori de program. Cel mai indicat este să evitaţi referinţele, acolo unde este posibil, şi să definiţi funcţii care returnează valori, şi nu funcţii care modifică valorile propriilor argumente.

Lucrul cu funcţii listă

În afară de modalităţile de parcurgere iterativă a tablourilor, PHP oferă numeroase funcţii care permit traversarea tablourilor, deplasându-vă înainte sau înapoi, după dorinţă. Prima dintre aceste funcţii este current(), care returnează valoarea curentă a tabloului. Funcţia current() foloseşte un pointer intern de tablou pe care PHP îl creează pentru fiecare tablou. Când creaţi un tablou, pointerul intern de tablou este configurat astfel încât să facă referire la primul element al tabloului. Funcţiile next() şi prev() modifică pointerul intern al tabloului şi se pot folosi alături de funcţia current() pentru a parcurge un tablou. Funcţia next(), aşa cum îi arată şi numele, modifică pointerul intern al tabloului astfel încât acesta să facă referire la următorul element, în timp ce funcţia prev() modifică pointerul intern al tabloului astfel încât acesta să facă referire la elementul anterior. Iată un exemplu care prezintă modul de operare al celor 3 funcţii:

Cod:

<?php $test = array(10=>"aaa", 20 => "bbb", 21 => "ccc"); $curent = current($test); echo "<br>functia current() a returnat $curent"; $urmator = next($test); echo "<br>functia next() a returnat $urmator"; $urmator = next($test); echo "<br>functia next() a returnat $urmator"; $anterior = prev($test); echo "<br>functia prev() a returnat $anterior"; ?>
Datele de ieşire sunt:

Citat: functia current() a returnat aaa functia next() a returnat bbb functia next() a returnat ccc functia prev() a returnat bbb

Funcţia key() Funcţia key() este corelată cu funcţia current(). Dacă funcţia current() returnează valoarea asociată elementului curent, funcţia key() returnează cheia asociată elementului curent. Exemplu:

Cod:

<?php $test = array(10=>"aaa", 20 => "bbb", 21 => "ccc"); $curent = current($test); $cheie = key($test); echo "<br>functia current() a returnat $curent"; echo "<br>functia key() a returnat $cheie"; ?>
Datele de ieşire sunt:

Citat: functia current() a returnat aaa functia key() a returnat 10

Funcţia each() O altă funcţie utilă în parcurgerea tablourilor este each(). Funcţia each() returnează următoarea pereche cheie-valoare din tabloul specificat. Perechea cheie-valoare este returnată sub forma unui tablou asociativ cu patru elemente, după cum urmează: Cheie Valoare

0 1 "key" "value"

Componenta Componenta Componenta Componenta

cheie a perechii cheie-valoare curentă valoare a perechii cheie-valoare curentă. cheie a perechii cheie-valoare curentă valoare a perechii cheie-valoare curentă.

Observaţi că puteţi folosi valoarea cheie "0" sau "cheie" pentru a obţine accesul la componenta cheie a perechii cheie-valoare; similar, puteţi folosi valoarea cheie "1" sau "valoare" pentru a obţine accesul la componenta valoare a perechii cheie-valoare. Iată mai jos un exemplu al funcţiei each():

Cod:

<?php $test = array(10=>"aaa", 20 => "bbb", 21 => "ccc"); $fiecare = each($test); $zero = $each[0]; $unu = $each[1]; $cheie = $each['key']; $valoare = $each['value']; echo "<br>zero = $zero"; echo "<br>unu = $unu"; echo "<br>cheie = $cheie"; echo "<br>valoare = $valoare"; ?>
Datele de ieşire sunt:

Citat: zero = 10 unu = aaa cheie = 10 valoare = aaa

Funcţia list() O altă funcţie utilă în lucrul cu tablouri este funcţia list(), care vă permite să atribuiţi valori la numeroase variabile în cadrul unei instrucţiuni. Funcţia list() este deseori folosită cu funcţia each(), deoarece funcţia list() facilitează accesul separat la cheia şi la valoarea returnate de funcţia each(). Forma generala de utilizare a funcţiei list() este: list($var1, $var2, ..., $varn) = valoare_tablou; Fiecare dintre variabilele specificate, de la $var1 la $varn, primeşte o valoare din tabloul valoare_tablou. Într-un fel, funcţia list() este opusă funcţiei array(), deoarece funcţia list() împarte un tablou într-o serie de valoari scalare, în timp ce funcţia array() construieşte un tablou dintr-o serie de valori scalare. Iată un exemplu de utilizare a funcţiei list():

Cod:

<?php $test = array(10=>"aaa", 20 => "bbb", 21 => "ccc");

list($cheie, $valoare) = each($test); echo "<br>cheie = $cheie, valoare = $valoare"; $urmator = $next($test); echo "<br>urmator = $urmator"; ?>
Datele de ieşire sunt:

Citat: cheie = 10, valoare = aaa urmator = bbb

PHP conţine peste 40 de funcţii pentru lucrul cu tablourile. De exemplu, funcţia array_search() facilitează căutarea într-un tablou. Sortarea tablourilor Sortarea reprezintă o altă operaţie frecvent aplicată tablourilor. PHP furnizează o suită de funcţii care facilitează sortarea unui tablou. De exemplu, un tablou poate fi creat după cum urmează: $limbaje = array(1=>"Perl", 2=>"PHP", 4=>"Python"); Apoi, doriţi să sortaţi tabloul în funcţie de numele limbajului de programare. Pentru aceasta, pur şi simplu invocaţi funcţia sort(): sort($limbaje); După sortare, conţinutul tabloului apare aşa: 0 => PHP 1 => Perl 2 => Python Observaţi că secvenţa de sortare sau secvenţa de aranjare (cum este numită uneori) este sensibilă la diferenţa dintre majuscule şi minuscule. Deoarece litera H mare este sortata anterior literei e mic, PHP apare înainte de Python în datele de ieşire sortate. Tabelul de mai jos prezintă pe scurt funcţiile de sortare ale limbajului PHP, inclusiv rezultatul aplicării fiecărei funcţii tabloului folosit în exemplul anterior. Operaţie Sortarea unui tablou în funcţie de valoare Funcţie Rezultat 0 => PHP 1 => Perl sort() 2 => Python 2 => PHP 1 => Perl asort() 4 => Python 0 => Python rsort() 1 => Perl 2 => PHP

Sortarea unui tablou asociativ în funcţie de valoare

Sortarea unui tablou după valoare, în ordine descendentă

x. în speţă uksort() şi uasort(). "strcmpcase"). 1. Funcţia strcmpcase() este o funcţie din biblioteca PHP care compară două şiruri fără a ţine cont de mărimea literelor (majuscule sau minuscule). Standard Edition 1.x. 0 sau =1.2_04 Cele două fişiere ale pachetului php_java pot fi găsite în versiunea integrală a limbajului PHP (în directorul php/extensions/ de pe hdd) Instalare: Pentru a utiliza această facilitate trebuie instalată platforma Java şi cele două fişiere ale . "PHP". care nu este sensibilă la diferenţa între majuscule şi minuscule.2. Această clasă este utilizată de către PHP pentru a executa funcţii din clase Java şi pentru a rula clase noi. Pur şi simplu scrieţi o funcţie care preia două argumente şir şi returnează -1. următoarele instrucţiuni creează un tablou şi îl sortează într-o manieră insensibilă la diferenţa între majuscule şi minuscule: $limbaje = array("Perl". Funcţia usort() sortează valorile din tablou şi returnează un tablou secvenţial.2. o modalitate ar fi utilizarea funcţiei natcasesort(). în ordine descendentă Sortarea unui tablou sau a unui tablou asociativ în funcţie de cheie Sortarea unui tablou sau a unui tablou asociativ în funcţie de cheie. funcţia uksort() sortează cheile tabloului. pe care o specificaţi prin desemnarea unei funcţii care compară valorile în conformitate cu secvenţa de aranjare. Funcţia returnează o valoare negativă dacă primul şir este mai mic decât al doilea.3. usort($limbaje. respectiv o valoare pozitivă dacă primul şir este mai mare decât ala doilea.dll (pe platforme Windows) şi pachetul php_java.4.jar care conţine o clasă care se ocupă de încărcarea celor folosite în script-urile PHP. în ordine descendentă 4 => Python Arsort() 1 => Perl 2 => PHP 1 => Perl 2 => PHP ksort() 4 => Python 4 => Python Krsort() 2 => PHP 1 => Perl Dacă doriţi să efectuaţi o căutare fără sensibilitate la diferenţa între majuscule şi minuscule. De exemplu. Aceste funcţii vă permit să definiţi o secvenţă de aranjare personalizată.4. Pentru a utiliza facilităţile oferite de limbajul Java în cadrul scripturilor PHP este necesară o platformă Java care poate fi găsită la adresa http://java. Limbajul PHP poate utiliza cel puţin următoarele versiuni de Java: 1.sun. care sortează un tablou folosind o "ordine naturală". zero dacă şirurile sunt identice. 1. O altă modalitate constă în a utiliza funcţia usort() sau una dintre funcţiile sale conexe. Eu am testat cu Java 2 SDK. iar funcţia uasort() sortează un tablou asociativ. Puteţi implementa o secvenţă de aranjare personalizată scriind propria dumneavoastră funcţie şi specificând numele acesteia ca argument al funcţiei usort() sau al uneia din funcţiile sale conexe.com/ şi pachetul php_java care conţine două fişiere: biblioteca php_java. în funcţie de rezultatul comparaţiei între valorile şir. "Python").Sortarea unui tablou asociativ după valoare. Interoperabilitate PHP-Java Un aspect important al limbajului PHP este acela că realizatorii de pagini web pot folosi în script-uri o mare parte a facilităţilor oferite de limbajul Java prin intermediul unei biblioteci de funcţii numită php_java.

Metodele şi proprietăţile statice sau dinamice ale claselor instanţiate se accesează folosind operatorul de indirectare "->". În continuare trebuie setate valori pentru următoarele patru variabile: . De exemplu.java. o clasă derivată din clasa java. dintre care primul este un şir de caractere care reprezintă numele clasei Java care se instanţiază. Configurarea se realizează prin intermediul fişierului php. iar restul de parametrii reprezintă parametrii pentru care se va apela constructorul clasei respective. . directoarele din această listă sunt separate între ele prin caracterul ".jar java.dll variabilei extension.library=C:\j2sdk1.ini.home . dacă avem o variabilă $clasa căreia i-a fost ataşată ca valoare o clasă Java.java.dll dacă o astfel de linie există în fişierul php.Object a limbajului Java." de la începutul liniei: .path .library. altfel nu se pot utiliza clase Java. Clasa Java Această clasă se foloseşte pentru a rula o clasă a limbajului Java şi reprezintă.reprezintă o listă de directoare.java.2_04 java.library." Valorile pentru aceste variabile se setează în fişierul php. .ini în cadrul sectiunii [Java]. de fapt.lang. maşina virtuală Java poate fi încărcată şi clasele pot fi utilizate în cadrul script-urilor PHP. .library . atunci pentru a afişa reprezentarea textuală a acesteia trebuie să utilizăm metoda toString() (metodă specifică tuturor claselor Java) vom utiliza o instrucţiune de forma: echo $clasa->toString()." această listă ar trebui să conţină calea către pachetul php_java.reprezintă numele directorului în care este instalată platforma Java.path . Constructorul acesteia primeşte mai mulţi parametrii. În acest fişier trebuie adăugată valoarea php_java.java. ejb.2_04\jre\bin\server\jvm.dll java.jar. arhive zip sau alte tipuri de pachete suportate de limbajul java (jar. Configurare: Pentru a putea accesa clasele Java în cadrul script-urilor PHP trebuie configurată biblioteca php_java.) separate între ele prin caracterul ".path=c:\php\extensions\ Cu aceste setări făcute. Există mai multe posibilităţi pentru a face acest lucru.home=c:\j2sdk1. iar o altă varianta este adăugarea liniei: extension=php_java. în plus decât cele cu care este configurată platforma Java.path=c:\php\extensions\php_java.extension=php_java. Utilizare Clasele Java se instanţiaza în PHP folosind constructorul clasei Java explicat mai jos.reprezinta o listă de directoare în care pot fi găsite anumite pachete de clase Java.class. În cazul în care nu se reuşeşte rularea unei clase a limbajului . war etc.class.reprezintă calea către maşina virtuală Java care se doreşte a fi încărcată.ini localizat pe platforme Windows în directorul sistemului de operare (în directorul Windows de obicei).pachetului php_java trebuie copiate în directorul extensions care poate fi găsit în directorul în care a fost instalat limbajul PHP.4. (in cazul meu am setat astfel valorile: [Java] java. Una dintre ele este eliminarea caracterului ".dll la sfârşitul fişierului.4.

cu care puteţi verifica dacă aţi instalat şi configurat corect clasele Java. $error = java_last_exception_get(). echo "Versiunea: "."<br>". $i = $int->parseInt($sir). echo "Versiunea Java este: ". echo $system -> getProperty("java.System")."\" este un numar intreg. } } ?> . $sir = $_POST['sir']. java_last_exception_clear(). Cod: <form action = "test. echo $system -> getProperty("os.lang. Funcţia java_last_exception_get nu are parametri. $int = new Java ("java.$i.lang.".Exception care reprezintă ultima exceptie care a fost generată sau valoarea logică false dacă nu a fost generată nici o excepţie de la începutul execuţiei script-ului sau de la ultimul apel al funcţiei java_last_exception_clear. În continuare este un exemplu de utilizare a clasei Java. if ($error) { echo "Sirul \"". echo "Sistem de operare: "."<br>". Cod: <?php $system = new Java("java.version").Java este generată o excepţie Java.version").lang. echo $system -> getProperty("os. iar pentru a verifica dacă a fost generată o astfel de excepţie se foloseşte funcţia java_last_exception_get care este prezentată mai jos.Integer").". ?> Funcţia java_last_exception_get Această funcţie returnează o clasă Java derivată din clasa java."<br>".php" metod=post> Introduceti un sir de caractere: <input type = text name = "sir"> <input type = submit value = "verificare"> </form> <?php if (isset($_POST['sir'])) { echo "<hr>".name").$sir."\" nu este un numar intreg. } else { echo "Sirul \"".

Funcţia mail Această funcţie se foloseşte pentru a transmite un mesaj de poştă electronică la una sau mai . cât şi limbajul PHP. în schimb efectul aplicării ei este acela că este anulată ultima excepţie Java care a fost generată de către maşina virtuală Java în timpul executării de cod. iar pe sistemele de operare din familia *NIX se foloseşte setarea implicită a sistemului. respectiv în directorul /etc pe sistemele *NIX. sendmail_from si sendmail_path. pentru sistemele de operare din familia Windows sau setarea implicită a sistemului. se poate întâmpla ca după apelul unei funcţii să tratam excepţia greşită. . În fisierul php. sau trebuie modificate valorile acestora. deoarece. . . prezenţa acestei librării are o foarte mare importanţă. Funcţiile scrise în Java sunt executate de către procesor mult mai repede decât cele scrise în PHP. smtp_port. .Variabila smtp_port reprezintă portul pe care răspunde server-ul de mesaje electronice şi are valoarea implicită 25. atunci. iar utilizarea codului Java oferă o mai mare siguranţă creatorilor de pagini web dinamice.ini trebuie adăugate variabilele având numele SMTP. transmiterea unor ştiri tuturor utilizatorilor înscrişi pe o anumită listă. Despre configurarea php Pentru a putea utiliza funcţiile oferite de limbajul PHP pentru a trimite mesaje de poştă electronică. Importanţa librăriei php_java Pentru programatorii de pagini web care cunosc atât limbajul Java.Funcţia java_last_exception_clear Această funcţie nu are nici un parametru şi nu returnează nici o valoare. Apelul acestei funcţii este necesar.Variabila SMTP reprezintă ip-ul sau adresa server-ului de mesaje electronice. în cazul în care a fost generată o excepţie şi nu a fost tratată. pe sistemele de operare din familia Windows sau *NIX este necesar să se seteze corect interpretorul PHP prin intermediul fişierului php. Dacă această variabilă lipseste. dacă acestea nu există. Funcţia mail() trimite mesajele prin intermediul unui server SMTP (Simple Mail Transfer Protocol) care poate fi găzduit de server-ul pe care este instalat interpretorul PHP sau de către un alt server accesibil interpretorului. Cu ajutorul acestor funcţii se pot realiza aplicaţii interesante cum sunt administrarea listelor de discuţii. pentru sistemele de operare din familia *NIX.Variabila sendmail_path reprezintă calea către aplicaţia care se ocupă de transmiterea mesajelor pe sistemele de operare din familia *NIX. Transmiterea mesajelor prin e-mail folosind PHP şi PEAR Limbajul PHP are integrat un client pentru protocolul SMTP (Simple Mail Transfer Protocol) şi un set de funcţii necesare pentru prelucrarea mesajelor primite de către un server de mail în vederea utilizării datelor conţinute. difuzarea de noutăţi cu privire la diverse apariţii etc.ini localizat în directorul în care este instalat sistemul de operare. Valoarea acestei variabile este folosită numai pentru sistemele de operare din familia Windows. pentru sistemele de operare din familia Windows se va încerca folosirea sistemului pe care se află instalat interpretorul pentru a transmite mesaje electronice.Variabila sendmail_from reprezintă adresa de mail a expeditorului. iar pentru sistemele de operare din familia *NIX se vor folosi setările implicite ale sistemului.

printre multe altele. . "Mesaj de test". . respectiv după câmpul adresa_email. Pentru a putea trimite mesaje care conţin ataşamente sau care au un tip de continut altul decat text (exemplu pagini HTML) este necesar ca valoarea acestui parametru sa fie în format MIME (Multi-porpose Internet Mail Extension). O căsuţă poştală din lista destinatarilor poate fi specificată utilizând unul dintre următoarele formate: "nume_destinatar <adresa_email>" sau "adresa_email".ro>" este o adresă validă pentru un mesaj de poştă electronică. . cea mai importantă clasă necesară pentru a codifica în format MIME astfel de mesaje.net/ În continuare este prezentată clasa Mail_Mime. .Ultimul parametru reprezintă o listă de opţiuni suplimentare pentru aplicaţia care va fi folosită pentru a efectua trimiterea mesajului şi este dependent de aceasta. Această bibliotecă oferă. PEAR PEAR (PHP Extension and Application Repository) reprezintă un proiect demarat de echipa de programatori PHP.Primul parametru reprezintă o listă a tuturor căsuţelor poştale. Constructorul Mail_Mime crează o instanţă a clasei şi are un singur parametru de tip şir de caractere.multe căsuţe poştale.net/package/Mail_Mime Pentru a putea folosi setul de clase Mail_Mime trebuie instalat mai întâi pachetul PEAR de bază care poate fi găsit la adresa http://pear. Un exemplu este prezentat mai jos: mail('"Alex" <php4@as. pentru a specifica un destinatar pentru mesajul care se va trimite. iar dacă valoarea câmpului nume_destinatar conţine caracterul spaţiu este necesară utilizarea caracterului " înaintea acestuia şi după acesta. separate prin şirul de caractere "\r\n" (sfârşit de linie).php. este obligatorie folosirea caracterelor "<" şi ">" înainte. De exemplu. "Acesta este un mesaj de test") or die("Nu se poate trimite mesajul"). care este opţional." care reprezintă destinatarii mesajului ce se va transmite. . Acest set de clase poate fi descărcat de la adresa http://pear.Cel de-al treilea parametru reprezintă conţinutul mesajului ce va fi transmis. dintre care ultimii doi sunt opţionali. Clasa Mail_Mime Această clasă se foloseşte pentru a construi mesaje electronice în format MIME. Clasa Mail_Mime are şase funcţii membru a căror funcţionalitate este prezentată în continuare şi un constructor. un set de clase care pot fi folosite pentru a putea transmite mesaje electronice care să conţină atasamente şi al căror conţinut poate fi în format HTML în loc de text. separate prin caracterul ".Al doilea parametru reprezintă subiectul mesajului care se va transmite. În cazul utilizării primului format. unde domeniu reprezintă numele serverului care găzduieşte căsuţa poştala a utilizatorului nume_utilizator.php. Acest parametru reprezintă terminatorul de linie care va fi utilizat de către clasa pentru a încheia fiecare linie din mesaj şi are valoarea implicită "\r\n". . unde nume_destinatar reprezintă numele proprietarului căsutei poştale adresa_mail şi poate fi şirul vid.ro>'. iar adresa_email reprezintă adresa căsuţei poştale şi are formatul "nume_utilizator@domeniu". Scopul acestui proiect este de a oferi o bibliotecă structurată de clase open-source tuturor utilizatorilor limbajului PHP. pentru mesajul care va fi transmis.Cel de-al patrulea parametru reprezintă o listă de linii de antet suplimentare. Funcţia mail are cinci parametri de tip şir de caractere. Funcţia returnează valoarea logică TRUE dacă s-a reuşit trimiterea mesajului şi valoarea logică FALSE în caz contrar. adresa "Alex <php4@as.

Funcţia Mail_Mime::setTxtBody Această funcţie setează conţinutul text al unui mesaj pentru ca acesta să poată fi vizualizat în cadrul unui client de mail de tip text cum este cazul aplicaţiei mail prezentă pe sistemele de operare din familia *NIX. Această funcţie are doi parametri. - Primul parametru este de tip şir de caractere şi reprezintă conţinutul mesajului sau numele fişierului care conţine mesajul în format text. - Cel de-al doilea parametru este de tip logic şi este opţional. Dacă acest parametru are valoarea TRUE, atunci se va considera că primul parametru reprezintă numele unui fişier, iar dacă are valoarea FALSE, atunci se va considera că primul parametru reprezintă conţinutul mesajului. Valoarea implicită a acestui parametru este FALSE. Funcţia setTxtBody returnează valoarea logică TRUE dacă a reuşit să adauge la mesaj conţinutul şi o instanţă a clasei PEAR_Error în caz contrar. Funcţia Mail_Mime::setHTMLBody Această funcţie setează conţinutul HTML al unui mesaj pentru ca acesta să poată fi vizualizat în cadrul unui client de mail de tip HTML cum este cazul aplicaţiei OUTLOOK prezentă pe sistemele de operare din familia Windows. Această funcţie are doi parametri. - Primul parametru este de tip şir de caractere şi reprezintă conţinutul mesajului sau numele fişierului care conţine mesajul în format HTML. - Cel de-al doilea parametru este de tip logic şi este opţional. Dacă acest parametru are valoarea TRUE, atunci se va considera că primul parametru reprezintă numele unui fişier, iar dacă are valoarea FALSE, atunci se va considera că primul parametru reprezintă conţinutul mesajului. Valoarea implicită este FALSE. Funcţia setHTMLBody returnează valoarea logică TRUE dacă a reuşit să adauge la mesaj conţinutul şi o instanţă a clasei PEAR_Error în caz contrar. Funcţia Mail_Mime::addHTMLImage Această funcţie se foloseşte pentru a adăuga o imagine în corpul unui mesaj, în cazul în care conţinutul în format HTML utilizează imagini integrate. Această funcţie are patru parametri. - Primul parametru este de tip şir de caractere şi reprezintă conţinutul imagini sau numele fişierului care conţine imaginea. - Al doilea parametru este de tip şir de caractere, este opţional şi reprezintă tipul conţinutului. Acest parametru are valoarea implicită "application/octet-stream". De exemplu, dacă imaginea este de tip GIF, acest parametru poate primi valoarea "image/gif". - Cel de-al treilea parametru este de tip şir de caractere, este opţional şi reprezintă numele care va fi dat imaginii. În cazul în care primul parametru conţine imaginea, atunci este necesar ca acest parametru să apară, în caz contrar se va folosi numele fişierului transmis ca valoare pentru primul parametru. - Cel de-al patrulea parametru este de tip logic şi este opţional. Dacă acest parametru are valoarea TRUE, atunci se va considera că primul parametru reprezintă numele unui fişier, iar dacă are valoarea FALSE, atunci se va considera că primul parametru reprezintă conţinutul unei imagini. Valoarea implicită a acestui parametru este TRUE. Funcţia addHTMLImage returnează valoarea logică TRUE dacă a reuşit să adauge la mesaj conţinutul şi o instanţă a clasei PEAR_Error în caz contrar. Funcţia Mail_Mime::addAttachement Această funcţie se foloseşte pentru a adăuga un fişier la un mesaj şi are cinci parametri, dintre care primii patru au aceaşi semnificaţie cu cei de la funcţia precedentă. Ultimul parametru este de tip şir de caractere, este opţional şi reprezinta tipul codificării care va fi utilizată. Acest parametru are valoarea implicită "base64". Pentru fişiere ataşate care nu sunt binare (ex. fişiere executabile, arhive...) se poate folosi valoarea "quoted-printable".

Functia Mail_Mime::headers Această funcţie se foloseşte pentru a adăuga linii de antet suplimentare la mesajul constituit de această clasă. Funcţia headers are un singur parametru de tip listă, care are ca şi chei numele câmpurilor antetelor şi ca valori, valorile acestor câmpuri. Funcţia returnează o referinţă la o listă de acelaşi tip care conţine, pe lângă elementele transmise ca parametru, şi elementele adăugate de această clasă, pentru ca mesajul să fie recunoscut cum trebuie de către un client de mail. Această funcţie nu poate fi apelată după apelul funcţiei Mail_Mime::get. Functia Mail_Mime::get Această funcţie se foloseşte pentru a obţine conţinutul mesajului electronic în format MIME, după ce acesta a fost construit. Funcţia get nu are nici un parametru şi returnează un şir de caractere care reprezintă conţinutul mesajului electronic codificat în format MIME. Pentru a transmite un mesaj folosind funcţia mail prezentată şi această clasă, trebuie prelucrat şirul liniilor de antet returnat de funcţia Mail_Mime::headers astfel încât să se obţină un şir de caractere, iar conţinutul mesajului va fi constituit de şirul de caractere rezultat în urma apelării funcţiei Mail_Mime::get.

Informaţii despre clasele încărcate

În continuare sunt prezentate un set de funcţii cu ajutorul cărora se pot afla informaţii despre clasele încărcate într-un script. Funcţia get_declared_classes Această funcţie returnează un tablou care conţine numele tuturor claselor definite în momentul execuţiei unui script PHP. Funcţia class_exists Această funcţie primeşte ca parametru un şir de caractere şi returnează valoarea logică TRUE dacă există o clasă care să aibă numele identic cu şirul de caractere primit ca parametru şi valoarea logică FALSE în caz contrar. Funcţia get_parent_class Această funcţie are un parametru care poate fi de tip şir de caractere sau obiect. În cazul în care parametrul este de tipul şir de caractere, atunci funcţia get_parent_class returnează un şir de caractere care reprezintă numele clasei care este părintele direct al clasei al cărui nume este dat de parametru. În cazul în care parametrul este de tip obiect, atunci funcţia returnează un şir de caractere care reprezintă numele părintelui direct al clasei a cărei instanţă este reprezentată de obiectul dat ca parametru. Funcţia is_a

Această funcţie are doi parametri. Primul parametru este de tip obiect, iar al doilea este de tip şir de caractere. Funcţia is_a returnează valoarea logică TRUE dacă primul parametru este de tipul reprezentat de al doilea parametru sau de tip derivat din cel de-al doilea parametru şi valoarea logică FALSE în caz contrar. De exemplu, dacă avem clasele cls1, cls2 şi cls3 iar cls3 este derivată din cls2 iar cls2 este derivată din cls1, atunci, dacă obj reprezintă o instanţă a clasei cls3, în urma apelurilor is_a(obj, "cls1"), is_a(obj, "cls2") şi is_a(obj, "cls3") se obţine valoarea logică TRUE. Funcţia is_subclass_of Funcţia is_subclass_of are aceiaşi parametri cu funcţia anterioară. Funcţionalitatea ei diferă faţă de funcţia precedentă prin faptul că valoarea logică TRUE este returnată numai în cazul în care primul parametru este o instanţă a unui tip derivat din tipul a cărui nume este dat de cel de-al doilea parametru. În condiţiile exemplului anterior, în urma apelului is_subclass_of(obj, "cls3") se va obţine valoarea logică FALSE. Funcţia get_class_methods Această funcţie are un parametru care poate fi de tip şir de caractere care reprezintă numele unei clase sau de tip obiect. Funcţia get_class_methods returnează un tablou ale cărui elemente sunt de tipul şir de caractere şi care reprezintă numele metodelor definite în cadrul clasei cu numele primit ca parametru sau în cadrul clasei care este reprezentată de obiectul primit ca parametru. În cazul în care parametrul este de tip şir de caractere şi nu este definită nici o clasă cu acest nume, atunci funcţia returnează valoarea logică FALSE. Functia get_class_vars Această funcţie are un singur parametru de tip şir de caractere care reprezintă numele unei clase şi returnează un tablou ale cărui elemente sunt de tip şir de caractere şi care reprezintă valorile implicite ale variabilelor definite în cadrul clasei. Tabloul rezultat în urma apelului acestei funcţii este indexat după numele variabilelor definite în cadrul clasei. Funcţia get_class Această funcţie primeşte ca parametru un obiect şi returnează numele clasei care reprezintă tipul obiectului primit ca parametru. Funcţia get_object_vars Această funcţie are un singur parametru de tip obiect şi returnează un tablou ale cărui elemente sunt de tip şir de caractere şi care reprezintă valorile variabilelor definite în cadrul acestuia. Tabloul rezultat în urma apelului acestei funcţii este indexat după numele variabilelor definite în cadrul obiectului. Funcţia get_object_vars se aseamănă foarte mult cu funcţia get_class_vars. Functia call_user_method Această funcţie realizează apelul unei metode care aparţine unei clase sau unui obiect cu parametrii specificaţi. Funcţia call_user_method are mai mulţi parametri. Primul parametru este de tip şir de caractere şi reprezintă numele metodei care se va apela. Al doilea parametru este de tip obiect sau de tip şir de caractere şi reprezintă numele unei clase. În cazul în care acest parametru este de tip obiect, metoda dată de primul parametru este apelată pentru obiect, iar dacă parametrul este de tip şir de caractere, atunci metoda este apelată pentru

clasa al cărui nume este dat de acest parametru. Restul parametrilor reprezintă parametrii cu care se va apela metoda al cărui nume este dat de primul parametru. Funcţia call_user_method_array Această funcţie are aceeaşi funcţionalitate cu funcţia anterioară cu diferenţa că are doar trei parametri, iar al treilea parametru este un tablou unidimensional care conţine parametrii cu care se va apela metoda dată de primul parametru pentru clasa sau obiectul reprezentat de cel de-al doilea parametru. Funcţia eval Această funcţie primeşte ca parametru un şir de caractere care reprezintă o secvenţă de cod PHP şi realizează execuţia acestuia. Funcţia dl Această funcţie realizează încărcarea în timpul execuţiei script-ului a unor extensii externe, dacă acest lucru este permis de setările interpretorului PHP. Funcţia dl primeşte ca parametru un şir de caractere care reprezintă calea către extenşia care trebuie încărcată şi returnează valoarea logică TRUE dacă s-a reuşit încărcarea extensiei şi valoarea logică FALSE în caz contrar. Funcţia extension_loaded Această funcţie verifică dacă o anumită extensie este încarcată. Funcţia primeşte un parametru de tip şir de caractere care reprezintă numele unei extensii şi returnează o valoare logică corespunzătoare. Funcţia get_declared_classes Funcţia get_declared_classes nu are nici un parametru şi returnează un tablou unidimensional care conţine numele tuturor claselor încărcate în mediul de execuţie în momentul apelării acesteia.

Prelucrarea dinamică a imaginilor

Un aspect important al limbajului PHP este acela că oferă programatorilor posibilitatea de a crea şi publica în cadrul paginilor web imagini dinamice cum ar fi de exemplu, o aplicaţie care monitorizează accesările unei pagini web şi afişează rezultatul sub forma unei imagini. Pentru a profita de această facilitate în limbajul PHP trebuie activată mai întâi biblioteca php_gd2. Acest lucru se face prin adăugarea următoarei linii (dacă nu există deja) în fişierul de configurare php.ini (pentru sistemele Windows): extension = php_gd2.dll În acest moment sunt disponibile funcţiile de prelucrare şi generare dinamică de imagini. Această librărie permite adăugarea de text în cadrul imaginilor generate şi oferă suport pentru

?> Citat: array(12) { ["GD Version"]=> string(27) "bundled (2. Pentru a obţine imagini de calitate foarte bună.0. FreeType 2 şi T1Lib. această bibliotecă oferă suport integrat pentru bibliotecile FreeType 1. Cod: <?php var_dump(gd_info()). Crearea dinamica a imaginilor Pentru a crea imagini în mod dinamic avem la dispoziţie două opţiuni. Putem crea o imagine care este bazată pe o paletă de culori (pentru acest tip de imagini avem la dispoziţie doar 256 .28 compatible)" ["FreeType Support"]=> bool(true) ["FreeType Linkage"]=> string(13) "with freetype" ["T1Lib Support"]=> bool(true) ["GIF Read Support"]=> bool(true) ["GIF Create Support"]=> bool(true) ["JPG Support"]=> bool(true) ["PNG Support"]=> bool(true) ["WBMP Support"]=> bool(true) ["XPM Support"]=> bool(false) ["XBM Support"]=> bool(true) ["JIS-mapped Japanese Font Support"]=> bool(false) } Rezultatul returnat de această funcţie îl reprezintă un vector cu mai multe componente.imagini în mai multe formate. Formate de imagini suportate Pentru a afla ce formate de imagini suportă biblioteca instalată (în funcţie de versiunea PHP) se poate executa funcţia gd_info(). Se poate observa că printre aceste componente se află versiunea bibliotecii şi facilităţile oferite. JPG. care au ca scop încărcarea şi desenarea font-urilor independent de platformă. Formatele de imagini suportate de biblioteca php_gd2 sunt GIF. PNG. Se observă că biblioteca folosită nu permite salvarea imaginilor în format GIF. WBMP şi XBM (XPM).

. imagedestroy($img). primeşte ca parametru două numere întregi care reprezintă dimensiunile imaginii (lăţimea şi înălţimea) şi returnează o variabilă de tipul resource care reprezintă identificatorul de acces la imaginea nou creată. Funcţiile cu ajutorul cărora putem crea imagini sunt: .această funcţie crează o imagine care are fundalul negru şi un număr nedefinit de culori.imagecreatefromgif . primeşte ca parametri două numere întregi care reprezintă dimensiunile imaginii (lăţimea şi înălţimea) şi returnează o variabilă de tipul resource care reprezintă identificatorul de acces la imaginea nou creată. $fundal = imagecolorallocate($img.100).această funcţie primeşte ca parametru o cale spre un fişier. Trebuie avut în vedere. şi returnează o variabilă de tipul resource care reprezintă identificatorul de acces la imaginea de tipul GIF încărcată.imagecreate . publicare.imagecreatetruecolor . $img = imagecreate(100.de culori cu care putem opera) sau putem crea o imagine cu un număr neprecizat de culori (true color). Cod: // pagina web contine: <HTML> <TITLE> Imagine dinamica </TITLE> <BODY> <IMG src="imagine.php contine: header("Content-type: image/png"). că pentru a afişa o imagine dinamică pe o pagină web trebuie realizată o pagină care are un element IMG al cărui atribut src să indice calea către script-ul PHP care creează imaginea. 150. eventual. citirea de imagini aflate la o anumită locaţie şi încărcarea acestora în memorie pentru prelucrare şi. 100).această funcţie crează o imagine goală care este bazată pe o paletă de culori. de asemenea. Funcţiile care încarcă imagini deja existente sunt: . care se poate afla şi la distanţă. imagepng($img). .php"> </BODY> </HTML> <?php // pagina imagine. ?> Mai jos aveţi un exemplu al scriptului prezentat mai sus: Încărcarea imaginilor Biblioteca permite. 200.

primeşte ca parametri identificatorul de acces la imaginea pe care se va desena. . IMG_ARC_EDGED.desenează o linie pe imagine.imagefilledarc .această funcţie primeşte ca parametru o cale spre un fişier.imagecreatefromxbm . coordonata x a centrului elipsei. .imagecreatefromstring . şi returnează o variabilă de tipul resource care reprezintă identificatorul de acces la imaginea de tipul XPM încărcată. IMG_ARC_NOFILL. şi returnează o variabilă de tipul resource care reprezintă identificatorul de acces la imaginea de tipul PNG încărcată. care se poate afla şi la distanţă. care se poate afla si la distanţă. şi returnează o variabilă de tipul resource care reprezintă identificatorul de acces la imaginea încărcată. care se poate afla şi la distanţă. coordonata y a celui de-al doilea capăt şi culoarea cu care se va desena linia. coordonata x a primului capăt de linie.desenează pe o imagine un arc de elipsă. Cod: <?php header("Content-type: image/png").această funcţie primeşte ca parametru un şir de caractere care conţine reprezentarea binară a unei imagini. desenarea se face în sens trigonometric. unghiurile de start şi de stop ale arcului şi culoarea cu care se va desena.această funcţie primeşte ca parametru o cale spre un fişier. care se poate afla şi la distanţă.imageline .setează grosimea cu care se vor trasa liniile pentru o anumită imagine.această funcţie primeşte ca parametru o cale spre un fişier. coordonata y a primului capăt de linie.png"). . $im=imagecreatefrompng("images/logo. şi returnează o variabilă de tipul resource care reprezintă identificatorul de acces la imaginea de tipul XBM încărcată. lungimea şi înălţimea elipsei.imagecreatefrompng .imagedashedline . . şi returnează o variabilă de tipul resource care reprezintă identificatorul de acces la imaginea de tipul WBMP încărcată. . primeşte ca parametri identificatorul de acces al imaginii pe care se va desena. . care se poate afla şi la distanţă.această funcţie primeşte ca parametru o cale spre un fişier. imagepng($im).imagesetthickness . are aceeaşi parametri cu funcţia anterioară la care se mai adaugă unul care reprezintă stilul haşurii şi care poate avea valorile: IMB_ARC_PIE. . ?> Şi exemplul concret îl vedeţi mai jos: Desenarea de imagini Pentru a desena pe o imagine creată dinamic sau încărcată dintr-un fişier avem la dispoziţie mai multe funcţii: . şi returnează o variabilă de tipul resource care reprezintă identificatorul de acces la imaginea de tipul JPG încărcată. are aceeaşi parametri ca funcţia anterioară şi va folosi stilul implicit sau cel setat de utilizator. primeşte ca parametri identificatorul de acces al imaginii şi un număr întreg care reprezintă grosimea cu care se vor desena liniile pe imagine.desenează pe o imagine un arc de elipsă haşurat.desenează o linie punctată pe o imagine. imagedestroy($im).imagecreatefromwbmp . coordonata y a centrului eclipsei.imagecreatefromjpeg . . IMG_ARC_CHORD. .imagecreatefromxpm .imagearc .această funcţie primeşte ca parametru o cale spre un fişier.. . coordonata x a celui de-al doilea capăt.

. coordonata x şi y a colţului din partea dreapta-jos a dreptunghiului şi culoarea cu care se va desena.0.80.desenează un poligon plin. atunci se returnează indicele culorii din paletă. coordonata x a unui punct din zona care se va umple cu culoare. .desenează o elipsă pe o imagine. ..imagecolorallocate . are aceeaşi parametri cu funcţia anterioară.255.100. are aceeaşi parametri cu funcţia anterioară.255).imagecolordeallocate .0).primeşte ca parametri identificatorul de acces al unei imagini şi o culoare.desenează un poligon pe o imagine.imageellipse .0.imagefill . o valoare pentru componenta roşu a unei culori.160.0. în cazul în care imaginea specificată ca parametru se bazează pe o paletă de culori. are aceeaşi parametri cu funcţia anterioară. Cod: <?php header("Content-type: image/png"). atunci culoarea este eliminată din paletă. imagefill($im.229. lungimea şi înălţimea elipsei şi culoarea cu care se va desena. . coordonata x şi y a centrului elipsei. coordonata x şi y a colţului din partea stângă-sus a dreptunghiului. coordonata y a punctului şi culoarea cu care se va umple.imagefilledpolygon . . $im = imagecreate(250.$magenta). coordonata y a punctului. $green = imagecolorallocate ($im. culoarea punctelor cu care este mărginită zona şi culoarea cu care se va umple. iar pe pozitiile impare coordonatele y ale punctelor. în cazul în care imaginea se bazează pe o paletă de culori.desenează un dreptunghi pe o imagine. . $blue = imagecolorallocate ($im.imagepolygon .imagefilledrectangle . . $cyan = imagecolorallocate ($im. .0. $yellow = imagecolorallocate ($im.$red).50. coordonata y a punctului şi noua culoare a acestuia.imagecolorat . coordonata x a punctului a cărui culoare se va schimba. .umple cu o culoare o zonă de pe imagine care are aceeaşi culoare cu cea a punctului care se află la coordonatele specificate ca parametru. imagefill($im.primeşte ca parametri identificatorul de acces al unei imagini.desenează o elipsă plină. coordonata x a unui punct din zona care se va umple cu culoare. dacă în paleta de culori nu există o culoare care să aibă toate cele trei componente.umple cu o culoare o zonă de pe imagine care este mărginită de o culoare specificată ca parametru.imagesetpixel . primeşte ca parametri identificatorul de acces al imaginii pe care se va face umplerea.schimbă culoarea unui punct de pe o imagine. o valoare pentru componenta verde a unei culori şi o valoare pentru componenta albastru a unei culori şi returnează un număr întreg care reprezintă culoarea având cele trei componente.0.255. coordonata x a punctului şi coordonata y a punctului. numărul de puncte ale poligonului şi culoarea cu care se va desena.0).0.100.100.255.imagefilledellipse .255. un tablou ale cărui elemente sunt numere întregi şi reprezintă coordonatele punctelor poligonului care se va desena.imagefilltoborder .250).$yellow). primeşte ca parametri identificatorul de acces al imaginii pe care se va desena poligonul. primeşte ca parametri identificatorul de acces al imaginii pe care se va desena.50.$green). primeşte ca parametri identificatorul de acces al imaginii pe care se va face umplerea.0). . .255.255. tabloul cu punctele poligonului conţine pe pozitiile pare coordonatele x ale punctelor.0.desenează un dreptunghi plin.255). . imagefilledellipse($im. primeşte ca parametri identificatorul de acces al imaginii pe care se va desena. primeşte ca parametri identificatorul de acces al imaginii.229. $magenta = imagecolorallocate ($im.0.100. imagefill($im. imagefilledrectangle($im. atunci ea este adaugată la paleta de culori a imaginii.30. primeşte ca parametri identificatorul de acces al imaginii.50.imagerectangle .255).returnează culoarea unui anumit punct de pe imagine. $red = imagecolorallocate ($im.$cyan).

0.imagesetthickness($im. Funcţia imagechar are şase parametri: .50). 4 sau 5 sau poate fi un număr returnat de o funcţie care încarcă un font de pe disc.100. 0. $poly = array(10.primul parametru este identificatorul de acces la imaginea pe care se va desena . . $im = imagecreate(100. imagedestroy($img). Acest identificator este de tip număr întreg şi poate avea valorile predefinite 1.al cincilea parametru reprezintă şirul de caractere din care va fi scris doar primul caracter. ?> Rezultatul exemplului îl vedeti mai jos: Scrierea textului pe imagini În continuare sunt prezentate câteva funcţii utilizate pentru a scrie un text sau un caracter pe o imagine.255.$poly.75.0. $fundal = imagecolorallocate($im.10.100).6.cel de-al doilea parametru reprezintă identificatorul de acces la font-ul care va fi folosit pentru a scrie caracterul pe imagine.200.cel de-al treilea parametru reprezintă coordonata x a colţului stânga-sus de unde va începe scrierea caracterului. 0. imagefilledpolygon($im. 3.229. 2.3). .200. . imagepng($im).50.50.cel de-al şaselea parametru reprezintă culoarea cu care se va scrie pe imagine. . .$blue).229.100. Funcţia imagechar Această funcţie scrie pe o imagine primul caracter al unui şir de caractere.$red).cel de-al patrulea parametru reprezintă coordonata y a colţului stânga-sus de unde va începe scrierea caracterului. imageline($im. Cod: <?php header("Content-type: image/png"). 225).150.

'a'. imagechar($im.100).0. $fundal = imagecolorallocate($im. 15.255. . imagedestroy($im).0. 0.255. Cod: <?php header("Content-type: image/png"). $verde = imagecolorallocate ($im. 225). $verde). 0.0). $fundal = imagecolorallocate($im.0. imagedestroy($im). 225). $verde = imagecolorallocate ($im. 15.$verde = imagecolorallocate ($im. Cod: <?php header("Content-type: image/png"). imagepng($im). 5. 5. ?> Rezultatul codului de mai sus: Funcţia imagestring Această funcţie scrie un text pe o imagine şi are aceeaşi parametri ca funcţia imagechar.100). 0. $verde). Are aceeaşi parametri ca funcţia anterioara. imagecharup($im.255.0). imagepng($im). 0. 'a'. $im = imagecreate(100. $im = imagecreate(100. 10. 10.0). ?> Rezultatul este: Funcţia imagecharup Această funcţie scrie un caracter vertical pe o imagine.

10.100). ?> Rezultatul este: Funcţia imagerotate Această funcţie realizează rotirea unei imagini în sens trigonometric cu un unghi primit ca parametru. Imaginea rezultată în urma rotirii va avea dimensiunile egale cu dimensiunile celui mai mic dreptunghi ale cărui laturi sunt paralele cu axele Ox şi Oy şi care conţine imaginea rotită. imagepng($im).al doilea este de tip real şi reprezintă unghiul cu care se va roti imaginea. ?> Rezultatul: Funcţia imagestringup Această funcţie scrie vertical un text pe o imagine şi are aceeaşi parametri ca funcţia imagechar. . 15. 40. 0. . 'test'. 5. imagepng($im).imagestring($im. $verde). imagedestroy($im).al treilea parametru este de tip întreg şi reprezintă culoarea cu care se va umple dreptunghiul care va conţine imaginea rotită. Cod: <?php header("Content-type: image/png"). Funcţia imagerotate returnează un identificator de acces la imaginea rotită.0.primul reprezintă identificatorul de acces la imagine. 225). . $verde). $im = imagecreate(100.0). 'test'. 5.255. $fundal = imagecolorallocate($im. Funcţia are trei parametri: . imagestringup($im. 0. 15. $verde = imagecolorallocate ($im. imagedestroy($im).

'test'. iar ultimul parametru. Al doilea parametru reprezintă calea spre fişierul care va conţine rezultatul transformării. dacă imaginea va fi cu zgomot (valoarea TRUE implică o aproximare mai bună a culorilor).0). $verde = imagecolorallocate ($im. . $im = imagecreate(100. Această funcţie este . Funcţia imagetruecolorpalette are trei parametri: .0. 45. 0. ?> Şi rezultatul din exemplul de mai sus este: Funcţia imagetruecolorpalette Această funcţie realizează transformarea unei imagini care nu foloseşte o paletă de culori întro imagine care foloseşte o paletă de culori. tot de tip întreg. 40.Cod: <?php header("Content-type: image/png"). Funcţia imageinterlace Această funcţie setează proprietatea interlace a unei imagini la valoarea logică precizată ca parametru sau la valoarea logică TRUE dacă acest parametru lipseşte.cel de-al doilea parametru este de tip logic şi reprezintă modul în care se va face transformarea: dacă imaginea va fi fără zgomot (valoarea logică FALSE implică o aproximare mai slabă a culorilor). $verde). 5. Următorii doi parametri sunt de tip întreg şi reprezintă înălţimea şi lăţimea noii imagini. 55. imagedestroy($imrot). Are aceeaşi parametri ca funcţia anterioară. imagestringup($im.primul reprezintă identificatorul de acces al imaginii care va fi transformată.255.100). $fundal = imagecolorallocate($im. cu observaţia că primul parametru reprezintă calea spre un fişier de tipul PNG. Funcţia are cinci parametri. Funcţia jpeg2wbmp Această funcţie transformă o imagine din formatul JPEG în formatul WBMP. $imrot = imagerotate($im. 0. 225). Funcţia png2wbmp Această funcţie transformă o imagine din formatul PNG în formatul WBMP. imagepng($imrot). reprezintă pasul cu care se va parcurge imaginea pentru a fi transformată. $verde). Primul parametru reprezintă calea spre fişierul de tip JPEG care va fi transformat.

o imagine este împărţită în subimagini de aceeaşi dimensiune şi calitate diferită (din ce în ce mai bună). care suprapuse dau ca rezultat imaginea iniţială. Practic nu se întâmplă chiar aşa.ultimul parametru este de tip întreg şi reprezintă proprietăţile pe care le va avea conexiunea. Primele trei funcţii se folosesc pentru a genera o imagine care să poata fi vizualizată într-un browser încărcat de pe un calculator. . O astfel de imagine se încarcă adaptiv. imagejpeg sau imagewbmp. c) MYSQL_CLIENT_INTERACTIVE .al treilea parametru reprezintă parola utilizatorului şi în caz că lipseşte se foloseşte şirul vid în momentul conectării la server.primul reprezintă numele server-ului MySQL şi dacă lipseşte se încearcă conectarea la calculatorul curent. dar efectul obţinut este cel precizat anterior. nu este nevoie să aşteptaţi încărcarea întregii imagini pentru a vedea ce este în ea.indică server-ului că va trebui să trimită date comprimate. imagepng.indică server-ului MySQL faptul că va trebui să ignore spaţiile care urmează după numele funcţiilor. Funcţia mysql_connect Această funcţie realizează conectarea la un server MySQL. iar ultima se foloseşte pentru ca imaginea generată să poata fi vizualizată în cadrul unui browser care suportă WAP. . iar al doilea parametru este de tip logic şi reprezintă valoarea pe care o va avea această proptietate. Funcţia mysql_connect primeşte cinci parametri opţionali: . şi în momentul în care s-a încheiat transferul imaginii către browser.indică server-ului MYSQL să nu închidă conexiunea după scurgerea unui anumit interval de timp în care script-ul nu a emis cereri către acesta. Publicarea în diverse formate Pentru a publica o imagine generată dinamic se poate utiliza una dintre funcţiile: imagegif. Cel de-al doilea parametru poate lipsi. Acest ultim parametru poate fi o combinaţie a valorilor: a) MYSQL_CLIENT_COMPRESS . teoretic vorbind. Primul parametru reprezintă identificatorul de acces la imaginea pentru care se doreşte setarea proprietăţii interlace. În cazul în care aveţi o viteză de acces la internet mică sau imaginea pe care doriţi să o încărcaţi este mare. Funcţia are doi parametri. . JPEG sau WBMP.foarte importantă în cazul în care doriţi ca site-ul vostru să aibă o navigabilitate bună.al patrulea parametru este de tip logic şi are rolul de a indica motorului PHP că în cazul în care există o conexiune la acelaşi server să se mai creeze încă una în loc să se reutilizeze cea existentă. De fapt. Funcţii PHP utilizate pentru accesarea şi interogarea bazelor de date MySQL În acest articol voi încerca să prezint cele mai folosite comenzi PHP pentru lucrul cu bazele de date MySQL. PNG. pe imagine se pot observa toate detaliile. b) MYSQL_CLIENT_IGNORE_SPACE .cel de-al doilea reprezintă numele utilizatorului şi în caz că acesta lipseşte se foloseşte valoarea root ca nume de utilizator. dar proprietatea interlace atribuită unei imagini va primi valoarea TRUE. Funcţia mysql_connect returnează valoarea logică FALSE în cazul în care a eşuat conectarea la server-ul de baze de date şi un identificator de acces la conexiunea către server-ul MySQL în . . Aceste funcţii primesc ca parametru un identificator de imagine şi tipăresc la ieşirea standard imaginea în format GIF. chiar dacă nu s-au încărcat integral toate elementele grafice prezente în cadrul lui.

"). ?> Funcţia mysql_close Această funcţie primeşte ca parametru un identificator de acces la o conexiune spre un server MySQL şi realizează închiderea acesteia. "parola"). În continuare sunt prezentate 2 modalităţi de conectare la un server MySQL: Cod: <?php // varianta 1 $conectare = mysql_connect("nume_server".".".. if ($conectare === FALSE) { echo "Conectare esuata. Aceasta nu are nici un parametru şi returnează valoarea logică TRUE în cazul în care conexiunea nu a fost închisă şi valoarea logică FALSE în caz contrar. Funcţia returnează valoarea logică TRUE în cazul în care a reuşit să creeze baza de date şi valoarea logică FALSE în caz contrar. } else { echo "Conexiune stabilita. Funcţia are doi parametri.cazul în care conectarea a reuşit. Funcţia mysql_ping Funcţia mysql_ping verifică dacă server-ul de MySQL a închis conexiunea sau nu. $conectare) or die("Nu se poate alege baza de date!"). } mysql_close($conectare). "user". // afisare rezultat // . Primul este de tip şir de caractere şi reprezintă numele bazei de date care va fi creată. Funcţia mysql_create_db Această funcţie este utilizată pentru a crea o nouă bază de date pe server-ul MySQL. mysql_select_db("nume_tabel". // varianta 2 $conectare = mysql_connect("nume_server". // inchidere conexiune mysql_close($conectare). $resultat = mysql_query($interogare) or die("Nu se poate executa intero garea!").. "user". "parola") or die("Con ectare esuata. $interogare = "SELECT * FROM nume_tabel". iar cel de-al doilea parametru reprezintă identificatorul de acces la conexiunea către server-ul MySQL. Funcţia mysql_drop_db .

while ($rand = mysql_fetch_array($rezultat. iar cel de-al doilea parametru reprezintă identificatorul de acces la conexiunea către serverul MySQL. Funcţia returnează valoarea logică TRUE în cazul în care s-a reuşit selectarea bazei de date şi valoarea logică FALSE în cazul în care baza de date nu există sau utilizatorul nu are drepturi de acces la aceasta. Funcţia returnează valoarea logică TRUE în cazul în care s-a reuşit ştergerea bazei de date şi valoarea logică FALSE în caz contrar. MYSQL_BOTH)) { echo '<br />'. } mysql_free_result($rezultat). . iar în cazul apariţiei unei erori. Funcţia mysql_query Această funcţie se foloseşte pentru a interoga o anumită baza de date. În cazul în care funcţia mysql_query este apelată pentru o interogare care nu presupune primirea unui rezultat. Ultimul parametru poate avea valorile MYSQL_USE_RESULT sau MYSQL_STORE_RESULT. pentru interogare se va folosi valoarea MYSQL_STORE_RESULT. deoarece va fi procesat imediat după apelul funcţiei. iar rezultatul primit va fi stocat în zone tampon până când va fi utilizat. Primul este de tip şir de caractere şi reprezintă numele bazei de date care va fi folosită pentru interogările ulterioare. $interogare = "SELECT * FROM nume_tabel LIMIT 0. Funcţia returnează o valoare de tip resursă în cazul în care a fost apelată folosind o interogare care presupune primirea unui rezultat cum sunt comenzile SELECT. În exemplu se face selecţia primelor 10 înregistrări din tabel: Cod: <?php $conectare = mysql_connect("localhost".al doilea parametru reprezintă identificatorul de acces al unei conexiuni către server. mysql_select_db("nume_tabel". pentru ultimul parametru.10". În continuare aveţi un exemplu de interogare a unei baze de date. $rezultat = mysql_query($interogare) or die("Nu se poate executa intero garea!"). EXPLAIN şi DESCRIBE şi nu a aparut nici o eroare. SHOW. este returnată valoarea logică FALSE. ."root". Funcţia mysql_select_db are doi parametri. Funcţia mysql_drop_db are doi parametri. Funcţia are 3 parametri: . iar cel de-al doilea parametru reprezintă identificatorul de acces la conexiunea către server-ul MySQL. Primul este de tip şir de caractere şi reprezinta numele bazei de date care va fi ştearsă."). este returnata valoarea logică TRUE şi valoarea logică FALSE în cazul apariţiei unei erori.$rand['coloana_X'].Această funcţie este folosită pentru a şterge o bază de date. . Utilizarea funcţiei folosind valoarea MYSQL_USE_RESULT pentru ultimul parametru are acelaşi efect cu aplicarea funcţiei mysql_unbuffered_query fără a folosi ultimul parametru. se foloseşte valoarea MYSQL_USE_RESULT. În cazul în care ultimul parametru lipseşte. Funcţia mysql_select_db Această funcţie setează baza de date pentru o conexiune către un server MySQL pentru interogările care vor urma. Dacă.al treilea parametru este opţional şi de tip întreg şi reprezintă modul în care va fi returnat rezultatul. atunci rezultatul primit nu va fi stocat."parola") or die("Nu sa p utut efectua conectarea la bd.primul este de tip şir de caractere şi reprezintă cererea emisă server-ului MySQL. $conectare) or die("Nu se poate selecta t abelul din bd!").

dacă apelăm această funcţie pentru şirul de caractere "D'apoi" vom obţine rezultatul "D\'apoi". Funcţia mysql_real_escape_string are doi parametri. Funcţia returnează un număr întreg care reprezintă numărul de înregistrări conţinute de variabila de tip resursă primită ca parametru. Diferenţa dintre această funcţie şi mysql_query este aceea că. "parola") or die("Nu se poate conecta la server"). echo "In tabel exista ". $conectare) or die("Nu se poate selecta baza de date"). ?> Funcţia mysql_unbuffered_query Această funcţie se foloseşte pentru a interoga o anumită bază de date şi are aceeaşi parametri cu funcţia anterioară. Funcţia mysql_num_rows are un singur parametru. Funcţia mysql_num_rows Această funcţie returnează numărul de înregistrări conţinute de către un rezultat primit de la server-ul MySQL. mysql_free_result($rezultat)." inregistrari in acest moment. Funcţia mysql_free_result Această funcţie se foloseşte pentru a elibera memoria alocată stocării unui rezultat primit în urma unei interogari de la un server MySQL. deoarece caracterul ' (apostrof) are o altă semnificaţie pentru server-ul MySQL dacă nu e precedat de caracterul "\". iar cel de-al doilea reprezintă identificatorul de acces la o conexiune către un server MySQL. şi anume o variabilă de tipul resursă a cărei valoare a fost setată folosind una dintre funcţiile mysql_query sau mysql_unbuffered_query. $total = mysql_num_rows($rezultat). şi anume o variabilă de tip resursă a cărei valoare a fost setată folosind una dintre funcţiile mysql_query sau mysql_unbuffered_query. mysql_select_db("nume_bd". Funcţia mysql_free_result are un singur parametru. în cazul funcţiei mysql_unbuffered_query. Primul este de tip şir de caractere şi reprezintă şirul care va fi transformat.". Funcţia returnează valoarea logică TRUE în cazul în care a reuşit să elibereze memoria utilizată de variabila de tip resursă primită ca parametru şi valoarea logică FALSE în caz contrar. $conectare) or die("Nu se poate face interogarea la baza de date"). .$total. $rezultat = mysql_query("SELECT * FROM nume_tabel".mysql_close($conectare). Cod: <?php $conectare = mysql_connect("localhost". Funcţia returnează un şir de caractere care poate fi interpretat corect de către server-ul MySQL. se foloseşte la interogarea bazei de date valoarea MYSQL_USE_RESULT. În continuare este un exemplu de utilizare a acestei funcţii. "user". În exemplu se afişează numărul total de înregistrări din tabel. De exemplu. Funcţia mysql_real_escape_string Această funcţie este utilă în momentul în care se doreşte introducerea în cadrul unei interogări a unui şir de caractere care nu poate fi interpretat corect de către server-ul MySQL şi realizează transformarea şirului într-unul care poate fi interpretat. dacă ultimul parametru lipseşte.

.elementele din lista rezultată pot fi accesate folosind ambele moduri prezentate anterior.elementele din lista rezultată pot fi accesate folosind doar numerele de ordine ale câmpurilor. Funcţia mysql_info are un singur parametru care reprezintă identificatorul de acces al unei conexiuni spre un server MySQL. Funcţia mysql_stat .primul parametru este de tipul resursă.MYSQL_ASSOC . folosind pentru cel de-al doilea parametru valoarea MYSQL_NUM. . folosind pentru cel de-al doilea parametru valoare MYSQL_ASSOC. cum este cazul funcţiilor INSERT sau UPDATE. Funcţia mysql_affected_rows În cazul interogărilor în urma cărora nu se obţine nici un rezultat. a cărui valoare a fost setată folosind una dintre funcţiile mysql_query sau mysql_unbuffered_query. Dacă nu mai sunt înregistrări de prelucrat. . Funcţia mysql_fetch_assoc Această funcţie transformă o înregistrare dintr-un rezultat primit de la server-ul MySQL într-o listă şi are acelaşi efect cu cel al folosirii funcţiei mysql_fetch_array.elementele din lista rezultată pot fi accesate folosind doar numele câmpurilor.MYSQL_BOTH . care reprezintă numărul de înregistrări actualizate la ultima interogare a bazei de date.mysql_close($conectare).MYSQL_NUM . se poate folosi funcţia mysql_affected_rows pentru a verifica numărul de înregistrări care au fost actualizate la ultima înterogare a bazei de date. numărul lor de ordine sau folosind ambele moduri.al doilea parametru este opţional. Funcţia mysql_fetch_array Această funcţie transformă o înregistrare dintr-un rezultat primit de la server-ul MySQL într-o listă. Funcţia mysql_fetch_array colectează datele referitoare la înregistrarea curentă şi le returnează sub forma unei liste ale cărui elemente pot fi accesate folosind numele câmpurilor. funcţia returnează valoarea logică FALSE. ?> Funcţia mysql_info Această funcţie returnează un şir de caractere care conţine informaţii referitoare la ultima interogare a unei baze de date în urma căreia nu s-a primit nici un rezultat. Cel de-al doilea parametru poate avea una din valorile următoare: . pentru celelalte tipuri de interogări putându-se folosi funcţia mysql_num_rows. Funcţia mysql_fetch_num Această funcţie transformă o înregistrare dintr-un rezultat primit de la server-ul MySQL într-o listă şi are acelaşi efect cu cel al folosirii funcţiei mysql_fetch_array. Funcţia mysql_affected_rows are un singur parametru care reprezintă identificatorul de acces al unei conexiuni spre un server MySQL şi returnează un număr întreg. este de tip întreg şi reprezintă modul în care sa face transformarea. Această funcţie are doi parametri: .

exprimată sub forma unui număr în hexazecimal În afară de ultimile două secvenţe din tabelul de mai sus. Pentru valoarea zecimală 65 poate fi reprezentată în hexazecimal cu nr 41. puteti reprezenta litera A folosind secvenţa escape "\101". valoarea zecimală 65 (care este codul ASCII al literei A) poate fi reprezentată în octal sub forma 101. exprimată sub forma unui număr în octal caracterul asociat valorii ASCII xxx. ?> Utilizarea şirurilor Secvenţe escape Pentru a include caractere speciale în cadrul şirurilor trebuie să folosiţi anumite secvenţe escape. "user". Deci puteţi scrie "\41". fiecare literă sau simbol folosit frecvent în limbile vest-europene are asociat un cod ASCII.Această funcţie returnează un şir de caractere care reprezintă statusul server-ului MySQL şi are un singur parametru care reprezintă identificatorul de acces la o conexiune către un server MySQL. Pentru \xxx puteti folosi reprezentarea în octal (baza 8) a unui cod ASCII pentru specificarea caracterului corespunzător. iar codul asociat cifrei 1 este 49. mysql_stat($conectare)). De exemplu. print_r($stare). care sunt cuprinse între 0 şi 255. Iată un scurt exemplu de utilizare a funcţiei ord() pentru a determina codul ASCII corespunzător unui anumit caracter: . Ca atare. "parola") or die("Nu se poate conecta la server"). codul ASCII asociat literei A este 65. Utilizarea codurilor ASCII În tabelul de mai jos sunt prezentate câteva funcţii PHP folosite la utilizarea codurilor ASCII. celelalte au fost prezentate în articolul Câteva informaţii despre documentarea şi depanarea unui script. De exemplu. mysql_close($conectare). Secvenţa escape \n \r \t \\ \$ \" \xxx \xnn Semnificaţie salt la linie nouă retur de car caracter de tabulare pe orizontală backslaşh simbolul dolarului ghilimele duble caracterul asociat valorii ASCII xxx. Codurile ASCII sunt valori întregi. Cod: <?php $conectare = mysql_connect("localhost". În tabelul de mai jos este prezentat setul de secvenţe escape folosit în PHP. Fiecare dintre aceste secvenţe escape foloseşte un cod ASCII (American Standard Code for Information Interchange) pentru reprezentarea unui caracter. Pentru \xnn puteţi folosi reprezentarea în hexazecimal (în baza 16). $stare = explode(' '.

caracter ec hivalent=$c". puteţi scrie un şir între ghilimele simple.php" alt="" height="1" width="1">'. respectiv hexazecimal al caracterelor ASCII ale căror coduri sunt cuprinse între 32 şi 127: Cod: <?php for ($i=32. $octal=decoct($i).Nu se execută substituţia variabilelor atunci când datele de ieşire sunt reprezentate printr-un şir delimitat prin ghilimele simple.$caracter="A". Un motiv în acest sens îl constituie facilitatea posibilităţii de includere a ghilimelelor duble. zecimal= $i .$caracter. . } ?> Pentru caracterul cu nr 32 caracterul echivalent este un spaţiu." este ". echo "<br>Nr.php\" alt=\"\" height=\"1\" width=\"1\">". Acest şir poate fi scris şi astfel: echo '<img src="pixel. În continuare este un exemplu care afişează echivalenţele în zecimal. În consecinţă dacă folosiţi ghilimele simple ca în exemplul următor: . echo "<br>Valoarea ASCII a caracterului ". $i<128. Datele de ieşire ale acestui exemplu sunt: Valoarea ASCII a caracterului A este 65 Funcţie chr(n) dechex(n) decoct(n) hexdec(n) octdec(n) ord(c) Descriere Returnează Returnează n. $hex=dechex($i). Returnează Returnează n.Singurele secvenţe escape permise în cadrul şirurilor delimitate prin ghilimele simple sunt \\ şi \'. valoarea hexazecimală echivalentă cu valoarea zecimală dată de valoarea în octal echivalentă cu valoarea zecimală dată de n.octal= $octal .$numar. Exemplu: echo "<img src=\"pixel. nu neapărat duble. Returnează Returnează caracterul având codul ASCII dat de n. Şirurile delimitate între ghilimele simple se comportă într-un mod diferit faţă de şirurile delimitate prin ghilimele duble: . octal. valoarea zecimală echivalentă cu valoarea hexazecimală dată de valoarea zecimală echivalentă cu valoarea în octal dată de n. Şirurile delimitate între ghilimele simple Dacă doriţi. $numar=ord($caracter). $i++) { $c=chr($i).hexa=$hex . codul ASCII echivalent caracterului c.

. ca în exemplul următor: $x = "test". dacă argumentul este de tip double. .Specificatorul de tip (obligatoriu): Specificatorul de tip determină modul de tratare şi afişare a argumentului.$x = "test". Şirul de formatare constă dintr-o serie de caractere şi directive ordinare. care trebuie să apară în ordinea indicată: . rezultatul este completat cu spaţii. în afara caracterului %. în speţă printf()şi sprintf(). . $n). urmat de un întreg care determină numărul de cifre după punctul zecimal pe care trebuie sa le conţina rezultatul. precum d. %f". care specifică formatul datelor de ieşire. Directivele reprezintă secvenţe de caractere care încep cu simbolul % acestea determină modul în care va fi formatat argumentul corespunzător. care arată că argumentul trebuie tratat ca număr zecimal. echo 'x este $x'. Pentru a evita astfel de situaţi preferabil e să folosiţi ghilimele duble sau afişarea valorilor din variabile în afara ghilimelelor simple. Un caracter ordinar este orice caracter.Specificator de completare (opţional): Un specificator de completare precizează caracterul care se va folosi pentru a completa rezultatul până la dimensiunea cerută a şirului. pentru a completa un rezultat cu liniuţe de subliniere. rezultatul va fi aliniat la stânga. Un alt caracter de completare poate fi specificat prin prefixarea acestuia cu un singur semn ('). o directivă mai sofisticată poate include următoarele componente. Specificatorul de precizie nu are nici un efect pentru alte tipuri decât double. În cazul în care caracterul de completare este omis. Specificatorul de completare poate fi un caracter spaţiu sau un 0 (zero). sau.Specificator de precizie (opţional): este un punct zecimal. denumit şir de formatare. în timp ce funcţia sprint() returnează datele sale de ieşire sub forma unor valori şir.$x. echo 'x este '. În general. . . iar un specificator de completare zero se foloseşte mai ales alături de numere. specificaţi '_ drept caracter de completare. Cu toate acestea. atunci va conţine şi caractere de completare.Specificator de aliniere (opţional): Un specificator de aliniere indică dacă rezultatul trebuie să fie aliniat la stânga sau la dreapta. numărul minim de caractere situate la stânga punctului zecimal. $x). Caracterele ordinare sunt pur şi simplu copiate la ieşire. iar celelalte argumente specifică valorile care vor constitui datele de ieşire. datele de ieşire vor arăta aşa: x este $x. Funcţia printf() afişează datele sale de ieşire. poate consta dintr-un caracter % urmat de un specificator de tip. $rezultat = sprintf(Valori: %d. O directivă simplă. Specificator de tip Descriere b Tratează argumentul ca pe un întreg şi îl afişează ca valoare binară. fiecare funcţie preia două sau mai multe argumente. Primul argument este un şir. Tabelul de mai jos rezumă specificatorii de tip disponibili. rezultatul va fi aliniat la dreapta. cum este cea din exemplul precedent. Iată un exemplu simplu de utilizare a funcţiei printf(): printf("Valoarea lui n este: %d".Specificator de lăţime (opţional): este un întreg care determină numărul minim de caractere ale rezultatului. Dacă specificatorul de aliniere este omis. Un specificator de completare de tip spaţiu este folosit frecvent cu şirurile. Crearea datelor de ieşire formatate PHP include două funcţii utile pentru generarea datelor de ieşire formatate. dacă se indică o cratimă (-) drept specificator de aliniere. De exemplu. $n. Dacă rezultatul conţine un număr mai redus de caractere.

cu litere scrise cu majuscule.. iar argumentul separator_mii precizează caracterul care se va folosi ca separator al miilor.000000 12. separator_mii) Argumentul numar specifică valoarea numerică pe care doriţi să o formataţi. Tratează argumentul ca pe un întreg şi îl afişează ca număr hexazecimal. respectiv se foloşeste o virgulă pentru separarea miilor. Tratează argumentul ca pe un întreg şi îl afişează ca pe o valoare scrisă în octal. La apariţia a două caractere %. zecimale.345000^^^^^^^^ ^^^^^^^^12. Tratează argumentul ca pe un întreg şi îl afişează ca valoare zecimală. 2) returnează valoarea 1. punct_zecimal.234. rezultatul este formatat fără zecimale. puteţi folosi funcţia number_format(). nu o directivă de formatare. Tratează argumentul ca pe un şir şi îl afişează. care returnează o valoare de tip şir conţinând un rezultat formatat. Tabelul de mai jos prezintă rezultatele aplicării a diferite şiruri de formatare valorilor selectate. Tratează argumentul ca pe o valoare de tip double şi îl afişează ca valoare cu virgulă mobilă.345 "test" "test" Format %d %b %o %x %f %'^-10f %'^10f %'^-10. Exemplu: number_format(1. În tabelul de mai jos spaţiile au fost înlocuite prin caracterul ^.345 12.2f %'^-10s %'^10s Rezultat 100 1100100 144 64 100.c d f o s x X Tratează argumentul ca pe un întreg şi afişează caracterul cu aceeaşi valoare ASCII ca şi argumentul. în cazul omiterii cifrelor zecimale.35^^^^^^^^ ^^^^^^^^12.35 test^^^^^^ ^^^^^^test Dacă preferaţi. două sau patru argumente: number_format(numar) number_format(numar. Remarcaţi că. În mod prestabilit.345 12.2f %'10. Argumentul zecimale specifică numărul dorit de cifre zecimale.345 12. Tratează argumentul ca pe un întreg şi îl afişează ca număr hexazecimal. se produce automat o rotunjire. Valoare 100 100 100 100 100 12. Dacă doriţi să inseraţi simbolul procentului în datele de ieşire ale unui apel la funcţia printf() sau sprintf().23 Manipularea şirurilor şi scrierea expresiilor regulate . zecimale) number_format(numar. inseraţi două caractere % în locul dorit. funcţiile printf() şi sprintf() ştiu că doriţi să inseraţi un simbol al procentului.345000 12. Puteţi apela funcţia cu unul. este inserat un punct înaintea cifrelor care compun partea zecimală. Argumentul punct_zecimal precizează caracterul ce se va folosi drept punct zecimal. cu litere scrise cu minuscule. pentru a vedea mai bine amplasarea acestora.

convertită la majuscule. respectiv 0 în celelalte cazuri. Returnează o valoare mai mică decât zero dacă s1 este mai mic strcmp(s1. echo "<br>Lungimea sirului este de $numar caractere". n) număr de n caractere. Funcţia strncasecmp() a fost adăugată în versiunea PHP 4. să eliminaţi dintr-un şir caracterele de tip spaţiu şi să convertiţi caracterele unui şir în majuscule sau minuscule.PHP conţine peste 70 de funcţii care lucrează cu şiruri. strncasecmp(s1. Execută o comparaţie cu sensibilitate la diferenţa între majuscule şi minuscule. Obţinerea lungimii unui şir Funcţia strlen() returnează lungimea şirului specificat ca argument al funcţiei. Aceste funcţi sunt prezentate în tabelul de mai jos.0. Funcţie . La fel ca strcasecmp() doar că la comparaţie sunt luate în considerare un s2. Aceste funcţii vă permit să obţineţi lungimea unui şir. tabulator şi caracter de salt la linie nouă. Compararea şirurilor şi căutarea în şiruri PHP furnizează patru funcţii care sunt deosebit de utile pentru compararea şirurilor. Returnează o valoare mai mică decât zero dacă s1 este mai mic strcasecmp(s1.2. Returnează valoarea lui s. eliminând dreapta a şirului. Iată un exemplu: $sir="ceva caractere". Descriere Execută o comparaţie fără sensibilitate la diferenţa între majuscule şi minuscule. Această pagină descrie cele mai utilizate funcţii. care nu dispun de nici o reprezentare vizibilă. respectiv 0 în celelalte cazuri. Eliminarea caracterelor dintr-un şir Numeroase funcţii PHP vă permit să eliminaţi caracterele de tip spaţiu alb de la una sau ambele extremităţi ale unui şir. $numar=strlen($sir). eliminând dreapta a şirului. eliminând stânga a şirului. Similar cu chop(). Funcţie chop(s) ltrim(s) rtrim(s) trim(s) Descriere Returnează valoarea lui s. Conversia şirurilor la majuscule sau minuscule Funcţia strtoupper() returnează valoarea argumentului său. s2) decât s2. Aceste funcţii sunt enumerate mai jos. La fel ca strcmp() doar că la comparaţie sunt luate în considerare un număr strncmp(s1. o valoare mai mare decât zero dacă s1 este mai mare decât s2. s2. Funcţia conexa strtolower() returnează valoarea argumentului său. o valoare mai mare decât zero dacă s1 este mai mare decât s2. Returnează valoarea lui s. s2) decât s2. Fiecare funcţie returnează o valoare al cărei semn determină rezultatul comparaţiei. Caracterele de tip spaţiu alb sunt caractere precum spaţiu. eliminând spaţiile albe de la extremitatea din spaţiile albe de la extremitatea din spaţiile albe de la extremitatea din spaţiile albe de la ambele extremităţi. convertită la minuscule. Similar cu rtrim(). Returnează valoarea lui s. n) de n caractere.

\"$b\"): $n". Dacă s1 nu este găsit. Returnează toate şirurile s1 de la prima apariţie a şirului s2 şi până la sfârşit. şi valoarea returnată FALSE. funcţia returnează FALSE. Funcţia strchr() execută aceeaşi operaţie. Returnează toate şirurile s1 de la ultima apariţie a şirului s2 şi până la sfârşit. 6. \"$b\"): $n". Returnează porţiunea şirului s specificată de indexul întreg start. adică părţi dintr-un şir. $n = strpos($s. Dacă s1 nu este găsit. s2). Mai jos este un scurt exemplu care indică un mod adecvat de testare a valorii returnate de funcţia strpos(). La comparaţie este folosit numai primul caracter al şirului s2. care arată că sub-şirul nu a fost găsit. funcţia returnează FALSE. Returnează poziţia întreagă a primei apariţii a şirului s2 în s1. start) substr(s. lung) Mai jos este dat un exemplu care foloseşte funcţiile de mai sus: Cod: <?php $s = "de la deal la vale si iar inapoi la vale mergand spre deal". Şirurile s1 şi s2 sunt comparate fără a se ţine cont dacă literele sunt majuscule sau minuscule. \"$b\"): $n". funcţia returnează FALSE. $b). s2) substr(s. Funcţia strstr() execută aceeaşi operaţie. $b = "al". Dacă s1 nu este găsit. $rezultat = substr($s. funcţia returnează FALSE. echo "<br>strchr(\"$s\". if ($poz === FALSE) { . 6. echo "<br>strrchr(\"$s\". echo "<br>strpos(\"$s\". echo "<br>substr(\"$s\". stristr(s1.Descoperirea şi extragerea sub-şirurilor PHP include numeroase funcţii care găsesc şi extrag sub-şiruri. respectiv de indexurile start şi lung. $n = strrchr($s. funcţia returnează FALSE. 4). astfel încât să se poată face diferenţa între cele două rezultate: $poz = strpos(s1. Returnează toate şirurile s1 de la prima apariţie a şirului s2 şi până la sfârşit. Prima poziţie a şirului este poziţia 0. care arată că sub-şirul a fost găsit în poziţia iniţiala a şirului. s2) strstr(s1. ?> O potenţială dificultate în utilizarea funcţiei strpos() constă în aceea că poate fi greu de sesizat diferenţa dintre valoarea returnată 0. s2) strrchr(s1. $n = strchr($s. Cele mai importante funcţii de acest gen sunt rezumate mai jos: Funcţie strchr(s1. s2) Descriere Returnează toate şirurile s1 de la prima apariţie a şirului s2 şi până la sfârşit. start. 4): $rezultat". Dacă s2 nu este găsit. $b). Dacă s1 nu este găsit. $b). s2) strpos(s1.

?> Scrierea expresiilor regulate În articolul Funcţii PHP pentru expresii regulate am vorbit despre semnificaţia caracterelor care se află într-un sablon. şi având lungimea lungime cu şirul inlocuire. În continuare o să detaliez mai mult expresiile regulate. \"$subiect\"): $rezul tat". Dacă folosiţi în schimb operatorul de egalitate (==). înlocuindu-se prima apariţie a şirului cauta cu inlocuire. } Procedeul prezentat foloseşte operatorul de identitate (===) pentru a determina dacă valoarea returnată este identică (nu doar aritmetic egală) cu valoarea FALSE. Mai jos aveţi un exemplu de utilizare a acestor funcţii: Cod: <?php $subiect = "de la deal la vale si iar inapoi la vale mergand spre deal" . că doriţi să specificaţi un şir care poate include litera b sau litera c. \"$inlocuire\".// sub-sirul nu a fost gasit. $rezultat = str_replace($cauta. returnează valoarea subiect. inlocuire. echo "<br>str_replace(\"$cauta\". echo "<br>substr_replace(\"$subiect\". şi anume str_replace()şi substr_replace(). 6. $cauta = "deal". $inlocuire = "DEAL".Să presupunem. valoare returnată şi dacă sub-şirul este găsit în poziţia initială a şirului. subiect) Descriere Se caută în şirul subiect sub-şirul cauta.Să presupunem că doriţi să specificaţi un şir care poate include orice vocală. start. Acest procedeu presupune utilizarea versiunii PHP 4. este posibil ca rezultatul să fie incorect. dacă sub-şirul este găsit. \"$inlocuire\". în timp ce funcţia substr_replace() noteaza sub-şirul prin pozitia sa în interiorul şirului subiect. funcţia strpos() returna o valoare şir. Funcţie str_replace(cauta. Dacă doriţi să permiteţi şi utilizarea majusculelor. $inlocuire. PHP are două funcţii deosebit de utile pentru asemenea operaţii. Prin includerea valorilor posibile între paranteze. 6... FALSE are valoarea numerică 0. înlocuind sub-şirul care începe de la start inlocuire. $rezultat = substr_replace($subiect. substr_replace(subiect. $inlocuire. . $subiect). în versiunile anterioare ale limbajului PHP. puteţi . . formaţi o expresie regulată echivalentă cu formularea "alege oricare din aceste valori". lungime) Remarcaţi că funcţia str_replace() notează sub-şirul prin valoarea sa. 4). Înlocuirea unui sub-şir O operaţie frecvent folosită în programare constă în găsirea unui sub-şir şi înlocuirea sa cu o valoare nouă. expresia regulată [aeiou] vă poate fi de ajutor.0b3 sau a unei versiuni ulterioare. de exemplu. 4): $rezultat" . Puteţi face aceasta folosind expresia regulată [bc]. Returnează valoarea subiect.

De exemplu. Din pacate. variabilele cookie permit browserului să recunoască utilizatorul şi să restaureze opţiunile selectate de utilizator. "mat" sau "lat" numai dacă şirul subiect este identic cu unul dintre aceste sub-şiruri. Pentru aceasta.1} . expresia regulată ([sml]at){1. variabilele cookie nu constituie soluţia perfectă pentru un mediu de stocare pe termen lung şi prezintă o serie de dezavantaje cum ar fi: .Să presupunem că doriţi să specificaţi un şir care poate include orice caracter scris cu majuscule. "mat" sau "lat". expresia regulată [sml]at$ corespunde sirurilor "sat". Valorile majorităţii variabilelor dispar atunci când scriptul PHP care le conţine îşi încheie execuţia. Pentru a dezactiva semnificaţia specială a caracterului *. aveţi nevoie de expresia regulată [sml]at. Totuşi.Pentru a specifica faptul că o expresie regulată se poate repeta. Semnificaţia acestei expresii regulate este următoarea: "alege oricare dintre literele s. mat şi lat.Pentru a specifica faptul că o expresie regulată corespunde numai unui sub-şir care include caracterul iniţial al unui şir subiect. . care includ limitele superioară şi inferioară ale repetiţiei. . Browserul utilizatorului stocheaza variabilele cookie în unitatea de hard-disk locală a utilizatorului. La ce este utilă o variabilă cookie? De exemplu pentru păstrarea preferinţelor utilizatorului.Să presupunem că doriţi să specificaţi şirurile sat. . De exemplu. De exemplu. . încât au abrevieri: Abreviere + * ? Semnificaţie {1. expresia regulatî [^a-z] corespunde oricărui caracter diferit de un caracter scris cu minuscule. pentru a arăta că o expresie regulată corespunde numai unui sub-şir care include caracterul final al unui şir subiect.Dacă un caracter ^ este primul simbol menţionat între parantezele drepte. .Să presupunem că doriţi să reprezentaţi o înmulţire. Dacă folosiţi caractere minuscule pentru operanzi. unde prin cratimă se înţelege o serie de caractere consecutive. . De exemplu.Similar. expresia regulată [aerou]{1. Puteţi scrie [abcdefghijklmnopqrstuvwxyz] sau puteţi folosi forma mai compactă [a-z].n}. Când utilizatorul revine la pagina vizitată. valorile variabilelor cookie se pot păstra un timp indefinit. expresia regulată ^[sml]at corespunde sub-şirurilor "sat". includeţi părţile respective între paranteze.n}. prefixaţi expresia regulată cu un caracter ^. "mat" sau "lat" numai dacă acestea apar la sfârşitul şirului subiect. nu un caracter dintr-un şir.4} corespunde unui şir care este compus din 1-4 vocale. unde n este un număr arbitrar de mare {0. puteţi obţine ceva de genul [a-z]*[a-z]. "mat" sau "lat" numai dacă acestea apar la începutul şirului subiect.Pentru a specifica repetarea mai multor părţi ale unei expresii regulate. Spre deosebire de acestea. . acesta are ca efect inversarea semnificaţiei expresiei regulate plasate între paranteze. Pentru uşurinţa creeri unor expresii regulate puteţi utiliza şi un program de genul Regex Coach cu care să va faceţi propria expresie pe care apoi să o folosiţi în scripturile dvs.Unele valori care se repetă sunt atât de frecvent folosite.Expresia regulată ^[sml]at$ corespunde sub-şirurilor "sat". expresia regulată va fi urmată de o pereche de paranteze acolade. De exemplu. . anexaţi la expresia regulată caracterul $. . Utilizarea variabilelor cookie Variabilele cookie sunt utile pentru stocarea preferinţelor utilizatorilor şi a altor informaţii care trebuie reţinute atunci când utilizatorul trece la o nouă pagină web. deoarece * este un factor de repetiţie.2} corespunde unui număr de una sau două repetări ale oricăruia dintre şirurile "sat". această expresie regulată nu are semnificaţia dorită. trebuie să îl prefixaţi cu un caracter backslash: [a-z]\*[a-z].scrie [aeiouAEIOU]. m şi l şi scrie după litera respectivă literele at". unde n este un număr arbitrar de mare {0.

variabilele cookie rămân cea mai populara tehnică pentru obţinerea unui mediu de stocare pe termen lung. an) De exemplu următoarea inscrucţiune creează o variabilă cookie care expiră la o secundă după . luna. În general. În ciuda acestor dezavantaje. De asemenea puteţi folosi şi următorul script pentru a afişa toate numele şi valorile variabilelor cookies: foreach ($HTTP_COOKIE_VARS as $nume => $valoare) echo "<br>$nume => $valoare". Puteţi adăuga o valoare de tip decalaj (offset). care are valoarea "vara". puteţi invoca funcţia phpinfo(). trebuie invocată funcţia setcookie(). puteţi specifica momentul expirării folosind funcţia mktime(). Această funcţie are următoarea formă: mktime (ore. . minute. să presupunem că aţi creat o variabilă cookie denumită "anotimp" şi că îi atribuiţi valoarea "vara". care specifică intervalul de timp pe durata căruia variabila cookie trebuie să fie accesibilă.. secunde. Această instrucţiune creează o variabilă cookie denumită "anotimp".Numeroase versiuni ale browserelor frecvent folosite au erori care le împiedică sa folosească variabilele cookie în mod adecvat. Crearea unei variabile cookie Pentru a crea o variabilă cookie. expirare) Argumentul nume specifică numele variabilei cookie. variabilele cookie pot fi vizualizate de alţi utilizatori. "vara".În anumite situaţii. Deci puteţi afişa valoarea variabilei cookie folosind următoarea instrucţiune: echo "Valoarea variabilei cookie este $anotimp". iar argumentul valoare specifică valoarea variabilei. care returnează intervalul de timp (exprimat în secunde) scurs de la 1 ianuarie 1970. time()+3600). Dacă preferaţi. Accesul la o variabilă cookie Dacă aţi creat o variabilă cookie. De exemplu: setcookie ("anotimp". valoarea acesteia este automat pusă la dispoziţie ca variabilă PHP având acelaşi nume cu acela al variabilei cookie. variabila cookie nu mai este accesibilă. este convenabil să se specifice momentul expirării folosind funcţia time().Un site poate stoca numai 20 de variabile cookie şi numai 4 KB de informaţii în unitatea de hdd locală a utilizatorului. zi. . Dacă doriţi să vizualizaţi fiecare variabilă cookie disponibilă şi valoarea acesteia. Argumentul expirare indică momentul expirării variabilei cookie. care are următoarea sintaxă: setcookie(nume. Această pereche numevaloare este apoi pusă la dispoziţia fiecărui script PHP asociat paginilor dvs de web. care afişează valoarea tabloului HTTP_COOKIE_VARS. Această comandă va afişa: Valoarea variabilei cookie este vara Variabila PHP de tip tablou asociativ HTTP_COOKIE_VARS conţine numele şi valoarea fiecărei variabile cookie curentă. valoare.Un utilizator poate dezactiva variabilele cookie prin stabilirea unei opţiuni a browserului. Variabila cookie va fi disponibilă timp de o ora (3600 secunde) de la crearea sa. . De exemplu. după ora specificată.

puteţi şterge o variabilă cookie imediat. Pentru a evita problemele. // afiseaza elementele tabloului din variabila cookie foreach ($rezultat as $i => $cookie) { . $i < 30.miezul nopţii primei zile a anului 2008: setcookie("anotimp". Pentru aceasta. inseraţi valorile într-un tablou şi folosiţi funcţia serialize() pentru a "împacheta" elementele tabloului într-un şir. asiguraţi-vă că un script PHP care stabileşte o valoare a unei variabile cookie este plasat la începutul fişierului. $s). Stocarea mai multor valori într-o variabilă cookie Deoarece un site web poate stoca numai 20 de variabile cookie în sistemul unui utilizator. Trimiterea chiar şi a unui singur spaţiu vă poate împiedica să configuraţi valoarea unei variabile cookie. "vara". înainte de a trimite alte taguri html sau alte caractere către browser. Atenţie!!! Valorile variabilelor cookie sunt trimise de către browser ca parte a antetelor HTTP. valorile variabilelor cookie trebuie să fie stabilite anterior expedierii oricăror altor valori către browser. Ca atare. mktime(0. Această instrucţiune stabileşte timpul de expirare cu o oră (3600 de secunde) în urmă. din moment ce variabila cookie nu va mai fi disponibilă. Totuşi. puteţi recupera valoarea tabloului folosind funcţia unserialize(). ulterior. valoarea sa nu mai are importanţă. Remarcaţi că valoarea variabilei cookie este exprimată sub forma unui şir vid. Ştergerea unei variabile cookie Deoarece o variabilă cookie are o dată de expirare.2008)). capacitatea de a stoca mai multe valori într-o singură variabilă cookie este utilă. "". } // se impacheteaza intregul tablou intr-un sir $s = serialize($tablou). aceasta va fi ştearsă automat la un oarecare interval de timp după crearea sa.1. if (isset($cookies)) { // se despacheteaza valoarea variabilei cookie $rezultat = unserialize(stripslashes($cookies)). Mai jos aveţi un exemplu: Cod: <?php // se creeaza un tablou for ($i = 0. time()-3600).1. Aceste reguli se aplică la fel şi la crearea sesiunilor despre care am discutat în articolele de pe acest site.0. Exemplu: setcookie("anotimp". fixaţi momentul expirării variabilei cookie la un moment de timp din trecut. stabiliţi valoarea variabilei cookie înainte de a executa o instrucţiunie echo sau altă instrucţiune PHP care trimite browserului date de ieşire. De asemenea. $i++) { $tablou[$i] = $i. // se creeaza o variabila cookie setcookie("cookies". Pentru aceasta.1.

Funcţiile în cauză sunt incluse în biblioteca libmcrypt. care specifică dacă o variabilă cookie trebuie trimisă prin intermediul unei conexiuni sigure (HTTPS). care nu face parte din versiunea instalată în mod prestabilit a limbajului PHP.com" ca valoare a argumentului domeniu. valoare. Ca atare. Specificaţia Netscape pentru variabile cookie (http://wp.com. specificând "subdomeniu. pentru a pune variabila cookie la dispoziţia întregului arbore de directoare. precum şi pentru scripturile din subdirectoarele aferente directorului respectiv. Specificaţi valoarea 1 pentru a împiedica transmiterea variabilei cookie în cazul în care conexiunea nu este sigură. /test2 şi în toate directoarele cu nume similare. să presupunem că un script din serverul web http://www. o variabilă cookie este disponibilă numai pentru scripturile rezidente pe serverul web care a creat variabila respectivă. expirare. pentru a face variabila cookie disponibilă în directorul /test şi în subdirectoarele sale. În consecinţa. O complicaţie în utilizarea argumentului cale o constituie modalitatea de identificare a numelor directoarelor. În particular. Deşi argumentele expirareşi cale ale funcţiei setcookie() sunt opţionale. variabila cookie este disponibilă numai pentru gazda respectivă.domeniu. puteţi folosi funcţiile Mcrypt din PHP. Deoarece browserele stochează variabilele cookie în unitatea de hdd locală. Pentru aceasta. variabila cookie va fi disponibilă numai pentru paginile web din cadrul domeniului specificat.echo "<br>$i => $cookie". De exemplu.netscape. Specificând "/test/" ca valoare a argumentului cale. variabila cookie este disponibilă pentru scripturile din directorul care conţine scriptul în care a fost configurată variabila respectivă. specificaţi "/" ca valoare a argumentului cale. Argumentul sigur este o valoare întreagă. pentru a permite transmiterea variabilei cookie prin conexiuni HTTP obişnuite. Specificarea accesului la o variabilă cookie Funcţia setcookie() poate prelua maximum şase argumente. expirare pe care le-am descris în acest articol. domeniu. variabila cookie va deveni disponibilă în /test1. Pentru a pune variabila cookie la dispoziţia scripturilor dintr-un anumit director şi din subdirectoarele sale.com" ca valoare a argumentului domeniu. Argumentul domeniu vă permite să specificaţi numele de domeniu asociat unei variabile cookie.subdomeniu. sigur) În afară de argumentele nume. scripturilor din directoarele părinte ale directorului care conţine scriptul nu li se permite accesul prestabilit la variabila cookie.html) impune ca argumentul domeniu să conţină minimum două caractere punct.domeniu. Cu toate acestea.com creează o variabilă cookie. inclusiv trei argumente despre care nu am discutat încă. cale. unele versiuni ale principalelor browsere prezintă erori care le determină să refuze variabilele cookie dacă aceste . puteţi face variabila cookie disponibilă pe întreg domeniu subdomeniu. valoare. În mod prestabilit. utilizatorii unui sistem pot obţine accesul la fişierele cookie şi pot citi sau chiar modifica informaţiile conţinute în fişierele respective.com/newsref/std/cookie_spec. nu trebuie să specificaţi un şir de tipul "domeniu. specificaţi valoarea 0. } ?> } Acest procedeu reuşeşte să ocolească limita celor 20 de variabile cookie dar nu poate depăşi limita celor 4 KB de date stocate într-o variabilă cookie pentru fiecare site web în parte. De exemplu. pe lângă directorul /test şi sub-directoarele sale. mai este şi argumentul cale care vă permite să specificaţi calea URL asociată variabilei cookie. O modalitate de a preveni situaţia prezentată constă în criptarea datelor stocate în variabilele cookie. În mod prestabilit.domeniu. specificaţi "/test/" ca valoare a argumentului cale. specificaţi o valoare a argumentului cale. Dacă nu este specificat nici un argument domeniu. Iată formatul complet al funcţiei setcookie(): setcookie(nume.

în general este recomandat să specificaţi aceste argumente. "Corpul mesajului". returnează FALSE..ro".argumente nu sunt specificate. antete) unde destinatar indică adresa de e-mail a destinatarului. "Mesaj de test". precum şi alte informaţii. Mesajele de e-mail sunt alcătuite din două părţi: o serie de antete de mesaj şi un corp. corp. Antetele de mesaj indică adresa destinatarului şi subiectul mesajului. Antetele de răspuns ale serverului frecvent folosite descriu configuraţia serverului şi furnizează informaţii referitoare la adresa URL solicitată de client. Pentru aceasta folosiţi funcţia trim() înainte de a trimite mesajul. Antetele generale sunt folosite atât de către clienţi.. Funcţia mail() returnează TRUE dacă serverul SMTP acceptă mesajul.ro". Un exemplu de trimitere a unui mesaj prin intermediul funcţiei mail: mail (destinatar.ro"). Similar. "From: adresa_mea@server. Reţineţi că acceptarea de către serverul SMTP nu garantează transmiterea către destinatar a mesajului dvs. "Corpul mesajului". Configuraţia PHP standard acceptă expedierea mesajelor de e-mail prin intermediul SMTP (abreviere de la Simple Mail Transfer Protocol). aşa cum nu există nici o modalitate absolut sigură de a garanta că destinatarul a citit mesajul. "Mesaj de test". În afară de antetele de răspuns ale serverului şi de antetele de cerere. aceste antete sunt cunoscute sub numele de antete de răspuns al serverului. Menţiune: Înainte de a trimite date HTML unui browser. Antetele de cerere utilizate de obicei descriu configuraţia clientului şi formatele de date acceptabile de către client. în caz contrar. un browser web trimite. l-a înţeles şi că a fost de acord cu el.ro. unul sau mai multe antete HTTP. Puteţi specifica mai mulţi destinatari prin separarea fiecărui destinatar de următorul prin intermediul unie virgule: mail ("adresa1@server1. adresa3@server3.ro. Expedierea mesajelor de poştă electronică În articolul Transmiterea mesajelor prin e-mail folosind PHP şi PEAR am mai discutat depre funcţia mail() şi cum se transmite un mesaj cu ajutorul acestei funcţii. aceste antete sunt cunoscute sub numele de antete de cerere. corp este corpul mesajului şi antete specifică adresele de email suplimentare. subiect specifică antetul de e-mail care conţine subiectul mesajului. înainte de a trimite informaţii unui server web. Exemplu: mail ("adresa_mea@server. în general. adresa2@server2. Recepţionarea mesajelor de e-mail . pentru a specifica informaţii precum data curentă şi opţiunile de conexiune. cât şi de către servere. Ca atare. Nu există nici o modalitate 100% sigură de a verifica faptul că mesajul a fost trimis.ro"). precum antetul from sau alte antete. Corpul conţine mesajul în sine. Acesta este protocolul standard folosit pentru transferul mesajelor de e-mail de la un sistem la altul prin internet. unul sau mai multe antete HTTP. subiect. protocolul HTTP foloseşte antete generale şi antete de entitate. un server web trimite. Antetele de entitate descriu formatul datelor schimbate de un client şi un server. în general. Unele servere SMTP refuză să accepte adrese şi antete care conţin spaţii albe la sfârşit. "From: adresa_mea@server. În acest articol o să încerc să aprofundez mai detaliat expedierea şi recepţionarea mesajelor de e-mail.

Cutia poştală care va fi deschisă (în general INBOX) Argumentul foloseste numeroşi delimitatori pentru a separa un element de altul. Exemplu: Cod: <?php $server = "{mail. } ?> În afară de directorul INBOX standard. Iată o valoare caracteristică a argumentului: {localhost/imap:143}INBOX în cadrul acestui exemplu. folosiţi funcţia imap_open(): imap_open (cutie_postala. apoi se pot trimite cereri serverului şi se pot primi răspunsuri de la acesta. Pentru a deschide o conexiune cu un server IMAP. trebuie deschisa o conexiune cu serverul.este considerat ca fiind directorul curent. $parola = "parola". IMAP (protocolul de recepţionare a mesajelor Interim Mail Access Protocol) nu este o componentă a acestei configuraţii. un director IMAP . care pot fi folosite pentru stocarea şi organizarea mesajelor primite.as. $utilizator. specifică identificatorul de utilizator şi parola folosite pentru a obţine accesul la serverul IMAP. acest lucru este posibil când un server PHP şi un server IMAP rulează pe acelaşi sistem gazdă. identificator_utilizator şi parola. $identificator = imap_open($server. IMAP permite unui utilizator să definească directoare.INBOX sau un alt director .yahoo.ro/imap:143}". trebuie să specificaţi numele gazdei care rulează sistemul IMAP: {mail. $parola). Deşi SMTP face parte din configuraţia PHP standard.Recepţionarea mesajelor de e-mail este un proces oarecum mai complex decât expedierea lor. Aşa cum funcţia fopen() returnează un identificator pe care îl puteţi folosi pentru a obţine accesul la un fişier. numele gazdei este localhost.Protocolul care va fi utilizat (IMAP) . Dacă administratorul serverului nu a configurat serverul PHP astfel încât să lucreze cu IMAP. Mai întâi. În orice moment. parola) Argumentul cutie_postala specifică patru elemente: . funcţia imap_open() returneaza FALSE."INBOX". trebuie închisă conexiunea.Numele gazdei sau adresa IP a serverului IMAP . După terminarea utilizării serverului. $utilizator = "php4". Un server IMAP este accesibil în acelaşi mod ca şi un fişier oarecare. Dacă PHP nu poate deschide o conexiune cu serverul IMAP.Portul care se va folosi pentru conectarea serverului (în general 143) .com/imap:143}INBOX Celelalte argumente ale funcţiei imap_open(). if ($identificator === false) { echo "Nu se poate deschide cutia poatala". Dacă un script se încheie cu mesajul "Call to undefined function: imap_open". După ce . În caz contrar. la fel şi funcţia imap_open() returnează un identificator pe care îl puteţi folosi pentru a obţine accesul la serverul IMAP. identificator_utilizator. exemplele următoare nu vor funţiona. aceasta arată că PHP nu a fost configurat pentru a folosi IMAP.

ro/imap:143}". $prefix. $server."INBOX". numele directoarelor IMAP sunt obţinute prin prefixarea numelui dosarului cu particula "~/mail/" şi "INBOX".$prefix.aţi stabilit o conexiune cu un server IMAP. if ($directoare == false) { echo "A aparut o eroare la afisarea directoarelor". $director = $server. $parola). if ($schimba === false) { echo "Nu se poate deschide directorul specificat". $utilizator. Cu toate acestea. aşa cum am arătat în exemplu. } } ?> Dacă doriţi să creaţi un director nou folosiţi funcţia imap_createmailbox() astfel: . if ($identificator === false) { echo "Nu se poate deschide cutia poatala"."nume_director". puteţi cere serverului să desemneze alt dosar ca dosar curent: Cod: <?php $server = "{mail. "*"). $parola = "parola". Dacă doriţi să afişati directoarele existente în căsuţa de mail puteţi folosi următorul script: Cod: <?php echo "Lista directoarelor". } } ?> De obicei. } else { foreach ($directoare as $cheie=>$valoare) { echo "\n $cheie=>$valoare". $identificator = imap_open($server."INBOX". } else { // se schimba directorul curent $prefix = "~/mail/". $schimba = imap_reopen($identificator. $utilizator = "php4". $director). un administrator de sistem poate configura o altă politică de atribuire a numelor.as. $directoare = imap_listmailbox($identificator.

puteţi obţine acces la informaţii care descriu cutia poştală curentă. $dosar_vechi. Punctul se comportă ca separator de cale. $director = $server. Fiţi atenţi atunci când scrieţi programe care şterg directoare sau atunci când folosiţi scripturi care conţin asemenea programe.". $creare = imap_createmailbox($identificator.". $director). După deschiderea unei conexiuni IMAP."INBOX. $dosar_n ou). puteţi proceda astfel incluzând un punct în numele directorului. } ?> Pentru ştergerea unui director folosiţi funcţia imap_deletemailbox(): Cod: <?php $director = $server.$director.". $modificare = imap_renamemailbox($identificator. $director). un director IMAP şters este eliminat imediat şi în mod irevocabil.$director.$director_nou. if ($stergere === false) { echo "A aparut o eroare la stergerea directorului". De exemplu. $director_nou = $server."INBOX. $stergere = imap_deletemailbox($identificator. Dacă doriţi să creaţi un sub-director. pentru a afla câte mesaje sunt în cutia poştala se invocă funcţia imap_num_msg(): . if ($creare === false) { echo "Nu s-a putut crea directorul". } ?> Numele unui director IMAP trebuie să conţină numai litere.$director_vechi. cifre şi caractere de subliniere.". analog caracterului slash folosit în căile din cadrul sistemului de fişiere.$prefix.Cod: <?php $director = "diverse".$prefix.$prefix.$prefix. if ($modificare === false) { echo "A aparut o eroare la modificarea numelui directorului"."INBOX. } ?> Spre deosebire de mesajele IMAP care rămân în cutia poştală până când le ştergeţi."INBOX. Pentru modificarea numelui unui director din căsuţa de email folosiţi funcţia imap_renamemailbox() astfel: Cod: <?php $director_vechi = $server.

echo "Cutia postala contine $nr_mesaje_recente mesaje recente". } } ?> Rezultatul de ieşire al scriptului va fi: Citat: Cutia postala contine x mesaje Cutia postala contine y mesaje recente Unread: 0 Deleted: 0 Nmsgs: x Size: dimensiunea in octeti a mesajelor Date: data Driver: imap Mailbox: numele cutiei postale Recent: y Se mai poate utiliza şi varianta următoare: Cod: <?php echo "Afisarea starii cutiei postale".nbsp. if ($obiect_cutie_postala) { $tablou_cutie_postala =&. foreach ($obiect_cutie_postala as $cheie=>$valoare) { echo "\n $cheie: $valoare".imap_num_msg($identificator) În continuare este o variantă prin care puteţi obţine diferite informaţii despre conţinutul cutiei poştale: Cod: <?php $nr_mesaje = imap_num_msg($identificator).get_object_vars($obiect_cutie_postala ). $obiect_cutie_postala = imap_mailboxmsginfo($identificator). ?> . print_r($obiect_cutie_postala). $obiect_cutie_postala = imap_mailboxmsginfo($identificator). echo "Cutia postala contine $nr_mesaje mesaje". $nr_mesaje_recente = imap_num_recent($identificator).

0). astfel încât acestea să fie uşor accesibile pentru un script. Funcţia de bibliotecă IMAP imap_fetch_overview() returnează un tablou asociativ care descrie un mesaj. $mesaje = imap_fetch_overview($identificator. O chestie ciudată a serviciului IMAP constă în aceea că fiecare mesaj dintr-un director are atât un număr. Iată un exemplu care afişează informaţiile despre mesaje: Cod: <?php $nr_mesaj = 1. foreach ($mesaje as $mesaj) { foreach ($mesaj as $proprietate=>$valoare) { echo "\n $proprietate: $valoare". dar formatul datelor de ieşire este cu mult mai puţin inteligibil. respectiv la ştergerea mesajelor din dosar. } . } } ?> Funcţia imap_headers() returnează un tablou unde fiecare element descrie un mesaj din directorul curent. $id) O limitare a funcţiei imap_headers() este aceea că nu separă fiecare caracteristică a mesajului în câmpuri distincte. IMAP furnizează funcţii care vă permit să determinaţi identificatorul unui mesaj dacă este dat numărul său şi invers. cât şi un identificator. Numărul reprezintă poziţa mesajului în directorul respectiv. $nr_mesaj. Iată funcţiile descrise mai jos: imap_uid($identificator.Funcţia PHP print_r() afişează valoarea unui obiect. În continuare este un exemplu care afişează o listă de mesaje din directorul curent: Cod: <?php echo "Antete de mesaje in cutia postala curenta:" $antete = imap_headers($identificator). Această metodă este cu mult mai simplă decât cea folosită anterior. } else { foreach ($antete as $cheie=>$valoare) { echo "\n $valoare". if ($antete == false) { echo "A aparut o eroare la afisarea mesajelor". această valoare se poate modifica la adăugarea mesajelor. Pe de altă parte. $numar) si imap_msgno($identificator. identificatorul unui mesaj nu se modifică niciodată.

?> Antetele de mesaj conţin informaţii importante. $id) $corp = imap_body($identificator. care în general nu apar în corpul mesajului. Datele de ieşire conţin următoarele informaţii: subiectul mesajului numele şi adresa de e-mail ale expeditorului data la care a fost trimis mesajul numărul mesajului identificatorul mesajului dimensiunea mesajului în octeţi indicatoare care precizează dacă: = mesajul este recent = mesajul a fost citit = mesajul a primit un răspuns = mesajul a fost marcat în vederea ştergerii = mesajul este o ciornă Pentru a obţine corpul unui mesaj (care include conţinutul efectiv al mesajului) putem utiliza scriptul de mai jos: Cod: <?php // afisare dupa numar $numar = imap_msgno($identificator. echo $corp. $numar = 0. foreach ($antete as $proprietate=>$valoare) { if (!is_array($valoare)) { echo "\n $proprietate: $valoare". $obiect_antet = imap_header_info($identificator. FT_UID). $numar). $numar. Mai jos este dată o variantă de afişare a acestor informaţii: Cod: <?php $n = 0. $antete = get_object_vars($obiect_antet). } else { foreach ($valoare as $sub_valoare) { .?> } Al doilea argument al funcţiei imap_fetch_overview() vă permite să specificaţi o listă sau un domeniu de mesaje pentru care funcţia returnează vederi de ansamblu. precum data şi subiectul mesajului.

dacă este specificată = destinatarilor = destinatarilor eventualelor copii (cc:) = destinatarilor eventualelor copii la indigo necunoscute (bcc:). Pentru a şterge un mesaj IMAP. $sub_valori = get_object_vars($sub_valoare). cum sunt cele returnate de funcţia imap_fetch_overview() numele şi adresa de e-mail ale: = expeditorului = persoanei care primeşte răspunsul.} ?> } echo "\n $proprietate: ". FT_UID). for_each ($sub_valoare as $articol=>$valoare_articol) { echo "\n $articol=>$valoare_articol". Mesajele marcate pentru ştergere. ?> Folosind funcţia print_r() se generează date de ieşire mai puţin inteligibile. dacă există indicatoare de mesaj. $id. sunt numai semnalate ca şterse şi sunt în continuare accesibile. dacă informaţiile respective sunt disponibile Numeroase elemente ale tabloului asociativ au valori de tip tablou. } ?> . Pentru parcurgerea iterativă şi afişarea valorii acestor elemente se foloseşte o buclă îmbricată. Iată un exemplu care vă permite să ştergeţi un mesaj prin specificarea numărului sau a identificatorului mesajului: Cod: <?php $stergere = imap_delete($identificator. dar care nu au fost încă eliminate. } } Obiectul returnat de funcţia de biblioteca IMAP imap_headerinfo() include următoarele informaţii: data expedierii mesajului subiectul mesajului Identificatorul mesajului la care s-a răspuns prin acest mesaj. $numar). Pentru aplicaţi mai puţin pretenţioase se poate utiliza exemplul următor: Cod: <?php $antete = imap_headerinfo($identificator. if ($stergere == false) { echo "Nu se poate sterge mesajul". mai întâi îl marcaţi în vederea ştergerii şi apoi îl eliminaţi. print_r($antete).

puteţi folosi funcţia imap_errors() astfel: Cod: <?php $erori = imap_errors(). $nr_mesaje = "". Când aţi terminat de utilizat un server IMAP./span>imap_mail_copy($identificator. $copiere = <."."INBOX. if ($erori) { foreach ($erori as $cheie=>$valoare) { echo "\n $cheie: valoare". trebuie să îl închideţi.$director. $director ). testaţi următorul script: Cod: <?php $eliminare = imap_expunge($identificator). aşa cum închideţi un fişier atunci când aţi terminat cu el.să se specifice numele gazdei serverului la copierea mesajelor IMAP. $director = $prefix.Pentru a elimina mesajele şterse. } } ?> Pentru copierea unui mesaj din directorul curent într-un alt director se poate folosi funcţia imap_mail_copy() astfel: Cod: <?php $numar = 0. $nr_mesaje. } ?> Deoarece serverele IMAP nu coopereaza la copierea unui mesaj de la un server la altul. nu este necesar . Iată cum se poate închide o conexiune IMAP: .sau posibil . echo "Se copiaza mesajul $numar in directorul $director". if ($copiere === false) { echo "A aparut o eroare la copierea mesajului specificat".$numar. } ?> În cazul în care doriţi să vedeţi exact ce eroare a returnat una din funcţiile bibliotecii IMAP. if ($eliminare == false) { echo "Nu s-a reusit eliminarea mesajelor".

va veni un moment când veţi dori să stocaţi datele ierarhice într-o bază de date. deschideţi o conexiune astfel: $nntp = imap_open("{localhost/nntp:119}comp. Acest magazin îşi sortează alimentele după categorie. ele nu sunt decât un fişier plat. cu multiple soluţii. Numele gazdei.net. Ca exemplu voi folosi arborele dintr-un magazin alimentar fictiv de pe internet. În acest articol vom explora aceste 2 metode de salvare a datelor ierarhice. "". if ($inchidere === false) { echo "Nu se poate inchide cutia postala". puteţi căuta mesaje al căror corp conţine anumite texte. } ?> Biblioteca IMAP furnizează multe alte funcţii în afara celor descrise în acest articol.test". $parola).Cod: <?php $inchidere = imap_close($identificator). funcţiile imap_search() şi imap_scanmailbox() vă permit să căutaţi mesaje care satisfac criteriile specificate. Stocarea unor date ierarhice într-o bază de date Fie că vreţi să vă construiţi propriul forum. De exemplu. De asemenea. Şi. culoare şi tip. Pur şi simplu deschideţi o conexiune cu serverul POP specificând o cutie poştala POP astfel: $mbox = imap_open("{localhost/pop3:110}INBOX". Pentru mai multe informaţii puteţi consulta manualul php de la adresa www. puteţi avea acces la cutia poştală POP cu ajutorul sistemului PHP. Arborele arată astfel: . Stocarea arborilor este o problemă obişnuită. Există 2 abordări importante: modelul listei adiacente şi algoritmul parcurgerii arborelui cu preordine modificată. nu de un server IMAP.php. să vă publicaţi mesajele dintr-un ‘mailing list' pe propriul site de pe internet sau să vă scrieţi propriile CMS. Pentru aceasta. dacă nu folosiţi o bază de date cu suport XML. puteţi folosi biblioteca IMAP pentru a vă conecta la un server de informaţii folosind NNTP (Network News Transfer Protocol). În cazul în care furnizorul de servicii internet dispune de un server POP. Va trebui să gasiţi un mod de a traduce ierarhia într-un fişier plat. protocolul şi numărul portului sunt asemănătoare cu valorile similare folosite pentru conectarea la un server IMAP. De exemplu. folosind biblioteca IMAP. tabelele nu sunt ierarhice. ""). $identificator_utilizator.

Acest articol conţine un număr de exemple de coduri care arată cum se salvează şi se restabilesc datele. Pentru fiecare dintre aceşti copii. am ales să scriu exemplele în PHP. Această funcţie va trebui să înceapă la nodul rădăcină . am folosit valoarea "title" pentru a identifica fiecare nod. Este o abordare elegantă pentru că veţi avea nevoie de o simplă funcţie care să se repete în arborele dvs. Nodul rădăcină. funcţia ar trebui să . Putem vedea că "Pear" este un copil al lui "Green" care este un copil al "Fruit" s.d. e timpul să scriem o funcţie de afişare.nodul fără nici un părinte – şi ar trebui după aceea să arate toţi copiii acelui nod. Pentru simplificare. În magazinul nostru de alimente tabelul arată astfel: După cum vedeţi salvaţi "părintele" fiecărui nod. nu are o valoare parentală. Deoarece folosesc eu însumi acest limbaj şi mulţi alţi oameni îl folosesc sau îl cunosc. Probabil că-l puteţi traduce uşor în limbajul pe care vi-l doriţi. Metoda recursivă Prima şi cea mai elegantă abordare pe care o vom încerca se numeşte metoda recursivităţii . "Food".m.a. într-o bază de date reală. Bineânţeles. ar trebui să folosiţi id-ul numeric al fiecărui nod. Daţi-mi arborele Acum că am introdus arborele nostru în baza de date.

Aşa după cum probabil că aţi observat. // folosit pentru a arata un arbore frumos indentat function display_children($parent. dacă vreţi să vedeţi un sub-arbore. De exemplu. ar trebui să puneţi în aplicare . display_children(' '.m. Acesta este mecanismul recursiv care-i dă metodei numele de " metoda recursivităţii". Pentru aceşti copii."\n".$row['title']. pentru a arăta sub-arborele "Fruit".'). există un tipar regulat în descrierea acestei funcţii. Acea funcţie ar trebui atunci să pornească o altă instanţă a ei însăşi pentru fiecare dintre aceşti copii.'WHERE parent="'. pentru a-i arăta pe toţi copiii acestora.$level). // foloseste din nou aceasta functie pt a arata // copiii acestui copil display_children($row['title']. Putem pur şi simplu să scriem o funcţie care restabileşte copiii unui anumit nod părinte.0). Cod: <?php // $parent este parintele copiilor pe care vrem sa-i vedem // $level creste cand inaintam in arbore. $level) { // restabileste toti copiii $parent $result = mysql_query('SELECT title FROM tree '. } } ?> Pentru a arăta întregul nostru arbore. Pentru arborele magazinului nostru de alimente funcţia returnează: Citat: Food Fruit Red Cherry Yellow Banana Meat Beef Pork Observaţi că. $level+1). $parent. puteţi indica funcţiei să pornească cu un alt nod.a.'". funcţia ar trebui să arate din nou toţi copiii s. vom pune în aplicare funcţia cu un "string" gol cum ar fi $parent şi $row =0.d. // arata fiecare copil while ($row = mysql_fetch_array($result)) { // indenteaza si arata titlul acestui copil echo str_repeat(' '.restabilească şi să arate toate nodurile copii ale acelui copil.

dacă ştiţi numele sau id-ul acelui nod. Cod: <?php // $node este numele nodului a carui cale o dorim function get_path($node) { // cauta parintele acestui nod $result = mysql_query('SELECT parent FROM tree '. } // returneaza calea return $path. funcţia noastră va trebui să pornească la cel mai profund nivel : "Cherry".'WHERE title="'.'). După aceea. În exemplul nostru. Pentru a găsi această cale. Calea către un nod Cu aproximativ aceeaşi funcţie. // ar trebui sa adaugam calea spre parintele acestui nod // la cale $path = array_merge(get_path($row['parent']). aşa că pentru a arăta calea putem folosi print_r(get_path('Cherry')). veţi vedea că: Citat: ARRAY ( [0] => Food [1] => Fruit . // salveaza calea in aceasta ordine $path = array(). este numele // parintelui lui $node $path[] = $row['parent']. $node. putem calcula calea spre "Cherry". Si acest lucru ne este dat de funcţia pe care tocmai am folosit-o: căutând în mod recursiv părinţii. ea caută părintele acestui nod şi-l adaugă la cale. folosind calea spre "Red". Dacă stim că "Red" este părinte pentru "Cherry". calea spre "Cherry" este "Food" > "Fruit" > "Red". Ea restabileşte calea ca o dispunere. $row = mysql_fetch_array($result). // continua numai daca acest Snod nu este nodul radacina // (acesta este nodul fara nici un parinte) if ($row['parent']!='') { // ultima parte a caii spre $nod.'". puteţi căuta calea spre un nod.0).display_children('Fruit'. Dacă faceţi acest lucru pentru "Cherry". ca un array. $path). } ?> Această funcţie restabileşte acum calea către un nod dat. vom găsi calea către orice nod din arbore. acesta ar fi "Cherry". De exemplu.

aşa că n-ar trebui să folosim o funcţie recursivă. Vom numi aceste numere stângul şi dreptul (de exemplu valoarea stângă pentru "Food" este 1. Recursivitatea poate fi lentă. recursivitatea este foarte lentă atunci când este aplicată pe arbori mari. veţi pune în aplicare patru instanţe ale funcţiei în acelaşi timp. aceasta face ca funcţia să fie foarte lentă când se aplică pe arbori mari. Spre deosebire de limbaje cum ar fi Lisp. Structura arborelui este acum stocată în valorile din stânga şi din dreapta. Ultimul număr este scris în dreapta nodului "Food". Vom începe prin a aşeza arborele nostru în poziţie orizontală. Atunci care sunt dezavantajele modelului acestei structuri de date? În majoritatea limbajelor de programare. cele mai multe limbaje nu sunt concepute pentru funcţii recursive. este lentă şi ineficientă. Al doilea motiv pentru care această metodă nu este atât de rapidă. Şi cum fiecare funcţie ocupă o felie de memorie şi are nevoie de ceva timp pentru a porni. el este un descendent al nodului 1-18 "Food". Am prefera să avem o singură interogare pentru fiecare activitate. Parcurgerea în preordine modificată a arborelui Acum. E uşor de înţeles şi codul de care avem nevoie este de asemenea simplu. Cum fiecare interogare durează destul de mult. Urmăm arborele spre "Fruit" şi scriem 2 lângă el. În acest fel. aceasta este o metodă excelentă. puteţi vedea întregul arbore numerotat şi câteva săgeţi care arată ordinea numerotării. Pentru fiecare nod. După cum vedeţi. putem spune că toate nodurile cu valorile din stanga mai mari decât 2 şi valorile din dreapta mai mici decât 11 sunt descendenţi ai nodului 2-11 "Fruit". este limbajul de programare pe care probabil îl veţi folosi. În această imagine. aceste numere indică relaţia care se stabileşte între fiecare dintre aceste noduri. Acest lucru se datorează în special recursivităţii. pentru un arbore cu patru nivele. Deoarece "Red" are numerele 3 şi 6. În acelaşi fel. funcţia porneşte o altă instanţă a ei însăşi. Am dori de asemenea să micşorăm numărul interogărilor în baza de date. Pornim de la nodul rădăcină ("Food") şi scriem 1 în stânga lui. să aruncăm o privire asupra unei alte metode de stocare a arborilor. valoarea dreaptă este 18).[2] => Red ) Dezavantaje Aşa cum tocmai am văzut. mergem de-a lungul marginilor arborelui în timp ce scriem câte un număr în stânga şi în dreapta fiecărui nod. Aşa că. Avem nevoie de o interogare în baza de date pentru fiecare nod din arbore. Această metodă de a merge de jur împrejurul arborelui şi de a număra nodurile se numeşte algoritmul "Parcurgerea în preordine modificată a arborelui" .

aşa că. Putem face aceasta. De fiecare dată când începeţi cu copiii unui nod. Ultima problemă care ne-a mai rămas este indentarea. va trebui să adăugăm o clauză ORDONEAZA DUPA la această interogare. copiii ar trebui indentaţi ceva mai mult decât părintele lor. Ştiţi că toţi copiii acelui nod au o valoare-dreapta mai mică decât valoarea din dreapta a părintelui. probabil că el nu va fi în ordinea corectă. va trebui să selectaţi numai nodurile cu o valoare-stânga cuprinsă între 2 şi 11. Observaţi de asemenea că nu prea mai avem nevoie de coloana părinte . dacă vreţi subarborele "Fruit". va trebui să folosim "lft" şi "rgt" pentru a identifica coloanele. iată un arbore întreg într-o singură interogare. . De aceea. Această interogare returnează: Ei bine. adăugaţi valoarea din dreapta a acelui nod la stivă. să vedem cum arată aceste valori în tabelul nostru: După cum observaţi. Avem acum valorile "lft" şi "rgt" pentru a stoca structura arborelui. Extragerea datelor din Arbore Dacă vreţi să arătaţi arborele folosind un tabel cu valorile din stânga şi din dreapta. ar trebui să ordonăm rândurile după valoarea lor din stânga. În SQL. cuvintele "left" şi "right" au un înţeles special în SQL. Pentru a arăta acest arbore aşa cum am procedat cu funcţia noastră recursivă. o să puteţi vedea dacă încă mai arătaţi copiii acelui părinte. Când aţi terminat de arătat un nod. De exemplu. Pentru a arăta structura arborelui. SELECT * FROM tree WHERE lft BETWEEN 2 AND 11 ORDER BY lft ASC. va trebui mai întâi să identificaţi nodurile pe care vreţi să le restabiliţi. dacă o să comparaţi valoarea din dreapta a nodului curent cu ultimul nod din dreapta aflat în stivă. aceasta ar însemna: SELECT * FROM tree WHERE lft BETWEEN 2 AND 11. Dacă adăugaţi şi ştergeţi rânduri din tabelul dvs. păstrând o stivă a valorilor din dreapta.Înainte de a continua. De aceea.

$root. va trebui de asemenea să găsim un nou mod de a obţine calea către un anumit nod. lft. . Dacă veţi număra elementele din stivă. Pentru a obţine toţi strămoşii. nu este foarte greu. Noua noastră funcţie va fi probabil mai rapidă.count($right)).')."\n". $row['rgt']. } } // arata titlul nodului indentat echo str_repeat(' '. o să vedeţi că valorile din stânga ale tuturor strămoşilor sunt mai mici decât 4.'). veţi obţine nivelul nodului curent. la nodul 45 "Cherry". Cu structura noului nostru tabel. în timp ce toate valorile din dreapta sunt mai mari decât 5.$row['title']. Cod: <?php function display_tree($root) { // acum. veţi obţine exact acelaşi arbore pe care l-aţi obţinut cu funcţia recursivă discutată mai sus. $row = mysql_fetch_array($result). // adauga acest nod la stiva $right[] = $row['rgt'].'".' AND '. } } ?> Dacă veţi folosi acest cod. vom avea nevoie de o listă a tuturor strămoşilor acelui nod. de exemplu. putem folosi această interogare: SELECT title FROM tree WHERE lft < 4 AND rgt > 5 ORDER BY lft ASC. Pentru a obţine această cale. nu este recursivă şi foloseşte doar două interogări Calea către un nod Cu acest nou algoritm.$row['lft']. // acum. restabileste toti descendentii nodului $root $result = mysql_query('SELECT title. 'WHERE lft BETWEEN '. rgt FROM tree '.îndepărtaţi valoarea sa din partea dreaptă din stivă. // incepe cu o stiva $right goala $right = array(). // arata fiecare rand while ($row = mysql_fetch_array($result)) { // verifica stiva numai daca exista una if (count($right)>0) { // verifica daca ar trebui sa indepartam un nod din stiva while ($right[count($right)-1]<$row['rgt']) { array_pop($right).'WHERE title="'. Când vă uitaţi.' ORDER BY lft ASC. rgt FROM tree '. restabileste toti descendentii nodului $root $result = mysql_query('SELECT lft.

left . folosind puţină matematică. Să scriem un scenariu care transformă o listă adiacentă într-un tabel traversal al arborelui cu preordine modificată. Deoarece fiecare descendent incrementează valoarea din dreapta a nodului cu 2. vă pot spune că nodul 2-11 "Fruit" are 4 noduri descendenţi şi că nodul 8-9 "Banana" este doar un copil. avem cu adevărat nevoie de un scenariu care să facă toată această numărătoare şi înconjur al arborelui pentru noi. // obtine toti copiii acestui nod $result = mysql_query('SELECT title FROM tree '.'".Observaţi că. trebuie să folosim clauza ORDONEAZA DUPA pentru a sorta nodurile.'). Câţi descendenţi Dacă îmi daţi valorile din stânga şi din dreapta ale unui nod.'WHERE parent="'. $left) { // valoarea din dreapta a acestui nod este valoarea din stanga + 1 $right = $left+1.1) / 2 Cu această formulă simplă. Automatizarea parcurgerii arborelui Acum că aţi văzut câteva dintre lucrurile uşoare pe care le puteţi face cu acest tabel. întocmai ca în investigaţia noastră precedentă. vă pot spune căţi descendenţi are. e timpul să învăţăm cum putem automatiza crearea acestui tabel. Această interogare va returna: Citat: +-------+ | title | +-------+ | Food | | Fruit | | Red | +------Acum nu ne rămâne decât să intrăm pe fiecare rând pentru a găsi calea spre "Cherry". Cod: <?php function rebuild_tree($parent. Cu toate că este un exerciţiu plăcut atunci când e făcut prima dată şi cu un arbore mic. nu un părinte. while ($row = mysql_fetch_array($result)) { // executarea recursiva a acestei functii pt fiecare // copil al acestui nod . numărul descendenţilor poate fi calculat cu: $descendants = (right . $parent.

ea ajunge la acelaşi rezultat la care am ajuns noi manual la începutul acestui capitol. După ce aţi pus în aplicare această funcţie. Această valoare este folosită atunci ca valoare din dreapta a nodului "Food". sau puteţi reactualiza valorile din stânga şi din dreapta ale tuturor nodurilor în partea dreaptă a fiecărui nod nou. această funcţie se repetă şi ultima valoare din dreapta este restabilită. rgt='. Recursivitatea face ca această funcţie să fie. veţi vedea că valorile din stânga şi din dreapta rămân aceleaşi (o verificare rapidă. UPDATE tree SET lft=lft+2 WHERE lft>5.1). Reactualizarea nodului "Red" înseamnă că va trebui să adăugăm 2 la toate valorile din stanga şi din dreapta mai mari decât 5. 1. } ?> Aceasta este o funcţie recursivă. dar nu foarte eficientă cu arbori mari. prin complexitatea ei.$left. adăugaţi-l la tabel şi setaţi coloana părinte. Vom folosi interogarea: UPDATE tree SET rgt=rgt+2 WHERE rgt>5. Acest nod are valoarea . Cea de-a doua modalitate de a adăuga şi şterge noduri constă în reactualizarea valorilor din stânga şi din dreapta ale tuturor nodurilor în partea dreaptă a noului nod. ea stabileşte valorile din stânga şi din dreapta ale acestui nod. // returneaza valoarea din dreapta a acestui nod + 1 return $right+1. iar nodul 7-10 "Yellow" ar trebui schimbat în 9-12 etc.dreapta de la "Red" ar trebui schimbată din 6 în 8. Ar trebui s-o porniţi cu rebuild_tree('FOOD'.dreapta 7. Apoi. Prima opţiune este simplă.$parent. $right). o "Strawberry". Dacă există copii. Mai întâi. Acum putem adăuga un nou nod "Strawberry" pentru a umple noul spaţiu. Valoarea din stânga este dată.// $right este valoarea dreapta curenta. va trebui să facem puţin loc.stânga 6 şi valoarea . iar valoarea din dreapta este valoarea din stânga plus 1. atunci funcţia restabileşte toţi copiii nodului "Food".'". Dacă vreţi să adăugaţi un nou nod. care este // incrementata de functia rebuild_tree() $right = rebuild_tree($row['title']. destul de greu de înţeles. Totuşi. valoarea din dreapta a nodului rădăcină ar trebui să fie egală cu de două ori numărul nodurilor).'). .' WHERE ti tle="'. Dacă nu există copii.'. adăugând câte un nod pentru fiecare nod pe care îl vede.$right. Adăugarea unui nod Cum adăugăm un nod la arbore? Există două abordări: puteţi păstra coloana părinte în tabelul dvs şi doar să porniţi din nou funcţia rebuild_tree() – o funcţie simplă dar nu aşa de elegantă. Această opţiune este uşoară. Să ne uităm la un exemplu. Vrem să adăugăm un nou tip de fruct. } // am obtinut valoarea din stanga. Ea merge în jurul arborelui. Folosiţi metoda listei adiacente pentru reactualizare şi algoritmul parcurgerii arborelui cu preordine modificată pentru restabilire. nu vă rămâne decât să reporniţi funcţia rebuild_tree(). si acum ca am procesat // copiii acestui nod stim si valoarea din dreapta mysql_query('UPDATE tree SET lft='. ca ultim nod şi copil al "Red". Valoarea .

techtarget.30 aprilie 2003 (Traducere efectuată de Dragos după articolul original) .ac.html Autor articol: De Gijs Van Tulder . Vă las să judecaţi singuri.apache. vom vedea că noul nostru nod "Strawberry" a fost introdus cu succes în arbore: Citat: Food Fruit Red Cherry Strawberry Yellow Banana Meat Beef Pork Dezavantaje În primul rând.html Xindice.INSERT INTO tree SET lft=6. Reactualizarea arborelui impune mai multe investigaţii. Este cu siguranţă mai greu decât metoda listei adiacente. ceea ce durează mai mult.com/tip/1.org/article/Four_ways_to_work_with_hierarchical_data/17/4047/index. odată ce v-aţi obişnuit cu proprietăţile valorilor din stânga şi din dreapta. Deşi prefer oarecum parcurgerea arborelui cu preordine modificată. Dacă pornim funcţia noastră display_tree()..evolt.uk/IT/Docs/Ccourse/subsection3_9_5. Totuşi. baza de date XLM nativă: http://xml. algoritmul parcurgerii arborelui cu preordine modificată pare greu de înţeles.sid13_gci537290.289483. rgt=7.00. în cazul dvs. Concluzie Acum v-aţi familiarizat cu ambele metode de stocare a arborilor într-o bază de date.strath. dar restabilirea nodurilor se realizează cu o singură interogare.org/xindice/ O explicaţie a recursivităţii: http://www.html Alte două metode pentru a opera cu datele ierarhice: http://www. metoda listei adiacente ar putea fi mai bună. este evident că puteţi face cu această tehnică aproape tot ce făceaţi cu metoda listei adiacente şi că algoritmul traversal al arborelui cu preordine modificată este mult mai rapid. title='Strawberry'. Lecturi suplimentare Mai multe despre Arbori în SQL de specialistul în baze de date Joe Celko: http://searchdatabase.

fără a defini însă comportamentul acestor metode. "Este folositor?". Noţiuni Încerc să respect cât mai exact regulile publicate sub numele de Coding Standards pe pagina de web PEAR.PHP 5. I. Documentaţia "inline" a claselor. Factory O să încerc pe parcursul acestui tutorial să explic diferite tehnici introduse în PHP 5 pe care îmi place să le folosesc (sau mi-ar plăcea). Am parcurs cu atenţie codul postat acolo. o să folosesc php CLI şi un director numit trace_factory. metodelor şi atributelor este foarte folositoare când citesc codul sursă al unui fişier scris în urmă cu 6 luni. m-am hotărât să implementez un exemplu scris în java. III. Google mi-a mai adus câteva articole interesante. Design Patterns and Useful Objects . Motivul? Data viitoare când am nevoie de ceva asemănător să pot găsi repede şi cât de cât documentat informaţiile necesare.trace * @access public . Intro Primul exemplu prezentat în această serie se referă la implementarea conceptului de factory în php. "Se merită?" am citit articolul "The Factory Method" de Harry Fuecks. Interfaţa. Pentru teste. Pentru a-mi răspunde la întrebarile "Ce este un Factory?". "La ce mă ajută?". ţinând cont că la un moment dat voi pierde aceste lucruri printr-un colţ al hdd-ului. şi am mai citit şi paginile astea ce fac parte din prezentarea "2002 International PHP Conference: Applied OO PHP: APIs.factory. Traducerea interfeţei din java în PHP 5 arată cam aşa: Cod: <?php /** * Is the Trace Interface * It contains common methods for every implementation * @package test.Chuck Hagenbuch". printr-o interafţă putem creea un obiect care specifică metodele pe care o clasă trebuie să le implementeze. Acest exemplu nu este complet şi nu poate fi considerat un exemplu standard al ideii de factory. II. Din documentaţia prezentată în manual. Într-un final. Am găsit şi un tutorial aici. De obicei folosesc phpDocumentor pentru a genera din codul php documenţii în mod profesional.

StdoutTrace. IV. /** * Sets the debug * @param bool debug * @return void * @access public */ .*/ interface Trace { /** * Turn on and off debugging * @param bool debug */ public function setDebug($debug).factory. va scrie mesajele într-un fişier text.php').php.trace * @access public */ class StdoutTrace implements Trace { /** * debug * @var bool * @access private */ private $debug. Continuând exemplu. /** * It display the trace to stdout * * @package test. vom scrie două implementări. va afişa mesajele în consolă (sau pagina web dacă se renunţă la CLI) iar cea dea doua. } ?> fişier pe care l-am salvat cu numele de ITrace. /** * Write out a debug message * @param string message to debug */ public function debug($message).php Cod: <?php include_once('ITrace. prima. /** * write out an error message * @param string message to debug */ public function error($message).

php Cod: <?php include_once('ITrace.$message.php'). } } ?> Fişierul l-am salvat cu numele de StdoutTrace."\n".trace * @access public */ class FileTrace implements Trace { /** * It`s the file handler ." ERROR >>>>". } /** * It writes a debug message * only if debug is setted to true * @param string message * @return void * @access public */ public function debug($message) { if($this->debug) { // only print if debug is true echo date("d-m-Y H:i:s").php în acelaşi director.factory.public function setDebug($debug) { $this->debug = $debug.$message. V. FileTrace."\n". /** * It logs the trace to a file * * @todo: implement a custom Exception class * @package test." DEBUG >>>>". } } /** * It writes an error message * * @param string message * @return void * @access public */ public function error($message) { // always print out errors echo date("d-m-Y H:i:s").

" at ". /** * debug * @var bool * @access private */ private $debug." is not writable. "a+").__METHOD__.\n Or it dosent exist in ". * @var handler * @access private */ private $handler. /** * Is the file name * @var string * @access private */ private $file.).$file. /** * The construnctor * it opens the file handler * * @param string the file name * @return void * @access public */ public function __construct($file) { // a real FileTrace would need to obtain the filename somewhere if((!is_file($file)) or (!is_writable($file))) { throw new Exception("The file ".__LINE__."!\n" } $this->handler = fopen($file. } /** * It writes a debug message * only if debug is setted to true * @param string message * @return void * @throw Exception * @access public */ public function debug($message) { if($this->debug) { . } /** * Sets the debug * @param bool debug * @return void * @access public */ public function setDebug($debug) { $this->debug = $debug.

trace */ class TraceFactory { .// only print if debug is true fwrite($this->handler<.php'). include_once('StdoutTrace." DEBUG >>>> "." ERROR >>>> ". } } } ?> Fişierul l-am salvat cu numele de FileTrace. /** * Is the factory * * @access public * @package test."\n"). date("d-m-Y H:i:s")./span>.php în acelaşi director. VI.$message. } /** * Is the Destructor * just close the handle * @access public * return void */ public function __destruct() { if($this->handler===true) { fclose($this->handler)."\n"). $message. date("d-m-Y H:i:s").factory. Factory Cod: <?php include_once('FileTrace.php'). } } /** * It writes an error message * * @param string message * @return void * @throw Exception * @access public */ public function error($message) { // always print out errors fwrite($this->handler.

cele două noi obiecte vor trebui să implementeze metodele prezentate în interfaţa ITrace. În partea I. să arunc excepţia. trebuia să arunce o excepţie în constructor. însă dacă totul este în regulă. cred că e timpul să explic ce am făcut până acum. am scris şi un destructor. Am decis să deschid fişierul în mod a+ (read/write. o să pot afişa un mesaj de debug (bineânţeles dacă am făcut setDebug(true) în prealabil). iar condiţia: if($this->handler===true) . return $t. în exemplul urmat de către mine. } catch (Exception $ex) { $t = new StdoutTrace(). aici. În cea de-a doua parte. "a+")./** * It trys to get a trace * * @access public * @return mixed Trace Interface implementation */ public static function &getTrace($file='') { try { return new FileTrace($file). Am decis că în cazul în care fişierul în care vrem să log-ăm mesajele nu există sau nu se poate scrie în el. am implementat interfaţa ITrace în două cazuri. VII. În plus faţă de exemplul urmat. debug($message). Ceva explicaţii Înainte de a merge mai departe. să creez handlerul ( :) ): $this->handler = fopen($file. FileTrace ce îmi va permite să log-ez mesajele de eroare/debug într-un fişier text şi StdoutTrace. } } } ?> Salvat cu numele de TraceFactory. place the file pointer at the end of the file). $t->error("Could not instantiate FileTrace: " + $ex>getMessage()). la fel ca în exemplul pe care l-am urmat. Obligatoriu.php. FileTrace. dar acesta nu era necesar (PHP va închide automat după terminare executarea codului handlerul?). Detalii despre fopen. care îmi va permite să schimb nivelul afişat de trace (debug sau error). am scris o interfaţă ce conţine trei metode: setDebug($debug). va afişa un mesaj de eroare tot timpul (indiferent de valoarea setată pentru $debug). error($message). Am încercat să implementez în PHP 5 un model de factory preluat dintr-un exemplu dat în java. cu toate că probabil a era destul (nu intenţionez să şi citesc fişierul). ce îmi va permite să afişez aceste mesaje în consolă (pagina web).

din constructori. " DEBUG >>>> " .php: Cod: <?php include_once('TraceFactory. dacă nu reuseşc acest lucru (catch).php'). Pentru o mai mare flexibilitate.PrintWriter pw cu $handler. (??) cu fwrite($this->handler. Folosesc un bloc try/catch pentru a intercepta exceptia aruncată de constructorul din FileTrace. Voi continua cu explicaţii pentru TraceFactory. Dar. cu menţiunea că numele obiectului prezentat în exemplu (SystemTrace). Exact ca în exemplul urmat. în StdoutTrace lucrurile sunt destul de clare. Poate că sensul exemplului s-a schimbat în momentul în care am decis să pasez numele fişierului în care se face logarea. initializez StdoutTrace care va merge sigur având astfel posibilitatea de a afişa mesajele de eroare/debug. Acest lucru. Comparaţie: pw = new java. reprezentând numele fişierului în care voi loga mesajele. cu toate că acum este destul de intuitivă. pw.println( "DEBUG: " + message ). VIII. (nu o să reţint foarte uşor linia asta) cu $this->handler = fopen($file.io.log). l-am înlocuit cu StdoutTrace. exact ca în exemplu. Ca o mică traducere. date("d-m-Y H:i:s") .log" ) ). am declarat metoda ca fiind statică. încerc (try) să returnez o nouă instanţă a obiectului FileTrace.io.flush(). sau cu modalitatea de scriere (de exemplu): pw.FileWriter( "c:\trace. asta este deja o altă discuţie.nu cred că îşi are rostul (poate se întâmplă altceva în $this->handler = fopen($file. "a+"). În schimb. "a+") ?).PrintWriter( new java. am decis ca numele fişierului în care să log-ăm mesajele să fie pasat în constructor (parcă aş vrea să meargă şi pe linux şi pe windows în aceiaşi manieră. În partea următoare. $message . şi am constatat că în PHP pentru a scrie ceva într-un fişier este mai intuitiv şi mai uşor de reţinut.io. "\n"). o să încerc şi o implementare a acestui exemplu. nu folosind un nume de fişier predefinit: c:\trace. adăugând în plus parametrul $file. ca în PHP să înlocuiesc atributul: private java. . O implementare Am scris fişierul runTrace. aduce şi modificări directe în factory. Am decis.

$t = &TraceFactory::getTrace($filename). for($i=1.$filename = 'logger. } unset($t). ?> După execuţie. $t = &TraceFactory::getTrace().$i).php 15-01-2005 14:42:24 ERROR >>>>0 15-01-2005 14:42:24 ERROR >>>>Ceva de test! 15-01-2005 14:42:24 DEBUG >>>>True Debug 15-01-2005 14:42:24 DEBUG >>>>Za I :: 1 15-01-2005 14:42:24 DEBUG >>>>Za I :: 2 15-01-2005 14:42:24 DEBUG >>>>Za I :: 3 15-01-2005 14:42:24 DEBUG >>>>Za I :: 4 15-01-2005 14:42:24 DEBUG >>>>Za I :: 5 15-01-2005 14:42:24 DEBUG >>>>Za I :: 6 15-01-2005 14:42:24 DEBUG >>>>Za I :: 7 15-01-2005 14:42:24 DEBUG >>>>Za I :: 8 15-01-2005 14:42:24 DEBUG >>>>Za I :: 9 15-01-2005 14:42:24 ERROR >>>>FOO IS BAR MUST DIE !!! iar în fişierul logger. touch($filename).$i++) { $t->debug("Tha lup :: ". $i). $t->setDebug(true).$i<10.log am: Citat: 15-01-2005 14:42:24 ERROR >>>> O eroare de test! 15-01-2005 14:42:24 DEBUG >>>> Debug is true . $t->debug("Debug is true").log'. $t->error("O eroare de test!"). în consolă rezultatul a fost: Citat: $ php runTrace. $t->debug("True Debug"). } $t->error("FOO IS BAR MUST DIE !!!").$i++) { $t->debug("Za I :: " . for($i=1. $t->setDebug(true). $t->error("Ceva de test!").$i<10.

şi mai mult. factory methods prove useful when you're not sure what concrete implementation of a class to .php Citat: 15-01-2005 14:48:59 ERROR >>>>0 15-01-2005 14:48:59 ERROR >>>>O eroare de test! 15-01-2005 14:48:59 DEBUG >>>>Debug is true 15-01-2005 14:48:59 DEBUG >>>>Tha lup :: 1 15-01-2005 14:48:59 DEBUG >>>>Tha lup :: 2 15-01-2005 14:48:59 DEBUG >>>>Tha lup :: 3 15-01-2005 14:48:59 DEBUG >>>>Tha lup :: 4 15-01-2005 14:48:59 DEBUG >>>>Tha lup :: 5 15-01-2005 14:48:59 DEBUG >>>>Tha lup :: 6 15-01-2005 14:48:59 DEBUG >>>>Tha lup :: 7 15-01-2005 14:48:59 DEBUG >>>>Tha lup :: 8 15-01-2005 14:48:59 DEBUG >>>>Tha lup :: 9 15-01-2005 14:48:59 ERROR >>>>0 15-01-2005 14:48:59 ERROR >>>>Ceva de test! 15-01-2005 14:48:59 DEBUG >>>>True Debug 15-01-2005 14:48:59 DEBUG >>>>Za I :: 1 15-01-2005 14:48:59 DEBUG >>>>Za I :: 2 15-01-2005 14:48:59 DEBUG >>>>Za I :: 3 15-01-2005 14:48:59 DEBUG >>>>Za I :: 4 15-01-2005 14:48:59 DEBUG >>>>Za I :: 5 15-01-2005 14:48:59 DEBUG >>>>Za I :: 6 15-01-2005 14:48:59 DEBUG >>>>Za I :: 7 15-01-2005 14:48:59 DEBUG >>>>Za I :: 8 15-01-2005 14:48:59 DEBUG >>>>Za I :: 9 15-01-2005 14:48:59 ERROR >>>>FOO IS BAR MUST DIE !!! Totuşi. O să încerc să rescriu FileTraceşi TraceFactory pentru a ajunge la utilitatea şi concluziile prezentate în exemplul urmat: Citat: Further. doar în consolă.15-01-2005 14:42:24 DEBUG >>>> Tha lup :: 1 15-01-2005 14:42:24 DEBUG >>>> Tha lup :: 2 15-01-2005 14:42:24 DEBUG >>>> Tha lup :: 3 15-01-2005 14:42:24 DEBUG >>>> Tha lup :: 4 15-01-2005 14:42:24 DEBUG >>>> Tha lup :: 5 15-01-2005 14:42:24 DEBUG >>>> Tha lup :: 6 15-01-2005 14:42:24 DEBUG >>>> Tha lup :: 7 15-01-2005 14:42:24 DEBUG >>>> Tha lup :: 8 15-01-2005 14:42:24 DEBUG >>>> Tha lup :: 9 dacă. şi şterg fişierul logger. comentez linia: touch($filename). căci constructorul din FileTrace va arunca excepţia întrucât fişierul nu va exista): $ php runTrace. şi implicit şi constructorului din FileTrace m-am îndepărtat prea mult de exemplul de la care am pornit. nu sunt mulţumit de codul scris. pasând $file ca parametru în factory. rezultatul va fi (normal.log.

log'.$file. In the above examples your program didn't know whether to create FileTrace or SystemTrace instances. IX. you can program your objects to simply use Trace and leave the instantiation of the concrete implementation to a factory method.trace * @version 0. /** * The construnctor * it opens the file handler * * @param string the file name * @return void * @access public */ public function __construct() { $file = 'logger. /** * It logs the trace to a file * * @todo: implement a custom Exception class * @package test. FileTrace. Instead. /** * debug * @var bool * @access private */ private $debug.instantiate. Ceva corecturi Aşa cum ziceam în finalul ultimului capitol.\nOr . you can leave those details to the factory method. if((!is_file($file)) or (!is_writable($file))) { throw new Exception("The file ".2 * @access public */ class FileTrace implements Trace { /** * It`s the file handler * @var handler * @access private */ private $handler.factory. pentru a fi cât mai aproape de modelul urmat." is not writable. m-am decis să rescriu FileTrace şi TraceFactory.php Cod: <?php include_once('ITrace. Instead.php').

" ERROR >>>> ". } /** * Sets the debug * @param bool debug * @return void * @access public */ public function setDebug($debug) { $this->debug = $debug. $message.__LINE__.it dosent exist in: ". "a"). } $this->handler = fopen($file. . } } /** * It writes an error message * * @param string message * @return void * @access public */ public function error($message) { // always print out errors fwrite($this->handler." at line: ". date("d-m-Y H:i:s")."!"). } /** * Is the Destructor * just close the handle * @access public * return void */ public function __destruct() { fclose($this->handler). } /** * It writes a debug message * only if debug is setted to true * @param string message * @return void * @access public */ public function debug($message) { if($this->debug) { // only print if debug is true fwrite($this->handler. $message."\n"). date("d-m-Y H:i:s")."\n"). __METHOD__." DEBUG >>>> ".

constructorul din FileTrace.2 * @access public * @package test. Alte explicaţii Am încercat să mă apropii cât mai mult de exemplul pe care l-am urmat.} ?> } TraceFactory.factory. } catch (Exception $ex) { include_once('StdoutTrace. return $t. } } } ?> X. $t = new StdoutTrace(). Mai bine.$ex>getMessage()).php').trace */ class TraceFactory { /** * It trys to get a trace * * @access public * @return mixed Trace Interface implementation */ public static function &getTrace() { try { include_once('FileTrace.php'). ar putea fi rescris aşa: Cod: <?php . return new FileTrace(). $t->error("Could not instantiate FileTrace:\n".php Cod: <?php /** * Is the factory * * @version 0.

/span>=1. $this->handler = @fopen($file. folosind şi o metodă de logare a evenimentelor produse pe parcursul lor.$i). if($this->handler===false) { throw new Exception("Cannot create the file hanled!").$i++) { $t->debug("Za I :: ". $t->setDebug(true).function __construct() { $file = 'logger.$i<10. ţinând cont de permisiunile care trebuiesc setate pentru directorul în care lucrez ar fi totuşi posibil.log'. $t->error("Ceva de test!"). } $t->error("FOO IS BAR MUST DIE !!!"). ?> Teste? Rezultatele au fost previzibile. $t->setDebug(true). Pot fi liniştit acum. îmi pot scrie scripturile mai departe. $t->debug("Debug is true"). fără să ma intereseze dacă se produce într-un fişier sau pe consolă. $t->error("O eroare de test!"). pe windows ar fi mai greu de testat.$i<10.log.log. } unset($t). for($i=1.php'). PHP 5. $t = &TraceFactory::getTrace(). Pe linux. O altă implementare Am rescris şi mini testul runTrace. $t = &TraceFactory::getTrace(). este treaba factory-ului să decidă lucrul ăsta. for($i<.$i).php astfel: Cod: <?php include_once('TraceFactory. "a"). nu ar trebui să existe îngrijorări legate de faptul că nu aş putea crea fişierul logger.$i++) { $t->debug("Tha lup :: ". $t->debug("True Debug"). SQLite în Factory? . FileTrace nu a aruncat nici o excepţie cu constructorul din capitolul X deci totul a fost logat în fişierul logger. XI. } } ?> însă.

versiune 2. am creat un TRIGGER. după ce am citit şi tutorialul asta. folosind clientul SQLite. CREATE TRIGGER insert_logger_timeEnter AFTER INSERT ON logger BEGIN UPDATE logger SET timeEnter = DATETIME('NOW') WHERE rowid = new. am zis să încerc să mai creez încă un produs pentru factory-ul descris în tutorialul precedent.15. XII. SQLite? După un timp. END. câmpul timeEnter se va actualiza singur (nu o să fie nevoie să îi mai zic insert into logger (timeEnter) values DATETIME('NOW'). CREATE TABLE logger (id INTEGER PRIMARY KEY. Lucruri obişnuite aici: un tabel cu numele logger.0 trebuie să folosesc SQLite 2. Bazele de date create cu SQLite 3.timeEnter DATE ).0. Mi-ar fi plăcut să am posibilitatea să log-ez erorile şi mesajele de debug într-un tabel al unei baze de date. insert into logger (message) values ($message) va fi destul pentru a actualiza cele 3 campuri).rowid. În plus. am decis ca acesta să fie tipul de bază de date pe care o să îl folosesc.8. Ce este SQLite? Deci. astfel la fiecare insert pe care îl voi face. ce conţine un câmp id de tip INTEGER cheie primară. Am descoperit astfel şi triggeri în SQLite.0. şi am creat o bază de date nouă: $ sqlite logger.db < dump. deci mai am de asteptat până în a doua jumătate a acestui an.db Am aflat că îmi pot scrie sql-ul liniştit şi apoi îl pot importa într-o bază de date SQLite. un câmp message.În articolul anterior am prezentat notiunea de factory în PHP 5.sql: Cod: BEGIN TRANSACTION. dump.8. nu SQLite 3. Şi cum încă nu am avut posibilitatea să lucrez cu SQLite.8.15 m-am pus pe treabă.exe pe Windows) ar trebui să fie în PATH pentru a avea comanda sqlite la . unde evident voi ţine mesajele şi timeEnter în care voi păstra data introducerii unui mesaj nou.1.sql Binarul (fişierul .message TEXT. Prima concluzie? Dacă vreau să folosesc clientul SQLite din lina de comandă şi apoi să accesez baza de date creată cu acest client din PHP 5.8 vor putea fi accesate din viitorul PHP 5. În continuare o să aprofundez aceste tehnici raportate la o bază de date. Am importat fişierul dump. COMMIT.sql cu comanda: $ sqlite logger.

factory. SQLite Tinând cont că va trebui să implementez metodele interfeţei Trace şi. CREATE TABLE logger (id INTEGER PRIMARY KEY. END.rowid.php'). Un nou produs.8. COMMIT.timeEnter DATE ). XIII.prompt. CREATE TRIGGER insert_logger_timeEnter AFTER INSERT ON logger BEGIN UPDATE logger SET timeEnter = DATETIME('NOW') WHERE rowid = new.php: Cod: <?php // merge cu sqlite 2. /** * It logs the trace to a sqlite db * * @todo: implement a custom Exception class * @package test.message TEXT. /** * debug * @var bool * @access private */ private $debug.0! /* ----------> SQL DUMP BEGIN TRANSACTION.15 pe php 5.SQL DUMP */ include_once('ITrace. /** * The construnctor * it opens the db handler * * @return void * @access public */ public function __construct() { . urmând exemplul din FileTrace am scris destul de repede şi uşor SQLiteTrace. <---------.trace * @access public */ class SQLiteTrace implements Trace { /** * It`s the db handler * @var handler * @access private */ private $handler.

. } } /** * It writes an error message * * @param string message * @return void * @access public */ public function error($message) { // always log errors sqlite_query($this->handler. $this->handler = @sqlite_open($dbname.$message. if($this->handler===false) { throw new Exception($sqliteerror). 0666. "INSERT INTO logger (message) VALUES (' DEBUG >>>> ". } } /** * Sets the debug * @param bool debug * @return void * @access public */ public function setDebug($debug) { $this->debug = $debug."')").$message. } /** * It writes a debug message * only if debug is true * @param string message * @return void * @access public */ public function debug($message) { if($this->debug) { // only insert if debug is true sqlite_query($this->handler.$dbname = 'logger.db'. "INSERT INTO logger (message) VALU ES } /** * Is the Destructor * just close the handler * @access public * return void (' ERROR >>>> "."')"). $sqliteerror).

} catch (Exception $ex) { try { include_once('SQLiteTrace. return $t.php astfel: Cod: <?php /** * Is the factory * * @version 0. } catch(Exception $sqlite_ex) { include_once('StdoutTrace.trace */ class TraceFactory { /** * It trys to get a trace * * @access public * @return object Trace.php'). return $t_sqlite. } } ?> XIV. a trace instance */ public static function &getTrace() { try { include_once('FileTrace. $t = new StdoutTrace(). return new FileTrace().*/ public function __destruct() { @sqlite_close($this->handler).php'). $t_sqlite->error("Could not instantiate FileTrace:\n".php'). $ex->getMessage()). $t_sqlite = new SQLiteTrace(). $t->error("Could not instantiate SQLiteTrace:\n". Un nou Creator Am reuşit să rescriu şi TraceFactory. . $sqlite_ex->getMessage()).factory.3 * @access public * @package test.

mi-ar plăcea să am mai multe nivele de logare (debug/info/error/alert/emergency). într-o bază de date sau direct pe consolă (nu prea o să văd lucrul ăsta prea curând totuşi).factory. Aş vrea să îl continui.4 * @access public * @package test. sincer să fiu.} } ?> } } Chiar dacă nu îmi place prea mult blocul: Cod: <?php try { } catch (Exception $ex) { try { } catch(Exception $sqlite_ex) { ?> } Tracerul meu este funcţional având 3 metode distincte de a loga mesajele: într-un fişier. aducâd în discuţie un alt procedeu: observer. cum ar fi dacă aş vrea să mai adaug încă un produs acolo? Probabil ar trebui să o rescriu astfel: Cod: <?php /** * Is the factory * * @version 0. Metoda getTrace nu mi se pare prea flexibilă. Neajunsuri În momentul de faţă. mai mult. nu îmi dau seama unde aş putea implementa acest exemplu. XV.trace */ .

} } } ?> iar testul următor. include_once($rs. return new $rs().":\n". return $t. } unset($t). .$ex>getMessage()). } try { $rs = $driver.'SQLite'). a trace instance */ public static function &getTrace($driver='') { $drivers = array('File'. în baza de date SQLite în partea de mijloc şi în final aş afişa şi ceva în consolă: Cod: <?php include_once('TraceFactory. $t->error("Ceva de test!"). $t->setDebug(true). $t->setDebug(true). return new StdoutTrace(). $t = &TraceFactory::getTrace('File').$i++) { $t->debug("Tha lup :: ". $t->error("Could not instantiate ".php'). if(!in_array($driver. $t->error("O eroare de test!").php').class TraceFactory { /** * It trys to get a trace * * @param string driver. $t->debug("Debug is true"). for($i=1. runTrace. $t = &TraceFactory::getTrace('SQLite').$i<10.php').php mi-ar loga mesaje în fişierul text în prima parte. $drivers)) { include_once('StdoutTrace. $t = new StdoutTrace().$driver. } catch (Exception $ex) { include_once('StdoutTrace.php'). it can be File or SQLite * @access public * @return object Trace.'Trace'.$i).'.

$i). $t = &TraceFactory::getTrace('Unknow_driver'). for($i=1. Până una-alta. } $t->error("FOO IS BAR MUST DIE !!!"). cea ce înseamnă un sitem de logare a mesajelor cât de cât complet şi utilizabil în producţie (chiar dacă constat că SQLite nu este chiar atât de rapid :) ).$i++) { $t->debug("I-ul :: ". } $t->error("Fatal!!!"). $t->error("Ajunge in consola!"). for($i=1. rămân cu PEAR::Log.$i<10.$t->debug("True Debug"). . unset($t).$i<10. ?> Rămâne însă de discutat despre diferite niveluri de log şi de introducerea unui observer care să mă anunţe în cazul în care se produce o eroare în sistem. $t->debug("True Debug a fos setat").$i++) { $t->debug("Za I :: ".$i). dar o să continui totuşi acest articol prin introducerea componentelor de mai sus. $t->setDebug(true).

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->