Sunteți pe pagina 1din 217

PHP

1.
Unelte de baza - ce aveti nevoie pentru un site profesionist. 2. Despre PHP - ce este i instruciuni pentru nceptori. 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. Afiarea mesajelor n PHP 8. Construiete un site cu php 9. Cteva informaii despre documentarea i depanarea unui script. 10. Operatori PHP 11. Cteva idei utile pentru securitatea paginilor web 12. Structuri de control n PHP 13. Despre funcii n PHP 14. Clase i obiecte n PHP 15. Crearea imaginilor thumbnails 16. Autentificarea n paginile restricionate i cteva informaii despre cookie, uploadul fiierelor i includerea lor n pagini, precum i informaii despre starea conexiunii. 17. Descrierea funciilor care pot fi utilizate la manipularea tablourilor 18. Lucrul cu fiiere i directoare 19. Descrierea funciilor de prelucrare a fiierelor 20. Funcii care faciliteaza lucrul cu directoare 21. Valori scalare i tablouri 22. Lucrul cu formulare 23. Conversia tipurilor de variabile 24. Scrierea instruciunilor swich, break i default 25. Scrierea instruciunilor for 26. Scrierea instruciunilor while i do while 27. Introducere n Clase PHP 28. Sesiuni n PHP 29. Crearea i utilizarea funciilor 30. Utilizarea fiierelor incluse 31. Funcii PHP pentru expresii regulate 32. Utilizarea referinelor n PHP 33. Lucrul cu funcii list 34. Interoperabilitate PHP-Java 35. Transmiterea mesajelor prin e-mail folosind PHP i PEAR 36. Informaii despre clasele ncrcate 37. Prelucrarea dinamic a imaginilor 38. Funcii 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 pot 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 folosii PHP n loc de HTML sau ASP sau PERL? Pentru c, fa de alte limbaje, PHP este gratuit. S spunem c avei de fcut un site care va conine peste 150 de pagini. Dac ar fi s l facei n HTML, ar dura ceva vreme. Ok. S zicem c site-ul este gata, dar acum vrei s schimbai fontul i culorile textului i ale link-urilor n toate cele 150 de pagini. V apuc durerea de cap doar cnd v gndii ce avei de fcut. n schimb, n PHP, acest lucru i multe altele sunt foarte simple. Dac site-ul respectiv ar fi fost fcut n PHP pe module, tot ce ar fi trebuit s facei este ca n partea care conine informaiile despre text s schimbai informaile despre text i link aa cum dorii i modificarea este aceeai 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 avei instalate i configurate cteva aplicaii de care o sa vorbim n continuare. Nu trebuie s avei cunotine preliminare de baze de date sau programare. Simpla studiere a codului sursa i aplicarea exemplelor v poate lmurii ce poate face php. Deci, dac v credei pregtii cititi n continuare...

Unelte de baz
Crearea unor pagini dinamice la un nivel performant, precum i punerea lor n funciune, nu poate fi fcut fr anumite programe. Iat cam de ce avei nevoie: Browsere - Pentru testarea paginilor este nevoie de mai multe browsere pentru c nu toate afieaz acelai rezultat i este neprofesional s obligai vizitatorul s foloseasc un anumit browser doar pentru c pagina fcut 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 att pe sisteme de operare Windows ct i pe Mac OS X sau Linux) i Opera (care are suport pentru mai multe sisteme de operare). Serverul web pentru teste - Dac lucrai cu PHP-MySQL sub Windows, sigur avei nevoie de triada Apache - PHP - MySQL s fie instalat pe calculatorul local. Pentru aceasta avei dou posibiliti: prima ar fi s descrcai de pe pagina productorului fiecare aplicaie n parte i s o instalai manual, urmnd apoi s facei configurarea serverelor manual (lucru nerecomandat nceptorilor) i a doua variant s descrcai un program care instaleaz toate acestea gata configurate pe calculator, urmnd ca voi doar s v apucai de lucru. Astfel de aplicaii 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 faciliti n plus fa de EasyPHP pe care cu timpul cnd vei nva mai multe despre PHP si MySQL o s le considerai foarte utile (cum ar fi posibilitatea de testare a scripturilor PHP att pentru versiunea 4 ct si 5). Ultima recomandare, att pentru cei care folosesc sistemul de operare Windows ct i Linux, ar fi XAMP care conine toate pachetele necesare instalrii i configurrii unui server de web profesional (inclusiv server de FTP, SSI, DNS i MAIL), dar pe care nu l recomand nceptorilor pentru c mulimea de faciliti oferite v poate ncurca. Editoare web - Dup ce ai 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). Putei descrca 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 ocupai i cu design-ul paginilor aceasta aplicaie v este util mpreun cu Adobe Photosop sau Corel Draw) i Flash (dac dorii s facei animaie pentru site). Desigur sunt o mulime de programe care fac aceleai lucruri cu ce v recomand eu, dar dac dorii s lucrai la nivel profesional recomand s lucrai cu unelte de profesioniti. Bineneles c putei scrie cod i n Notepad i desena n Paint dar aplicaiile pe care vi le-am recomandat v uureaz extraordinar de mult munca i v semnaleaz rapid erorile din pagini. Alte editoare pe care vi le recomand s le testai sunt: PSPad (un bun nlocuitor al Notepadului, mai ales c este freeware), Zend Studio (destinat profesionitilor).

Dup ce ai fcut rost de tot ce v trebuie ca s ncepei treaba, v recomand s citii n continuare celelalte articole, eventual s vizitai i pagina de download, sigur gsii ceva util acolo pentru nceput, apoi pagina de link-uri, unde gsiti resurse gratuite i s discutm pe forum eventualele probleme pe care le ntmpinai.

Despre PHP - ce este i instruciuni pentru nceptori.

Despre PHP
PHP este limbajul ideal pentru construirea de pagini web dinamice. Este usor de nvat, 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 "nscut" n 1994 din nevoia lui Rasmus Lerdorf de a afla cte persoane i viziteaz CV-ul online. El a denumit setul de scripturi create PHP, acronimul pentru Personal Home Page. Pe parcursul urmtorilor trei ani limbajul a evoluat dar adevratul succes a nceput s l cunoasc de cnd 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 combinaie de litere din prenumele creatorilor si: Zeev i Andi. Fiind open-source, PHP beneficiaz de suport activ din partea comunitii online, acesta fiind i motivul creterii explozive a numrului 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. Diferena esenial fa de alte limbaje de scripting (gen JavaScript) este faptul c PHP este un interpretor server-side (operaiile sunt executate de ctre server i nu pe calculatorul utilizatorului). Pentru a putea testa pagini PHP avei nevoie de un server de web (Apache) i de pachetul PHP instalat. PHP permite folosirea unor elemente specifice limbajelor de programare. Ieirea standard a script-ului PHP devine intrarea standard pentru programul de navigare care vizualizeaz pagina. Aadar, la iesirea standard poate fi scris (de exemplu, prin intermediul comenzii echo) orice tip de cod HTML, acesta fiind interpretat de ctre browser. Pe lng manipularea coninutului paginilor de web, PHP poate trimite headere HTTP pentru autentificare, seta cookie-uri sau redireciona utilizatorii. Mai mult, cu ajutorul bibliotecilor externe de funcii poate parsa fisiere XML, crea i manipula imagini, animaii Shokwave Flash, PDF-uri sau se poate conecta la un server de mail, iar acestea sunt doar cteva din funciile pe care le poate ndeplini. Interpretorul PHP parcurge documentul accesat pn n momentul n care ntlnete 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 pn n momentul n care este ntlnit 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 secvene 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 specificaiile 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 asemntoare celei folosite pentru includerea de script-uri JavaScript. Sintaxa este urmatoarea:

Cod:

<SCRIPT language = "php"> //cod PHP </SCRIPT>


Exist alte dou posibiliti, dar acestea sunt folosite rar, n situaii particulare i depinde n mare msur de setrile serverului de web. Este permis "iesirea" i "intrarea" n "modul PHP" de oricte ori este necesar n pagin. Aceasta este util cnd se lucreaz cu texte de mari dimensiuni. Pentru ca instruciunile 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. Apariia 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 sfrit.

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 instruciunile. Pentru a lucra cu datele trebuie s nelegem ce sunt variabilele i tipurile, iar pentru a lucra cu instruciuni trebuie s aflm ce sunt structurile de control i funciile. O variabil este o zon de memorie cruia i se d un nume pentru a putea fi recunoscut ulterior i pentru a ne putea referi mai trziu 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 distincia 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 liniue 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. ncepnd cu versiunea 4, au fost introduse referinele; astfel, o variabil poate referi o alta, astfel nct 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:

echo $b; ?>


Dup cum se vede, modificarea valorii variabilei $b a dus automat la modificarea automat a valorii variabilei $a. S disecm codul pentru a nva cteva lucruri: - toate instruciunile PHP se termin cu punct i virgul. Omiterea semnului ";" este cea mai frecvent greeal pe care o fac programatorii nceptori. - codul PHP ncepe ntotdeauna cu "<?php" i se termin cu "?>". El poate fi mbricat cu cod HTML dup cum putei vedea n exemplul de mai sus. Putei chiar crea pagini HTML fr pic de cod PHP n ele i s le dai extensia php. Atta vreme ct parser-ul PHP nu "vede" tagurile "<? php ...?> ", el va trimite pagina neschimbat ctre server. - putem pune diacritice n cadrul unui string ns pentru ca browserul s le afieze corect va trebui s specificm n <head> setul de caractere folosit, la fel ca ntr-un document HTML. - valoarea unei variabile poate fi schimbat dup necesiti (aa cum am schimbat valoarea lui $a) sau ea va fi schimbat automat n funcie de celelalte variabile de care depinde.

Variabile predefinite

ncepand de la versiunea 4.1.0 metodele predefinite pentru preluarea variabilelor externe depind de setarea din php.ini a variabilelor globale (register_globals). Astfel dac pe server este setat register_globals=ON (nerecomandat) se pot prelua de exemplu variabilele trimise prin GET i POST apelnd direct variabila. 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"; // cu register_globals=OFF $_POST['camp1'] = "valoarea campului"; $camp1 = $_POST['camp1']; ?>
Variabile globale: $GLOBALS - pot fi accesate toate variabilele globale care sunt accesibile script-ului PHP curent; acest vector este indexat chiar prin numele variabilelor globale. Aceast variabil superglobal este accesibil ncepnd cu versiunea 3.0.0 $_SERVER - conine o serie de variabile ale cror valori sunt setate de server-ul web; majoritatea valorilor variabilelor din acest vector depind de mediul de execuie al script-ului curent. A fost introdus ncepnd de la versiunea 4.1.0. n versiunile anterioare se folosea $HTTP_SERVER_VAR . Este o variabil care conine informaii cum ar fi headere, locaia scriptului, sau informaii despre vizitator i browser. Este posibil ca n funcie de setrile fiecrui server i browser s nu fie active toate informaiile specificate de aceast variabil. Aceast variabil este de asemenea global, adic se poate folosi oriunde n script, fr apelarea ei ca funcie global (adic nu trebuie s o cerei cu global $_SERVER n funciile dvs.) n schimb

$HTTP_SERVER_VARS conine aceleai informaii dar nu este o funcie global (atenie $HTTP_SERVER_VARSi $_SERVER sunt dou variabile diferite, chiar dac aparent fac aceleai lucruri) Dac directiva register_globals este ON atunci aceste variabile vor deveni la rndul lor variabile globale n cadrul scriptului. Elementele acestor variabile sunt cele de mai jos (atenie: n funcie de setrile serverului i browserului unele elemente pot lipsi) ' PHP_SELF ' - conine numele fiierului unde se execut scriptul curent, relativ la rdacin (document root) De exemplu, $_SERVER['PHP_SELF'] ntr-un script la adresa http://example.com/test.php/foo.bar va fi /test.php/foo.bar . Constanta __FILE__ conine toat calea i numele fiierului curent. ' argv ' - Un array al argumentului trimis ctre script. Cnd scriptul ruleaz n linie de comand, va da acces C-style la parametrii liniei de comanda. Cnd este accesat prin metoda GET, acesta va conine un sir de interogare. ' argc ' - Conine un numr al parametrilor liniei de comand trimise ctre script (daca este rulat n linie de comanda). ' GATEWAY_INTERFACE ' - Returneaza versiunea CGI utilizat pe server (exemplu ' CGI/1.1 '). ' SERVER_NAME ' - Numele server-ului de hosting unde se execut scriptul curent. Dac scriptul ruleaz pe un host virtual, aceasta va conine valoarea definit pentru acel host virtual. ' SERVER_SOFTWARE ' - Returneaz un ir de identificare al server-ului dat n header ca raspuns la cerere. ' SERVER_PROTOCOL ' - Numele i versiunea protocolului prin care este cerut pagina (exemplu ' HTTP/1.0 ') ' REQUEST_METHOD ' - returneaz metoda utilizat pentru accesarea paginii (exemplu ' GET ', ' HEAD ', ' POST ', ' PUT ') ' REQUEST_TIME ' - Valoarea timestamp dat la pornirea cererii. Este valabil ncepnd de la versiunea PHP 5.1.0. ' QUERY_STRING ' - Sirul de interogare, dac este, de la pagina care a fost accesat. ' DOCUMENT_ROOT ' - Directorul radcin unde este rulat scriptul curent, aa cum este definit n fiierul de configuraie al serverului. ' HTTP_ACCEPT ' - Coninutul header-ului acceptat de la cererea curent, dac este unul. ' HTTP_ACCEPT_CHARSET ' - Conine setul de caractere acceptate i care este trimis de header-ul cererii respective, dac exist. Exemplu: ' iso-8859-1,*,utf-8 '. ' HTTP_ACCEPT_ENCODING ' - Conine tipul de encodare trimis de cerera curent prin header, dac exist.. Exemplu: ' gzip '. ' HTTP_ACCEPT_LANGUAGE ' - Conine limbajul trimis de cererea curent prin header, dac exista. Exemplu: ' en '. ' HTTP_CONNECTION ' - Conine informaii despre conecsiiunea trimis de cererea curent prin header, dac exist. Exemplu: ' Keep-Alive '.

' HTTP_HOST ' - Conine informaii despre host, header-ul de la cererea curent, dac exist. ' HTTP_REFERER ' - Adresa paginii (dac este) de unde a venit userul n pagina curent. Aceasta este setat de ctre browser. Nu toate browserele seteaz aceast valoare, i chiar unele au posibilitatea de a modifica HTTP_REFERER aa cum vor. Pe scurt, nu este de ncredere. ' HTTP_USER_AGENT ' - Conine semntura browser-ului trimis prin header la cererea curent, dac exist. Un exemplu tipic este: Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586) . n afar de asta, putei utiliza get_browser() pentru a vedea ce capabilitai are browserul folosit de user i astfel s returnai pagina specific pentru acel browser. ' HTTPS ' - Seteaz o valoare dac scriptul a fost cerut printr-un protocol securizat HTTPS ' REMOTE_ADDR ' - Adresa de IP a userului care acceseaz pagina curent. ' REMOTE_HOST ' - Numele hostului userului care vede pagina curent. Este inversul DNSului userului bazat pe REMOTE_ADDR. Atenie: Serverul web trebuie configurat pentru a crea aceast variabila. De exemplu n Apache va trebui HostnameLookups On n fiierul de configurare httpd.conf. Pentru alte detalii vedei i funcia gethostbyaddr() . ' REMOTE_PORT ' - Portul prin care userul comunic cu serverul web. ' SCRIPT_FILENAME ' - Calea absolut unde se execut scriptul curent. Atenie: Dac scriptul este rulat cu CLI, ca i cale relativ, cum ar fi file.php sau ../file.php , $_SERVER['SCRIPT_FILENAME'] va conine calea relativ specificat de ctre user. ' SERVER_ADMIN ' - Valoarea dat de directiva SERVER_ADMIN (pentru Apache) n fiierul de configurare al web serverului. Dac scriptul ruleaz pe un host virtual, acesta va conine valoarea definit pentru acel host virtual. ' SERVER_PORT ' - Portul de pe server care este folosit pentru comunicare pe web. Pentru setrile standard, acesta este ' 80 '; pentru SSL, de exemplu, se va schimba cu oricare port definit n transmisia securizat HTTP. ' SERVER_SIGNATURE ' - Conine un ir care cuprinde versiunea serverului i numele hostului virtual dac este. ' PATH_TRANSLATED ' - Calea de baz a sistemul de fiiere (nu rdacina documentului) de la scriptul curent, dup ce serverul a terminat maparea oricror cai ( virtual-to-real mapping) Atenie: ncepnd de la PHP 4.3.2, PATH_TRANSLATED nu mai este setat implicit n Apache 2 SAPI n contrast cu situaia din Apache 1, unde este setat aceeai valoare ca i la SCRIPT_FILENAME. Aceast schimbare a fost fcut pentru a fi compatibil cu specificaiile CGI n care PATH_TRANSLATED trebuie s existe doar dac PATH_INFO este definit. Utilizatorii Apache 2 pot utiliza AcceptPathInfo = On n fiierul de configuraie httpd.conf pentru a defini PATH_INFO . ' SCRIPT_NAME ' - Conine calea ctre scriptul curent. Acesta este util pentru pagini care trebuiesc definite ctre ele nsui. Constanta __FILE__ conine calea complet i numele de fiier al scriptului curent. ' REQUEST_URI ' - URI care este dat pentru accesarea paginii curente, de exemplu ' /index.html '. ' PHP_AUTH_DIGEST ' - Cnd rulai sub Apache ca modul, aciunea Digest HTTP, valoarea

acestei variabile este setat n 'Authorization' header trimis ctre client (care ar trebui utilizat pentru a face o validare corespunztoare). ' PHP_AUTH_USER ' - Cnd este rulat sub Apache sau IIS (ISAPI pe PHP 5) ca modul, actiunea HTTP authentication, aceast variabil conine numele userului trimis de ctre user. ' PHP_AUTH_PW ' - Cnd este rulat sub Apache sau IIS (ISAPI pe PHP 5) ca modul, actiunea HTTP authentication, aceast variabil conine parola userului trimis de ctre user. ' AUTH_TYPE ' - Cnd este rulat sub Apache ca modul aciunea HTTP authenticated , aceast variabil seteaza tipul de autentificare. Variabilele pentru trimiterea datelor: $_GET este o variabil array global. A fost introdus n versiunea 4.1.0. Pentru versiunile anterioare se folosete $HTTP_GET_VARS care nu este variabil global. Putei folosi $_GET pentru a trimite variabile cu valori prin intermediul linkurilor. $_POST este de asemenea o variabil array global. A fost introdusa n versiunea 4.1.0. Pentru versiunile anterioare se folosete $HTTP_POST_VARS care nu este variabil global. Putei folosi $_POST pentru a trimite variabile cu valori prin intermediul formularelor. $_GETi $_POST conin variabile primite de script prin intermediul unor transferuri care folosesc metodele HTTP get, respectiv post. De exemplu, prin intermediul acestor vectori pot fi accesate valorile cmpurilor dintr-un formular care a fost completat i transmis folosind una dintre cele doua metode. Variabilele HTTP coockies: $_COOKIE conine valorile variabilelor care conin informaii referitoare la cookie-urile pstrate pe calculatorul utilizatorului care acceseaz pagina web. A fost introdus n versiunea 4.1.0. n versiunile anterioare, utilizai $HTTP_COOKIE_VARS . Variabile pentru uploadul fisierelor: $_FILES conine variabile primite de script prin intermediul ncrcrilor de fiiere prin metoda post. A fost introdus n versiunea 4.1.0. n versiunile anterioare se folosete $HTTP_POST_FILES care nu este variabil global. Variabilele de mediu $_ENV $_ENV conine variabile disponibile prin intermediul mediului n care este executat. A fost introdus n versiunea 4.1.0. n versiunile anterioare, utilizai $HTTP_ENV_VARS . Variabilele pentru cereri: $_REQUEST conine variabile disponibile prin intermediul oricrui tip de mecanism cu ajutorul cruia utilizatorul poate introduce date. Este de tip array i conine valorile variabilelor $_GET , $_POST , i $_COOKIE. A fost introdus n versiunea 4.1.0. ncepnd de la versiunea 4.3.0, informaiile din $_FILES au fost de asemenea incluse n $_REQUEST Variabile de sesiune: $_SESSION conine variabile care corespund sesiunii curente a script-ului, sub form de array. A fost introdus n versiunea 4.1.0 i este de asemenea global. n versiunile anterioare folosii $HTTP_SESSION_VARS. Variabile de mesaje de eroare: $php_errormsg - este o variabil ce conine ultimul mesaj generat de ctre PHP Aceast variabil este folosit n scopul de a vedea ce eroare apare i doar dac opiunile de configurare a erorilor track_errors este pornita (standard este pe OFF) Constante predefinite: PHP conine un mare numr de constante predefinite pentru fiecare script care ruleaz. Totui, sunt 5 constante "magice" pe care le prezint n continuare: __LINE__ - Conine numrul curent al liniei din fisier.

__FILE__ - toat calea i numele fiierului curent. Dac este folosit n interiorul unui fiier inclus, va returna numele fiierului inclus. ncepnd de la versiunea 4.0.2 conine ntotdeauna calea absolut la fiier, pe cnd n versiunile anterioare conine calea relativ, n afar de cteva cazuri. __FUNCTION__ - Numele funciei (adugat n versiunea 4.3.0) n PHP 5 aceast constant returneaz numele funciei care a fost declarat (case-sensitive). n PHP 4 aceast valoare este ntotdeauna lowercased (cu litere mici) __CLASS__ - Numele clasei (adaugat n versiunea 4.3.0) n PHP 5 aceast constant returneaz numele clasei care a fost declarat (case-sensitive). n PHP 4 aceast valoare este ntotdeauna lowercased (cu litere mici) __METHOD__ - Numele metodei clasei (adaugat n versiunea 5.0.0.) Numele metodei este returnat asa cum este declarat (case-sensitive)

Domeniul de vizibilitate al variabilelor - Cum se pot accesa variabilele.

n PHP o variabil poate fi accesat doar n contextul n care a fost definit. De exemplu, o variabil definit n interiorul unei funcii nu va putea fi accesat dect de instruciunile din interiorul acelei funcii. Mai mult, n mod implicit, o variabil definit n exteriorul unei funcii nu va putea fi accesat n interiorul funciei chiar dac ea nu este redefinit n cadrul funciei. Pentru ca o funcie s aib acces la o variabil definit n afara ei, variabila trebuie redeclarat ca variabil global n interiorul funciei. S considerm urmtorul exemplu: Cod:

<?php $a = 1; function test () { echo $a; } test (); ?>


Observm c nu se afieaz valoarea 1 deoarece instruciunea echo $a se refer la variabila local $a care nu este definit, deci nu are nici o valoare. n continuare, este o versiune n care instruciunea echo $a va accesa variabila $a definit n afara funciei test(): Cod:

<?php $a = 1; function test () { global $a; echo $a; } test (); ?>
O a doua posibilitate de a accesa o variabil definit n afara funciei este folosirea vectorului $GLOBALS:

Cod:

<?php $a = 1; function test () { echo $GLOBALS ["a"]; } test (); ?>

Tipuri de variabile

Variabilele pot fi de mai multe tipuri, nu doar numere. PHP are opt tipuri de variabile. Patru dintre acestea sunt tipuri scalare (boolean, integer, float i string), dou sunt tipuri compuse (array i object), iar alte dou sunt tipuri speciale (resource i null). De asemenea, din motive de lizibilitate, au fost introduse trei pseudotipuri: mixed, number i callback. Mai exista i tipul double, dar semnificaia acestuia este aceeai cu cea a tipului float. Cele dou denumiri coexist doar din motive "istorice". n PHP, de obicei, tipul unei variabile nu este specificat de ctre programator, ci este stabilit n timpul execuiei n funcie de contextul n care este folosit variabila. Tipul boolean: Variabilele de acest tip pot avea doar dou valori: ADEVARAT sau FALS. Aceste valori pot fi indicate prin cuvintele cheie TRUE sau FALSE (pentru ambele nu se face distincie ntre literele mari i literele mici). Exist posibilitatea de a converti o variabil de orice tip la tipul boolean. n momentul efecturii unei conversii, sunt convertite la valoarea FALSE urmtoarele valori: - numrul ntreg 0; - numrul real 0.0; - sirul vid; - sirul "0"; - un vector fr nici un element; - un obiect fr nici o variabil membru; - o variabil de tipul NULL; - o variabil nedefinit. Orice alt valoare este convertit la valoarea TRUE (inclusiv resursele). Acest tip se poate folosi de exemplu pentru verificarea logrii ntr-o pagin de administrare. Dup ce se fac verificrile, dac utilizatorul este logat ca administrator, funcia noastr va returna o valoare de adevar: TRUE dac este logat, sau FALSE dac nu este, i astfel vom ti dac s i acordm sau nu acces n seciunea de administrare. Tipul integer: O variabil de tip integer reprezint o valoare din mulimea numerelor ntregi. Aceste numere pot fi specificate n baza 10, n baza 16 sau n baza 8, conveniile fiind aceleai ca i n limbajele C/C++ sau Java. Modul de reprezentare depinde de platforma utilizat; de obicei se folosete reprezentarea pe 32 de biti. Interpretorul PHP nu ofer suport pentru numerele ntregi far semn. Trebuie remarcat faptul c n PHP nu exist nici un operator pentru efectuarea de mpriri ntregi. De exemplu, rezultatul operaiei 3/2 nu va fi numrul ntreg 1 (ca n C/C++ sau Java), ci numrul real (float) 1.5 i pentru numerele ntregi exist posibilitatea efecturii de conversii: - valoarea logic TRUE este convertit la valoarea ntreag 1; - valoarea logic FALSE este convertit la valoarea ntreag 0; - un numr real este convertit prin "rotunjire nspre 0"; asadar, valoarea real 2.5 va fi convertit la valoarea ntreag 2, n timp ce valoarea real -2.5 va fi convertit la valoarea ntreag -2;

- un sir de caractere este convertit lund n considerare doar primele caractere care conin informaii numerice; aadar irul "10" va fi convertit la valoarea ntreag 10; de asemenea irul "10 ani" va fi convertit tot la valoarea 10; dac primele caractere nu conin informaii numerice, rezultatul conversiei va fi valoarea 0. Tipul float: O variabil de tip float poate fi specificat folosind fie forma zecimala, fie cea tiinific (cu exponent). La fel ca i n cazul tipului integer, precizia variabilelor de tipul float este dependent de platforma utilizat. De obicei se folosete standardul IEEE 64. Exist posibilitatea de a converti o variabil de orice tip la tipul float. Pentru numerele reale se pot efectua urmtoarele conversii: - un ir de caractere este convertit lund n considerare doar primele caractere care conin informaii numerice; aadar irul "10.2" va fi convertit la valoarea real 10.2; irul "1.23E1 ani" va fi convertit la valoarea 12.3; - n toate celelalte cazuri se realizeaz conversii la numere ntregi care apoi sunt convertite la valorile reale corespunztoare. Tipul string: O variabil de tip string reprezint un ir de caractere. Un caracter se reprezint pe un octet, deci sunt 256 de caractere distincte. Acest lucru implic faptul c interpretorul PHP nu ofer suport nativ pentru setul de caractere Unicode. Lungimea variabilelor de tip string nu este limitat de ctre interpretor. Literalii de tip ir de caractere pot fi specificai n trei moduri diferite: - prin folosirea ghilimelelor simple (exemplu $a='acesta este un sir de caractere'). Pentru a avea n cadrul irului simbolul "`", atunci naintea acestuia trebuie scris caracterul "\", iar pentru a putea specifica simbolul "\" acesta trebuie dublat. - prin folosirea ghilimelelor duble. Folosind aceast notaie pot fi specificate mai multe caractere speciale, pe lng caracterele de la varianta anterioara, printre care: sfrit de linie ("\r"), rnd nou ("\n"), tab orizontal ("\t"), semnul dolar ("\$"), ghilimelele duble ("\""), secvene de caractere pentru specificarea faptului c o expresie regular este n notaie octal ("\[0-7]{1,3}") i secvenele de caractere pentru specificarea faptului c o expresie regular este n notaie hexazecimal ("\x[0-9A-Fa-f]{1,2}"). Cel mai important lucru este acela c, folosind acest mod de specificare a literalilor de acest tip, numerele de variabile care apar n interior vor fi transformate n valoarea lor. De exemplu dac $a este o variabil de tipul integer i are valoarea 2, atunci sirul de caractere "Variabila a are valoarea $a." va fi transformat n irul "Variabila a are valoarea 2". - notaia heredoc. Acest tip de notaie a fost introdus la versiunea 4 a interpretorului PHP. Pentru a specifica un sir de caractere folosind aceast notaie 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, i acelai identificator pe o alt linie vor constitui valoarea sirului de caractere. De exemplu, instruciunea: Cod: $str=<<<SF Acesta este un exemplu de utilizare a sintaxei heredoc SF; va avea ca rezultat un ir de caractere format din trei linii de text. Pentru a accesa un anumit caracter din irul de caractere se folosete, dup numele variabilei de tip string, indicile caracterului care trebuie accesat scris ntre acolade. De exemplu, $str{0} returneaz primul caracter din irul de caractere $str. n cazul n care dorim s concaternm dou iruri de caractere vom folosi operatorul "." Folosirea operatorului "+" nu va concaterna cele dou iruri. Exist posibilitatea de a converti o variabil de orice tip la tipul string. Pentru irurile de caractere se pot efectua urmtoarele conversii:

- valoarea logic TRUE va fi convertit la irul "1", iar valoarea logic FALSE va fi convertit la irul vid (""); - un numr ntreg va fi convertit la un ir de caractere care reprezint valoarea numrului n baza 10; - un numr real va fi convertit la un ir de caractere care reprezint notaia tiinific a acestuia; - obiectele sunt ntotdeauna convertite la irul "Object"; - variabilele de tipul resource sunt convertite la irul "Resource id #n", unde n reprezint un numr unic ataat resursei respective de ctre interpretorul PHP; - valoarea NULL este convertit la irul vid (""). Tipul array - Vectorii n PHP sunt nite mulimi formate din chei. Fiecarei chei din vector i se ataeaz o valoare. Acest tip de date este optimizat astfel nct s poat fi folosit n locul urmtoarelor structuri de date: liste, tabele de dispersie, dicionare, colecii, stive, cozi i altele. Datorit faptului c o valoare poate fi reprezentat de un alt vector, se pot simula foarte uor arborii n-dimensionali sau tablourile n-dimensionale. Valoarea unei variabile de tip vector se poate specifica folosind construcia array (cheie => valoare, cheie => valoare, ...) De exemplu, urmtoarea nstruciune PHP va construi un vector cu dou elemente, dintre care unul este de tip string, iar cellalt de tip boolean: $a = array ("ch" => "string", 12 => TRUE); Variabila $a reprezinta un vector, $a ["ch"] are valoarea string, iar $a [12] are valoarea TRUE. n cazul n care nu se specific o cheie pentru o valoare, atunci acea valoare va fi ataat unei chei care va fi cheia maxim de tip integer folosit anterior, la care se adaug valoarea 1. Cheile pot avea i valori negative. Dac nu exist chei de tip integer, atunci valoarea va fi ataata cheii 0. De exemplu, urmtoarele dou instruciuni sunt echivalente: array (5 => 43, 32, 56, "b" => 12); array (5 => 43, 6 => 32, 7 => 56, "b" => 12); Dac se folosete valoarea logic TRUE ca i cheie, atunci aceasta va fi convertit la cheia de tip ntreg 1, iar valoarea FALSE va fi convertit la numrul ntreg 0. Nu se pot folosi pentru chei variabile de tipul array sau object. O variabil de tip array se poate modifica prin setarea explicit de valori. De exemplu instruciunea $a ["x"] = 42; adaug n vectorul $a valoarea 42 ataat cheii "x". Dac se folosete un vector care nu a fost definit anterior, atunci acesta este creat automat. Aadar printr-o instruciune de forma $a [5] = 42, n cazul n care vectorul $a nu exist, atunci se va crea un vector cu un singur element. Cheia acestuia va fi numrul ntreg 5, iar valoarea sa va fi 42. De asemenea, exist posibilitatea de a crea un element nou fr a-i preciza cheia. Sintaxa are forma $vector [] = valoare; aceast instruciune are ca efect adugarea unui element a crui cheie este un numar ntreg mai mare cu 1 dect cel mai mare numr ntreg care este cheie a unui alt element al vectorului. Dac nu exist nici o astfel de cheie, atunci noul element va avea cheia 0. De exemplu, urmtoarele dou secvente sunt echivalente: $a [5] = 1; ............................ $a [5] = 1; $a [6] = 2; ............................ $a [] = 2; Prin conversia la un vector a unei variabile de tip scalar (boolean, integer, float, string) sau resource se creeaz un vector cu un singur element; cheia acestui element este numrul ntreg 0, iar valoarea este cea a variabilei convertite. Dac se convertete un obiect (variabila de tip object), atunci vectorul rezultat va conine cte un element pentru fiecare variabil membru a obiectului. Cheile elementelor vor fi date de denumirile proprietilor obiectului (variabilele membru ale obiectului), iar valorile elementelor vor fi valorile proprietilor obiectului. Dac realizm o conversie a unei variabile de tip NULL, atunci rezultatul va fi un vector vid (care nu conine nici un element). n continuare sunt prezentate cteva exemple care descriu mai detaliat posibilitile oferite de folosirea vectorilor n PHP. Pentru nceput, prezint un vector al crui elemente reprezint caracteristicile unei portocale: Cod: $a = array ('denumire' => 'portocala',

'familie' => 'citrice', 'culoare' => 'portocaliu', 'forma' => 'rotunda', 'gust' => 'dulce' ); Putem aduga i alte elemente care s reprezinte diferite alte proprieti. De exemplu, am putea avea nevoie de o valoare suplimentar creia nu dorim s i atribuim nici un nume de identificare (cheie). Pentru ca vectorul s conina un element suplimentar cu valoarea 4, vom putea defini vectorul astfel: Cod: $a = array ('denumire' => 'portocala', 'familie' => 'citrice', 'culoare' => 'portocaliu', 'forma' => 'rotunda', 'gust' => 'dulce', 4); Cheia elementului cu valoarea 4 va fi numrul ntreg 0 deoarece nu exist nici o alt cheie care este numr ntreg. O alternativ de construire a acestui vector este urmtoarea: Cod: $v['denumire'] = 'portocala'; $v['familie'] = 'citrice'; $v['culoare'] = 'portocaliu'; $v['forma'] = 'rotunda'; $v['gust'] = 'dulce'; $v[] = 4; Exemplul urmtor ilustreaz cum putei folosi vectorii la afiarea unei pagini cu text colorat: Cod:

$colors = array (`red`, `green`, `blue`, `silver` ); foreach { echo echo echo } ($colors as $color) "<FONT size = 4 color = $color>"; "<b>Acest text este <i>$color!</i>"; "</b></FONT><br>";

Tipul object: Pentru a defini un obiect care poate fi folosit pentru afiarea mesajului SALUTARE LUME! se scrie urmtoarea secven: Cod:

class salutare { function Displaysalutare ()

{ echo "SALUTARE LUME!"; }

Pentru a utiliza o variabil de tip obiect va trebui s realizm o instaniere prin intermediul instruciunii new. Sintaxa este: $a = new salutare; Astfel, variabila $a devine un obiect ale crui metode pot fi utilizate. Pentru afiarea propriuzis a mesajului va trebui s executm metoda Displaysalutare() printr-o instruciune de tipul $a -> Displaysalutare(); Orice variabil de un anumit tip poate fi convertit ntr-un obiect. Dac variabila respectiv este un obiect, atunci ea nu va fi modificat. n caz contrar, efectul conversiei este crearea unei noi instane a clasei stdClass. Dac variabila are tipul NULL, atunci noua instan va fi vid. n toate celelalte cazuri instana va conine o variabil membru numit scalar a crei valoare va fi cea a variabilei convertite. Pentru conversii vom folosi instruciuni de tipul $obiect = (object) "SALUTARE LUME!" Dup realizarea conversiei vom putea tipri mesajul SALUTARE LUME! folosind instruciunea echo $obiect->scalar; Tipul resource: Variabilele de tip resource sunt folosite pentru pstrarea unor referine ctre anumite resurse externe cum ar fi conexiuni la baze de date, fiiere, etc. Resursele sunt create i utilizate de anumite funcii speciale. Datorit specificului acestui tip de date valoarea nici unei variabile de alt tip nu poate fi convertit la tipul resource. Tipul NULL: Valoarea special NULL este atribuit oricrei variabile care nu a fost iniializat. Aceast valoare este singura pe care o pot avea variabilele de tip NULL. Se consider c o variabil are tipul NULL dac: - i s-a atribuit constanta NULL; - nu a fost iniializat; - a fost deziniializat (prin intermediul funciei unset() ).

Afiarea mesajelor n PHP

Limbajul PHP ofer mai multe variante de a trimite la browser mesaje i iruri de caractere sau chiar cod HTML. Cea mai folosit funcie este echo(). Sintaxa corect este:

<?php echo("sir de caractere"); ?>


Instruciunea de mai sus va afia n browser mesajul introdus ntre ghilimele. Funcia echo, la fel ca i print, nu este chiar o funcie, ci mai degrab un constructor al limbajului i nu este nevoie s folosii parantezele ca pentru o funcie. De fapt, dac dorii s trimitei mai muli parametri ctre echo, nu trebuie s includei aceti parametrii ntre paranteze. Exist chiar i o variant mai scurt a lui echo, dar aceasta funcioneaz doar dac este setat n configuraia php.ini directiva short_open_tag pe ON. Sintaxa pentru varianta scurt este:

<?=$foo?>
n cazul de mai sus, imediat dup deschiderea tagului php se va afia valoarea variabilei $foo. Nu recomand aceast abordare, deoarece nu toate serverele au setat n configuraia lor

short_open_tag pe ON i nu va funciona. O funcie asemntoare cu echo este print. La fel ca i echo, nici aceasta nu este chiar o funcie ci un constructor al limbajului, i nu trebuie s utilizai parantezele. Textul ce urmeaz a fi afiat trebuie introdus ntre ghilimele simple sau duble, rezultatul fiind uor diferit. Folosind ghilimelele duble, orice variabil din cadrul stringului este parsat. Astfel, dac am avea de exemplu:

<?php $x = 1; $rezultat = $x*1; print "Rezultatul inmultirii lui $x cu 1 este $rezultat"; ?>
afieaz n browser: Rezultatul inmultirii lui 1 cu 1 este 2 Dac am folosi ghilimelele simple (print '...'), variabilele $x i $rezultat nu ar fi fost parsate i output-ul ar fi fost: Rezultatul inmultirii lui $x cu 1 este $rezultat Putem afia variabilele i dac folosim ghilimelele simple, "rupnd" stringul i intercalndu-l cu variabile, n forma urmatore, folosind operatorul "."(punct) de concaternare a stringurilor (irurilor):

<?php print 'Rezultatul inmultirii lui '.$x.' cu 1 este '.$rezultat; ?>


Pentru a afia caracterele speciale folosite de PHP (ghilimelele simple ', ghilimelele duble ", backslash-ul \, semnul $) trebuie s le precedai cu semnul \, astfel:

<?php echo "Semnul dolar \$, back-slash \\"; ?>


Ghilimelele trebuie precedate de semnul \ doar dac sunt de acelai tip cu cele care ncadreaz string-ul. n plus, ntr-un string putei folosi celelalte ghilimele normal. Dac dorii s afiai doar valoarea unei variabile, putei s nu o ncadrai ntre ghilimele. Exemplu:

<?php echo $x; ?>


Alte informaii despre aceste funcii, precum i altele asemntoare cu acestea, de genul printf(), i flush() putei gsi n manualul oficial pe care l putei lua gratuit de pe site-ul oficial al PHP - www.php.net.

Construiete un site cu php

n continuare, o s ncerc s v prezint cum se poate construi un site cu ajutorul limbajului PHP. Exemplul prezentat nu este un standard, este doar o modalitate de a vedea cum se poate construi un site i cum se preiau sau trimite variabilele prin intermediul site-ului. Putei, pe baza acestui exemplu, s v construii propriul site, n forma preferat de dvs. i adaptnd modelul acesta la necesitaile voastre. n exemplul meu, am preferat s am o singur pagin, anume index.php, n care s includ dinamic coninutul i meniul, n funcie de ce link acceseaz vizitatorul. Putei vedea acest model ntr-un fel modular, fiecare script fiind de fapt un modul care execut anumite operaii specifice. Astfel, n pagina index.php se includ mai multe module (scripturi) care luate separat, fiecare fac anumite lucruri, dar puse mpreun, formeaz pagina de web generat dinamic. n acest exemplu, nu am folosit o baz de date, dar pe acelai principiu se poate adapta ideea la un site care preia datele din baza de date. 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, si alte informatii lateral informatii generate dinamic partea de incheiere a paginii (footer) Dup cum putei vedea alturat, am desprit fiecare parte a unei pagini n buci, fiecare bucat este colorat diferit pentru o mai bun vizualizare. Putei introduce n fiecare bucat cte un script php care s genereze respectiva bucat dinamic. Astel, n cazul unei modificri, va fi mult mai uor s modificai doar scriptul care se ocupa de o anumit parte a paginii, pe cnd daca tot site-ul ar fi fost facut static n HTML, la un site cu 100-200 de pagini chiar i cea mai mic modificare ar fi nsemnat un chin.

Am numit fiecare script care se ocup de o anumit parte a site-ului astfe: head.php - conine partea dintre tagurile HTML <head> i </head> body.php - conine partea dintre tagurile HTML <body> i coninutul paginii footer.php - conine partea de jos a paginii n continuare, o s v prezint fiecare modul n parte. index.php - head.php - css.php - js.php - body.php - meniu_orizontal.php - meniu_vertical.php - continut.php - contact.php - module.php - /module/data_ora.php - footer.php index.php - n care se seteaz nivelul de raportare al erorilor (dac nu dorii ca vizitatorii s vada eventualele erori raportate de ctre php, putei stabili nivelul 0).Apoi, se verific dac exist fisierul head.php i body.php i se ncarc sau se oprete cu un mesaj de eroare. head.php - n acest fiier se afiseaz codul html pentru nceputul paginii, i dac exist, se ncarc i fiierele cu cod CSS i JavaScript folosite n pagin. css.php - acest fiier conine codul CSS folosit pentru formatarea i afiarea paginii HTML. js.php - dac se folosete cod JavaScript n pagini, este de preferat s se salveze codul n acest fiier, pentru a putea avea acces rapid la el n cazul n care doriti s facei modificri. body.php - conine codul HTML existent ntre tagurile <body> i </body> Dac exist, se ncarc i fiierele care conin meniul orizontal i/sau vertical, precum i fiierul care afieaz

coninutul paginii cerute. Pe lang acestea, dac dorii s bagai alte scripturi n pagini, se include i fisierul module.php meniu_orizontal.php - conine codul HTML pentru meniul orizontal. meniu_vertical.php - conine codul HTML pentru meniul vertical continut.php - afieaz coninutul paginilor, n funcie de linkul cerut. Dac se cer pagini externe, se verific daca acea pagin exist i se ncarc pentru afiare. contact.php - poate fi o pagina extern, cu coninut HTML sau PHP, precum i formulare de contact. module.php - este un fiier care atunci cnd este accesat, verific ce fiiere exist n directorul MODULE i le ncarc pe fiecare. data_ora.php - este un fiier extern, care afieaz cteva informaii despre vizitator. footer.php - este fiierul care afieaz n josul paginii numele curent al paginii Acest exemplu l putei descrca de aici i l putei testa i modifica pe serverul dvs.

Cteva informaii despre documentarea i depanarea unui script.

n afar de a furniza nume descriptive fiierelor care conin scripturile dvs. PHP, trebuie s includei n fiecare script att comentarii care s permit unui cititor s determine cu uurin utilitatea scriptului, ct i alte informaii referitoare la script. De exemplu, putei include un comentariu care precizeaz numele fiierului care conine scriptul, astfel nct acesta s apar n versiunile tiprite ale scriptului. Iat un model sintactic pentru comentariile PHP: // Scrieti aici comentariul dvs. Dup cum se poate vedea, un comentariu ncepe cu dou caractere slash, urmate de un spatiu. n continuare, linia conine comentariul, care poate include orice caractere dorii, inclusiv caractere speciale. O modalitate de a crea un comentariu pe mai multe linii este de a ncepe fiecare linie cu ajutorul caracterelor //. Totui, putei crea un comentariu din mai multe linii i n alte moduri, dac preferai. Iat un exemplu: /* Acesta este un comentariu pe mai multe linii. Poate fi alcatuit dintr-un numar oricat de mare de linii. */ Pentru a ncepe un comentariu alctuit din mai multe linii, scriei caracterele /*, iar pentru a ncheia comentariul, scriei caracterele */ ntre cele dou perechi de caractere, putei scrie orice text dorii, folosind oricte linii dorii. Uneori, n locul datelor de ieire ale scriptului, putei vedea unul din urmtoarele: - Textul scriptului, n loc de datele de ieire ale acestuia - O caset de dialog, prin care suntei ntrebat dac dorii s descrcai fiierul care conine scriptul. - Un mesaj n care se spune c scriptul nu exist - Un mesaj n care se spune c browserul web nu are permisiunea de a obine accesul la script - Un mesaj n care se spune c scriptul conine o eroare La vizualizarea rezultatelor unui script PHP se pot produce numeroase erori, chiar dac scriptul n sine e corect. Dac vedei textul scriptului sau o caset de dialog prin care suntei ntrebat

dac dorii s descrcai fiierul care conine scriptul, este posibil ca extensia fiierului script s fie incorect sau ca serverul PHP s nu funcioneze. Dei fiierele script PHP trebuie s aib, n general, extensia .php, este posibil ca un administrator de sistem s configureze un server PHP astfel nct acesta s impun o alt extensie de fiier. Dac vedeti un mesaj n care se spune c scriptul nu exist, este posibil ca s fi tastat incorect adresa URL. Verificai dac ai tastat corect adresa URL precum i dac ai ataat corect la aceasta numele fiierului care conine scriptul, folosind un slash numai dac adresa URL nu se ncheie cu un atare caracter. Dac vedei un mesaj n care se arat c browserul web nu are permisiunea de a obine accesul la script, poate c este necesar s modificai permisiunile fiierului script (cmod). Dac vedei un mesaj n care se spune c scriptul conine o eroare, verificai dac nu au aprut urmtoarele probleme: - O eroare de tastare, cum ar fi scrierea greit a cuvntului echo - O eroare de punctuaie, cum ar fi paranteze, ghilimele duble sau punct i virgul lips sau inserate greit. - Neincluderea sau includerea eronat a liniilor de delimitare a scriptului, n spe <?php i ?> - Un marcaj de comentariu (//) care lipsete sau a fost introdus gresit. irurile i caracterele speciale Spre deosebire de numere ntregi i de numere duble, care conin cu precdere cifre, irurile pot conine orice caracter. Ca atare, irurile sunt utile pentru stocarea datelor care nu pot fi calculate, precum nume i adrese. De asemenea, irurile pot fi utilizate pentru stocarea datelor numerice. Pentru a specifica un ir n PHP, caracterele care alctuiesc irul sunt incluse ntre ghilimele duble; de exemplu, irul reprezentnd numele "Albert Einstein". Aa cum am mai spus, un ir poate conine date numerice; de exemplu , "3.141516". PHP faciliteaz includerea n iruri a unor caractere speciale, precum caracterele de salt la linie nou sau retur de car, prin furnizarea de secvene escape care reprezint caractere speciale. Iat secvenele escape folosite n PHP: \n - salt la linie noua \r - retur de car \t - caracter de tabulare pe orizontal \\ - backslash \$ - simbolul dolarului \" - ghilimele duble Ca exemplu, iat un ir care include un retur de car, urmat de un salt la linie nou: "Salut! \r\n". Reinei c fiecare secven escape ncepe cu un backslash (\). Pentru a include un backslash ntr-un ir, trebuie s folosii secvena escape adecvat, care este alctuit din dou caractere backslash. Pentru a introduce ghilimele duble n cadrul unui ir fr a folosi secventa escape, putei include irul ntre ghilimele simple astfel: 'Pe ea o cheama "Nikita"' Aceasta este util cnd dorii s introducei ntr-un ir taguri HTML, astfel: $sir = '<a href="index.php" target="_blank">Prima pagin</a>'; Dup cum observai deoarece standardul HTML necesit folosirea ghilimelelor pentru a nu se ncurca cu codul php am folosit pentru acest sir ghilimele simple. Sigur, acest cod se poate scrie i asa: $sir = "<a href=\"index.php\" target=\"_blank\">Prima pagin</a>";

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.

Operatori PHP

Interpretorul PHP permite folosirea a nou tipuri diferite de operatori. Acetia opereaz asupra unor expresii (una, doua sau trei) i furnizeaz ca rezultat o alt expresie (rezultatul operaiei corespunztoare). Operatori aritmetici: Toi operatorii aritmetici opereaz asupra a dou expresii (operanzi). Exist cinci astfel de operatori: - adunare ('+'); - scdere ('-'); - nmulire ('*'); - mparire ('/'); - rest ('%'). Aceste operaii se aplic asupra unor valori care reprezint tipuri numerice. Dac unul dintre operanzi nu are tip numeric, atunci el va fi convertit automat la o valoare ntreag. Dac cel puin unul dintre operanzi (dup efectuarea eventualelor conversii necesare) este un numr real, atunci rezultatul operaiei va fi tot un numr real, cu excepia operatorului rest; rezultatul operaiei de determinare a restului este ntotdeauna un numr ntreg. Dac ambii operanzi sunt numere ntregi, atunci rezultatul va fi un numr ntreg, cu excepia mpririi al crei rezultat este ntotdeauna un numr real. Dac operatorul rest este aplicat asupra unor numere reale, atunci rezultatul este un numr ntreg. Nu este permis mprirea la valoarea 0. Dac al doilea operand asupra cruia se aplic unul dintre operatorii '/' sau '%' are valoarea 0, va fi semnalat o eroare. Operatori de comparare: Interpretorul PHP pune la dispozitie mai muli operatori care pot fi folosii pentru compararea a dou valori. Expresiile n care apar astfel de operatori au ca rezultat valori logice (true sau false). Cel mai des ntlnit operator este cel de atribuire, definit prin semnul = Dac scriem $x = 1 nu nseamn c $x este egal cu 1 ci c i s-a acordat valoarea 1. Dac scriem $rezultat = $x + $y nu nseamn c $rezultat este egal cu suma celor dou, ci c i-am atribuit (acordat) valoarea sumei celor dou. Operatorul de egalitate este == si se folosete cel mai des n propoziii condiionale, pentru a testa egalitatea. Opusul su, !=, este operatorul de inegalitate i se folosete n acelai scop. Operatorul de egalitate se folosete pentru a compara egalitatea a dou valori. Pentru a v lmuri cum st treaba cu egalitatea i atribuirea, testai urmtorul cod:

Cod:

<?php $x = 1; $y = 7; if ($x == { print } if ($x != { print

$y) "$x este egal cu $y"; $y) "$x este diferit de $y";

?>

Ali operatori folosii pentru compararea valorilor variabilelor sunt: '>' mai mare '>=' mai mare sau egal '<' mai mic '<=' mai mic sau egal Exemplu: Cod:

<?php $x = 5; $y = 4; if ($x > $y) { print "$x este mai mare ca $y"; } if ($x <= $y) { print "$x este mai mic sau egal cu $y"; } ?>
'==' - rezultatul este true dac cele dou expresii au aceeai valoare; '===' - rezultatul este true dac cele dou expresii au aceeai valoare i au acelai tip; '!=' sau '<>' - rezultatul este true dac cele dou expresii au valori diferite; '!==' - rezultatul este true dac cele dou expresii au valori diferite sau au tipuri diferite; '<' - rezultatul este true dac valoarea primei expresii este mai mic dect valoarea celei dea doua expresii; '>' - rezultatul este true dac valoarea primei expresii este mai mare dect valoarea celei dea doua expresii; '<=' - rezultatul este true dac valoarea primei expresii este mai mic sau egal cu valoarea celei de-a doua expresii; '>=' - rezultatul este true dac valoarea primei expresii este mai mare sau egal cu valoarea celei de-a doua expresii. Pe lng acestea exist i operatorul condiional '?' 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. Operatori pentru iruri de caractere: Operatorii pentru stringuri sunt '.' (punct) pentru concaternare i '.=' (punct i egal) pentru atribuirea concaternrii. Aceti operatori sunt folosii pentru a unii stringuri, n felul urmator:

Cod:

<?php // concaternarea stringurilor $test = 'Am scris un '.'text'.'oarecare'; print $test; // pe ecran va fi afisat "Am scris un text oarecare" // concaternarea stringurilor cu variabile

$nr = 5; print 'Am scris numarul '.$nr.' si un text '.' oarecare'; // pe ecran va fi afisat "Am scris numarul 5 si un text oarecare" // atribuirea concaternarii $nr = 6; $text = "Un text "; $text .= "oarecare "; $text .= "si numarul ".$nr; print $text; // pe ecran va fi afisat "Un text oarecare si numarul 6" ?>
Operatori pe bii i operatori logici: Interpretorul PHP pune la dispoziie ase operatori care opereaz asupra biilor unui numr ntreg sau ai unui ir de caractere. Acetia sunt: - conjuncie ('&') - SI (AND); - disjuncie ('|') - SAU (OR); - disjuncie exclusiv ('^') - SAU exclusiv (XOR); - negaie ('~') - NU (NOT); - deplasare la stnga ('<<'); - deplasare la dreapta ('>>'). Operatorii logici v vor veni la ndemn n execuia scriptului atunci cnd avei nevoie s lucrai cu valori de adevr. S presupunem c la intrarea n seciunea de administrare avem un formular care cere numele i parola de acces n seciune. Pentru contruirea expresiilor logice operanzii trebuie s aib tipul boolean; dac operatorii au alt tip, valoarea este convertit la o valoare boolean. Scriptul PHP ar putea verifica aceste informaii pentru a autoriza accesul n seciune folosind operatorii logici astfel: - operatorul 'xor' (SAU exclusiv) Expresia n care apare operatorul 'xor' va avea valoarea true dac exact unul dintre operanzi are valuarea true - operatorul '!' (NOT) if (!parola_e_buna) ... parola nu este bun, accesul este interzis if (!parola_nu_e_buna) ... parola e bun, accesul este permis Operatorul '!' returneaza TRUE dac valoarea iniial de adevr e FALSE i FALSE dac valoarea iniial este TRUE. - operatorul '||' (OR) if (numele_este_valid) || parola_este_buna) ... verific dac numele sau parola sunt valide i dac oricare dintre ele este, returneaz valoarea de adevr TRUE. n acest exemplu de pseudocod dac numele ar fi valid dar parola nu, i-am acorda utilizatorului acces mai departe, ceea ce nu este de dorit. Trebuie s fim siguri c i numele i parola sunt valide. Operatorul '||' returneaz TRUE dac oricare din valorile verificate e TRUE. Returneaz FALSE doar dac amndou sunt FALSE. - operatorul '&&' (AND) if (numele_este_valid && parola_este_buna) ... dac att numele ct i parola sunt valide putem acorda utilizatorului acces n seciunea de administrare. Operatorul '&&' returneaz TRUE doar dac ambele valori verificate sunt TRUE. El returneaz FALSE dac oricare dintre ele este FALSE (sau dac amndou sunt FALSE). Operatori de atribuire: Primul operand asupra cruia este aplicat un astfel de operator de atribuire trebuie s fie o variabil, iar al doilea poate fi o expresie. Operaia Varianta scurt Varianta standard adunare ('+=') $a += 2 $a = $a + 2

scdere ('-=') nmulire ('*=') mprire ('/=') rest ('%=') conjuncie ('&=') disjuncie ('|=') disjuncie exclusiv ('^=') deplasare la stnga ('<<=') deplasare la dreapta ('>>=') concaternare ('.=') Exemplu: Cod:

$a $a $a $a $a $a $a $a $a $a

-= 2 *= 2 /= 2 %= 2 &= 2 |= 2 ^= 2 <<= 2 >>= 2 .= "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 . "2"

<?php $b = 2; $a = 1; echo "<TT>$a += $b = "; echo $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; "<br>$a -= $b = "; $a -= $b; 2; 1; "<br>$a *= $b = "; $a *= $b; 2; 1; "<br>$a /= $b = "; $a /= $b; 2; 1; "<br>$a %= $b = "; $a %= $b; 2; 1; "<br>$a &= $b = "; $a &= $b; 2; 1; "<br>$a |= $b = "; $a |= $b; 2; 1; "<br>$a ^= $b = "; $a ^= $b;

$b = 2;

$a = 1; echo "<br>$a <<= $b = "; echo $a <<= $b; $b = $a = echo echo $b = $a = echo echo echo ?> 2; 1; "<br>$a >>= $b = "; $a >>= $b; 2; 1; "<br>$a .= $b = "; $a .= $b; "</TT>";

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.5 %= 2 = 1 &= 2 = 0 |= 2 = 3 ^= 2 = 3 <<= 2 = 4 >>= 2 = 0 .= 2 = 12

Operatori de incrementare i decrementare: Operatorul de incrementare (++) are ca efect creterea cu 1 a valorii unei variabile, iar cel de decrementare (--) are ca efect scderea cu 1 a valorii variabilei. Tipul variabilei poate fi ntreg sau real. Dac operatorul precede variabila, atunci rezultatul expresiei este valoarea obinut dup incrementare sau decrementare. Dac variabila precede operatorul, atunci rezultatul expresiei este valoarea variabilei naintea incrementrii sau decrementrii. Cu alte cuvinte, dac operatorul precede variabila, atunci valoarea variabilei este mai nti modificat i apoi utilizat, iar dac variabila precede operatorul, atunci valoarea ei este mai nti utilizat i apoi modificat. Aceti operatori pot fi utilizai i pentru variabile care conin iruri de caractere. Operatorul de incrementare duce la creterea cu 1 a codului ASCII a ultimului caracter din ir dac acesta este o litera sau cifr. n cazul n care litera este 'z', respectiv 'Z', sau cifra este '9', atunci ea devine 'a', respectiv 'A', sau cifra '0' i se ncearc incrementarea penultimului caracter. Dac aceasta este tot '9', 'z' sau 'Z' se aplic acelai procedeu i se trece la antepenultimul caracter. Procedeul continu pn n momentul n care se ajunge la un caracter care nu este '9', 'z' sau 'Z' sau se ajunge la nceputul irului. n acest ultim caz, la nceputul irului se adaug caracterul '1', 'a' sau 'A'. Incrementarea nu are nici un efect pentru caracterele care nu sunt cifre sau litere. Decrementarea irurilor de caractere nu are nici un efect, valorile variabilelor rmnnd nemodificate. Exist o singur excepie i anume irurile care reprezint numere ntregi sau reale. Acestea sunt incrementate sau decrementate potrivit regulilor pentru valorile numerice. Exemplu:

Cod:

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

echo $a++; echo "</tt>. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t t>$a."; echo "<br>a = $a"; echo ": </tt><i>Rezultatul operatiei </i><tt>++a</tt><i> este </i><tt> "; echo ++$a; echo "</tt>. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t t>$a."; echo "<br>a = $a"; echo ": </tt><i>Rezultatul operatiei </i><tt>a--</tt><i> este </i><tt> "; echo $a--; echo "</tt>. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t t>$a."; echo "<br>a = $a"; echo ": </tt><i>Rezultatul operatiei </i><tt>--a</tt><i> este </i><tt> "; echo --$a; echo "</tt>. <i>Noua valoare a variabilei </i><tt>a</tt><i> este </i><t t>$a."; echo "</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. Noua valoare a variabilei a este 8. 8: Rezultatul operatiei ++a este 9. Noua valoare a variabilei a este 9. 9: Rezultatul operatiei a-- este 9. Noua valoare a variabilei a este 8. 8: Rezultatul operatiei --a este 7. Noua valoare a variabilei a este 7. 7.5: Rezultatul operatiei a++ este 7.5. Noua valoare a variabilei a este 8.5: Rezultatul operatiei ++a este 9.5. Noua valoare a variabilei a este 9.5: Rezultatul operatiei a-- este 9.5. Noua valoare a variabilei a este 8.5: Rezultatul operatiei --a este 7.5. Noua valoare a variabilei a este PHP: Rezultatul operatiei a++ este PHP. Noua valoare a variabilei a este PHQ: Rezultatul operatiei ++a este PHR. Noua valoare a variabilei a este PHR: Rezultatul operatiei a-- este PHR. Noua valoare a variabilei a este PHR: Rezultatul operatiei --a este PHR. Noua valoare a variabilei a este

8.5. 9.5. 8.5. 7.5. PHQ. PHR. PHR. PHR.

Aceti operatori sunt utili de exemplu pentru monitorizarea unui download, dac dorii s tii de cte ori a fost descrcat un fiier dintr-o anumit pagin. La fiecare accesare a fiierului, scriptul incrementeaz cu 1 i afieaz valoarea. (scriptul l gndii voi, doar nu vrei totul la tav) Operatori pentru controlul erorilor: n PHP exist un operator (@) care permite ignorarea erorilor. Dac este aplicat asupra unei expresii care ar duce la afiarea unui mesaj de eroare, atunci mesajul respectiv nu va fi afiat. Operatori de execuie: Interpretorul PHP permite executarea unor comenzi sistem prin intermediul operatorului (` `) . Comanda respectiv este cuprins ntre apostroafele inverse (tasta de lng 1 deasupra tastei tab), iar rezultatul acestei comenzi este un ir de caractere care reprezint i rezultatul expresiei. Urmatorul script PHP determin execuia pe server a comenzii help /? i afiarea rezultatului n fereastra programului de navigare.

Cod:

<?php echo "<PRE>".`help /?`."</PRE>"; ?>


Atenie! Pe unele configuraii de server nu se permite executarea de comenzi prin intermediul PHP (ca msur de siguran, altfel oricine ar putea da un format sau reboot la server prin intermediul unui script PHP). Operatori pentru vectori: Singurul operator care poate fi aplicat asupra vectorilor este cel de concaternare (+) Rezultatul concaternrii a doi vectori este un vector care conine elementele din cei doi vectori. Dac cei doi vectori conin elemente cu aceeai cheie, atunci este pstrat doar elementul din vectorul care reprezint primul operand. Exemplu:

Cod:

<?php $x[2] = 2; $x[4] = 4; $x[5] = 5; $x[7] = 7; $y[1] = 100; $y[2] = 200; $y[3] = 300; $y[4] = 400; $y[5] = 500; $z = $x + $y; echo "$z[1] $z[2] $z[3] $z[4] $z[5] $z[7]"; ?>
Rezultatul codului de mai sus este: 100 2 300 4 5 7 Ordinea operaiilor: Evident, o expresie poate conine mai muli operatori, din categorii diferite. Pentru a indica ordinea n care trebuie efectuate calculele, trebuie stabilit o ordine a operaiilor. Pentru aceasta a fost definit precedenta i asociativitatea operaiilor. Valoarea expresiilor corespunztoare operatorilor cu precedenta mai mare va fi calculat naintea valorilor expresiilor cu o precedent mai mic. De exemplu, pentru expresia 1 + 2 * 3 va fi efectuat mai nti nmulirea 2 * 3, datorit faptului c operatorul '*' are precedenta mai mare dect cea a operatorului '+'. Dac o expresie sau o subexpresie conine numai operatori cu aceeai precedent, atunci operaiile se vor efectua n ordinea determinat de asociativitatea acestor operatori care poate fi de la dreapta la stnga sau de la stnga la dreapta. Toi operatorii cu aceeai precedent au aceeai tip de asociativitate. Evident, pentru a modifica ordinea implicit de efectuare a operaiilor pot fi folosite paranteze pentru a indica faptul c o anumit operaie trebuie efectuat naintea altora, chiar dac acestea din urm au o precedent mai mare. Trebuie observat faptul c, datorit asociativitii de la dreapta spre stnga a operatorilor de atribuire, expresiile de tipul $a = $b = 1 sunt valide. Mai nti se va efectua atribuirea $b =

1; variabila $b va primi valoarea 1 i, datorit faptului c rezultatul unei operaii de atribuire este valoarea atribuit variabilei care reprezint primul operand, n continuare se va efectua atribuirea $a = 1, deci i variabila $a va primi tot valoarea 1. Tabelul de mai jos conine o list cu majoritatea operatorilor din PHP. Liniile tabelului indic precedenta, n sensul c un operator are aceeai precedent cu operatorii de pe linie n care apare i o precedent mai mare dect oricare operator aflat pe o linie anterioar. n acest tabel se observ faptul c, dei operatorii '&&' i 'and', respectiv '||' i 'or' realizeaz aceeai operaie, ei au precedente diferite, deci nu sunt echivaleni din toate punctele de vedere. de de de de de la la la la la Tip asociativitate stnga la dreapta stnga la dreapta stnga la dreapta stnga la dreapta stnga la dreapta Tip unar binar binar binar binar Operanzi . (selectare) or xor and print = += -= *= /= .= %= &= |= ^= ~= <<= >>= ?: || && | ^ & == != === !== < <= > >= << >> + . (concaternare) * / % ! ~ ++ -(int) (float) (string) (array) (object)

de la stnga la dreapta

binar

de de de de de de

la la la la la la

stnga stnga stnga stnga stnga stnga

la la la la la la

dreapta dreapta dreapta dreapta dreapta dreapta

ternar binar binar binar binar binar binar

fr asociativitate

fr asociativitate de la stnga la dreapta de la stnga la dreapta de la stnga la dreapta de la stnga la dreapta

binar binar binar binar unar

de la stnga la dreapta fr asociativitate

unar unar

@ [ new

n tabel este prezentat i numrul expresiilor asupra crora acioneaz un operand. Operatorii unari acioneaz asupra unei singure expresii, cei binari asupra a dou expresii i singurul operator ternar asupra a trei expresii. n continuare sunt civa operatori care execut operaii utile: abs(x) - returneaz valoarea absolut a lui x; ceil(x) - returneaz valoarea x, rotunjit la ntregul imediat superior; floor(x) - returneaz valoarea x, rotunjit la ntregul imediat inferior; max(x, y, ...) - returneaz valoarea maxim a unui set de valori; min(x, y, ...) - returneaz valoarea minim a unui set de valori; pow(x, n) - returneaz numrul x, ridicat la puterea specificat n; strftime(f) - returneaz data curent, formatat conform coninutului parametrului f; sqrt(x) - returneaz rdcina ptrat a lui x

Mai jos sunt cateva exemple: $lungime = sqrt($arie); Acest exemplu calculeaz lungimea laturilor unui ptrat, dac este cunoscut aria ptratului. n continuare este prezentat modul de utilizare al funciei max, care preia mai multe argumente: $punctaj_castigator = max($punctaj1, $punctaj2, $punctaj3); Un alt exemplu calculeaz aria unui cerc de raz dat:

Cod:

<?php $raza = 2.0; $pi = 3.14159; $arie = $pi * $raza * $raza; echo "raza = "; echo $raza; echo "<br>arie = "; echo $arie; ?>

Cteva idei utile pentru securitatea paginilor web

Regula numrul unu a securitii online este: nu v ncredei niciodat n utilizator. ntotdeauna verificai datele trimise ctre server i "curai-le" nainte de a le utiliza. Pentru aceasta trebuie s luai n considerare cteva posibile "guri" de securitate. Menionez c cele scrise aici sunt doar noiuni generale, pentru o securitate ridicat ar trebui sa avei noiuni specializate de baze de date i de administrare a serverelor web. 1. Variabilele globale Avnd variabilele globale din php.ini setate pe ON putei accesa datele trimise prin formulare

mai simplu: $variabila n loc de $_GET['variabila'], la fel i pentru POST sau FILES. Dac scriptul nu este foarte bine gndit, variabilele globale pot prezenta un risc major de securitate. Din acest motiv php.ini este distribuit cu globals=off n ultimele versiuni. 2. Ghilimele "magice" Dac n php.ini magic_quotes_gpc sunt OFF folosii funcia addslashes pentru a preceda ghilimelele din datele trimise de utilizatori cu caracterul \. Dac magic_quotes_gpc sunt ON, PHP adaug automat caracterul \ nainte de ghilimele dar dac ele sunt OFF, ghilimelele din input v pot crea probleme serioase. Ca exemplu, 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, utilizatorul este logat. n acest caz, 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, de fapt). Mai mult, atunci cnd v ateptai ca baza de date s returneze un singur rnd, verificai acest lucru i nu dac interogarea s-a executat cu succes. Implicit n php.ini magic_quotes_gpc sunt ON pentru a v proteja de astfel de atacuri, dar este bine s verificai nainte de a renuna la addslashes. 3. Includere ncercai s evitai includerea "vizibil" a fiierelor n forma http://site.ro/fisier.php? file=cutare.html pentru a include fiiere n cadrul unei pagini. Cu puin neatenie din partea voastr atacatorul ar putea accesa astfel de informaii sensibile din cadrul sistemului. Nu includei fiiere strine. PHP poate "include" fiiere aflate pe alte servere dect cel care ruleaz dac setarea URL fopen wrappers este activat n php.ini. n exemplul de mai sus, un atacator ar fi putut accesa adresa http://site.ro/fisier.php?file=http://www.rau.ro/scriptultau.php pentru a include n fisier un script localizat pe alt server i astfel obine acces ctre toate resursele sistemului la care are acces PHP, putnd rula comenzi de sistem, afia informaii confideniale sau sterge baza de date. Nu permitei includerea fiierelor din alt parte dect de pe serverul vostru. Setai allow_url_fopen=OFF n php.ini. 4. Formulare Folosii metoda POST n formulare atunci cnd informaia din acestea urmeaz s fie introdus n baza de date. Dac variabilele globale sunt OFF n php.ini sau metoda de transmitere a formularului este GET, un utilizator ru intenionat ar putea accesa adresa dvs. i ar introduce comentariul lui (exemplu "blabla") n baza voastr de date fr s treac propriuzis prin site. Aa v putei trezi c nu mai avei spaiu pe server iar n baza de date sunt cteva milioane de comentarii care spun acelai lucru "blabla". Verificarea provenienei cererilor ctre server este foarte important i n alt caz: formularele de loghin. Cineva care tie numele de utilizator ar putea ncerca s v gseasc parola foarte usor. n acest caz va trebui s punei o protecie suplimentar care s nu permit mai mult de X ncercri consecutive euate de logare pentru un nume de utilizator. Aceast problem se rezolva uor folosind sesiunile. n momentul cnd cineva ncearc s trimita numele i parola din formular putem seta o variabil de sesiune $_SESSION['login_count'] care s in minte numrul de ncercri. Cnd valoarea acesteia trece de 3 (ncercri nereuite) nici mcar nu mai interogai baza de date pentru a verifica datele trimise. Variabila de sesiune va rmne n memorie ct timp browserul este deschis i sesiunea activ (opiunea implicit a PHP de meninere a sesiunilor active este de o or). Dac atacatorul ateapt o ora sau i nchide browserul, sesiunea va fi nchis i va putea de alte X ori s se logheze. De cele mai multe ori acest msur de siguranta este suficient pentru a preveni ncercrile de aflare a parolelor.

5. Extensii O practic obinuit este de a acorda extensia .inc fiierelor care conin biblioteci de funcii ce urmeaz a fi incluse i folosite n cod. PHP nu parseaz fiierele cu extensia .inc i dac acestea sunt apelate direct ele sunt trimise plain text ctre browser. Nu punei informaii sensibile (precum nume i parola) n fiiere cu extensia .inc, .txt, sau .html care pot fi accesate i vzute. Folosii pentru aceste fiiere extensia .php care, dac sunt accesate direct, vor fi rulate fr s afieze informaiile coninute n ele. 6. Comanda CHMOD - setarea atributelor Comanda CHMOD (abreviere pentru change mode permissions of a file) este folosit pentru a schimba modul de acces (de permitere) a fiierelor i directoarelor de pe server. Setarea poate afecta modul cum poate fi citit, sau cum se poate executa un fiier pe server. De exemplu, dac avei un fiier .php care trebuie s execute o comand de scriere pe server ntr-un fiier .txt trebuie s i dai dreptul s poata fi executat iar la fiierul .txt trebuie s i dai dreptul de a se putea scrie n el. Aveti 3 tipuri de acces - OWNER - GROUP - WORLD - fiecare cu cte 3 setri - READ - WRITE - EXECUTE Este bine ca la WORLD s nu dai dect acces la citire (pentru a putea accesa paginile de pe site) dar nu i drepturi de scriere sau execuie (pentru c nu dorii ca oricine s v scrie ce vrea n respectivul fiier .txt) n programul TOTAL COMMANDER (pe care eu l folosesc i pentru FTP) setarea atributelor pe server se face din meniul FILES - CHANGES ATTRIBUTES. Fiecare program de FTP are n meniul lui setare pentru atributele fiierelor de pe server. 7. Cookies Dac avei o seciune de administrare pe site, unde accesul este restrictionat doar la membrii de exemplu, este bine ca n toate paginile din aceast seciune s nclud o pagin de verificare a accesului. 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. Fr aceast verificare, un utilizator ar putea accesa paginile din seciunea de administrare fr s treac prin formularul de nregistrare. Dup autentificarea propriu-zis, vom folosi variabile de sesiune pentru a pstra n memorie cteva informaii despre autentificare, pentru a le verifica mai trziu, atunci cnd accesm alte pagini din cadrul seciunii de administrare. Pornim nti sesiunea dup care trecem la salvarea informaiilor n ea ca n exemplul de mai jos: session_start(); $_SESSION ['nume_admin'] = $_POST ['nume']; $_SESSION ['parola_encriptata'] = $parolaEncriptata; Pe lng acestea, pentru o i mai mare siguran, vom salva id-ul sesiunii n alt variabil. Toate sesiunile au un id unic, un string care seamn cu rezultatul unei criptri MD5: $_SESSION ['key_admin'] = session_id(); Cu autentificare fcut, spunem scriptului s ncarce prima pagin din seciunea de administrare: header ("location: admin.php"); n continuare pentru a mpiedica accesul neautorizat la paginile din aceast seciune, scriem un mic script de verificare a datelor sesiunii nainte de a ncrca orice pagin din seciunea de administrare: session_start(); if ($_SESSION ['key_admin'] != session_id ()) { print 'Acces neautorizat!'; exit; } 8. Loguri de acces

Pentru o verificare ulterioar a persoanelor care ncearc s intre n paginile restrictionate de pe site, este bine s salvm n baza de date (sau ntr-un fiier text) numele, parola criptata, ora, data, semntura browserului i ip-ul. Aa vei tii cine a ncercat s v sparg site-ul i putei 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 gsete userul i parola corecte) 9. Criptarea parolelor cu MD5 Parolele care sunt salvate n baza de date este recomandat s le inei criptate, astfel dac cineva ncearc s citeasca parolele le va vedea criptate. INSERT INTO admin VALUES ("administrator", md5("parola")); 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). 10. Pagina index.php n subdirectoare Dac avei mai multe directoare i subdirectoare pe server este recomandat pentru a preveni accesul la datele aflate n aceste directoare s introducei n fiecare director o pagin numit index.html sau index.php care s fac redirectarea automat ctre pagina principal a site-ului. Astfel minimizati riscul s intre cineva i s vad tot ce este n aceste subdirectoare. 11. Fiierul .htaccess Pentru a bloca accesul la un anumit director (sau chiar la tot site-ul) puteti crea un fiier numit .htaccess (cu punct nainte) n care s introducei ip-ul care dorii s l blocai (sau care s aib acces) Order Deny,Allow Allow from all n exemplul de mai sus, toat lumea are acces. Dac de exemplu ip-ul 192.168.1.1 nu dorii s aib acces la acel director scriei Deny from 192.168.1.1 Atenie, s nu v blocai singuri ip-ul la site, c altfel trebuie s luai legtura cu administratorul serverului s stearg fiierul ca s putei intra din nou pe site, sau sa scrieti prin FTP un nou fiier .htaccess. (la subdirectoare tergei directorul sau salvai un alt fiier .htaccess) n cazul n care dup de ai pus fiierul pe server nu l vedei, el este acolo dar serverul seteaza acest nume de fiier ca fiier ascuns. 12. Roboii de cutare Motoarele de cutare pot indexa tot ce se afl la voi pe site. Dac dorii ca un fiier sau director s nu fie indexat de ctre motoarele de cutare, trebuie s creai un fiier numit robots.txt care s se afle n directorul principal de pe site (nu n subdirectoare). n el scriei urmtoarele comenzi: # robots.txt for http://www.tutoriale.far-php.ro User-agent: * Disallow: /cache/ Disallow: /admin disallow: /search unde pentru fiecare director sau fiier se specific locaia i numele. Pentru mai mult siguran, am gsit 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).

Cum am specificat i la nceputul acestui articol, cele spuse mai sus nunt doar cateva indicii i idei pentru a v putea proteja mai bine paginile.

Structuri de control n PHP

Dup cum tii, instruciunile PHP sunt separate prin caracterul ';'. Deseori, suntem nevoii s grupm mai multe instruciuni pentru a forma un bloc. Astfel, obinem instruciunile compuse care sunt formate din mai multe instruciuni simple, separate prin caracterul ';'. n PHP, instruciunile compuse au urmtoarea sintaxa: { instructiune #1 instructiune #2 ... instructiune #n } Instruciunile care formeaz instruciunea compus pot fi de orice tip: orice structur de control, alte instruciuni compuse etc. Aadar un bloc de instructiuni (o instruciune compus), n PHP, este delimitat de acolade. Structura if Una dintre cele mai importante structuri n orice limbaj este cea alternativa. n PHP sintaxa acestei structuri este urmtoarea: if (conditie) instructiune Folosirea unei astfel de structuri indic faptul c instruciunea se va executa dac i numai dac valoarea expresiei conditie (eventual dup conversia la tipul boolean) este true. Construcia if - else n foarte multe cazuri dorim s executm o alt instruciune dac valoarea expresiei condiie este false. n PHP putem utiliza o construcie de tipul if - else n acest scop. Sintaxa este: if (conditie) instructiune #1 else instructiune #2 Construcia elseif Uneori, suntem nevoii s folosim structuri alternative mbricate n diferite scopuri. Folosind construcii de tipul if - else vom obine o secven de tipul: if (conditie #1) instructiune #1 elseif (conditie #2) instructiune #2 else ... elseif (conditie #n) instructiune #n else instructiune #n+1 Limbajul PHP permite folosirea unei prescurtri i anume construcia elseif. Practic, aceasta nlocuieste un else urmat de un if. Folosind aceast structur, codul anterior poate fi scris astfel: if (conditie #1) instructiune #1 elseif (conditie #2) instructiune #2

elseif ... elseif (conditie #n) instruciune #n else instructiune #n+1 Sintaxe alternative Dac dorim s se execute mai multe instruciuni cnd este indeplinit o anumit condiie, atunci ar trebui s folosim instruciunile compuse. De exemplu, pentru o structur if vom scrie: if (conditie): instructiune #1 instructiune #2 ... instructiune #n endif Practic, pentru orice structur de control PHP, putem nlocui acolada deschisa prin caracterul ':' i acolada nchis printr-un cuvnt cheie opinut prin adugarea prefixului end la cuvntul cheie care indic structura de control. Trebuie observat faptul c else i elseif nu sunt structuri, ele fiind simple construcii folosite n cadrul structurii if. Din acest motiv, nu vom avea niciodat endelse sau endelseif, ci doar endif-uri. Aadar, sintaxa alternativ pentru o structur if n care se folosesc construcii else i elseif este urmtoarea: if (conditie #1) grup instructiuni #1 elseif (conditie #2) grup instructiuni #2 elseif ... elseif (conditie #n) grup instructiuni #n else grup instructiuni #n+1 endif; Structura while Majoritatea script-urilor PHP vor conine cicluri. Pentru a folosi o bucl anterior condiionat vom utiliza structura while. Sintaxa acestei proceduri este: while (conditie) instructiune Efectul acestei structuri este executarea instruciunii att timp ct valoarea expresiei condiie (eventual dup conversia la tipul boolean) este true. Trebuie observat faptul c este posibil ca instruciunea s nu fie executat niciodat. Si pentru aceast structur avem la dispoziie o sintax alternativ i anume: while (conditie): grup instructiuni endwhile; Structura do - while Uneori, dorim s folosim bucle posterior condiionate. n acest scop, n PHP avem la dispoziie structura do - while a crei sintax este: do instructiune while (conditie);

Singura diferen fa de structura while este faptul c valoarea condiiei este determinat, de fiecare dat, dup executarea instruciunii. Ca urmare, instruciunea va fi executat cel puin o dat. Nu exist o sintax alternativ pentru aceast structur. Structura for O alternativ cu o funcionalitate mai ridicat pentru utilizarea buclelor este structura repetitiv for. Sintaxa este foarte asemntoare cu cea din limbajele C/C++ i Java i anume: for (expresie #1; expresie #2; expresie #3) instructiune Prima expresie este evaluat o singur dat, nainte de nceperea execuiei ciclului. Instruciunea este executat ct timp cea de-a doua expresie are valoarea true. De fiecare dat, dup executarea instruciunii, este evaluat cea de-a treia expresie. Oricare dintre cele trei expresii poate lipsi; n cazul n care o expresie lipseste, se consider c ea are valoarea true. Pentru structura for poate fi folosit i urmtoarea sintax alternativ: for (expresie #1; expresie #2; expresie #3): instructiune endfor; Exemple n continuare avei un exemplu care afieaz numerele cuprinse ntre 1 i 15. Numerele pare vor fi scrise cu rou, iar cele impare care sunt divizibile cu 3 cu verde, iar celelalte cu albastru. Vom folosi o structur repetitiv pentru a afia numerele i o structur alternativ pentru a determina culoarea cu care vor fi afiate. Putem utiliza oricare dintre cele trei structuri repetitive; codul PHP pentru cele trei variante este prezentat mai jos.

Cod:

<?php // Structuri alternative si repetitive // Bucla for // Exemplu for ($i = 1; $i <= 15; $i++): echo "<b><font size = 3 "; echo "color = "; if ( ! ($i % 2)) echo "red"; elseif ( ! ($i % 3)) echo "green"; else echo "blue"; echo "> $i </font></b>"; endfor; ?>
Cod:

<?php // Structuri alternative si repetitive

// Bucla while // Exemplu $i = 1; while ($i<=15) { echo "<b><font size = 3 "; echo "color = "; if ( ! ($i % 2)) echo "red"; elseif ( ! ($i % 3)) echo "green"; else echo "blue"; echo "> $i </font></b>"; $i++; } ?>
Cod:

<?php // Structuri alternative si repetitive // Bucla do - while // Exemplu $i = 1; do { echo "<b><font size = 3 "; echo "color = "; if ( ! ($i % 2)) echo "red"; elseif ( ! ($i % 3)) echo "green"; else echo "blue"; echo "> $i </font></b>"; $i++; } while ($i <= 15); ?>
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 iteraie printre toate elementele unui vector. Aadar, ea nu poate fi folosit dect mpreun cu vectorii; utilizarea sa asupra unei variabile de alt tip duce la apariia de erori. Exist dou sintaxe acceptate pentru aceast structur i anume: foreach (expresie_vectoriala as $valoare) instructiune

sau foreach (expresie_vectoriala as $cheie => $valoare) instructiune Dac se utilizeaz prima variant, atunci la fiecare iteraie valoarea elementului curent este atribuit variabilei $valoare i apoi se trece la elementul urmtor (a crui valoare va fi atribuit variabilei la urmtoarea iteraie). Execuia ciclului se ncheie n momentul n care nu mai exist alte elemente n vector. Singura diferena care apare n cazul utilizrii celei de-a doua variante este faptul c la fiecare iteraie valoarea cheii elementului curent este atribuit variabilei $cheie. n continuare este un exemplu de folosire a celor doua sintaxe ale structurii foreach.

Cod:

<?php // structura foreach echo '<table width="100%"><tr><td with="50%">'; // un vector obisnuit $a = array (1, 2, 3, 10); echo "<b>Parcurgerea unui vector:</b><br><ol>"; foreach ($a as $v) echo "<li><i>Valoarea curenta este </i>:<tt>$v</tt>\n<br>"; /* parcurgerea vectorului, contorizarea elementelor si afisarea num arului de ordine al elementului curent */ $i = 0; echo "</ol><b>O alta parcurgere: </b><ul>"; foreach ($a as $v) { echo "<li><tt>\$a[$i] => $v</tt>\n <br>"; $i++; } /* un vector ale carui elemente sunt identificate prin chei */ $a = array ( "unu" => 1, "doi" => 2, "trei" => 3, "zece" => 10 ); echo "</ul><td><width = 50%><b>Parcurgere cu afisarea cheilor: </b><ul>" ; foreach ($a as $k => $v) { echo "<li><tt>\$a[$k] => $v</tt>\n"; } // o matrice $b[0][0] = "a"; $b[0][1] = "b"; $b[1][0] = "c"; $b[1][1] = "d"; echo "</ul><b>Parcurgerea unei matrice:</b><br><tt>";

foreach ($b as $v1) { echo "&nbsp;&nbsp;"; foreach ($v1 as $v2) echo "$v2\n"; echo "<br>"; } echo "</tt><br><b>Parcurgerea unui vector generat dinamic: </b><br><tt> &nbsp;&nbsp;"; // un vector generat dinamic foreach (array (1, 2, 3, 4, 5) as $v) echo "$v\n"; echo "</tt></td></tr></table>"; ?>
Rezultatul codului de mai sus este: Parcurgerea unui vector: Parcurgere cu afisarea cheilor:

1. 2. 3. 4.

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 efectum anumite operaii n funcie de anumite valori ale unei expresii. O soluie ar fi folosirea unor structuri if mbricate sau a uneia singure n care apar mai multe construcii elseif. S presupunem c o anumit variabil poate avea cinci valori distincte i pentru fiecare valoare trebuie executat o anumit instruciune. Dac folosim structura if, secvena de cod va fi urmtoarea: 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)

Folosind structura switch, secvena echivalent este: swich ($variabila) { case valoare #1: instructiune break; case valoare #2: instructiune break; case valoare #3: instructiune break; case valoare #4: instructiune break; case valoare #5: instructiune break; } #1 #2 #3 #4 #5

Prezentm 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 construciile case. n caz afirmativ, toate instruciunile ncepnd cu cea corespunztoare valorii respective (pn la sfritul blocului swich) vor fi executate. Execuia acestor instruciuni poate fi ntrerupt dac este folosit instruciunea break, care va fi prezentat mai jos. Dac valoarea expresiei nu corespunde nici uneia dintre valorile corespunztoare construciilor case, se execut instruciunile corespunztoare construciei default. Dac aceasta lipseste, atunci nu se execut nici o instruciune. Trebuie precizat faptul c valorile corespunztoare construciilor case pot fi numere ntregi, numere reale sau iruri de caractere; nu pot fi utilizate obiecte sau vectori. Instruciunea break Aceast instruciune poate fi folosit pentru a ntrerupe forat execuia unui ciclu sau a secvenei de instruciuni corespunztoare unei structuri switch. Instruciunea poate fi urmat de un argument care indic numrul de structuri mbricate a cror execuie se ncheie. Valoarea implicit este 1, deci se ntrerupe execuia unei singure structuri. Urmtoarea secven de cod PHP realizeaz parcurgerea elementelor unui vector de numere ntregi pn n momentul n care se ntlnete un numr negativ.

Cod:

<?php foreach ($a as $v) if ($v < 0) break; ?>


Mai departe avei cazul n care este ntrerupt execuia mai multor cicluri; vom considera c parcurgem elementele unei matrice ptratice cu n elemente i n coloane pn n momentul n care ntlnim o valoare nul.

Cod:

<?php for ($i = 0; $i < $n; $i++) for ($j = 0; $j < $n; $j++) if ( ! $a [$i] [$j] ) break 2; ?>
Instruciunea break poate fi utilizat pentru ntreruperea execuiei secvenelor de instruciuni corespunztoare structurilor for, foreach, while, do - while i switch. Instruciunea continue Aceast instruciune este folosit pentru a ntrerupe execuia secvenei de instruciuni din interiorul unui ciclu i trecerea la urmtoarea iteraie. n cazul instruciunii for, nainte de urmtoarea iteraie se evalueaz (execut) expresia de incrementare (expresia #3 din sintaxa general). La fel ca i n cazul instruciunii break, poate aprea un argument care indic numrul structurilor mbricate asupra crora are efect. Exemplul urmtor realizeaz afiarea elementelor unui ir de numere ntregi care sunt mai mari dect 1000.

Cod:

<?php foreach ($a as $v) { if ($v <= 1000) continue; echo $v; } ?>
Urmtorul exemplu ilustreaz efectul folosirii argumentelor pentru instruciunea continue.

Cod:

<?php $i = 0; while ($i++ <5) { echo "Ciclul #1 <br>\n"; while (1) { echo "??Ciclul #2 <br>\n"; while (1) { echo "??Ciclul #3<br>\n"; continue 3; } echo "Acest mesaj nu va fi afisat niciodata.<br>\n";

?>

} echo "Nici acest mesaj nu va fi afisat niciodata.<br>\n"; }

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. Vom aminti acum cteva dintre ele: Structurile include, require, include_once i require_once pot fi utilizate pentru a "insera" anumite instruciuni care sunt pstrate ntr-un alt fiier (document). Interpretorul PHP consider c secvena din fiierul inserat se afl n fiierul din care s-a "comandat" inserarea n poziia n care apare structura de inserare. O alt structur este declare care permite crearea unor directive n execuie. Funciile PHP trebuie s utilizeze instruciunea return pentru a furniza un rezultat.

Despre funcii n PHP

n PHP funciile pot fi definite de ctre utilizator folosind urmtoarea sintax: function numef ($param1, $param2, ..., $paramN) { // instructiuni } n PHP o funcie poate fi definit oriunde n cadrul script-ului i n interiorul unei funcii poate s apar orice secven valid de cod care include definirea de alte funcii i definiii de clase. Argumentele unei funcii trebuie separate prin virgul, i, implicit, acestea sunt transmise prin valoare. Pentru ca funcia s returneze un rezultat se folosete construcia return care primete ca parametru o expresie care reprezint valoarea funciei. n momentul n care este ntlnit construcia return, execuia funciei se ncheie. n exemplul urmtor se calculeaz cu ajutorul unei funcii PHP, ptratul unui numr.

Cod:

<?php function patrat($n) { return $n * $n; } echo "4^2=<b>".patrat(4)."</b>"; ?>


Rezultatul codului va fi: 4^2=16 Transmiterea parametrilor prin referin Pentru a transmite parametri unei funcii prin referin, fapt care implic modificarea valorii parametrilor i pstrarea noii valori dup ce execuia funciei s-a ncheiat, se folosete operatorul '&' naintea numelui parametrului formal, n momentul definirii funciei. Urmtorul exemplu indic modul n care se modific valoarea unei variabile n interiorul unie funcii i modul n care aceast modificare este resimit n exteriorul acesteia:

Cod:

<?php function modificInt ($s) { $s .= " prima functie."; echo "<b>In modificInt: </b>".$s."<br>"; } function modificExt (&$s) { $s .= " a doua functie."; echo "<b>In modificExt: </b>".$s."<br>"; } $s="Iesire din "; echo "<b>In script: </b>".$s."<br>"; modificInt ($s); echo "<b>In script: </b>".$s."<br>"; modificExt ($s); echo "<b>In script: </b>".$s."<br>"; ?>
Rezultat: In In In In In script: Iesire din modificInt: Iesire din prima functie. script: Iesire din modificExt: Iesire din a doua functie. script: Iesire din a doua functie.

Nu exist posibilitatea de suprancrcare a unei funcii, de redefinire a ei dup ce aceasta a fost definit n cadrul scriptului respectiv i nu exist nici posibilitatea de anulare a unei funcii.

Parametri cu valori implicite n PHP parametrii formali pot avea valori implicite, i, n cazul n care parametrul actual lipsete, atunci se va considera c are valoarea implicit. Urmtorul exemplu ilustreaz modul de folosire al funciilor cnd acestea au parametri formali cu valori implicite:

Cod:

<?php function comanda($s='cafea') { return "Ati comandat ".$s."."; } echo comanda(); echo "<br>"; echo comanda("suc"); ?>
Rezultat: Ati comandat cafea. Ati comandat suc. 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, n caz contrar interpretorul PHP nu poate s decid crui parametru s-i atribuie valoarea de pe o anumit poziie din lista de parametri. De exemplu, dac avem o funcie a crei declaraie este function transform ($baza=10, $nr) si care returneaz rezultatul transformrii lui $nr din baza 16 n baza $baza, a crei valoare implicit este 10, dac se apeleaza transform (50), interpretorul nu atribuie valoarea 50 parametrului $nr, ci parametrului $baza i genereaz o eroare deoarece lipseste valoarea parametrului $nr. Funcii cu numr variabil de parametri O alt facilitate a limbajului PHP este aceea c ofer programatorului posibilitatea de a utiliza funcii care au un numr nedeterminat de parametri. Funciile care folosesc un numr variabil de parametri nu au nici o particularitate n ceea ce privete definirea lor. Aceste funcii se definesc la fel ca cele prezentate anterior, dar pentru a putea accesa parametri se vor folosi urmtoarele funcii predefinite: - func_num_args( ) - aceast funcie returneaz numrul parametrilor funciei care a apelat-o; dac aceast funcie este apelat din exteriorul unei funcii definite de utilizator se va genera un mesaj de avertizare; - func_get_arg(arg_num) - returneaz valoarea parametrului care se afl pe pozitia arg_num n lista de parametri; primul parametru are numrul de ordine 0; dac este apelat din exteriorul unei funcii definite de utilizator se va genera un mesaj de avertizare; - func_get_args( ) - returneaz un tablou unidimensional care conine valorile parametrilor pe care funcia apelant i-a primit; dac aceast funcie este apelat din exteriorul unei funcii definite de utilizator se va genera un mesaj de avertizare.

n continuare avei 2 exemple de utilizare a acestor funcii. Primul exemplu afieaz lista parametrilor funciei folosind funcia func_num_argsi func_get_arg, iar al doilea exemplu afieaz aceeai list folosind numai funcia func_get_args.

Cod:

<?php function lista_parametri() { for ($i=0; $i<func_num_args(); $i++) { print_r(func_get_arg($i)); echo "<br>"; } } echo lista_parametri("Comanda:", 1, "calculator", 2, "procesoare", "con figuratie", array("local", 2, 3)); ?>
Cod:

<?php function lista_parametrii() { foreach(func_get_args() as $i) { print_r ($i); echo "<br>"; } } echo lista_parametrii ("Comanda:", 1, "calculator", 2, "procesoare", "c onfiguratie", array("local", 2, 3)); ?>

Rezultat: Comanda: 1 calculator 2 procesoare configuratie Array ( [0] => local [1] => 2 [2] => 3 ) Valorile returnate de funcii Rezultatul obinut dup apelarea unei funcii poate avea orice tip. O funcie poate s returneze chiar i liste sau obiecte. n PHP exist un caz special de rezultat numit referin. Pentru ca o funcie s poat returna o referin, aceasta trebuie declarat folosindu-se operatorul '&' naintea numelui funciei. Acest operator trebuie s apar naintea numelui funciei i n

momentul cnd o variabil primete ca valoare referina rezultat din apelul funciei. n exemplul urmtor se definete o funcie al crui rezultat l constituie o referin:

Cod:

<?php function &refer() { global $s; return $s; } $s = "Acesta este continutul variabilei referite cu ajutorul functiei."; $z = &refer(); echo $z; ?>
Rezultat: Acesta este continutul variabilei referite cu ajutorul functiei. Spre deosebire de majoritatea limbajelor de programare moderne, o funcie PHP poate s returneze o referin la o variabil care a fost declarat n interiorul funciei, ns acest lucru nu este indicat deoarece, n anumite cazuri, poate duce la efecte neateptate ale executrii unui script PHP. n alte limbaje de programare efectele devin uneori fatale. Variabilele de tip funcie O alt facilitate a limbajului PHP n ceea ce privete funciile este aceea c suport variabile de tip funcie. Acest lucru este util atunci cnd se folosesc liste de funcii pentru prelucrarea anumitor tipuri de date. Pentru a atribui un nume de funcie unei variabile n PHP se folosete aceeai construcie ca n cazul atribuirii unui ir de caractere, i anume, o variabil va primi ca valoare numele funciei scris ntre ghilimele simple sau duble. n cazul n care interpretorul PHP gsete un nume de variabil urmat de o list de parametri, acesta caut funcia pe care variabila o refer i n cazul n care exist, o execut. Variabilele de tip funcie nu funcioneaza cu construcii ale limbajului ca echo, unset, isset, empty, include etc. Mai jos avei un exemplu care ilustreaz modul de lucru cu variabilele de tip funcie.

Cod:

<?php function produs($a, $b) { return $a * $b; } function suma($a, $b) { return $a + $b; } $operatie = 'produs'; $rez = $operatie(4, 5);

echo "4 * 5 = <b>".$rez."</b><br>"; $operatie = 'suma'; $rez = $operatie(4, 5); echo "4 + 5 = <b>".$rez."</b><br>"; ?>
Rezultat: 4 * 5 = 20 4+5=9

Clase i obiecte n PHP

O clas este o colecie de variabile i funcii care opereaz asupra variabilelor respective. Sintaxa folosit pentru declararea unei clase n PHP este:

Cod:

<?php class nume_clasa { // date membre var nume_variabila_1 ... var nume_variabila_m // metode function nume_functie_1 (parametri) { ... // definitia functiei } ... function nume_functie_n (parametri) { ... // definirea functiei } } ?>
Pentru numele unei clase poate fi utilizat orice identificator permis n PHP cu o singur excepie: sdtclass; acest identificator este folosit de PHP n scopuri interne. n PHP funciile ale cror identificatori ncep cu _ sunt considerate funcii magice i utilizarea acestora nu este recomandat. n PHP, datele membre nu pot fi iniializate dect cu valori constante. Pentru a iniializa variabilele cu valori care nu sunt constante trebuie folosit un constructor. Mai jos aveti un exemplu de clas n care initializrile nu sunt corecte:

Cod:

<?php

class Nepermis { var $data = date("Y-m-d"); var $nume = $prenume; var $dest = 'Mihai '.'Claudiu'; var $obiecte = array ("minge", "pantof"); } ?>
Obiecte n PHP clasele sunt considerate a fi tipuri de date; ele pot fi privite ca fiind "amprentele" variabilelor propriu-zise. Pentru a crea o variabil al crei tip este o clas trebuie utilizat operatorul new. n continuare vom defini o clas Aritmetica cu dou date membre x i y care sunt numere ntregi i dou metode care realizeaz adunarea, respectiv nmulirea lor.

Cod:

<?php class Aritmetica { var x = 2; var y = 3; function Suma () { return $this -> x + $this -> y; } function Produs() { return $this -> x * $this -> y; } } ?>
Pentru a crea un obiect de tipul Aritmetica vom utiliza o instruciune de tipul: $aritm = new Aritmetica; Acum putem utiliza metodele clasei; pentru a afia suma sau produsul celor dou numere vom putea apela cele dou metode astfel: echo $aritm -> Suma ( ); echo $aritm -> Produs ( ); Vom obine rezultatele 5, respectiv 6. Valorile datelor membre pot fi i ele modificate prin instruciuni de tipul: $aritm -> x = 5; $aritm -> y = 4; Dac, n urma modificrii apelam din nou metodele Suma( ) i Produs( ), rezultatele vor fi 9, respectiv 20.

Cod:

<?php class PHP4 { var $salut = "Salut PHP4!"; function Salut() { return $this -> salut; } } $salutare = new PHP4; echo $salutare -> Salut()."<br>"; ?>
Rezultatul codului de mai sus este: Salut PHP4! n acest exemplu a fost utilizat pseudo-variabila $this. Aceasta este folosit pentru a indica faptul c se opereaz asupra unei date membre a obiectului curent. Extinderea claselor Deseori este necesar definirea unor clase cu proprieti (date membre) i metode asemntoare. Pentru a usura definirea unor astfel de clase a fost introdus conceptul de extindere (derivare) a claselor. O clas derivat va pstra toate proprietile i metodele clasei pe care o extinde i poate conine diferite proprieti i metode noi. Nu exist nici o posibilitate de a elimina din clasa derivat anumite proprieti sau metode ale clasei de baz. O anumit clas poate avea o singur clas printe; aadar, n PHP nu este permis motenirea multipl. Pentru a extinde o anumit clas se utilizeaz cuvntul cheie extends. urmtorul exemplu voi extinde clasa Aritmetica; o s adaug nc o variabil i o s crez dou noi funcii: una pentru calculul sumei celor trei variabile i una pentru calcularea produsului lor:

Cod:

<?php class Aritmetica3 extends Aritmetica { var z = 4; function Suma3() { return $this -> x + $this -> y + $this -> z; } function Produs3() { return $this -> x * $this -> y * $this -> z; } } ?>

Dac definim un obiect prin intermediul unei instruciuni de genul: $aritm3 = new Aritmetica3; atunci pentru acest obiect vom putea utiliza att metodele definite n cadrul clasei Aritmetica3: Suma3( )i Produs3( ), ct i metodele definite n cadrul clasei de baz Aritmetica: Suma( )i Produs( ). n continuare avei un exemplu care ilustreaz modul n care pot fi create i utilizate clasele derivate.

Cod:

<?php class Aritmetica { var $x = 2; var $y = 3; function Suma() { return $this -> x + $this -> y; } function Produs() { return $this -> x * $this -> y; } } class Aritmetica3 extends Aritmetica { var $z = 4; function Suma3() { return $this -> x + $this -> y + $this -> z; } function Produs3() { return $this -> x * $this -> y * $this -> z; } } $aritm3 = new Aritmetica3; echo "<b>Inainte de modificare.</b>"; echo "<br>"; echo "Suma primelor doua numere: "; echo $aritm3 -> Suma()."<br>"; echo "Produsul primelor doua numere: "; echo $aritm3 -> Produs()."<br>"; echo "Suma celor trei numere: "; echo $aritm3 ->Suma()."<br>"; echo "Produsul celor trei numere: "; echo $aritm3 -> Produs()."<br>"; $aritm3 -> x = 5; $aritm3 -> y = 4; $aritm3 -> z = 3; echo "<br><br>";

echo echo echo echo echo echo echo echo echo echo ?>

"<b>Dupa modificare.</b><br>"; "<br>"; "Suma primelor doua numere: "; $aritm3 -> Suma3()."<br>"; "Produsul primelor doua numere: "; $aritm3 -> Produs3()."<br>"; "Suma celor trei numere: "; $aritm3 -> Suma3()."<br>"; "Produsul celor trei numere: "; $aritm3 -> Produs3()."<br>";

Rezultatul codului de mai sus este:

Citat: Inainte de modificare. Suma primelor doua numere: 5 Produsul primelor doua numere: 6 Suma celor trei numere: 5 Produsul celor trei numere: 6 Dupa modificare. 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 utilizrii lor; aadar clasa printe va fi definit ntotdeauna naintea clasei fiu. Constructori Un constructor este o metod (funcie) a unei clase care este apelat automat n momentul n care este creat o nou instan a clasei (cu ajutorul operatorului new). n PHP, este considerat ca fiind un constructor, orice funcie care are acelai nume cu clasa n interiorul creia este definit. Constructorii pot fi folosii pentru iniializarea datelor membre cu valori care nu sunt constante. Ei pot avea argumente, iar acestea pot fi optionale. Pentru a putea utiliza clasa fr a specifica nici un parametru n momentul crerii unui obiect, se recomand stabilirea unor valori implicite pentru toate argumentele constructorului. n cazul n care nu este definit un constructor pentru o anumit clas, se utilizeaz constructorul clasei de baz, dac aceasta exist. De exemplu, pentru urmtoarea secven de cod, n momentul crerii obiectului corespunztor variabilei $b, va fi apelat constructorul clasei A.

Cod:

<?php class A { function A()

{ echo "Constructorul clasei A<br>"; } function B() { echo "O functie obisnuita a clasei A.<br>"; } } class B extends A { function C() { echo "O functie obisnuita a clasei B.<br>"; } } ?>
n PHP apelul constructorului clasei de baz trebuie s fie explicit dac este necesar executarea operaiilor corespunztoare. n majoritatea limbajelor de programare exist funcii speciale numite destructori care sunt apelate automat n momentul "distrugerii" unui obiect. n PHP nu exist destructori. Operatorul :: Uneori este util folosirea unor metode sau variabile ale clasei de baz sau ale unei clase care nu a fost instaniat nc. n acest scop a fost introdus operatorul :: Pentru a descrie modul de utilizare al acestui operator voi prezenta mai nti un exemplu:

Cod:

<?php class A { function exemplu() { echo "Functia clasei de baza. <br>"; } } class B extends A { function exemplu() { echo "Functia redefinita<br>\n"; A :: exemplu(); } } A :: exemplu(); $b = new B; $b -> exemplu(); $b = new B; ?>

Prin intermediul instruciunii A :: exemplu( ); este apelat metoda exemplu( ) a clasei A, aadar se afieaz mesajul 'Functia clasei de baza' cu toate c nu exist nici un obiect care este o instan a acestei clase, deci nu putem scrie o instruciune de tipul $a -> exemplu( ); n schimb apelm metoda $b -> exemplu( ); ca "o funcie a clasei" i nu ca "o funcie a unui obiect". Putem avea funcii ale claselor, dar nu putem avea variabile ale claselor. De fapt, n momentul unui astfel de apel nu se creeaza nici un obiect care este instan a clasei respective. Ca urmare, o funcie a unei clase nu poate opera asupra unor proprieti ale clasei, dar poate utiliza variabile locale sau globale. n plus, o astfel de funcie nu poate utiliza pseudo-variabila $this. n exemplul anterior, n cadrul clasei B este redefinit funcia exemplu( ). Aadar, definiia "original" (din cadrul clasei A) nu poate fi accesat n interiorul clasei B dect dac ne referim la ea explicit prin intermediul operatorului ::. Accesarea clasei de baza n exemplul anterior am utilizat o funcie a clasei de baz. n locul utilizrii denumirii clasei de baza poate fi folosit denumirea special parent care este o referin la clasa de baz definit n cadrul construciei extends. Folosirea denumirii speciale este util n cazul n care ierarhia de clase se modific. n acest caz este suficient o singur modificare n cadrul construciei extends, fr a mai fi necesare modificri n interiorul clasei derivate. Aadar, definiia clasei B poate fi rescris astfel:

Cod:

<?php class B extends A { function exemplu() { echo "Functia redefinita<br>\n"; parent :: exemplu(); } } ?>
Serializarea obiectelor Prin serializare se nelege crearea unui ir de octei care conin reprezentarea intern (binar) a variabilei respective. Aadar, serializarea permite "salvarea" valorilor unei variabile. Dac este serializat un obiect sunt salvate doar proprietile acestuia (variabilele membre) i numele clasei din care face parte, nu i metodele, deoarece funciile nu reprezint valori. Pentru a serializa un obiect este utilizat funcia serialize( ) care returneaz irul de octei care conine reprezentarea binar. Pentru a deserializa un obiect se folosete funcia pereche unserialize( ). Pentru ca o astfel de operaie s funcioneze corect este necesar definirea clasei din care face parte obiectul respectiv. Funcia returneaz valoarea variabilei serializate. n exemplul

urmtor avei prezentat modul n care poate fi serializat i deserializat un obiect. irul de octei obinut n urma serializrii va fi scris ntr-un fiier i va fi citit din fiierul respectiv pentru efectuarea deserializrii. De obicei serializarea i deserializarea sunt realizate n documente php diferite deoarece aeste operaii nu au aproape nici o utilitate dac sunt folosite n cadrul aceluiai document. Primul document n care se realizeaz serializarea trebuie s conin o secven asemntoare cu urmtoarea:

Cod:

<?php class A { var $msg = "Salutare lume"; function scrie() { echo $this -> msg; } } $a = new A; $s = serialize ($a); // salvarea sirului intr-un fisier $fp = fopen ("fisier", "w"); fputs ($fp, $s); fclose ($fp); ?>
Pentru deserializare al doilea document va conine urmtoarea secven:

Cod:

<?php class A { var $msg = "Salutare lume"; function scrie() { echo $this -> msg; } } // $s $a // $a ?> citirea sirului din fisier = implode ("", @file ("fisier")); = unserialize ($s); dupa deserializare obiectul poate fi folosit -> show_one();

Referinele pot fi utilizate pentru a accesa coninutul unei variabile folosind mai multe nume. Spre deosebire de limbajul C, n PHP referinele nu sunt pointeri, ci alias-uri ntr-o tabela de simboluri. n PHP denumirile variabilelor i coninutul acestora nu sunt unul i acelai lucru. Aadar este posibil ca acelai coninut s aib denumiri diferite.

Utilizarea referinelor Referinele PHP permit unor variabile cu denumiri diferite s corespund unui acelai coninut. Cu alte cuvinte, instruciunea $a = &$b are ca efect faptul c $a i $b refer aceeai variabil. n aceast situaie $a i $b<;/em> au acelai statut. Nu se poate spune c $a refer $b sau invers. O alt posibilitate de utilizare a referinelor este transmiterea prin referin a parametrilor unei funcii. Efectul unei astfel de transmisii este crearea unei variabile locale care refer spre acelai coninut ca variabila din contextul apelant. S lum n considerare urmtorul exemplu:

Cod:

<?php function inc(&$var) { $var++; } $a = 5; inc($a); ?>

Iniial valoarea variabilei $a este 5. Dup apel variabila local $var i variabila din contextul apelant $a indic spre acelai coninut. Valoarea pstrat n locaia de memorie respectiv este incrementat (devine 6) prin intermediul instruciunii $var++;. Datorit faptului c cele dou variabile au acelai coninut, valoarea variabilei $a va fi 6 dup executarea funciei. Un parametru transmis prin referin poate fi: - o variabil; - o instruciune new; - o referin returnat de o funcie. Dac unei astfel de funcii i se transmite ca parametru un alt tip de expresie rezultatul este nedefinit. Aadar, pentru o funcie care are un parametru transmis prin referin nu se poate folosi o constant n momentul apelului. De exemplu, pentru funcia inc( ) prezentat anterior nu este permis un apel de forma inc(5). Referine globale n momentul declarrii unei variabile globale (printr-o instruciune de tipul global $var) se creeaz de fapt o referin spre o variabil global. Cu alte cuvinte, aceast instruciune este echivalent cu $var = &$GLOBALS ["var"];. Referina $this n cadrul unei metode a unui obiect $this este ntotdeauna o referin spre obiectul care utilizeaz funcia (obiectul curent).

Crearea imaginilor thumbnails

Acest tutorial v va nva cum s creai thumbnail-uri ale unor imagini mai mari ca dimensiune. Thumbnail-urile sunt nite imagini n miniatur de o rezoluie mai mic. Odat apsat un thumbnail vom deschide poza original. S vedem n continuare cum vom face acest lucru posibil. n primul rnd avem nevoie de dou foldere: unul pentru imaginile originale, i l vom denumi pictures i unul pentru thumnail-uri pe care l vom denumi thumbnails. Ceea ce este foarte important este c n aceste dou foldere nu trebuie s se gseasc dect imagini de tip JPG altfel vom ntmpina erori. Este evident c putem adapta scriptul pentru orice format de imagine, GIF sau PNG ns scopul principal al acestui tutorial este acela de a v face s ntelegei care sunt paii pe care trebuie sa i urmai cnd facei un asemenea script. PHP-ul pe care l rulai trebuie s aib activat libraria GD2 pentru a rula acest script, altfel vei ntmpina o eroare prin care v va fi adus la cunotin c funcia pentru imagini nu poate fi gsit. Dac librria GD2 nu este activ o putei activa n felul urmtor n mediul WINDOWS: adugai liniile urmtoare n php.ini: extension=php_gd2.dll Vom deschide directorul pictures i thumbnails i vom citi numele fiecrui fiier care exist n aceste directoare i le vom memora n vectorul $pictures i $thumbnails

Cod:

<?php $open_pictures = opendir("pictures"); while($file = readdir($open_pictures)) { if(substr($file, 0, 1) != '.') { $pictures[] = $file; } } closedir($open_pictures); $open_thumbnails = opendir("thumbnails"); while($file = readdir($open_thumbnails)) { if(substr($file, 0, 1) != '.') { $thumbnails[] = $file; } else { $thumbnails = array(); } } closedir($open_thumbnails); ?>
Vom reine apoi n dou variabile de tip vector numele pozelor care se afl n folderul pictures dar nu se afl n folderul thumbnails, ct i pozele care se afl n folderul thumbnails dar nu se afla n folderul pictures. 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

variabila $max_width i $max_width bineneles pstrnd proporiile pozei originale calculate cu ajutorul variabilei $ratio, astfel nct dac lungimea pozei originale este mai mare dect nlimea, atunci $ratio va lua valoarea lungimei maxime setate n variabila $max_width mprit la lungimea pozei originale, iar n caz contrar $ratio va lua valoarea nlimii maxime setate pentru thumbnail mprite la nlimea pozei originale. Rezoluia pozei originale o aflm cu ajutorul funciei getimagesize() care returneaz un vector cu atributele pozei. Vom afla n continuare noile dimensiuni ale pozei n miniatur calculate n variabilele $thumbnail_width i $thumbnail_height prin mulirea dimensiunilor pozei originale cu $ratio.

Cod:

<?php $diff_pic = array_diff($pictures, $thumbnails); $diff_tumb = array_diff($thumbnails, $pictures); foreach($diff_pic as $key => $value) { $image_name = 'pictures/'.$value; $image_attribs = getimagesize($image_name); $max_width = 100; $max_height = 100; $ratio = ($image_attribs[0] > $image_attribs[1]) ? $max_width / $im age_attribs[0] : $max_height / $image_attribs[1]; $thumbnail_width = $image_attribs[0] * $ratio; $thumbnail_height = $image_attribs[1] * $ratio;
n continuare vom crea acele thumbnail-uri ale pozelor prin aplicarea funciilor PHP pentru imagini. Pentru nceput vom returna o imagine din poza original cu ajutorul funciei imagecreatefromjpeg() dup care vom crea o imagine neagr cu dimensiunile calculate mai sus pentru thumbnail. Numele pozei n miniatur va fi acelai cu numele pozei originale numai c o vom salva n alt director. Calea ctre thumbnail o vom ine ntr-o variabil $thumbnail_name, apoi vom copia imaginea original peste imaginea thumbnail pstrnd proporiile. Vom crea imaginea jpg n calea specificat n variabila $thumbnail_name cu ajutorul funciei imagejpeg().

Cod:

$image = imagecreatefromjpeg($image_name); $image_new = imagecreatetruecolor($thumbnail_width, $thumbnail_heig ht); imageantialias($image_new, true); $thumbnail_name = 'thumbnails/'.$value; imagecopyresampled($image_new, $image, 0, 0, 0, 0, $thumbnail_width, $thumbnail_height, $image_attribs[0], $image_attribs[1]); imagejpeg($image_new, $thumbnail_name); imagedestroy($image); } ?>
Este posibil ca n directorul thumbnails s se afle imagini ale pozelor care nu se mai afl n directorul pictures, acestea nu sunt necesare i le vom terge cu ajutorul funciei unlink(). V amintii c mai sus am aflat care sunt pozele care se afla n directorul thumbnails dar nu

se afla n directorul pictures cu ajutorul funciei array_diff() care face diferena dintre valorile primului vector analizat i cel de-al doilea vector.

Cod:

<?php foreach($diff_tumb as $key => $value) { unlink("thumbnails/".$value); } ?>


n acest moment avem create thumbnail-urile imaginilor originale i le vom afia n pagin ncadrate ntr-un tabel cu $modulo celule, cu link ctre pozele originale. Mai jos avei ntreg codul surs pentru crearea imaginilor thumbnail i afiarea acestora n pagin.

Cod:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Thumbnails</title> </head> <body> <?php $open_pictures = opendir("pictures"); while($file = readdir($open_pictures)) { if(substr($file, 0, 1) != '.') { $pictures[] = $file; } } closedir($open_pictures); $open_thumbnails = opendir("thumbnails"); while($file = readdir($open_thumbnails)) { if(substr($file, 0, 1) != '.') { $thumbnails[] = $file; } else { $thumbnails = array(); } } closedir($open_thumbnails); $diff_pic = array_diff($pictures, $thumbnails);

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

echo '<td>&nbsp;</td>'; } echo '</tr>'; } echo '</table>'; ?> </body> </html>


Articol preluat de la http://boo.opaq.org

Autentificarea n paginile restricionate i cteva informaii despre cookie, uploadul fiierelor i includerea lor n pagini, precum i informaii despre starea conexiunii.

Dup cum probabil tii, anumite site-uri au accesul restricionat i coninutul lor poate fi accesat numai de ctre anumite persoane autorizate. 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 informaii. n momentul acceasrii paginii web este trimis un mesaj care indic faptul c autentificarea este necesar. Programul de navigare va afia o caset de dialog care permite introducerea unui nume de utilizator i a unei parole. Dup introducerea informatiilor necesare va fi accesat din nou pagina web dar, de aceast data, variabilele predefinite PHP_AUTH_USER, PHP_AUTH_PW i PHP_AUTH_TYPE vor conine numele de utilizator, parola, respectiv tipul autentificrii. Pentru a trimite mesajul care cere autentificarea este utilizat funcia header() . Nu este posibil dect autentificarea de tip "Basic". Un exemplu n care este prezentat o autentificare naintea accesrii informaiilor este prezentat n continuare:

Cod:

<?php if (!isset($_SERVER['PHP_AUTH_USER'])) { header ('WWW-Authenticate: Basic realm="php4"'); header ('HTTP/1.0 401 Unauthorized'); echo 'Pentru accesarea continutului este necesara o autentificare!' ; exit; } else { echo "<html><head>"; echo "<title>Autentificare</title>"; echo "</head><body>"; echo "<p>Salut <b><i>{$_SERVER['PHP_AUTH_USER']}</i></b>!</p>"; echo "<p>Parola introdusa este <b><i>{$_SERVER['PHP_AUTH_PW']}</i>< /b>.</p>"; echo "</body></html>"; } ?>

Rezultatul codului de mai sus l putei vedea dnd clik aici. Pentru o compatibilitate ct mai mare, cuvntul Basic trebuie scris cu majuscul, valoarea pentru realm trebuie s fie cuprins ntre ghilimele (nu ntre apostrofuri), iar ntre HTTP/1.0 i 401 trebuie s existe exact un spaiu. n acest exemplu, numele de utilizator i parola sunt afiate. n practic, se va verifica validitatea lor, de obicei printr-o interogare a unei baze de date. n situaia n care este apsat butonul Cancel, pagina web generat va conine un mesaj de avertizare. Funcia setcookie. n PHP exist o funcie special care poate fi folosit pentru crearea cookie-urilor i anume setcookie(). Funcia definete un cookie care va fi trimis mpreun cu celelalte headere HTTP. Ca i alte headere, cookies trebuie trimis naintea oricrui caracter din script (aceasta deoarece exist o restricie de protocol, nu se poate trimite coninutul paginii i apoi headerul, headerele trebuiesc trimise primele, naintea oricrui mesaj). Dac a fost trimis ceva la browser (chiar i un simplu spaiu blank) nainte de apelarea acestei funcii, setcookie() va genera un mesaj de eroare de tipul FALSE. Dac setcookie() a putut genera cu succes cookie-ul, va returna TRUE. Aceasta nu indic dac userul a acceptat sau nu cookie, ci doar c a fost generat i trimis cu succes. ncepnd de la php4, putei folosi funciile ob_start() la nceputul scriptului i ob_end_flush() la sfritul scriptului pentru a se genera un buffer cu tot ce trebuie trimis la browser, i astfel la sfrit se vor trimite toate odat, ncepnd cu headerele i continund cu restul paginii, indiferent dac n script ai trimis nti text i apoi headere (folosind prima funcie, buffer-ul se va genera pe msur ce primete date, iar la sfrit, cnd se cere nchiderea buffer-ului prin apelarea celei de-a doua funcii - ob_end_flush() - , headerele se vor trimite primele apoi restul buffer-ului). O alt variant este de a seta directiva output_buffering din php.ini (n fiierul de configurare al serverului). Funcia setcookie() are ase parametri, doar prezena primului parametru fiind obligatorie. Sintaxa este: setcookie(nume, valoare, expirare, cale, domeniu, securitate); 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 Presupunnd c numele este 'cookiename', valoarea cookie-ului (informaia valoarea va fi preluat prin corespunztoare), care va fi $_COOKIE['cookiename'] salvat pe calculatorul clientului (nu trimitei date sensibile, gen parola) expirare un numr ntreg care indic time()+60*60*24*30 va seta cookie s expire momentul de timp n care n 30 de zile. Dac nu e setat, cookie va expira la cookie-ul nu va mai putea fi terminarea sesiunii curente (cnd se nchide utilizat. Valoarea este n format browserul) "Unix timestamp", adic se poate seta folosind funcia time() plus numrul de secunde pn cnd dorii s expire, sau putei folosi mktime(). cale ir de caractere care reprezint o Dac este setat ca '/', cookie va fi accesibil cale generic a fiierelor care pot pentru ntreg domeniu. Dac este setat ca '/foo/', accesa cooke-ul atunci cookie va fi accesibil doar pentru fiierele i scripturile din directorul /foo/ (de pe server) nclusiv toate sub-directoarele acelui director, cum ar fi /foo/bar/. Valoarea standard este setat

domeniu

securitate

ca directorul curent (directorul curent adic directorul n care exist scriptul care a setat acel cookie). ir de caractere care reprezint Pentru a face cookie disponibil pentru toate domeniul pe care trebuie stocate subdomeniile, de exemplu domeniu.com putei fiierele care pot accesa cookie- seta astfel '.domeniu.com'. Punctul dinainte nu ul este neaparat necesar, dar l face compatibil cu mai multe browsere. Setnd ca www.example.com vei face cookie-ul disponibil doar pentru sub-domeniul www. Pentru alte detalii vedei specificaiile de aici. numr ntreg care, dac are 0 sau 1 valoarea 1 (TRUE), arat c informaia poate fi transmis doar folosindu-se o conexiune HTTPS securizat. Setarea de baz este 0 (FALSE)

Dac unul dintre parametri este prezent, atunci toi parametrii anteriori trebuie s fie prezeni. Dac unul dintre acetia nu este utilizat, se va folosi n poziia respectiv fie irul vid, fie valoarea 0. n continuare sunt prezentate cteva exemple de apeluri prin care sunt create cooke-uri: - setcookie ("TestCookie", "PHP4"); - setcookie ("TestCookie", "Site", time()+3600); // expir dupa o or de la creare - setcookie ("TestCookie", "Test", time()+3600, "/articole/", ".php4.as.ro",1); Cu ajutorul funciei setcookie() este posibil i tergerea cookie-urilor. Urmtoarele exemple ilustreaz modul n care poate fi realizat aceast operaie: setcookie ("TestCookie", "", time()-3600); sau setcookie ("TestCookie", "", time()-3600, "/comenzi/", ".php4.as.ro", 1); Se observ c momentul expirrii este setat ca fiind anterior momentului executrii operaiei de stergere. Exist posibilitatea de a crea iruri de cookie-uri prin simpla introducere a parantezelor drepte n denumiri. Un exemplu de creare i utilizare a unor astfel de iruri este prezentat n continuare:

Cod:

<?php setcookie ("cookie[three]", "cookiethree"); setcookie ("cookie[two]", "cookietwo"); setcookie ("cookie[one]", "cookieone"); if (isset ($cookie)) { while (list($name,$value)=each($cookie)) { echo "$name == $value<br>"; } } ?>

Pentru a accesa cookie-urile stocate pe calculatorul unui vizitator al paginii Web, este disponibil vectorul $_COOKIE. Voi prezenta n continuare un exemplu cu ajutorul cruia se genereaz o pagin care conine denumirile i valorile tuturor cookie-urilor.

Cod:

<?php foreach ($_COOKIE as $cheie=>$valoare) { echo "$cheie = $valoare<br>"; } ?>


Fiierele pot fi ncrcate pe un server dac utilizatorul folosete un program de navigare compatibil RFC-1867; pot fi utilizate ultimile versiuni ale celor mai cunoscute browsere. Este posibil ncrcarea att a fiierelor text, ct i a celor binare. Folosind autentificarea PHP i funciile de manipulare a fiierelor, avem controlul total asupra utilizatorilor care pot ncrca fiiere i asupra operaiilor efectuate cu fiierul ncrcat. Formularul de ncarcare (upload) Pentru ca utilizatorul s poat ncrca un fiier, el trebuie s aib la dispoziie un formular care s permit alegerea fiierului. Un astfel de formular poate fi creat, de exemplu, folosind limbajul HTML standard. n continuare este prezentat un document HTML care genereaz o pagina web care permite alegerea unui fiier i ncrcarea sa pe un server.

Cod:

<html> <head> <title>Incarcarea unui fisier pe server</title> </head> <body> <form enctype="multipart/form-data" action="upload.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... poate fi utilizat pentru alegerea unui fiier care urmeaz a fi ncrcat. Este posibil specificarea fiierului preciznd exact calea n caseta de text afiat. URL-ul care este folosit ca valoare pentru atributul action al marcajului <from> trebuie s reprezinte documentul php care va realiza ncrcarea. Operatia de ncarcare (upload) Aadar, formularul prin intermediul cruia este ales fiierul va fi prelucrat de ctre un script PHP. Pentru a manipula fiierele poate fi utilizat tabloul $_FILES. Pentru script-ul care prelucreaz formularul prezentat anterior, informaiile referitoare la fiierul ncrcat vor fi

acceasate folosind variabila $_FILES['fisier'] care este tot un vector. Elementele acestui vector sunt prezentate n cele ce urmeaz: - $_FILES['fisier'] ['name'] numele pe care l are fiierul pe calculatorul utilizatorului; - $_FILES['fisier'] ['tmp_name'] numele temporar pe care l are fiierul pe server dup ncheierea procesului de ncrcare; - $_FILES['fisier'] ['type'] tipul fiierului n cazul n care programul de navigare furnizeaz aceast informaie; un exemplu ar putea fi image/gif; - $_FILES['fisier'] ['size'] dimensiunea fiierului, exprimat n bytes; - $_FILES['fisier'] ['fisier'] ['error'] un cod de eroare generat n urma efecturii ncrcrii. Fiierul va fi stocat pe server n directorul care conine fiierele temporare. O secven de instruciuni PHP care poate fi folosit pentru a prelucra fiierul ncrcat i a-l muta n directorul dorit este urmtoarea:

Cod:

<?php if (is_uploaded_file($_FILES['fisier']['tmp_name')) { copy($_FILES['fisier']['tmp_name'],"/directorul/dorit"); } else { echo "Eroare de transfer ".$_FILES['fisier']['name']; } ?>


O variant alternativ ar fi:

Cod:

<?php move_uploaded_file($_FILES['fisier']['tmp_name'],"/directorul/dorit"); ?>

Coduri de eroare ncepnd cu versiunea PHP 4.2.0, n urma efecturii unui transfer, sunt generate anumite coduri de eroare. Versiunea 4.3.0 introduce constante predefinite pentru fiecare dintre aceste coduri. n funcie de codul de eroare generat n urma operaiei, trebuie realizate diferite aciuni. Codul de eroare poate fi accesat prin intermediul elementului ['error'] al vectorului care pstreaz informaiile despre fiier. Codurile de eroare care pot fi generate sunt urmtoarele: - UPLOAD_ERR_OK (0) nu a fost semnalat nici o eroare n timpul transferului; operaia de ncrcare s-a ncheiat cu succes;

- UPLOAD_ERR_INI (1) dimensiunea fiierului este mai mare dect valoarea maxim permis (aceast valoare este specificat n momentul configurrii server-ului i poate fi schimbat modificnd fiierul PHP.INI); - UPLOAD_ERR_FORM_SIZE (2) dimensiunea fiierului este mai mare dect valoarea maxim indicat de directiva MAX_FILE_SIZE care este specificat n formular; aceast valoare este specificat prin intermediul unui cmp ascuns al crui text este MAX_FILE_SIZE; - UPLOAD_ERR_PARTIAL (3) fiierul a fost ncrcat doar parial; - UPLOAD_ERR_NO_FILE (4) nu a fost ncrcat nici un fiier. ncrcarea mai multor fiiere Exist posibilitatea de a ncrca mai multe fiiere dac sunt folosite nume diferite pentru marcajul <input> utilizat pentru afiarea casetei de text i a butonului folosite pentru alegerea fiierului. De asemenea, este posibil ca fiierele ncrcate s fie organizate automat ntr-un vector. Pentru aceasta, la numele folosite trebuie adaugate caracterele ' [ ] '. Un exemplu este prezentat n continuare:

Cod:

<?php <form action="upload.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 ncrcm fiierele POZA1.GIF i DOC1.PDF. n acest caz, $_FILES['fisiere']['name'][0] va avea valoarea POZA1.GIF, n timp ce $_FILES['fisiere'] ['name'][1] va avea valoarea DOC1.PDF. Dimensiunile celor dou fiiere pot fi determinate folosind valorile $_FILES['fisiere']['size'][0], respectiv $_FILES['fisiere']['size'][1]. Includerea fiierelor Deseori, mai multe pagini web pe care le crem trebuie s conin secvene identice. Evident, putem copia secvenele dintr-un fiier n altul, dar aceast varianta, pe lng faptul c este incomod, duce la un consum mrit de spaiu pe server i, n cazul n care secvenele sunt lungi sau sunt folosite n foarte multe pagini, problema este destul de important. Interpretorul PHP permite pstrarea secvenelor comune n fiiere separate i accesarea acestora din cadrul altor documente PHP. Pentru a accesa un astfel de fiier, poate fi utilizat directiva include(). Practic, din punct de vedere logic, tot coninutul fiierului inclus este inserat n poziia n care apare directiva. Sintaxa acestei directive este include(fisier);. S presupunem c avem un fiier numit HELLO.TXT cu urmtorul coninut:

Cod:

<?php echo "Pagina de test"; ?>


n continuare avei un model n care putei vedea cum poate fi inclus acest fiier ntr-un document php.

Cod:

<head> <title>Pagina cu fisier inclus</title> </head> <body> <?php include("HELLO.TXT"); ?> </body> </html>

Pentru ca fiierul inclus s fie interpretat, acesta trebuie obligatoriu s indice faptul c secvenele de text din cadrul su reprezint instruciuni php. Aadar, prezena construciei <?php... ?> este necesar pentru ca textul s fie interpretat corect. Dac fiierul HELLO.TXT ar conine doar secvena echo "Pagina de test";, atunci acesta nu ar fi interpretat ca fiind cod php, ci ca fiier html. Aceasta se datoreaz faptului c n momentul includerii unui fiier se iese din modul PHP i tot textul este interpretat ca fiind cod HTML. Dup interpretarea textului din fiierul inclus se intr din nou n modul PHP. n concluzie, folosirea celor dou fiiere este echivalent cu utilizarea urmtorului fiier:

Cod:

<head> <title>Pagina cu fisier inclus</title> </head> <body> <?php echo "Pagina de test"; ?> </body> </html>

Includerea n cadrul funciilor Dac directiva de includere apare n cadrul unei funcii, atunci se consider c toate instruciunile din cadrul fiierului inclus fac parte din corpul funciei. Aadar, domeniul de vizibilitate al variabilelor folosite n fiierul inclus este acelai cu domeniul pe care l-ar fi avut dac ar fi aprut n cadrul funciei. Pentru a

ilustra acest aspect vom considera un fiier var.txt care conine secvena:
Cod:

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

i urmtorul 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 fiierului inclus au domeniul de vizibilitate corespunztor funciei fructe(). Din aceste motive valoarea variabilei $fruct nu este disponibil n afara funciei. Valoarea variabilei $culoare este disponibil i n afara funciei, deoarece a fost declarat ca fiind o variabil globala. Aadar, instruciunea echo din cadrul funciei duce la afiarea mesajului un mar verde, deoarece ambele valori ale variabilelor sunt disponibile, iar instruciunea din afara funciei duce la afiarea mesajului un verde, deoarece, n afara funciei, variabila $fruct nu a fost definit anterior i este automat iniializata cu irul vid. Includeri prin HTTP Dup cum ai observat, directiva include are ca parametru un ir de caractere care conine numele fiierului care va fi inclus. Acesta

poate fi orice URL valid, aadar este posibil includerea unui fiier aflat pe un alt server. Un exemplu ar putea fi include("http://www.site-ul.meu/pagina.mea");. O astfel de directiv funcioneaza doar dac se foloeste PHP 4.3.0 sau o versiune ulterioar. Includerea unui fiier o singur dat Uneori, mai ales n situaiile n care se folosesc variabile pentru numele fiierelor incluse, este posibil ca anumite fiiere s fie incluse de mai multe ori. De obicei, fiierele incluse conin definiii ale unor funcii sau clase, motiv pentru care este de dorit ca un astfel de fiier s nu fie inclus de mai multe ori. Pentru ca un fiier s fie inclus o singur dat, se utilizeaz o directiva alternativ numit include_once. Dup cum rezult din denumire, un fiier va fi inclus o singur data. Cu alte cuvinte, n momentul n care se cere includerea unui fiier, se verific dac acesta a fost deja inclus i n aceast situaie directiva nu are nici un efect (fiierul nu este inclus nc o dat). Alternative: Pe lng directivele includei include_once exist dou alte directive a cror utilizare are un efect aproape echivalent. Acestea sunt require (echivalent cu include) i require_once (echivalent cu include_once). Singura diferena dintre include i require (respectiv dintre include_oncei require_once) este dat de modul n care este tratat situaia n care fiierul care se dorete a fi inclus nu exist sau nu este disponibil. n cazul directivelor include i include_once este generat un avertisment i execuia script-ului continu fr ca fiierul 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 execuia script-ului este ntrerupt. Aadar, n situaiile n care este absolut necesar existena fiierului, pentru a nu aprea efecte bizare, trebuie utilizat directiva require, respectiv require_once. Starea conexiunii n PHP, conexiunea poate avea una dintre cele trei stri posibile: - NORMAL (0) starea normal de funcionare; - ABORTED (1) utilizatorul care acceseaz pagina generat de script-ul aflat n execuie s-a deconectat (de obicei prin apsarea butonului Stop al programului de navigare); - TIMEOUT (2) a fost atins limita de timp impus de PHP. Pentru fiecare dintre cele trei stri exist un indicator (flag) care este setat sau nu n funcie de starea conexiunii. n funcie de script, este necesar sau nu ca execuia 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 execuia s continue. n principiu, este indicat ca script-urile s i ncheie execuia chiar dac datele de ieire nu vor mai fi trimise utilizatorului. Pentru a decide dac execuia script-ului se va ncheia n momentul ntreruperii conexiunii putei (sau nu!) s apelai funcia

ignore_user_abort(). Implicit, n momentul n care conexiunea este ntrerupt, se ntrerupe i execuia script-ului. Este posibil (chiar recomandabil!) s fie definit o funcie care va fi executat naintea ntreruperii execuiei script-ului. Aceasta poart denumirea de funcie de dezactivare (shutdown function) i este definit la fel ca orice alt funcie. Pentru a specifica faptul c o anumit funcie trebuie apelat naintea intreruperii execuiei, aceasta trebuie nregistrat ca fiind funcie de dezactivare. Aceasta se realizeaz printr-un apel al funciei registrer_shutdown_function(). n cadrul funciei se poate testa dac execuia a fost determinat de ntreruperea conexiunii prin apelarea funciei connexion_aborted(). Aceasta va returna valoarea TRUE dac a fost ntrerupt conexiunea. Funcia de dezactivare va fi apelat automat i n cazul n care este depit limita de timp. n cadrul funciei se poate testa dac un astfel de eveniment a avut loc prin apelarea funciei connection_aborted() care returneaz valoarea TRUE n cazul depirii acestei limite. Exist posibilitatea de a testa ambele indicatoare printr-un singur apel al funciei connection_status(). Funcia va returna un numr ntreg ai crui bii 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 setai la un moment dat. Aceast situaie poate aprea n cazul n care ntreruperea conexiunii este ignorat. PHP va detecta faptul c a fost ntrerupt conexiunea i va seta indicatorul corespunztor. Totui, execuia 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 funcia set_time_limit(). Fiiere aflate la distan Aa cum am spus n seciunea dedicat includerii fiierelor, ncepnd cu versiunea PHP 4.3.0 este posibil includerea de fiiere aflate pe alte servere. Evident, este posibil utilizarea de fiiere aflate pe alte servere i n alte scopuri. Practic, n aproape toate funciile care manipuleaz fiiere, pot fi folosite att fiiere locale, ct i fiiere aflate la distan. n continuare este prezentat modul n care pot fi citite date dintr-un fiier 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 fiier 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); ?>

Putei folosii aceste idei pentru a creea o pagin cu acces restricionat, i unde s scriei ntr-un fiier pe server datele vizitatorului (cum ar fi adresa lui de ip, host, timpul ct a stat pe pagina respectiv, ce pagini a vizitat etc...).

Descrierea funciilor care pot fi utilizate la manipularea tablourilor

Funcia array_change_key_case Aceast funcie realizeaz conversia tuturor literelor care apar n cadrul denumirilor cheilor elementelor unui tablou. Funcia are doi parametri: un tablou asupra cruia se vor efectua modificrile 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. Urmtorul script PHP ilustreaz modul n care poate fi utilizat aceast funcie.

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);

print_r($b); echo "</TT><TR><TD><B>Tabloul dupa conversia la litere mici: </B><TD><TT>"; $b = array_change_key_case($a,CASE_LOWER); print_r($b); echo "</TT></TABLE>"; ?>
Dup cum se poate vedea, funcia are efect doar asupra cheilor elementelor, valorile acestora rmnnd nemodificate. Funcia array_chunks Aceast funcie poate fi utilizat pentru a mpri un tablou n mai multe bucti (chunks). Ea are trei parametri, i anume: vectorul care urmeaz a fi mprit, dimensiunea unei buci (numrul de elemente) i un indicator care arat dac se pstreaz sau nu cheile elementelor (acesta poate lipsi; n acest caz are valoarea implicit false, deci nu se vor pstra cheile elementelor). n cazul n care numrul elementelor tabloului iniial nu este multiplu al dimensiunii unei buci, atunci ultima bucat va fi mai "scurt" . Funcia va returna un tablou al bucilor (un tablou de tablouri). n continuare este prezentat un exemplu care arat utilizarea acestei funcii:

Cod:

<?php $vector = array("a", "b", "c", "d", "e"); echo "<pre>"; print_r(array_chunk($vector, 2)); echo "<p>"; print_r(array_chunk($vector, 2, TRUE)); echo "</pre>"; ?>
Funcia array_count_values Aceast funcie are ca parametru un tablou i returneaz un alt tablou ale crui elemente au chei date de valorile elementelor tabloului transmis ca parametru. Pentru fiecare valoare se va genera un singur element (chiar dac valoarea apare de mai multe ori), iar valoarea elementului respectiv este dat de numrul apariiilor. De exemplu, n urma execuiei unei secvene de forma: $tablou = array (1, "Pagina" , 1, "mea" , "Pagina" ); $rez = array_count_values ($tablou); vectorul $rez va conine trei elemente, acestea vor avea cheile 1, Paginai mea, iar valorile vor fi 2, 2, respectiv 1. Funciile array_diff i array_diff_assoc Uneori dorim s eliminm dintr-un tablou anumite elemente; n acest scop pot fi utilizate funciile array_diff( ) i array_diff_assoc( ) . Acestea au ca parametri mai multe tablouri i returneaz un tablou care conine toate elementele din tabloul reprezentat de primul parametru care nu apar n nici unul dintre tablourile corespunzatoare celui de-al doilea parametru. n cazul funciei array_diff( ) sunt eliminate elemente din primul tablou dac n celelalte exist elemente cu aceeai valoare. n cazul functiei array_diff_assoc( ) sunt eliminate elemente din primul tablou dac n celelalte exist elemente cu aceeai valoare i aceeai cheie.

Funcia array_fill Aceast funcie poate fi utilizat pentru a completa cu o anumit valoare elementele unui tablou. Funcia are trei parametri: primul reprezint indicele la care ncepe completarea, al doilea reprezint numrul elementelor completate, iar cel de-al treilea indic valoarea cu care se completeaz elementele. De exemplu, n urma executrii instruciunii $a = array_fill(5, 6, 'Pagina mea! ' ); vom avea un tablou cu sase elemente (cheile acestora sunt 5, 6, 7, 8, 9 si 10), valorile tuturor acestora fiind Pagina mea! . Funcia array_filter Aceast funcie realizeaz o filtrare a elementelor unui vector pe baza unei funcii. Funcia array_filter( ) are ca parametri un tablou i identificatorul funciei care este utilizat pentru filtrare. Aceast funcie trebuie s fie definit i va fi apelat pentru fiecare element al vectorului. n cazul n care funcia returneaz valoarea true (eventual, n urma conversiei la tipul boolean), elementul este pstrat; n caz contrar, acesta este eliminat. Funcia array_filter( ) returneaz vectorul obinut dup eliminarea elementelor. n continuare este prezentat un exemplu n care se utilizeaz aceast funcie pentru a filtra elementele unui vector n funcie de paritatea acestora.

Cod:

<?php function impar($var) { return $var % 2; } function par($var) { return 1 - $var % 2; } $vector = array("2", "4", "5", "7"); echo "<pre>"; print_r(array_filter($vector, par)); echo "<p>"; print_r(array_filter($vector, impar)); echo "</pre>"; ?>
Funcia array_flip Aceast funcie are ca parametru un tablou i returneaz un alt tablou n care a fost realizat o interschimbare a cheilor elementelor cu valorile. Cu alte cuvinte, pentru fiecare element va fi creat un element a crui cheie va fi vaIoarea elementului n tabloul iniial i a crui valoare va fi cheia elementului din tabloul iniial. De exemplu, pentru tabloul definit prin $tablou = array("A" => "Pagina" , "B" => "de" , "C" => "php"); n urma executrii apelului $b = array_flip($tablou) tabloul $b va avea forma

array("Pagina" => "A" , "de" => "B" , "php" => "C") n cazul n care n vectorul transmis ca parametru exist mai multe elemente care au aceeai valoare, datorit faptului c elementele unui vector trebuie s aib chei distincte, vor fi eliminate toate aceste elemente, cu excepia ultimului. Funciile array_intersect i array_intersect_assoc Aceste funcii au un comportament similar funciilor array_diff( ), respectiv array_diff_assoc( ). Singura diferen este dat de faptul c tabloul rezultat va conine toate elementele care se afl n fiecare dintre tablourile transmise ca parametri (pentru funcia array_diff( ) elementele trebuie s aib aceeai valoare, n timp ce pentru funcia array_diff_assoc( ) ele trebuie s aib aceeai cheie i aceeai valoare). Funcia array_key_exists Aceast funcie are doi parametri (o cheie i un vector) i verific, aa cum sugereaz i numele, dac vectorul conine un element cu cheia respectiv. Funcia returneaz o valoare logic, iar pentru parametrul care reprezint cheia poate fi folosit orice valoare care poate fi cheie ntr-un vector. Funcia array_keys i array_values Aceste funcii returneaz un vector care conine ca valori toate cheile (respectiv toate valorile) elementelor unui tablou transmis ca parametru. Pentru funcia array_keys( ), n cazul n care se foloseste un parametru suplimentar, vectorul rezultat va conine doar cheile elementelor care au valoarea egal cu cea indicat de acest parametru. Funcia array_map Aceast funcie realizeaz o transformare a elementelor unui vector pe baza unei funcii. Funcia este transmis ca parametru i este aplicat tuturor elementelor unui vector care este, i el, transmis ca parametru. Iat un exemplu:

Cod:

<?php function cub($n) { return $n * $n * $n; } $a = array(l, 2, 3, 4, 5); $b = array_map("cub", $a); ?>
n urma executrii secvenei, vectorul $b va avea cinci elemente ale cror valori vor fi 1, 8, 27, 64 i 125. Exist posibilitatea de a transmite mai multe tablouri ca parametri. n acest caz, numrul argumentelor funciei utilizate trebuie s fie egal cu numrul tablourilor transmise i se recomand ca tablourile s aib acelai numr de elemente. n caz contrar, tablourile mai "scurte" vor fi completate cu elemente nule. Un artificiu interesant permite crearea unor vectori de vectori folosind funcia array_map( ). Pentru aceasta vom utiliza valoarea null pentru funcia transmis ca parametru. Vom prezenta n continuare un exemplu:

Cod:

<?php $a = array("unu", "doi", $b = array("one", "two", $c = array("un", "deux", $d = array_map(null, $a, ?>

"trei"); "three"); "trois"); $b, $c);

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

Funciile array_merge i array_merge_recursive Aceste funcii realizeaz o "interclasare" a dou sau mai multe tablouri prin adugarea elementelor unui vector la sfritul tabloului anterior. n cazul n care exist elemente cu aceeai cheie (reprezentat de un ir de caractere) n tabloul rezultat va aprea un singur element cu cheia respectiv, i anume primul ntlnit n timpul interclasrii. n cazul n care cheia identic este reprezentat de un numr, n tabloul rezultat vor aprea ambele valori, dar valoarea corespunztoare unei chei care apare deja n tablou va avea cheia reprezentat de cel mai mic numr mai mare dect cheia iniial care nu apare nca n tabloul rezultat. n cazul n care tablourile conin elemente care sunt tablouri, atunci funcia este array_merge_recursive( ) i are ca efect i interclasarea acestor tablouri (care sunt elemente ale altor tablouri) i procedeul continua recursiv. n cele ce urmeaza vom prezenta un exemplu care ilustreaz diferenele dintre cele dou funcii.

Cod:

<?php $v1 = array( "culoare" => array( "preferata" => "rosu"),

(5)); $v2 = array( 10, "culoare" => array( "preferata" => "verde", "albastru")); echo "<PRE>"; print_r(array_merge($v1, $v2)); echo "<br>"; print_r(array_merge_recursive($v1, $v2)); echo "</PRE>"; ?>
Funcia array_multisort Aceast funcie poate fi utilizat pentru a sorta mai multe tablouri sau un tablou multidimensional. Primul parametru al funciei trebuie s fie un tablou, iar urmtoarele pot fi tablouri i indicatori de sortare. Fiecare indicator de sortare descrie caracteristici ale sortrii pentru cel mai apropiat tablou aflat naintea indicatorului n lista de parametri. Exista dou categorii de indicatori de sortare: - indicatori de ordine: - SORT_ASC: sortare n ordine cresctoare; - SORT_DESC: sortare n ordine descresctoare; indicatori de tip: SORT_REGULAR: elementele sunt comparate fr a efectua conversii; SORT_NUMERIC: elementele sunt comparate dup ce sunt convertite la valori numerice; SORT_STRING: elementele sunt comparate dup ce sunt convertite n iruri de caractere.

Pentru un tablou nu pot fi specificai doi indicatori care fac parte din aceeai categorie (de exemplu, nu este permis specificarea pentru un tablou a indicatorilor SORT_NUMERIC i SORT_STRING). Nu este obligatorie specificarea ambelor tipuri de indicatori pentru fiecare tablou. n cazul n care indicatorii lipsesc, sunt utilizate valorile implicite SORT_ASC i SORT_REGULAR. Tablourile transmise ca parametri sunt considerate a fi coloane ntr-o matrice care trebuie sortat pe linii. Primul tablou reprezint criteriul de baza. Pentru valori egale n primul tablou se ia n considerare al doilea criteriu (reprezentat de al doilea tablou). Pentru valori egale n primele dou tablouri se ia n considerare al treilea criteriu i aa mai departe. Funcia returneaz o valoare logic ce indic dac operaia de sortare sa ncheiat cu succes. S considerm doi vectori definii astfel: $v1 = array("10", 100, 100, "a"); $v2 = array(1, 3, "2", 1); n urma execuiei apelului array_multisort($v1, $v2); vectorul $v1 va conine elementele "10", "a", 100 i 100, n timp ce vectorul $v2 va conine elementele 1, 1, "2" i 3. Se observ c elementele din al doilea vector corespunztoare 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. Vom prezenta acum un exemplu n care vom sorta un tablou bidimensional definit prin: $v = array(array("10", 100, 100, "a"), array(1,3,"2",11)); n urma unui apel de forma: array_multisort($v[0], SORT_ASC, SORT_STRING, $v[l], SORT_NUMERIC, SORT_DESC);

prima linie a tabloului va conine elementele "10", 100, 100 i "a" (au fost sortate cresctor ca iruri de caractere), iar cea de-a doua va conine elementele 1, 3, "2" i 1 (pentru valori egale n prima linie, elementele de pe a doua au fost sortate descresctor ca valori numerice). Funcia array_pad Aceast funcie poate fi utilizat pentru a completa un tablou cu o valoare dat, astfel nct s aib o dimensiune specificat. Funcia are trei parametri: tabloul care trebuie completat, dimensiunea pe care trebuie s o aib tabloul completat i valoarea cu care este completat tabloul. Tabloul va fi completat astfel nct dimensiunea sa s fie egal cu valoarea absolut a celui deal doilea parametru. n cazul n care valoarea acestui parametru este pozitiv, tabloul va fi completat la dreapta, iar dac aceasta este negativ, tabloul va fi completat la stnga. Dac valoarea absolut a acestui parametru este mai mic sau egal cu dimensiunea tabloului transmis ca parametru, atunci nu sunt adugate elemente. Funcia returneaz tabloul obinut dup completare. S considerm vectorul definit prin: $v = array(2 , 4 , 5 , 7); n continuare vom prezenta cteva apeluri ale funciei i vectorii returnai de aceasta: $r = array_pad($v2, 6, -1) : (2, 4, 5, 7, -1, -1); $r = array_pad($v2, -7, 0) : (0, 0, 0, 2, 4, 5, 7); $r = array_pad($v2, 3, 5) : (2, 4, 5, 7); [nu este adugat nici un element] Funciile array_pop i array_push Aceste funcii permit utilizarea tablourilor similar stivelor. Funcia array_pop( ) este utilizat pentru a elimina un element al tabloului (ultimul), iar funcia array_push( ) pentru a aduga n tablou unul sau mai multe elemente. S considerm ca vectorul $v este vid. n urma execuiei apelului array_push( $v , 1 , 2 , 3) acesta va conine elementele 1, 2 i 3. n acest moment, un apel de forma array_pop($v) va returna valoarea 3, iar vectorul $v va conine elementele 1 i 2. n cazul n care vectorul transmis ca parametru este vid, funcia array_pop( ) returneaz valoarea null. Funcia array_push( ) va returna ntotdeauna noua dimensiune a vectorului. Funciile array_shift i array_unshift Perechile funciilor array_pop( ) i array_push( ) sunt array_shift( ) i array_unshift( ). Acestea pot fi utilizate pentru a insera sau elimina elemente la nceputul unui tablou. Executarea acestor funcii va duce la modificarea cheilor ntregi astfel nct acestea s nceap de la 0. Funcia array_rand Aceast funcie permite alegerea aleatoare a unui numr de elemente dintr-un vector. Funcia are ca parametri un vector i o valoare numeric ce indic numrul elementelor care vor fi alese. Acest al doilea parametru poate lipsi, caz n care are valoarea implicit 1. n cazul n care se alege un singur element, funcia va returna cheia acestuia. n caz contrar, funcia va returna un tablou care va conine cheile elementelor alese. n continuare este un exemplu care ilustreaz modul de utilizare a acestei funcii.

Cod:

<?php $v = array(2, 4, 5, 7);

$a = array_rand($v); echo "A fost ales elementul a carui cheie este <B>$a</B>. Valoarea acestui element este <B>$v[$a]</B>.<BR><BR>"; $a = array_rand($v); echo "A fost ales elementul a carui cheie este <B>$a</B>. Valoarea acestui element este <B>$v[$a]</B>.<BR><BR>"; $a = array_rand($v, 2); echo "Au fost alese elementele ale caror chei sunt <B>$a[0]</B> si <B>$ a[1]</B>. Valorile acestor elemente sunt <B>".$v[$a[0]]."</B> si <B>".$v[$a[1]]."</B>.<BR><BR>"; $a = array_rand($v, 2); echo "Au fost alese elementele ale caror chei sunt <B>$a[0]</B> si <B>$ a[1]</B>. Valorile acestor elemente sunt <B>".$v[$a[0]]."</B> si <B>" . $v[$a[1]]."</B>."; ?>
Funcia array_reduce Aceast funcie aplic o alt funcie transmis ca parametru asupra elementelor unui tablou pn n momentul n care tabloul este redus la o singur valoare. Mai exact, funcia transmis ca parametru este apelat pentru primele dou elemente ale tabloului. Cele dou elemente sunt eliminate i n tablou este inserat pe prima poziie rezultatul apelului funciei. Procedeul continu pn n momentul n care vectorul conine o singur valoare care este returnat. Exista i posibilitatea de a transmite o valoare iniial pentru efectuarea operaiilor. n acest caz funcia transmis ca parametru va fi apelat pentru valoarea iniial i primul element al tabloului. n cazul n care tabloul este vid, rezultatul apelului va fi aceast valoare iniial. S considerm funciile definite astfel: function S($v, $w) { return $v + $w; } function P($v, $w) { return $v + $w; } n urma executrii instruciunilor: $a = array(2, 4, 5, 7); $x = array( ); $b = array_reduce($a, "S") ; $c = array_reduce($a, "P", 10) ; $d = array_reduce($x, "S", l) ; valorile variabilelor $b, $c i $d vor fi 18 (2+4+5+7), 2800 (10*2*4*5*7), respectiv 1 (datorita faptului ca vectorul $x este vid). Funcia array_reverse Aceast funcie inverseaz ordinea elementelor unui vector transmis ca parametru. n cazul n care este prezent un al doilea parametru i valoarea acestuia este TRUE (eventual dup o conversie), atunci se pstreaz corespondena dintre chei i valori. Funcia returneaz tabloul obinut dup inversare. S considerm tabloul definit astfel: $v = array("Pagina", "de", "programare", array("martie", 2004));

n urma apelurilor $a = array_reverse($v) i $b = array_reverse($v, 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

Funcia array_search Aceast funcie verific dac un vector conine un element care are o anumit valoare i, dac un astfel de element exist, returneaz cheia acestuia. n caz contrar funcia returneaz valoarea FALSE. Primul parametru al funciei este valoarea cutat, iar al doilea este vectorul n care este cutata valoarea respectiv. Funcia permite folosirea unui al treilea parametru care este opional. n cazul n care acesta exist i are valoarea TRUE, atunci n timpul cutrii se verific i egalitatea tipurilor. Funcia array_slice Aceast funcie poate fi utilizat pentru a prelua o poriune a unui tablou. Primul parametru reprezint tabloul, al doilea reprezint poziia la care ncepe poriunea preluat, iar al treilea indica numrul elementelor preluate. Aceast funcie ignor cheile elementelor i ia n considerare pozitiile "reale" ale elementelor n tablou. n cazul n care valoarea celui de-al doilea parametru este pozitiv, poziia de nceput este determinat relativ fa de nceputul tabloului. Pentru o valoare negativ, poziia este determinat relativ fa de sfritul tabloului. n cazul n care valoarea celui de-al treilea parametru este pozitiv, ea va indica numrul elementelor preluate. Dac ea este negativ, atunci valoarea sa absolut va indica poziia fa de sfritul vectorului la care se va "opri" preluarea elementelor. Acest parametru poate lipsi, caz n care sunt preluate toate elementele, pn la sfritul tabloului. Funcia va returna un tablou care va conine elementele preluate. n continuare este prezentat modul n care poate fi utilizat aceast funcie pentru a prelua poriuni ale unui vector.

Cod:

<?php function DisplayArray($v) { echo "<B>"; foreach($v as $val) { echo "$val<BR>"; } echo "</B><BR>"; } $v = array("a", "b", "c", "d", "e"); echo "<TT>Vectorul initial:"; DisplayArray($v);

echo "array_slice(\$v,2):"; DisplayArray(array_slice($v,2)); echo "array_slice(\$v,2,-1):"; DisplayArray(array_slice($v,2,-1)); echo "array_slice(\$v,-2,1):"; DisplayArray(array_slice($v,-2,1)); echo "array_slice(\$v,0,3):"; DisplayArray(array_slice($v,0,3)); echo "</TT>"; ?>
Funcia array_splice Efectul acestei funcii este similar efectului funciei array_slice( ), diferena constnd n faptul c poriunea preluat este eliminat din tablou i nlocuit cu elementele unui al patrulea parametru care reprezint un vector. Funcia array_sum Aceast funcie calculeaz suma elementelor unui tablou. n funcie de tipul elementelor, rezultatul va fi un numr ntreg sau un numr real. 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 calculrii sumei. De exemplu, n urma executrii secvenei: $a = array(2, 4, 6, 8); echo "suma(a) = ".array_sum($a)."\n"; $b = array("a" => 1.2 , "b" => 2.3 , "c" => 3.4); echo "sum (b) = ".array_sum($b)."\n"; se va afisa: sum(a) = 20 sum(b) = 6.9 Funcia array_unique Aceast funcie elimin dintr-un vector toate valorile care apar de dou sau mai multe ori i returneaz vectorul obinut n urma eliminrii. Pentru a elimina elementele, funcia le sorteaz mai nti considerandu-le iruri de caractere. Apoi, pentru fiecare valoare care apare de mai multe ori, va pstra prima cheie ntlnit n irul sortat. Funcii de sortare Interpretorul PHP pune la dispozitie o mulime de funcii care pot fi utilizate pentru a sorta elementele unui tablou. Acestea sunt (n ordine alfabetic): - arsort( ) - sorteaz un tablou n ordine descresctoare i pstreaz asocierile dintre indici; - asort( ) - sorteaz un tablou n ordine cresctoare i pstreaz asocierile dintre indici; - krsort( ) - sorteaz un tablou n ordine descresctoare n funcie de cheile elementelor acestuia; - ksort( ) - sorteaz un tablou n ordine cresctoare n funcie de cheile elementelor acestuia; - natcasesort( ) - sorteaz un tablou folosind o "ordine natural" fr a face distincie ntre literele mari i literele mici; - natsort( ) - sorteaz un tablou folosind o "ordine natural" fcnd distincie ntre literele mari i literele mici; - rsort( ) - sorteaz un tablou n ordine descresctoare n funcie de valorile elementelor acestuia; - sort( ) - sorteaz un tablou n ordine cresctoare n funcie de valorile elementelor acestuia;

- uasort( ) - sorteaz un tablou folosind pentru comparri o funcie indicat de utilizator i pstreaz asocierile dintre indici; - uksort( ) - sorteaz un tablou n funcie de cheile acestuia folosind pentru comparri o funcie indicat de utilizator; - usort( ) - sorteaz un tablou folosind pentru comparri o funcie indicat de utilizator. Toate funciile necesit un parametru care reprezint vectorul care trebuie sortat. Functiile arsort( ), asort( ), krsort( ), ksort( ), rsort( ) i sort( ) permit utilizarea unui al doilea parametru (opional) care este un indicator de tip. Valoarea implicit a acestuia este SORT_REGULAR. Al doilea parametru al funciilor uasort( ), uksort( ) i usort( ) reprezint identificatorul funciei care va fi folosit pentru comparare. Funciile natsort( ) i natcasesort( ) nu permit utilizarea unui alt parametru i stabilesc ordinea aa cum ar face o fiin uman (ordine natural). De exemplu, pentru irurile de caractere IMG1.GIF, IMG2.GIF, IMG10.GIF i IMG12.GIF, un algoritm "clasic" (bazat pe ordinea lexicografic) ar stabili ordinea: IMG1. GIF, IMG10 .GIF, IMG12 .GIF i IMG2 .GIF, dar algoritmul care foloseste ordinea naturala nu ar efectua nici o modificare. Funcia compact Aceast funcie are ca argumente un numr variabil de iruri de caractere sau tablouri. Ea creeaz un tablou n care va insera toate irurile care reprezint o variabil (aceste iruri vor fi chei, iar valorile elementelor corespunztoare vor fi valorile variabilelor). n cazul tablourilor, vor fi luate n considerare toate elementele care sunt iruri de caractere, iar dac tablourile conin elemente care, la randul lor, sunt tablouri, atunci procedeul se aplic recursiv i asupra acestora. Funciile count i sizeof Aceaste funcii returneaz numarul elementelor unui vector transmis ca parametru. Teoretic, parametrul poate s nu fie un vector, dar n acest caz se va returna valoarea 1 (doar tablourile pot conine mai multe elemente). Nu exist nici o diferen ntre aceste funcii. Funcii pentru elementul curent Fiecrui vector i este asociat o referin care indic elementul curent. Exist mai multe funcii care pot utiliza aceast referin. Acestea sunt (n ordine alfabetic): - current( ) - returneaz valoarea elementului curent al tabloului; - each( ) - returneaz cheia i valoarea elementului curent i deplaseaz referina la elementul urmtor; funcia returneaz un tablou cu patru elemente: dou dintre ele au cheile 0i key i conin cheia elementului; celelalte dou au cheile 1i value i conin valoarea elementului; - end( ) - deplaseaz referina la ultimul element al tabloului; - key( ) - returneaz cheia elementului curent al tabloului; - next( ) - deplaseaz referina la urmtorul element al tabloului; - pos( ) - returneaz valoarea elementului curent al tabloului (are acelai efect ca i funcia current( ) ); - prev( ) - deplaseaz referina la elementul anterior al tabloului; - reset( ) - deplaseaz referina la primul element al tabloului. Funcia extract Aceast funcie este utilizat pentru a crea variabile pe baza valorilor elementelor unui vector. Cheile elementelor vor deveni identificatori de variabile, iar valorile elementelor vor deveni valorile variabilelor respective. Funcia verific dac cheile reprezint identificatori valizi ai variabilelor sau dac se ncearc crearea unei variabile care exista deja. Aceste situaii sunt tratate n funcie de valoarea unui al doilea parametru care reprezint un indicator i este opional. Valorile posibile pentru acest parametru sunt urmtoarele: - EXTR_OVERWRITE : dac variabila exist deja, valoarea curenta va fi suprascris; - EXTR_OVERWRITE : dac variabila exist deja, valoarea curenta nu va fi modificat; - EXTR_PREFIX_SAME: dac variabila exist deja, denumirea noii variabile va fi prefixat cu

un prefix transmis ca al treilea parametru al funciei; - EXTR_PREFIX_ALL : denumirile tuturor variabilelor vor fi prefixate; - EXTR_PREFIX_INVALID : n cazul n care o cheie nu reprezint un identificator de variabil valid, denumirea cheii va fi prefixat; - EXTR_IF_EXISTS : nu sunt create variabile noi, ci sunt doar suprascrise valorile variabilelor care exist deja; - EXTR_PREFIX_IF_EXISTS : n cazul n care cheia reprezint denumirea unei variabile, se creeaz o nou variabil prefixat; dac nu exist o astfel de variabil, nu este creat o variabil nou; - EXTR_REFS : variabilele create reprezint referine; aadar, prin intermediul lor pot fi modificate i elementele vectorului; acest indicator poate fi utilizat mpreuna cu oricare dintre celelalte cu ajutorul unei disjunctii logice. Cel de-al treilea parametru al funciei trebuie s apar doar dac valoarea celui de-al doilea este unul din indicatorii ai crui identificator conine secvena PREFIX. Al doilea parametru poate lipsi, caz n care are valoarea implicit EXTR_OVERWRITE. Funcia in_array Aceast funcie este similar funciei array_search( ), singura diferen fiind faptul c, n cazul n care cutarea se ncheie cu succes, nu este returnat cheia elementului gsit, ci valoarea TRUE. Funcia range Aceast funcie returneaz un vector care conine toate valorile cuprinse ntre dou limite date (st i dr). Primul element al vectorului va avea valoarea st, iar urmtoarele vor avea valorile st + 1, st + 2 etc. dac st < dr, respectiv st - 1, st - 2 etc. dac st > dr. ncepnd cu versiunea PHP 4.4.0 exista i posibilitatea de a crea iruri n care diferena dintre doua elemente s fie diferit de 1. n cele ce urmeaza este prezentat un document PHP care ilustreaz modul de utilizare a acestei funcii.

Cod:

<?php function DisplayArray($v) { echo "<B>"; foreach ($v as $val) { echo "$val<BR>"; } echo "</B><BR>"; } echo "<TT>"; DisplayArray (range(1,10)); DisplayArray (range(10,1)); DisplayArray (range('a', 'k')); DisplayArray (range('k', 'a')); echo "</TT>"; ?>
Funcia shuffle Aceast funcie poate fi utilizat pentru a "amesteca" elementele unui tablou. Ea nu returneaz nici o valoare, dar modific ordinea elementelor tabloului.

Cod:

<?php function DisplayArray($v) { echo "<B>"; foreach ($v as $val) { echo "$val<BR>"; } echo "</B><BR>"; } echo "<TT>Sirul initial:<BR>&nbsp;"; $a = range(l, 10); DisplayArray($a); echo "Sirul amestecat:<BR>&nbsp;"; shuffle($a); DisplayArray($a); echo "</TT>"; ?>

Lucrul cu fiiere i directoare

ncerc n continuare s v prezint lucrul cu fiiere i directoare (foldere) prin intermediul scripturilor php. Deoarece va fi un articol destul de lung, l voi mpari n mai multe subcapitole pentru a putea nelege mai bine ideile prezentate. Voi ncepe n acest articol s va prezint sistemul de fiiere UNIX (asemntor cu LINUX), apoi voi continua cu vizualizarea informaiilor despre fiiere, proprietile i privilegiile ce se pot acorda fiierelor sau directoarelor continund apoi cu exemplificri. n articolele viitoare voi continua cu descrierea funciilor php de prelucrare a fiierelor i a directoarelor, bineneles cu exemplele aferente. Deci, s ncep: Sistemul de fiiere UNIX Pentru a nelege cum trebuie utilizat limbajul PHP pentru a lucra cu fiiere i cataloage, trebuie s nelegeti sistemul de fiiere UNIX. Acest fapt este valabil chiar dac foloii PHP sub Microsoft Windows, deoarece modelul folosit de PHP pentru lucrul cu fiiere i directoare este bazat pe UNIX. Un fiier este o serie de octei stocai pe o unitate de hard-disc, CD-ROM sau alt mediu de stocare. Fiierele primesc nume pentru a se putea face cu uurin referire la acestea. Un nume de fiier UNIX poate avea o lungime aproape nelimitat i poate include aproape orice caracter. Totui pentru compatibilitate nu v recomand s creai fiiere cu nume mai lungi de 255 de caractere i s nu conin caractere speciale sau diacritice. Spre deosebire de numele de fiiere Windows, numele de fiiere UNIX sunt sensibile la diferena ntre majuscule i minuscule; ca atare, index.php i INDEX.PHP se refer la fiiere UNIX diferite. Sunt sigur c unii dintre voi la nceput cnd puneai fiierele pe server v ntrebai de ce nu merg anumite pagini dei link-ul era corect i pagina era pus pe server... problema era diferena dintre majuscule i minuscule. Pentru a evita problemele, mai ales atunci cnd deplasai fiiere ntre UNIX i Windows, trebuie s folosii minuscule, cifre, puncte, caractere de subliniere i cratime n numele fiierelor; de asemenea, numele fiierelor trebuie s nceap cu o minuscul sau cu o cifr. Vizualizarea informaiilor despre fiiere Pentru a vizualiza informaii care descriu un fisier, emitei comanda:

ls -1 nume_fisier unde nume_fisier este numele fiierului. Datele de ieire includ urmtoarele cmpuri: - tipul fiierului i permisiunile de acces. - legturi: numrul legturilor hard asociate acestui fiier. Fiecare legtur hard stabilete un nume dup care este cunoscut fiierul respectiv. n general putem ignora acest cmp. - Utilizator: numele utilizatorului care este posesorul fiierului - Grup: Numele grupului care este posesorul fiierului - Dimensiunea fiierului exprimat in octei. - Data modificrii: data i ora ultimei modificri a fiierului. Dac fiierul nu a suferit modificri recente, vor fi afiate data i anul. - Numele fiierului: numele atribuit fiierului. n Windows, o comanda asemntoare ar fi comanda dir. Rulai ntr-un script sub windows comanda urmtoare:

Cod:

<?php $comanda = `dir`; //pentru ghilimele folositi tasta de langa 1 // deasupra tastei tab nu caracterul asta '. echo $comanda; ?>
Pentru a funciona aceast comand trebuie introdus n ghilimele simple ` (a nu se folosi ghilimelele ' ) Proprietatea asupra fiierelor Fiecare fiier are un cont de utilizator asociat, cunoscut sub numele de posesor al fiierului. Putei determina posesorul unui fiier prin emiterea comenzii ls. Utilizatorul care creeaz un fiier devine posesorul fiierului. Cu toate acestea, un administrator de sistem poate atribui un fiier unui alt utilizator, prin emiterea comenzii chown (este i comand php). Administratorii de sistem UNIX pot defini grupuri de utilizatori, sau pur i simplu grupuri, care reprezint seturi de utilizatori. Un utilizator poate fi membru al unui numr orict de mare de grupuri. Posesorul unui fiier poate atribui unui fiier un nou grup posesor prin emiterea comenzii chgrp: chgrp grup nume_fisier unde nume_fisier este numele fiierului, iar grup este numele grupului. n afar de calitatea de posesor al fiierului, utilizatorul care emite comanda trebuie s fie un membru al grupului grup. Privilegii de fiier Privilegiile asociate unui fiier determin operaiile pe care utilizatorii le pot efectua cu fiierul respectiv. Privilegiile sunt date sub forma a trei grupuri alctuite din cte trei caractere fiecare; cu alte cuvinte, trei triade. Prima triad indic privilegiile acordate posesorului fiierului. Cea de-a doua triad indic privilegiile acordate membrilor grupului care este posesorul fiierului. Cea de-a treia triad indic privilegiile acordate altor utilizatori, cu alte cuvinte, persoanelor care nu sunt nici posesoare ale fiierului i nici nu sunt membre ale grupului care care este posesorul fiierului. Fiecare caracter al unei triade de privilegii poate fi o liter sau o cratim. Literele au urmtoarele semnificaii: - r, fiierul poate fi citit - w, se poate scrie n fiier - x, coninutul fiierului poate fi executat. Privilegiul x este semnificativ numai pentru fiierele care includ un coninut executabil, cum

sunt fiierele binare executabile sau anumite categorii de scripturi. Caracterele unei triade apar ntotdeauna n secvena rwx. Daca o anumit liter este nlocuit de o cratim, privilegiul asociat nu este utilizabil. De exemplu, avem un fiier cu privilegiile urmtoare: rwxr-xr-Aceste caractere au urmtoarea semnificaie: - rwx, posesorul fiierului poate citi, scrie sau executa fiierul - r-x, membrii grupului posesor al fiierului pot citi sau executa fiierul, dar nu pot scrie n fiier - r--, alti utilizatori pot citi fiierul, dar nu pot scrie n fiier sau executa coninutul fiierului. Posesorul unui fiier poate modifica privilegiile asociate fiierului emind comanda chmod. Aceast comand are dou forme. O form v permite s specificai privilegiile folosind cifre scrise n octal; cealalt v permite s le specificai folosind litere. Pentru a specifica privilegiile folosind cifre n octal, calculai valoarea numeric a fiecrei triade. Pentru aceasta, nsumai numerele corespunztoare fiecrui privilegiu disponibil din cadrul triadei. Numerele asociate privilegiilor sunt: r- 4 w-2 x-1 De exemplu, privilegiul rwx are valoarea 4+2+1 = 7. Similar, privilegiul r-x are valoarea 4+1 = 5, iar privilegiul r-- are valoarea 4. Dup ce ai calculat valoarea numeric a fiecrei triade, formai un numr din trei cifre scris n octal. De exemplu, privilegiile rwxr-xr-- corespund valorii n octal 754. Forma comenzii chmod care foloseste cifre n octal este urmtoarea: chmod mod nume_fisier unde mod este numrul din trei cifre scris n octal care indic privilegiile, iar nume_fisier este numele fiierului cruia urmeaz a i se aplica privilegiile. De exemplu, pentru a acorda posesorului acces complet la fiierul test i pentru a acorda altor utilizatori numai acces de citire, emitei comanda: chmod 744 test Majoritatea utilizatorilor gsesc mai comod utilizarea acelei forme a comenzii chmod care le permite specificarea privilegiilor folosind litere. Aceast form alternativ v permite s specificai privilegii, precum i s adaugai sau s extrageti privilegii dintr-un fiier. chmod utilizatori operatie privilegii ntre argumentele comenzii nu sunt permise spaii. Argumentul utilizatori include ntre una i trei dintre urmtoarele litere: - u, care indic utilizatorul posesor al fiierului - g, care indic pe membrii grupului posesor al fiierului - o, care indic utilizatori alii dect posesorul i membrii grupului posesor. Argumentul operatie este unul din urmtoarele: - r, fiierul poate fi citit - w, n fiier este permis scrierea - x, coninutul fiierului poate fi executat Se pot specifica mai muli utilizatori, mai multe operaii i mai multe grupuri; fiecare specificaie trebuie separat de urmtoarea cu ajutorul unei virgule. De exemplu, iat o

comand care atribuie privilegiile rwxr--r-- pentru fiierul test: chmod u=rwx,g=r,o=r test Iat o comand care retrage privilegiile de scriere fiecrui utilizator, cu excepia posesorului fiierului, respectiv aduga privilegiile de executare la privilegiile posesorului fiierului: chmod u+x,go-w test Aceast comand nu modific nici privilegiile de citire i de scriere ale posesorului fiierului, nici privilegiile de citire i de execuie ale celorlati utilizatori. Sistemele UNIX furnizeaz un cont special de utilizator, denumit radacina (root) sau superutilizator (superuser), care poate obine acces la fiiere i le poate manipula fr nici un fel de restricii. Administratorul unui sistem este, n general, singura persoan autorizat s utilizeze contul rdcin. Uneori, administratorii de sistem folosesc numeroase privilegii speciale astfel c pot aprea i alte privilegii n afar de r,w i x.. De exemplu, un privilegiu special, cunoscut sub numele de setuid, modific temporar identitatea utilizatorului deintor al acestui privilegiu care ruleaza un fiier program. Asemenea privilegii speciale nu sunt, n general, folosite de programatorii aplicaiilor PHP. Crearea unui director (folder sau catalog) Pentru a crea un director, invocai funcia mkdir(), care are urmtoarea form: mkdir(nume_director, mod) unde nume_director este calea absolut sau relativ (O cale absolut este calea care ncepe de la directorul rdcin urmnd structura arborescent a directoarelor i sub-directoarelor acestuia pn se ajunge la directorul dorit. Fiecare director din list este separat de directorul urmtor de un caracter slash orientat nainte (/). Calea relativ se refer la calea unui fiier sau director ncepnd de la directorul curent de lucru. De exemplu, dac fiierul index.php se afl n directorul /home/tutoriale/articole i dorim s includem n el un alt fiier numit test.php aflat cu un director mai sus l putem accesa relativ la locaia prezent astfel ../test.php) sau numele directorului care urmeaz a fi creat, iar mod atribuie privilegiile care trebuie acordate noului director. n mod normal, prima cifr a argumentului mod trebuie s fie 0, astfel ncat PHP s-l perceap ca pe o valoare scris n octal. Funcia returneaza true dac creeaz directorul; n caz contrar, returneaz false. De exemplu, pentru a crea un director denumit "test" i pentru a-i atribui privilegiile "rwxr-x--x", invocai functia mkdir() astfel: mkdir("test", 0751) Putei folosi funcia rename() pentru a modifica numele unui director. tergerea unui director Pentru a terge un director, se folosete funcia rmdir(), transferndu-i ca argument calea sau numele directorului care urmeaz a fi ters. De exemplu, pentru a terge directorul "home/tutoriale/teste/vechi", invocai funcia rmdir() astfel: rmdir("home/tutoriale/teste/vechi") Se pot sterge numai directoare vide. Funcia va returna zero n cazul producerii unei erori. Privilegii pentru directoare Ca i fiierele, directoarele au privilegii asociate. Privilegiile unui director se noteaz folosind aceleai litere care indic privilegiile fiierelor; cu toate acestea, literele au semnificaii

oarecum diferite atunci cnd se aplic asupra directoarelor: - r, directorul poate fi citit; cu alte cuvinte, sub-directoarele i fiierele pe care le conine pot fi afiate - w, directorul poate fi scris; cu alte cuvinte, sub-directoarele i fiierele pe care le conine pot fi create n catalog i apoi terse de acolo. - x, directorul se poate folosi, cu alte cuvinte, sub-directoarele i fiierele pe care le conine sunt accesibile. Vizualizarea i modificarea privilegiilor de director Putei invoca funcia chmod(), folosind ca argument un fiier sau un director. Putei vedea privilegiile de director utiliznd funcia fileperms(). Obinerea i modificarea directorului de lucru Functia getcwd() returneaz un ir care conine directorul curent de lucru. Funcia nu necesit argumente i, implicit, poate fi utilizat astfel: $director_curent = getcwd(); Pentru a schimba directorul curent de lucru, invocai funcia chdir(), care are urmtoarea form: chdir(nume_director) unde nume_director este calea sau numele directorului de lucru dorit. Funcia returneaz true dac operaia reuete; n caz contrar, returneaz false. De exemplu, pentru a face din /teste directorul curent de lucru, invocai funcia chdir() dup cum urmeaz: $schimba_dir = chdir("/teste"); if (!$schimba_dir) { die("<br>A aparut o eroare la schimbarea directorului curent de lucru.") } Manipularea cilor de acces Funcia dirname() preia calea de acces la un fiier i returneaz toat calea, mai puin componenta final a cii specificate. n cazul n care componenta final este un fiier, funcia v ajut s izolai numele fiierului de restul cii. De exemplu, dac se d calea "home/tutoriale/teste/test.php", funcia va returna "home/tutoriale/teste". Funcia are urmtoarea form: dirname(cale) Funcia basename() execut operaia complementar, returnnd numai componenta final a cii specificate. De exemplu, dac este dat calea "home/tutoriale/teste/test.php", funcia va returna "test.php". Funcia are urmtoarea form: basename(cale) Dac dorii s executai mai multe operaii cu o cale, funcia pathinfo() v poate fi de folos. Aceast funcie returneaz un tablou asociativ care include trei elemente: rezultatul invocrii funciei dirname() avnd ca argument calea respectiv, rezultatul invocrii funciei basename() avnd ca argument calea respectiv, precum i extensia fiierului (dac exist) asociat rezultatului invocrii funciei basename() avnd ca argument calea respectiv. Iat un exemplu care prezint modul de utilizare a funciei pathinfo():

Cod:

<?php $info = pathinfo("/home/tutoriale/teste/test.php"); foreach ($info as $nume=>$valoare) { echo "<br>$nume => $valoare"; } ?>
Datele de ieire ale exemplului vor fi:

Citat: dirname => /home/tutoriale/teste basename => test.php extension => php Versiunea PHP 4.04pl1 ii ncheie execuia dac invocai funcia pathinfo() pe o cale din care lipseste extensia fiierului. Se pare c acest defect de program a fost remediat n versiunea PHP 4.05 Citirea coninutului unui director PHP furnizeaz trei funcii care v permit s citii coninutul unui director, ca i cum directorul ar fi un fiier. Aceste funcii sunt: - opendir(), care permite citirea unui director - readdir(), care citeste o intrare dintr-un director - closedir(), care nchide directorul, elibernd resursele alocate de funcia opendir() Rezultatul apelrii funciei readdir() este un ir care conine numele urmtorului fiier sau subdirector al directorului deschis. Funcia returneaz false atunci cnd au fost citite toate intrrile din catalog. Exemplu:

Cod:

<?php $director = opendir("/home/tutoriale/teste"); if (!$director) { die("A aparut o eroare la deschiderea directorului"); } $citire = readdir($director); while ($citire) { echo "<br>$citire"; $citire = readdir($director); } closedir($director); ?>
Acest exemplu afieaz coninutul directorului "/home/tutoriale/teste" (att sub-directoarele ct i fiierele) Obinerea atributelor unui fiier

PHP furnizeaz numeroase funcii care v permit s obinei informaii care descriu un fiier. Tabelul de mai jos rezum cele mai cunoscute dintre aceste funcii. Funcie Descriere file_exists() returneaz true dac fiierul specificat exist, respectiv false n caz contrar. fileatime() returneaz timpul de acces la fiier sub form de amprent de timp UNIX returneaz timpul de modificare al i-nodului (structura de date care conine filectime() informaii despre fiierele UNIX) sub form de amprent de timp UNIX filegroup() returneaz identificatorul numeric al grupului care deine fiierul filemtime() returneaz momentul de timp al modificrii fiierului sub form de amprent de timp UNIX.

fileowner() returneaz identificatorul numeric de utilizator al fiierului fileperms() returneaz permisiunile fiierului <;/tr> returneaz dimensiunea fiierului, n octei. returneaz tipul fiierului, n spe "fifo", "char", "dir", "block", "link", "file" sau filetype() "unknown". returneaz true dac fiierul specificat exist i este un director, n caz contrar is_dir() returneaz false returneaz true dac fiierul specificat exist i este un fiier obinuit; n caz is_file() contrar, returneaz false. returneaz true dac fiierul specificat exist i poate fi citit, n caz contrar is_readable() returneaz false. returneaz true dac fiierul specificat exist i se poate scrie n acel fiier; n caz is_writable() contrar, returneaz false. Funciile fileowner() i filegroup() returneaz fiecare un identificator numeric; putei converti identificatorul numeric ntr-un ir prin invocarea funciei posix_getpwuid() cu un identificator de utilizator, respectiv a funciei posix_getgrgid() cu un identificator de grup. Un exemplu al acestor funcii este dat mai jos. filesize()

Cod:

<?php $nume_fisier = "pagina_demo.php"; $rezultat = file_exists($nume_fisier); echo "<br>file_exists(): $rezultat"; $rezultat = posix_getpwuid(fileowner($nume_fisier)); $rezultat = $rezultat["name"]; echo "<br>fileowner(): $rezultat"; $rezultat = posix_getgrgid(filegroup($nume_fisier)); $rezultat = $rezultat["name"]; echo "<br>filegroup(): $rezultat"; $rezultat = filetype($nume_fisier); echo "<br>filetype(): $rezultat"; $rezultat = filesize($nume_fisier); echo "<br>filesize(): $rezultat"; $rezultat = fileatime($nume_fisier); $rezultat = date("m-d-Y H:i", $rezultat);

echo "<br>fileatime(): $rezultat"; $rezultat = filectime($nume_fisier); $rezultat = date("m-d-Y H:i", $rezultat); echo "<br>filectime(): $rezultat"; $rezultat = filemtime($nume_fisier); $rezultat = date("m-d-Y H:i", $rezultat); echo "<br>filemtime(): $rezultat"; $rezultat = fileperms($nume_fisier); $rezultat = decoct($rezultat); echo "<br>fileperms(): $rezultat"; $rezultat = is_file($nume_fisier); echo "<br>is_file(): $rezultat"; $rezultat = is_dir($nume_fisier); echo "<br>is_dir(): $rezultat"; $rezultat = is_readable($nume_fisier); echo "<br>is_readable(): $rezultat"; $rezultat = is_writable($nume_fisier); echo "<br>is_writable(): $rezultat"; ?>
Modificarea privilegiilor unui fiier Pentru a modifica privilegiile unui fiier, invocai chmod(), o funcie ale crui argumente sunt asemnatoare celor folosite n linia de comand UNIX: chmod(nume_fisier, mod) unde nume_fisier specific numele sau calea de acces a fiierului ale crui privilegii urmeaz a fi modificate, iar argumentul mod specific privilegiile dorite. n general se prefer exprimarea privilegiilor sub forma unui numr scris n octal. Pentru aceasta, prefixai valoarea folosind cifra 0. De exemplu, valoarea literal 010 are valoarea 8, nu valoarea 10. Ca atare, puteti atribui unui fiier privilegiile rw-r----- specificnd valoarea 0640. Pentru ca funcia chmod() s se execute cu succes, PHP trebuie s ruleze sub contul utilizatorului posesor al fiierului. Funcia returneaz true n caz de reuit, respectiv false n caz contrar. Funcia chmod() nu funcioneaz sub Windows. Modificarea proprietii asupra unui fiier Pentru a modifica grupul posesor al unui fiier, invocai funcia chgrp(), care are forma: chgrp(nume_fisier, grup) unde nume_fisier este numele sau calea fiierului, iar grup este numele sau identificatorul numeric al grupului. Pentru ca funcia s se execute cu succes, contul de utilizator sub care ruleaz PHP trebuie s fie posesor al fiierului i s fie membru al grupului specificat de argumentul grup. Funcia returneaz true n caz de reuit, respectiv false n caz contrar. Funcia chgrp() nu funcioneaz sub Windows. Dei PHP include o funcie chown() care modific proprietatea asupra unui fiier, PHP trebuie s ruleze folosind contul rdcin pentru ca aceast funcie s poat da rezultate. Deoarece acesta este un procedeu nesigur i rareori folosit, n general funcia chown() nu este disponibil.

Deschiderea unui fiier nainte de a putea citi sau scrie ntr-un fiier, trebuie s deschidei fiierul folosind funcia fopen(): fopen(nume_fisier, mod) unde nume_fisier specific numele sau calea spre fiierul care urmeaz a fi deschis, iar mod indic tipul de acces dorit. De exemplu, instruciunea urmtoare deschide fiierul text.txt pentru citire: $fisier = fopen("text.txt", "r"); Funcia fopen() returneaz valoarea false dac PHP nu a reuit s deschid fiierul. n caz contrar, aceast valoare conine un ntreg care se numete identificator de fiier, care se folosete pentru identificarea unui fiier de ctre funciile care execut operaii cu fiiere. Tabelul de mai jos prezint valorile argumentului mod care pot fi transmise funciei fopen(). Literele care desemneaz modurile corespund cuvintelor read (citire), write (scriere) i append (adugare). Modul "r" permite accesul la citire. Modurile "w" i "a" permit accesul la scriere. Modurile care includ semnul "+" permit ambele tipuri de acces. Unele moduri determin PHP s ncerce a crea fiierul, dac acesta nu exist. 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 Sfrit Sfrit

Pentru ca funcia fopen() s se execute cu succes, PHP trebuie s ruleze sub contul unui utilizator care dispune de suficiente privilegii pentru a executa operaiile indicate de modul respectiv. De exemplu, pentru a putea crea un fiier, PHP trebuie s ruleze ca utilizator cu acces de scriere la catalogul n care urmeaz a fi creat fiierul. Fiecare fiier are un pointer asociat, care indic amplasarea octetului din fiier unde se va produce urmtoarea operaie (citire sau scriere). Valoarea modului funciei fopen() determin valoarea iniial a pointerului de fiier. PHP furnizeaz o form alternativ a funciei fopen(), care preia trei argumente: fopen(nume_fisier, mod, cale); Dac argumentul cale are valoarea "1", PHP va cuta fiierul ntr-un director special, denumit cale de includere. Administratorul PHP configureaz identitatea cii de includere. Dac specificai argumentul cale, argumentul nume_fisier trebuie s fie alctuit dintr-un nume de fiier sau o cale relativ, nu dintr-o cale absolut. n mod prestabilit, PHP 4.04pl1 raporteaz c este configurat calea de includere. Cu toate acestea, este necesar stabilirea manual a valorii variabilei include_path din fiierul php.ini; n caz contrar, calea de includere nu va fi folosit. Sub Windows, fiierele ASCII i fiierele binare sunt tratate n mod diferit. Cnd deschidei un fiier binar sub Windows, specificai "b" ca al doilea caracter al modului; de exemplu, "rb". Dac nu procedai astfel, citirile din fiier i alte operaii se vor ncheia prematur sau vor eua. Verificarea finalizrii unei operaii cu un fiier Operaiile cu fiiere pot eua dintr-o varietate de motive. Deci, este important s verificai

dac fiecare operaie s-a ncheiat cu succes. Iat o modalitate n care putei verifica:

Cod:

<?php $fisier = fopen("text.txt", "r"); if (!$fisier) { die("Nu se poate deschide fisierul pentru citire"); } ?>
Funcia fopen() returneaz false dac nu reuete s deschid fiierul. n acest caz, scriptul invoc funcia die() pentru a afia un mesaj i pentru a-i ncheia execuia. Cu mult mai compacte, dar i posibil mai derutante, sunt formele folosite de programatorii PHP cu experien:

Cod:

<?php $fisier = fopen("text.txt", "r") or die("Nu se poate deschide fisierul pentru citire"); ?>
sau aceeai instruciune mai complex:

Cod:

<?php ($fisier = fopen("text.txt", "r")) || die("Nu se poate deschide fisierul pentru citire"); ?>
nchiderea unui fiier Un fiier deschis consum resursele sistemului. Cnd un script a terminat de utilizat un fiier, scriptul trebuie s nchid fiierul, elibernd aceste resurse. La sfritul unui script, PHP inchide n mod automat fiierele deschise. Totui, n programare se recomand s nchidei fiierele mai rapid, ori de cte ori este posibil. Pentru a nchide un fiier invocai funcia fclose(): fclose(identificator_fisier) unde identificator_fisier este identificatorul fiierului, returnat la deschiderea acestuia. De exemplu: <;br> Cod:

<?php $fisier = fopen("text.txt", "r"); if (!$fisier) { die("Nu se poate deschide fisierul"); } // Aici se introduc instructiunile care folosesc fisierul deschis @fclose($fisier); ?>
Funcia fclose() returneaz valoarea true dac fiierul a fost nchis cu succes. Testarea acestei

valori este rareori necesar, deoarece nu se mai pot face prea multe dup ce s-a ratat o ncercare de a nchide un fiier. Citirea dintr-un fiier PHP furnizeaz o varietate de funcii pentru citirea fiierelor. Prima dintre acestea este fread() care are urmtoarea form: fread(identificator_fisier, lungime) Argumentul identificator_fisier este valoarea returnat de funcia fopen(), iar argumentul lungime specific numrul maxim de octei care vor fi citii. Octeii citii din fiier sunt returnai sub form de valoare de tip ir. Dac operaia de citire ntlnete sfritul fiierului, PHP va returna mai puin de lungime octei. PHP include o funcie conex, denumit fgetc(), care citete un octet din fiierul specificat. Exemplu:

Cod:

<?php $fisier = fopen("text.txt", "r") OR die("Nu se poate deschide fisierul pentru citire"); $citire = fread($fisier, 256); echo "<br>Citeste: $citire"; fclose($fisier); ?>
Exemplul citete maximum 256 de octei din fiier. Pentru a citi un numr mai mare sau mai mic de octei, modificai valoarea argumentului lungime al funciei fread(). Pentru a citi i a afisa ntregul coninut al fiierului, folosii funcia filesize() pentru a furniza valoarea argumentului lungime, astfel:

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)); echo "<br>Citeste: $citire"; fclose($fisier); ?>
Citirea unei linii de text O linie de text este o serie de caractere urmate de un caracter de terminare a liniei. Funcia fgets() citete o linie dintr-un fiier. Funcia are urmtoarea form: fgets(identificator_fisier, lungime) Ca i n cazul funciei fread(), argumentul identificator_fisier este o valoare returnat de funcia fopen(); cu toate acestea, argumentul lungime specific numrul maxim de octei care vor fi citii, minus o unitate, pentru a permite includerea caracterului de terminare a liniei. Octei citii din fiier sunt returnai ca valoare de tip ir. n exemplul urmtor este prezentat modul de citire i de afiare a primei linii a unui fiier:

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 fiierului conine mai puin de 256 octei. Pentru a permite lungimi de linie mai mari, modificai valoarea argumentului lungime al funciei fgets(). Citirea linie cu linie a unui ntreg fiier Funcia feof() este folosit pentru a determina momentul cnd fiierul a fost citit n totalitate. Funcia returneaz o valoare care arat dac s-a ajuns sau nu la sfritul fiierului. Funcia are urmtoarea form: feof(identificator_fisier) Argumentul identificator_fisier este valoarea returnat de funcia fopen(). Funcia feof() returneaz true dac fiierul specificat este la sfrit; n caz contrar returneaz false. Iat cum se poate folosi funcia feof() pentru a controla procesul de citire a unui ntreg fiier, 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); ?>
Instruciunea while asigur faptul c funcia fgets() este apelat n mod repetat, pn la citirea tuturor liniilor. O modalitate mai simpl de a citi linie cu linie un ntreg fiier const n a folosi funcia file(). Aceast funcie returneaz un tablou n care fiecare element conine o linie a fiierului 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 fiiere de foarte mari dimensiuni, deoarece n tablou este ncrcat ntregul coninut al fiierului, ceea ce poate necesita o cantitate de memorie superioar celei disponibile. Afiarea coninutului unui fiier PHP furnizeaz dou funcii care faciliteaz afiarea coninutului unui fiier. Una dintre funcii, fpassthru(), necesit un argument care specific identificatorul fiierului care urmeaz s fie afiat: $fisier = fopen("text.txt", "r"); fpassthru($fisier); Dup ce a afiat fiierul, funcia l nchide automat. Cealalt funcie, readfile(), necesit numai numele sau calea fiierului: readfile("text.txt"); Navigarea printr-un fiier Aa cum am mai spus, fiecare fiier are un pointer asociat care indic poziia octetului unde se va produce urmtoarea operaie. Putei folosi funcia rewind() pentru a readuce pointerul la nceputul fiierului. Funcia are urmtoarea form: rewind(identificator_fisier) unde identificator_fisier este identificatorul de fiier returnat de funcia fopen(). Nu se poate readuce pointerul unui fiier la nceputul propriu-zis al unui fiier dac fiierul a fost deschis pentru un acces de tip ataare, adic ntr-unul din modurile "a" sau "a+". Dac se produce o eroare, funcia rewind() returneaz zero. Dei funcia rewind() este util n caz de nevoie, necesitatea de a readuce un pointer de fiier la nceputul fiierului nu este chiar att de frecvent. Funcia fseek() furnizeaz o mai mare flexibilitate, permindu-v s poziionai pointerul de fiier astfel nct s putei citi sau scrie n orice punct al fiierului. Funcia are dou forme, cea mai simpl fiind urmtoarea: fseek(identificator_fisier, offset) unde identificator_fisier este identificatorul de fiier returnat de funcia fopen(), iar offset este poziia dorit a pointerului de fiier, specificat n octei, n raport cu nceputul fiierului. n caz de reuit, funcia fseek() returneaz 0; n caz contrar, returneaz -1. O form alternativ a funciei asigur un grad superior de flexibilitate: fseek(identificator_fisier, offset, baza) unde baza ia una dintre urmtoarele valori: - SEEK_SET, care stabilete poziia pointerului de fiier n raport cu nceputul fiierului - SEEK_CUR, care stabilete poziia pointerului de fiier n raport cu valoarea curent a pointerului - SEEK_END, care stabilete poziia pointerului de fiier relativ la sfritul fiierului. Valoarea argumentului offset poate fi pozitiv, negativ sau zero. De exemplu, pentru a poziiona pointerul cu 10 octei nainte de sfritul fiierului, emitei urmtorul apel de funcie: fseek($fisier, -10, SEEK_END)

unde $fisier este identificatorul fiierului al crui pointer dorii s-l repoziionai. Pentru a obine valoarea curent a pointerului de fiier, invocai functia ftell(), care are urmtoarea form: ftell(identificator_fisier) Funcia returneaz valoarea curent a identificatorului de fiier, respectiv valoarea zero dac funcia eueaz. Scrierea ntr-un fiier Spre deosebire de varietatea de funcii furnizate pentru citirea fiierelor, PHP ofer o singur funcie pentru scrierea n fiiere, i anume fwrite(), care are urmtoarea form: fwrite(identificator_fisier, data) unde identificator_fisier este identificatorul de fiier returnat de funcia fopen(), iar data este o valoare ir care determin datele ce urmeaz a fi scrise. Dac execuia funciei reuete, returneaz numrul octeilor scrii; n caz contrar, returneaz valoarea -1. Iat un exemplu de scriere a datelor ntr-un fiier:

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 fiier o linie de text. Deoarece fiierul a fost deschis folosind modul "a", datele sunt ataate la fiier; cu alte cuvinte, datele sunt scrise dup toate datele existente n fiier. Dac lucrai cu fiiere text, n general trebuie s includei un caracter de terminare a liniei la sfritul fiecrei linii scrise n fiier (n exemplul de mai sus am pus \n la sfritul liniei). Scriptul din exemplul de mai sus scrie n fiier o singur linie de text. Totui, putei scrie mai multe linii, dac dorii. Dac apelai funcia fwrite() din interiorul unei bucle, avei posibilitatea s scriei mai multe linii. Dup ce ai scris toate liniile de care avei nevoie, nchidei fiierul prin apelarea funciei fclose(). PHP mai furnizeaz i o form alternativ a funciei fwrite(): fwrite(identificator_fisier, data, lungime) Aceast form include un al treilea argument, i anume lungime, care v permite s specificai numrul maxim de octei care vor fi scrisi. Argumentul lungime trebuie utilizat atunci cnd se scrie n fiiere binare sub Windows. De asemenea, Windows prefer secvena de terminare a liniei "\r\n". PHP dispune de o alt funcie pentru scrierea fiierelor, n spe fputs(). Totui, n afar de nume, fputs() este una i aceeai funcie cu fwrite() (reprezint una i aceeai funcie dar cu nume diferite). Obinerea accesului exclusiv la un fiier Uneori, accesul simultan la un fiier poate avea ca rezultat deteriorarea fiierului. S ne imaginm c avem un contor de pagini asociat unei pagini web. Dac 2 sau mai muli vizitatori intr simultan pe pagin scriptul de contorizare va deschide fiierul pentru scriere n acelai timp pentru toi utilizatorii i ce credei c va scrie n el? n loc s incrementeze contorul cu o

unitate pentru fiecare vizitator este posibil sa dea eroare i informaiile din fiier s se piard. Pentru a evita astfel de probleme, este necesar ca fiecare proces s obin acces exclusiv la fiierul care conine contorul din pagin. Astfel, accesul la fiier este succesiv: fiierul va fi folosit mai nti de un proces, i apoi de cellalt. Atta vreme ct procesele sunt mpiedicate s obin simultan accesul la fiier, contorul nu va indica valori eronate. Funcia flock() permite unui proces s obin un acces exclusiv la un fiier, acordnd procesului o blocare a fiierului. Funcia are forma: flock(identificator_fisier, operatie) unde identificator_fisier este identificatorul de fiier returnat de funcia fopen(). Argumentul operatie este o constant sau o expresie care specific operaia dorit, dup cum urmeaz: Operaie Descriere Obine o blocare partajat a fiierului specificat. Mai multe procese pot deine o blocare partajat; pentru un fiier ns, nici un proces nu poate obine o blocare partajat n timp ce un alt proces deine o blocare exclusiv. Procesul va atepta pn cnd are posibilitatea de a obine blocarea cerut. Obine o blocare exclusiv pentru fiierul specificat. Un singur proces poate deine o blocare exclusiv a unui fiier. Procesul va atepta pn cnd are posibilitatea de a obine blocarea cerut. ncearc s obin o blocare partajat a fiierului specificat; totui, nu ateapt obinerea blocrii, dac aceasta nu este disponibil imediat. ncearc s obin o blocare exclusiv pentru fiierul specificat; totui, nu ateapta obinerea blocrii, dac aceasta nu este disponibil imediat. Elibereaz blocarea fiierului specificat.

LOCK_SH

LOCK_EX

LOCK_SH + LOCK_NB

LOCK_EN + LOCK_NB LOCK_UN

Funcia flock() returneaz true n caz de reuit, respectiv false cnd blocarea solicitat nu poate fi obinut (LOCK_SH i LOCK_EX) sau eliberat (LOCK_UN). Blocarea este o activitate care se desfoar n comun. Procesele nu au niciodat accesul interzis la fiiere, ci numai la blocri. Ca atare, un proces care nu ncearc s blocheze un fiier poate obine acces la fiier chiar dac un alt proces a cerut i a obinut o blocare exclusiv a fiierului. Unele servere Web, inclusiv IIS de la Microsoft, ruleaz un singur proces multifir. n asemenea situaii, funcia flock() nu va reui s furnizeze acces exclusiv la fiiere. Copierea unui fiier PHP furnizeaz o funcie care faciliteaz copierea fiierelor, i anume funcia copy(). Funcia copy() are urmtoarea form: copy(sursa, destinatie) unde sursa este numele sau calea fiierului care urmeaz a fi copiat, iar destinatie este numele sau calea unde se va copia. Funcia returneaz true dac operaia de copiere reueste; 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

i"); } ?>
Exemplul creaz o copie de siguran a fiierului "text.txt", cu numele "text.bak". PHP trebuie s aib acces de scriere la directorul n care se va afla copia; n caz contrar, PHP nu va putea crea copia. Funcia copy() va suprascrie fiierul destinaie, dac acesta exist. Modificarea numelui unui fiier PHP furnizeaz o funcie care v permite s modificati numele unui fiier, i anume rename(), funcie care are urmtoarea form: rename(nume_vechi, nume_nou) unde nume_vechi este numele sau calea original a fiierului, iar nume_nou este numele sau calea dorit. Funcia returneaz true dac operaia de modificare a numelui a reuit; n caz contrar, returneaz false. Exemplu:

Cod:

<?php $redenumeste = rename("text.bak", "text.txt"); if (!$redenumeste) { die("<br>A fost produsa o eroare la redenumirea fi sierului"); } ?>
Exemplul modific numele fiierului "text.bak", atribuindu-i numele "text.txt". La fel ca la funcia copy(), PHP trebuie s aib acces de scriere la directorul n care se va afla fiierul cu numele modificat; n caz contrar, PHP nu va putea modifica numele fiierului. Ca i n cazul comenzii UNIX mv, funcia rename() va suprascrie fiierul destinaie, dac acesta exist. tergerea unui fiier PHP furnizeaz o funcie care v permite s tergei un fiier, i anume unlink(). Funcia are forma: unlink(nume_fisier) unde nume_fisier este numele sau calea fiierului care urmeaz a fi ters. Funcia returneaz true dac operaia de tergere a avut succes, respectiv false n caz contrar. Exemplu:

Cod:

<?php $sterge = unlink("text.txt"); if (!$sterge) { die("<br>A fost produsa o eroare la stergerea fisierulu i"); } ?>
Reinei c PHP trebuie s aib acces de scriere la directorul n care se afl fiierul; n caz contrar, PHP nu va putea terge fiierul. n conformitate cu manualul PHP, functia unlink() "sar putea s nu funcioneze" n sistemele Windows. ncrcarea unui fiier n server Pe anumite pagini cu formulare HTML se poate ncrca un fiier pe server. Pentru a crea un

astfel de formular de ncrcare, specificai ENCTYPE="multipart/form-data" n eticheta FORM i includei un control de introducere a datelor cu atributul TYPE="FILE". Iat un exemplu:

Cod:

<HTML> <HEAD> <TITLE>incarcare fisier</TITLE> </HEAD> <BODY> <FORM METHOD="POST" ACTION="incarca.php" ENCTYPE="multipart/form-data"> Incarca un fisier: <INPUT NAME="fisier_utilizator" TYPE="FILE"> <BR><BR> <INPUT TYPE="SUBMIT" VALUE="Trimite"> </FORM> </BODY> </HTML>
Cnd utilizatorul apas pe butonul de trimitere, browserul ncarc fiierul n server. Scriptul vostru PHP poate obine accesul la calea fiierului ncrcat astfel: $HTTP_POST_FILES["fisier_utilizator"]["tmp_name"] unde fisier_utilizator este valoarea atributului NAME asociat controlului INPUT folosit pentru ncrcarea fiierului. La terminarea execuiei scriptului, PHP terge n mod automat fiierul ncrcat. Dac dorii s salvai fiierul, putei invoca funcia move_uploaded_file(). De exemplu:

Cod:

<?php $rezultat = move_uploaded_file ($HTTP_POST_FILES["fisier_utilizator"] ["tmp_name"], "/home/tutoriale/upload/nume_fisier.ext"); $rezultat = $rezultat ? "true" : "false"; echo "<br>move_uploaded_file(): $rezultat"; ?>
Funcia move_uploaded_file() v impune s specificai calea fiierului ncrcat i calea unde dorii s fie mutat fiierul. Funcia returneaz true dac operaia reuete, respectiv false n caz contrar. Momentan m opresc aici cu prima parte a acestui tutorial, sper c ai aflat lucruri interesante pn acum.

Descrierea funciilor de prelucrare a fiierelor

n articolul precedent am discutat despre sistemul de fiiere si am generalizat despre fisiere si directoare. n continuare o s ncerc sa detaliez lucrul cu fiierele i s discut ceva mai mult despre cele mai folosite funcii care se ocup de fiiere. Limbajul PHP ofer un set de funcii

pentru a facilita accesul la coninutul fiierelor. Sintaxa majoritii dintre acestea este similar funciilor de manipulare a fiierelor prezente n limbajul C/C ++. Datorit faptului c limbajul PHP este independent de platform, printre numele funciilor se regsesc i nume cunoscute pe platformele de operare *nix i Microsoft Windows. Funcia fopen Aceast funcie se folote pentru deschiderea unui fiier n vederea citirii sau scrierii datelor din/n acesta. Funcia are patru parametri, dintre care ultimii doi sunt opionali. Primul parametru l reprezint numele fiierului care urmeaz a fi deschis. Fiierul poate fi i unul aflat la distan. Un fiier este recunoscut de PHP a fi la distan dac este accesibil printr-unul dintre protocoalele HTTP (Hyper Text Transfer Protocol), HTTPS (Secure HTTP), FTP (File Transfer Protocol) sau FTPS (Secure FTP). Fiierele standard de intrare i ieire pot fi accesate folosind urmtorii identificatori: - php://stdin - fiierul standard de intrare pentru procesul curent creat de PHP; - php://stdout - fiierul standard de ieire pentru procesul curent creat de PHP; - php://stderr - fiierul standard de erori pentru procesul curent creat de PHP; - php://input - cu ajutorul acestui identificator se poate accesa coninutul datelor transmise paginii prin intermediul metodei POST; - php://output - cu ajutorul acestui identificator se pot scrie date direct n pagina web. Fiierele php://input i php://stdin pot fi deschise numai n scopul citirii, n timp ce fiierele php://output, php://stdout i php://stderr pot fi deschise numai pentru scriere. Scrierea datelor n fiierul php://output are acelai efect ca i utilizarea funciilor print i echo. Cel de-al doilea parametru este de tipul ir de caractere i reprezint modul de deschidere a fiierului care poate fi: -"r" - deschide fiierul pentru citire i poziioneaz pointer-ul la nceputul acestuia; -"r+" - deschide fiierul pentru citire i scriere i poziioneaz pointer-ul la nceputul acestuia; -"w" - deschide fiierul pentru scriere, poziioneaza pointer-ul la nceputul acestuia i sterge coninutul; dac fiierul nu exist, acesta este creat. -"w+ " - deschide fiierul pentru citire i scriere, poziioneaz pointer-ul la nceputul acestuia i sterge coninutul; dac fiierul nu exist, acesta este creat. -"a" - deschide fiierul pentru scriere i poziioneaz pointer-ul la sfritul acestuia, ns fr a terge coninutul; dac fiierul nu exist, acesta este creat. - "a+" - deschide fiierul pentru citire i scriere i poziioneaz pointer-ul la sfritul acestuia, ns fr a terge coninutul; dac fiierul nu exist, acesta este creat. La sfritul irului care reprezint modul de deschidere a fiierului mai poate aprea i caracterul "b". Acesta este util atunci cnd se dorete deschiderea fiierului n mod binar i nu n mod text. Pe sistemele de operare *nix nu are nici un efect, n schimb pentru portabilitate este indicat folosirea lui. Cel de-al treilea parametru este de tip ntreg i poate avea valorile 0 sau 1 i indic funciei faptul c se poate folosi (valoarea 1) sau nu (valoarea 0) lista de directoare, cu care interpretorul a fost configurat, pentru a gsi fiierul care se dorete a fi deschis, n cazul n care numele acestuia nu include i o cale absolut. Cel de-al patrulea parametru este de tipul resource i este folosit n scopul optimizrii unor operaii. Funcia fopen returneaz un numr ntreg care reprezint identificatorul de acces la fiierul care tocmai a fost deschis. Acest identificator va fi transmis tuturor funciilor pe care le vei utiliza pentru a accesa date din fiier. n cazul n care deschiderea fiierului nu poate avea loc din diferite motive, atunci funcia returneaz valoarea logic FALSE. De exemplu, pentru a deschide fiierul cu numele "test.txt" pentru a citi date, vom folosi urmtoarea linie de cod sursa: $f = fopen("test.txt", "r"); Dac dorim s scriem date n fiier, atunci l putem deschide folosind urmtorul cod: $f = fopen("test.txt", "w");

Funcia tmpfile Aceast funcie realizeaz crearea i deschiderea unui fiier temporar pentru scriere i citire. Funcia tmpfile nu are parametri i returneaz un numr ntreg care reprezint identificatorul de acces al fiierului temporar. Fiierul temporar va fi ters n mod automat n momentul n care este nchis sau cnd script-ul i ncheie execuia. Apelul acestei funcii este identic cu cel al funciei fopen cu parametrii: un nume de fiier temporar (de obicei generat aleator) i "w+b" ca mod de deschidere a fiierului. Functia fclose Aceast funcie realizeaz nchiderea unui fiier care a fost deschis cu ajutorul funciilor fopen sau tmpfile. Funcia fclose are un singur parametru de tip ntreg, care reprezint identificatorul de acces la fiierul care se dorete a fi nchis. Funcia returneaz valoarea logic TRUE dac nchiderea fiierului a reuit i valoarea logica FALSE n caz contrar. Un exemplu de apel al acestei funcii este fclose($fd) unde fd reprezint identificatorul de acces la fiierul care se dorete a fi nchis. Funcia feof Aceast funcie verific dac s-a ajuns la sfritul fiierului sau nu. Funcia feof are un singur parametru de tip ntreg, care reprezint identificatorul de acces la fiierul care se dorete a fi nchis. Funcia returneaz valoarea logic TRUE dac am ajuns la sfritul fiierului i valoarea logic FALSE n caz contrar. Funciile fscanf Aceast funcie citete date dintr-un fiier text i are doi parametri obligatorii. Primul parametru este de tip ntreg i reprezint identificatorul de acces la fiierul din care se face citirea, iar cel de-al doilea parametru este de tipul ir de caractere i indic funciei formatul intrrii. Formatul acestuia din urm este similar formatului folosit pentru funcia fscanf prezent n limbajul C/C++. Ceilali parametri reprezint referinele la variabilele care vor conine rezultatul citirii. Funcia returneaz un vector cu valorile citite, deci prezena variabilelor nu mai este obligatorie ca n cazul limbajului C/C++. De exemplu, dac din fiierul "c:\test.txt" dorim s citim un numr i un ir de caractere separate printr-un spaiu, atunci vom folosi urmtorul cod:

Cod:

<?php $f = fopen("c:\\test.txt","r"); $rez = fscanf($f, "%d %s \n"); list($nr, $sir) = $rez; fclose($f); echo "Am citit numarul: ".$nr."<BR>"; echo "si sirul: ".$sir; ?>
Funcia fread Aceast funcie se folosete pentru citirea datelor din fiiere binare. Pentru compatibilitate cu toate sistemele de operare se recomand ca la deschiderea fiierului, pentru citire, s se adauge caracterul "b" la parametrul care reprezint modul de deschidere a fiierului. Funcia

fread are doi parametri obligatorii. Primul parametru este de tip ntreg i reprezint identificatorul de acces al fiierului din care se dorete s se citeasc date, iar al doilea parametru, tot de tip ntreg, reprezint numarul de octei care se doresc a fi citii. Rezultatul returnat de aceast funcie este de tip ir de caractere care este format din octeii care s-au citit din fiierul de intrare. n cazul n care n fiierul din care se citesc date nu mai este disponibil numrul de octei specificat n cadrul celui de-al doilea parametru, atunci funcia returneaz toi octeii disponibili de la poziia curent din fiier i pn la sfritul acestuia. n continuare este un exemplu de folosire a acestei funcii. Codul este compatibil cu toate sistemele de operare pe care limbajul PHP poate fi instalat.

Cod:

<?php $fis = "test.txt"; $fd = fopen($fis, "rb"); $continut = fread($fd, filesize($fis)); fclose($fd); echo "Continutul fisierului este: "; echo $continut; ?>
Funcia fgetc Aceast funcie citete urmtorul caracter disponibil din fiierul de intrare. Funcia are un singur parametru de tip ntreg care reprezint identificatorul de acces la fiierul din care se dorete s se fac citirea. Funcia fgetc returneaz un ir de caractere, n cazul n care nu s-a ajuns la sfritul fiierului, format dintr-un singur caracter, i anume, cel citit din fiier. n cazul n care ne aflm la sfritul fiierului, funcia fgetc returneaz valoarea logic FALSE.

Cod:

<?php $fisier = "test.txt"; $fd = fopen($fisier,"r"); $car = fgetc($fd); fclose($fd); echo "Primul caracter din fisier este: "; echo $car; ?>
Funcia fgets Aceast funcie se folosete pentru a citi o linie dintr-un fiier de tip text. Sintaxa acestei funcii este similar cu cea a funciei fread, cu meniunea c cel de-al doilea parametru este opional. Funcia fgets returneaz un ir de caractere care conine datele citite. Citirea datelor din fiier se ncheie n momentul n care s-a citit un numr de caractere egal cu valoarea celui de-al doilea parametru (n cazul n care acesta este prezent), n momentul ntlnirii unui sfrit de linie sau n momentul n care s-a ajuns la sfritul fiierului. n cazul n care ne aflm la sfritul fiierului, funcia fgets returneaz valoarea logic FALSE.

Cod:

<?php $fisier = "test.txt";

$fd= fopen($fisier,"r"); $linie = fgets($fd); fclose($fd) ; echo "Prima linie din fisier este: "; echo $linie; ?>
n acest exemplu am omis cel de-al doilea parametru. Funcia fgetss Aceast funcie citete o linie dintr-un fiier HTML. Spre deosebire de funcia fgets, funcia fgetss are trei parametri. Primii doi parametri sunt identici cu cei folosii n cazul funciei fgets. Cel de-al treilea parametru este opional, este de tip ir de caraetere i reprezint o list de marcaje HTML sau PHP pe care funcia nu trebuie s le elimine n momentul citirii. Aceast funcie returneaz un ir de caractere care reprezint datele din fiierul HTML care au fost citite. Citirea datelor se ncheie n momentul n care s-au citit attea caractere cte indic cel de-al doilea parametru sau n momentul n care am ajuns la sfritul fiierului.

Cod:

<?php $fis = "test.html"; $fd = fopen($fis, "r"); echo "Continutul fisierului HTML este: "; while (!$linie = fgetss($fd, filesize($fis))) { echo $linie."<br>"; } fclose($fd); ?>
n cazul n care fiierul test.html conine multe linii cu marcaje html, prin eliminarea lor, irul returnat devine vid, iar pe ecran se vor afia multe rnduri goale. Funcia fgetcsv Aceast funcie citete date dintr-un fisier CSV (Comma Separated Values - valori separate prin virgula). Un fiier de tip CSV are formatul text i conine mai multe nregistrri. Este o reprezentare textuala a unui fiier de tip tabelar. Pe fiecare linie a unui astfel de fiier se afl mai multe valori ale unor cmpuri care sunt delimitate printr-un separator. De obicei acest separator este caracterul " , " (virgula), de unde i numele acestui tip de fiier. Funcia fgetcsv are trei parametri dintre care primii doi sunt obligatorii. Primul parametru este de tip ntreg i reprezint identificatorul de acces la fiierul de intrare, al doilea parametru este de tip ntreg i reprezint numrul maxim de octei care se vor procesa la o citire i trebuie s aib o valoare mai mare dect lungimea celei rnai mari linii din fiierul CSV, 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. Funcia returneaz, n cazul n care nu ne aflm la sfritul fiierului de intrare, un tablou de iruri de caractere care reprezint valorile citite. n cazul n care ne aflm la sfritul fiierului, funcia fgetcsv returneaz valoarea logic FALSE. n continuare este prezentat un exemplu de utilizare a acestei funcii pentru un fiier CSV n care fiecare linie nu are o lungime mai mare de 1000 de caractere:

Cod:

<?php $lin = 1; $fp = fopen("test.csv", "r"); while ($date = fgetcsv($fp, 1000, ",")) { $num = count($date); echo "<p>$num campuri pe linia $lin: <br>"; $lin++; for ($c=0; $c<$num; $c++) { echo $date[$c]."<br>"; } } fclose($fp); ?>
Funcia file_get_contents Aceast funcie citete coninutul unui fiier de tip text i are doi parametri. Primul parametru este de tip ir de caractere i reprezint numele fiierului al crui coninut se va citi, iar cel deal doilea parametru este opional i indic dac pentru gsirea fiierului se va folosi sau nu lista de directoare predefinit. Funcia returneaz un ir de caractere care conine toate datele din fiierul primit ca parametru n cazul n care citirea s-a efectuat cu succes i valoarea logic FALSE n caz contrar. Funcia file Aceast funcie citete coninutul unui fiier de tip text i are aceeai sintax cu funcia file_get_contens, dar rezultatul returnat de aceasta este un tablou de iruri de caractere, fiecare dintre acestea constnd ntr-o linie din fiierul primit ca parametru. Funcia filetype Aceast funcie returneaz un ir de caractere care reprezint tipul unui fiier. Funcia filetype are un singur parametru de tip ir de caractere, mai exact numele fiierului pentru care dorim s determinm tipul. Valorile posibile pentru tipul unui fiier sunt "pipe", "fifo", "char", "dir", "block", "link", "file", i "unknown". Funcia filesize Aceast funcie se foloeste pentru a afla dimensiunea, exprimat n octei, a unui fiier. Funcia filesize are un singur parametru de tip ir de caractere, mai exact numele fiierului pentru care dorim s determinm dimensiunea. Funcia fwrite Aceast funcie se folosete pentru a scrie date ntr-un fiier text sau binar. Pentru compatibilitate cu toate sistemele de operare, se recomand ca la deschiderea fiierului, pentru scriere, s se adauge caracterul "b" la parametrul care reprezint modul de deschidere a fiierului. Funcia fwrite are trei parametri. Primul parametru este de tip ntreg i reprezint identificatorul de acces la fiierul n care se dorete s se scrie date, cel de-al doilea parametru este de tip ir de caractere i reprezint datele care se vor scrie n fiier, iar cel de-al treilea parametru este de tip ntreg, opional i reprezint numrul de octei din irul de caractere care se vor scrie n fiier. Funcia returneaz un numr ntreg care reprezint numrul de octei pe care a reuit s-i scrie n fiier, n cazul n care nu au aprut erori i valoarea logic FALSE n caz contrar. n continuare este un exemplu de utilizare a acestei funcii:

Cod:

<?php $fis = "test.txt"; $sir = "Scriere in fisier"; $fp = fopen($fis, "a"); fwrite($fp, $sir); echo "Am scris ($sir) in fisierul ($fis)."; fclose($fp); ?>
Funcia fputs Aceast funcie este o redenumire a funciei fwrite, pentru compatibilitate cu limbajul C/C++, i are acelai comportament. n limbajul C/C++ functia fwrite este folosit pentru a scrie un ir de octei ntr-un fiier, spre deosebire de PHP, unde irul de octei este reprezentat chiar de irul de caractere. Funcia fflush Aceast funcie foreaz salvarea pe disc a coninutului zonelor tampon folosite pentru scrierea ntr-un fiier. Funcia fflush primete un singur parametru de tip ntreg, care reprezint identificatorul de acces al fiierului pentru care se dorete golirea zonelor tampon. Funcia returneaz valoarea logic FALSE n caz de eroare i valoarea logic TRUE n caz contrar . Funcia flock Aceast funcie se foloeste pentru a bloca sau debloca accesul la un fiier. Necesitatea utilizrii funciei flock apare n momentul n care mai multe procese doresc s acceseze acelai fiier i nu se vrea afectarea integritii acestuia. Funcia are trei parametri. Primul parametru reprezint identificatorul de acces la coninutul fiierului, cel de-al doilea parametru reprezint tipul operaiei de blocare a fiierului, iar al treilea parametru este de tip referin la ntreg i va primi valorea logic TRUE n cazul n care funcia flock va opri execuia script-ului pn n momentul n care va reui s blocheze fiierul. Pentru cel de-al doilea parametru, n limbajul PHP sunt disponibile constantele: - LOCK_SH - se folosete n cazul n care fiierul se blocheaza n mod partajat pentru citirea datelor; - LOCK_EX - se folosete n cazul n care fiierul se blocheaza n mod exclusiv pentru scrierea datelor; - LOCK_UN - se folosete n cazul n care se dorete deblocarea unui fiier; - LOCK_NB - se folosete mpreun cu una dintre primele trei constante dac nu se dorete ca funcia flock s ntrerup execuia script-ului pn n momentul n care va reui s efectueze operaia cerut; aceast constant se adun la una dintre primele trei. Funcia returneaz valoarea logic TRUE n caz de succes i valoarea logic FALSE n cazul unui eec. Funcia fseek Aceast funcie se folosete pentru modificarea poziiei de citire sau scriere n interiorul unui fiier. Funcia fseek are trei parametri. Primul parametru este de tip ntreg i reprezint identificatorul de acces la un fiier, al doilea parametru este de tip ntreg i indic numrul de poziii cu care se va face modificarea, iar al treilea parametru, tot de tip ntreg, este opional i specific modul n care se va face modificarea. Se observ c cel de-al doilea parametru poate avea i valori negative. Modificarea poziiei de citire sau scriere se poate face n trei moduri pentru care sunt definite constante:

- relativ la nceputul fiierului - constanta SEEK_SET; - relativ la pozitia curent - constanta SEEK_CUR; - relativ la sfritul fiierului - constanta SEEK_SET. n cazul n care cel de-al treilea parametru lipseste se va folosi ca valoare pentru acesta constanta SEEK_SET. Funcia returneaz o valoare ntreag egal cu 0, n cazul n care nu au aparut erori, i egal cu -1 n caz contrar. Aceast funcie nu poate fi folosit pentru fiiere care sunt accesate folosind unul dintre protocoalele HTTP sau FTP. Funcia rewind Aceast funcie schimb poziia de citire sau scriere ntr-un fiier la nceputul acestuia i are un singur parametru care specific identificatorul de acces la fiier. Rezultatul returnat de funcia rewind este acelai cu cel returnat de funcia fseek. Apelul acestei funcii este echivalent cu apelul funciei fseek cu primul parametru avnd ca valoare identificatorul de acces al fiierului, al doilea parametru avnd valoarea 0 i cel de-al treilea parametru avnd valoarea SEEK_SET chiar dac lipsete. Funcia ftell Aceast funcie se folosete pentru a afla poziia curent de la care se va face urmtoarea citire sau scriere ntr-un fiier, relativ la nceputul acestuia. Funcia ftell primete ca parametru identificatorul de acces al fiierului pentru care se aplic i returneaz o valoare ntreag reprezentnd poziia din fiier, n caz de succes sau valoarea logic FALSE n caz de eec. Funcia ftruncate Aceast funcie realizeaz redimensionarea fiierului cu o valoare primit ca parametru. Funcia ftruncate are doi parametri. Primul dintre acetia este identificatorul de acces al fiierului care se redimensioneaz, iar al doilea parametru este de tip ntreg i reprezint noua dimensiune a fiierului. Trebuie inut cont de faptul ca n cazul n care cel deal doilea parametru are o valoare mai mare dect dimensiunea curent a fiierului, va fi alocat, pe disc, spaiu suplimentar care nu va fi iniializat. n cazul n care cel de-al doilea parametru are o valoare mai mica dect dimensiunea curent a fiierului, atunci toate datele din fiier, care se afl dup poziia indicat de noua valoare, se vor pierde. Funcia delete Aceast funcie este mai degrab o redenumire a funciei unlink, care se folosete pentru a terge un fiier de pe disc. Funcia delete a fost inclus n pachetul de funcii oferit de limbajul PHP pentru cei care au programat n limbaje precum Pascal i nu au avut la dispoziie funcia unlink. Funcia unlink primete ca parametru un nume de fiier i returneaz valoarea logic TRUE n cazul n care tergerea s-a efectuat cu succes. n cazul n care tergerea nu s-a putut efectua, funcia returnez valoarea logic FALSE. n urtorul articol o s ncerc s detaliez funciile php care se ocup de manipularea directoarelor.

Funcii 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 funciile php care se ocup de fiiere. n acest articol se afl descrierea celor mai importante funcii i clase oferite de limbajul PHP pentru manipularea directoarelor.

Funcia getcwd Aceast funcie returneaz un ir de caractere care reprezint directorul curent. Funcia getcwd nu are nici un parametru. n continuare este un exemplu de utilizare al acestei funcii:

Cod:

<?php $cdir = getcwd(); echo "Directorul curent este: ".$cdir; ?>


Funcia chdir Aceast funcie se folosete pentru a schimba directorul curent i primete ca parametru un ir de caractere care reprezint noul director. Funcia chdir returneaz valoarea logic TRUE atunci cnd schimbarea directorului curent s-a efectuat cu succes i valoarea logic FALSE n caz contrar. Funcia chroot Aceast funcie se folosete pentru a schimba directorul rdcin pentru procesul curent i primete ca parametru un ir de caractere care reprezint noul director rdcin. Funcia chroot returneaz valoarea logic TRUE atunci cnd schimbarea directorului rdcin s-a efectuat cu succes i valoarea logic FALSE n caz contrar. Aceast funcie 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 execuie CGI. Functia opendir Aceasta functie se foloseste pentru a deschide un director in scopul citirii continutului sau. Functia opendir are un singur parametru de tip sir de caractere care reprezinta numele directoruiui al carui continut se va prelucra. Aceasta functie returneaza un identificator de acces la continutul directorului si este de tipul resursa. In cazul in care nu se reuseste deshiderea directorului, functia returneaza valoarea logica FALSE. Funcia closedir Aceast funcie se folosete pentru a nchide un director care a fost deschis pentru citire folosind funcia opendir. Funcia closedir are un singur parametru de tipul resurs, care reprezint identificatorul de acces al directorului care se doreste a fi nchis. Aceast funcie nu returneaz nici o valoare, ea avnd tipul void. Funcia readdir Funcia readdir se folosete pentru a citi urmtoarea intrare disponibil ntr-un director. Ea are un singur parametru de tip resurs, care reprezint identificatorul de acces al directorului din care se va citi. Funcia readdir returneaz un ir de caractere reprezentnd numele urmtoarei intrri din director, n cazul n care nu am ajuns la sfritul acestuia sau nu au aparut erori i valoarea logic FALSE n caz contrar. n continuare este un exemplu de utilizare a funciilor opendir, readdir i closedir:

Cod:

<?php

$dir = "E:\\"; $dh = opendir($dir); echo "Continutul directorului $dir<BR>"; while (false!==($fis=readdir($dh))) { echo "$fis<BR>"; } closedir($dh); ?>
Funcia rewinddir Aceast funcie reseteaz poziia curent dintr-un director, i anume, dac dup un anumit numr de citiri este apelat aceast funcie i dup aceeea se mai citete o intrare din directorul respectiv, atunci se va returna prima intrare din director. Funcia are un singur parametru de tipul resurs, care reprezint identificatorul de acces al directorului din care se va citi i nu returneaz nici o valoare. Clasa dir Aceast clasa ncapsuleaz funciile opendir, closedir, readdir i rewinddir. Structura acesteia este urmtoarea:

Cod:

class dir { dir (string directory) string path resource handle string read (void) void rewind (void) void close (void) }
Constructorul clasei dir primete ca parametru un ir de caractere care reprezint numele directorului care se va citi i apeleaz funcia opendir. Funciile read, rewind i close din cadrul acestei clase au acelai comportament cu funciile readdir, rewinddir, respectiv closedir i se deosebesc de acestea prin simplul fapt c nu mai au parametri, deoarece identificatorul de acces la director este de asemenea ncapsulat n cadrul clasei dir. n continuare este prezentat un exemplu de utilizare a acestei clase care reprezint implementarea cu clase a exemplului anterior:

Cod:

<?php $d = dir("E:\\");

echo "Continutul directorului $d -> path <BR>"; while (false !== ($fis = $d -> read())) { echo "$fis<BR>"; } $d -> close(); ?>
Funcia mkdir Aceast funcie se folosete pentru a crea un director nou i primete ca parametru un ir de caractere care reprezint numele directorului care se va crea i atributele acestuia (parametru de tip ntreg) n format *nix. Funcia returneaz valoarea logic TRUE n caz de succes i valoarea logic FALSE n caz de eec. Funcia rmdir Aceast funcie se folosete pentru a terge un director de pe disc i primete ca parametru un ir de caractere care reprezint numele directorului care va fi ters. Directorul care se dorete a fi ters trebuie s nu conin nici un fiier sau subdirector. Funcia returneaz valoarea logic TRUE n caz de succes i valoarea logic FALSE n caz de eec. Funcia basename Aceast funcie returneaz numele de baz al unui fiier sau director sub forma unui ir de caractere. Funcia are doi parametri de tip ir de caractere. Primul parametru reprezint o cale ctre un fiier sau director, iar al doilea este opional i reprezint sufixul fiierului. n continuare este prezentat un exemplu de utilizare a acestei funcii:

Cod:

<?php $cale= "c:\\test.html"; echo "Numele fisierului cu sufix:<BR>"; echo basename($cale)."<BR>"; echo "Numele fisierului fara sufix: <BR>"; echo basename($cale,".html"); ?>
Funcia dirname Aceast funcie returneaz numele directorului printe al unui fiier sau director sub forma unui ir de caractere. Funcia are un singur parametru de tip ir de caractere care reprezint o cale ctre un fiier sau director. n continuare este un exemplu de utilizare a acestei funcii:

Cod:

<?php $cale = "c:\\test.html"; echo "Directorul parinte pentru "; echo $cale." este ".dirname($cale); ?>
Funcia pathinfo

Aceasta funcie se folosete pentru a afia informaii referitoare la o cale ctre un fiier sau director. Funcia pathinfo primete ca parametru un ir de caractere care reprezint calea ctre un fiier sau director. Funcia returneaz un tablou ale crui valori sunt de tipul ir de caractere i care conine elementele " dirname ", "basename" i "extension". Elementele "dirname" i "basename" au valori identice cu cele returnate de funciile cu acelasi nume, iar elementul "extension" conine extensia fiierului. Exemplu:

Cod:

<?php $cale = "c:\\test.html"; $info = pathinfo($cale); echo "Informatii despre $cale:<BR>"; echo "Director: "; echo $info["dirname"]."<BR>"; echo "Nume fisier: "; echo $info["basename"]."<BR>"; echo "Extensie: "; echo $info["extension"]."<BR>"; ?>
Funcia file_exists Aceast funcie se folosete pentru a determina dac un fiier exist sau nu pe disc. Funcia file_exists are un singur parametru de tip ir de caractere care reprezint numele fiierului pentru care se verific existena fizic pe disc. Funcia returneaz valoarea logic TRUE n caz de succes i valoarea logic FALSE n caz de eec. Aceast funcie nu poate fi folosit pentru fiiere aflate la distan dect 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. Funcia copy Aceast funcie se folosete pentru a copia un fiier i are doi parametri de tip ir de caractere. Primul dintre acetia reprezint numele fiierului surs i cel de-al doilea reprezint numele fiierului destinaie. Funcia returneaz valoarea logic TRUE n caz de succes i valoarea logic FALSE n caz de eec. Funcia rename Aceast funcie se folosete pentru a redenumi un fiier i are doi parametri de tip ir de caractere. Primul parametru reprezint numele fiierului i cel de-al doilea reprezint noul numele al acestuia. Funcia returneaz valoarea logic TRUE n caz de succes i valoarea logic FALSE n caz de eec.

Valori scalare i tablouri

Majoritatea cumprtorilor prefer s cumpere oule n ambalaje de cte 10, nu unul cte unul. Similar, deseori este convenabil stocarea mai multor valori ntr-o variabil. O asemenea variabil se numete tablou, iar valorile individuale se numesc elementele tabloului. Variabilele care au o singur valoare se numesc scalare. Pentru a fi posibil accesul individual la fiecare element al unui tablou, fiecare element are o cheie asociat. Combinaia dintre numele

tabloului i valoarea unei chei identific un element al tabloului. Pentru a crea un tablou, se atribuie unui element al tabloului o valoare i o cheie:

Cod:

<?php $variabila[1] = "valoarea_a"; ?>


Aceast instruciune creeaz un tablou denumit $variabila i un element cu valoarea "valoarea_a" identificat prin cheia 1. Pentru a stoca n tablou o a doua valoare, putei folosi urmtoarea instruciune de atribuire:

Cod:

<?php $variabila[2] = "valoarea_b"; ?>


Pentru a obine acces la un element al tabloului, specificai numele tabloului i valoarea cheii:

Cod:

<?php echo $variabila[1]; ?>


Cheile folosite pentru identificarea elementelor unui tablou nu trebuie s fie numere consecutive; nici macr nu trebuie s fie numere.

Cod:

<?php $preferinte["vizitator1"] = "scripturi free"; $preferinte["vizitator2"] = "articole"; ?>


Elementele unui tablou cu chei non-numerice sunt accesibile n acelai mod ca i elementele unui tablou cu chei numerice. De exemplu:

Cod:

<?php $specialitatea_zilei = $preferinta["vizitator1"]; ?>


atribuie variabilei $specialitatea_zilei valoarea "scripturi free". Crearea tablourilor Se poate crea un tablou PHP n dou moduri principale. Putei atribui o valoare unei variabile dintr-un tablou sau putei invoca funcia array().

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. De exemplu:

Cod:

<?php $variabila[] = "valoare A"; $variabila[] = "valoare B"; $variabila[] = "valoare C"; ?>
Parantezele drepte care urmeaza dup numele variabilei indic limbajului PHP c variabila $variabila este o variabil de tip tablou. PHP stocheaza n mod automat valorile atribuite tabloului n celule numerotate succesiv, ncepnd de la $variabila[0]. Iat rezultatul tabloului:

Citat:

0 => valoare A 1 => valoare B 2 => valoare C


Simbolul => arat c unei valori i este asociat o cheie. n acest caz, cheia 0 este asociat cu valoarea "valoare A", cheia 1 este asociat cu valoarea "valoare B", iar cheia 2 este asociat cu valoarea "valoare C". Putei asocia tabloul cu un tabel, caz n care exemplul anterior arat astfel: 0 valoare A 1 valoare B 2 valoare C Dac dorii, putei scrie o instruciune de atribuire care specific o valoare cheie, astfel nct s putei asocia o valoare cu un anumit element al tabloului. De exemplu:

Cod:

<?php $variabila[0] = "valoare A"; $variabila[1] = "valoare B"; $variabila[] = "valoare C"; ?>
Observai c instruciunea final de atribuire nu include nici o valoare de index. PHP asociaz valoarea "valoare C" cu urmtorul element consecutiv al tabloului:

Citat:

0 => valoare A 1 => valoare B 2 => valoare C

Elementele unui tablou nu trebuie asociate unor chei consecutive. Iat un exemplu:

Cod:

<?php $variabila[10] = "valoare A"; $variabila[15] = "valoare B"; $variabila[] = "valoare C"; ?>
Rezultatul va fi:

Citat:

10 => valoare A 15 => valoare B 16 => valoare C


Remarcai c la fel ca n exemplul anterior c valoarea "valoare C" este asociat urmtorului element consecutiv din tablou. n PHP nu trebuie s folosii numere ntregi pe post de chei. Putei crea un tablou asociativ, cunoscut i sub numele de tablou indexat cu siruri, prin specificarea drept chei a unor iruri:

Cod:

<?php $variabila['a'] = "ceva 1"; $variabila['cc'] = "ceva 2"; $variabila['d'] = "ceva 3"; ?>
Prin instruciunile de mai sus, urmtoarele chei au fost atribuite urmtoarelor valori:

Citat:

a => ceva 1 cc => ceva 2 d => ceva 3


Semnificaia utilizrii pe post de chei a unor valori ntregi consecutive este aceea c putei folosi o bucl for simpl pentru a parcurge iterativ tabloul, cu alte cuvinte, pentru a examina valorile fiecruia dintre elementele sale. Utilizarea funciei array() Dincolo de utilizarea instruciunilor de atribuire, cealalt modalitate principal de creare a unui tablou PHP const n utilizarea funciei array(). Iat un exemplu care creeaz un tablou avnd drept chei valori ntregi consecutive:

Cod:

<?php $o_variabila = array("ceva", "php", "ceva html"); ?>


Acest script creeaza un tablou care conine:

Citat:

0 => ceva 1 => php 2 => ceva html


Dac dorii s asociai unei valori o anumit cheie, putei folosi operatorul =>, astfel:

Cod:

<?php $o_variabila = array(10=>"ceva", "php", "ceva html"); ?>


Care va creea urmtorul tablou:

Citat:

10 => ceva 11 => php 12 => ceva html


Ca i n cazul utilizrii unei instruciuni de atribuire pentru creearea unui tablou, valorile cheilor nu trebuie s fie consecutive i nici mcar ntregi:

Cod:

<?php $o_variabila = array("a"=>"ceva", "cc"=>"php", "d"=>"ceva html"); ?>


Aceast instruciune creeaz urmtorul tablou:

Citat:

a => ceva cc => php d => ceva html


Un tablou multi-dimensional poate fi asimilat, pur i simplu, unui tablou ale crui celule conin valori ale unui tablou; cu alte cuvinte, un tablou de tablouri. De exemplu un tablou asemntor: Pagina pagina 1 Trafic mic Procent 10

pagina 2 pagina 3

mediu mare

20 30

Putei reprezenta aceste date sub forma unui tablou PHP denumit $date, prin instruciunile de mai jos:

Cod:

<?php $date["pagina 1"] = array("mic", "10"); $date["pagina 2 "] = array("mediu", "20"); $date["pagina 3 "] = array("mare", "30"); ?>
Sau putei scrie astfel cu acelai rezultat:

Cod:

<?php $date = array("pagina 1" => array("mic", "10"), "pagina 2" => array("mediu", "20"), "pagina 3" => array("mare", "30")); ?>
Parcurgerea iterativ a unui tablou Cnd ai stocat date ntr-un tablou, putei obine acces la valoarea unui element al tabloului sau i putei modifica valoarea prin intermediul cheii asociate elementului. De exemplu, avem:

Cod:

<?php $a[0] = 1; $a[1] = 10; $a[2] = 1000; ?>


Putei obine acces la valoarea asociat cheii 1 prin intermediul unei instruciuni asemntoare:

Cod:

<?php $y = 3 * $a[1]; echo $y; echo $a[1]; ?>


Similar, putei modifica valoarea asociat cheii 2 prin intermediul unei instruciuni ca aceasta:

Cod:

<?php

$a[2] = 100; ?>


Uneori, n loc de a obine accesul la un singur element al unui tablou sau de a-l modifica, dorii s obineti accesul la mai multe elemente ale tabloului. De exemplu, s presupunem c dorii s determinai dac n tablou exist o anumit cheie sau valoare. S presupunem c tabloul reprezint salarii i dorii s mrii fiecare valoare cu 10 procente. Operaii de acest gen implic parcurgerea iterativ a tabloului sau, altfel spus, accesul la fiecare element al tabloului. n continuare o s ncerc o scurt prezentare a modului de iteraie prin tablouri secveniale i non-secveniale. Parcurgerea iterativ a unui tablou secvenial Un tablou al crui chei sunt valori ntregi consecutive se numete tablou secvenial. n general, valoarea cea mai mic a unei chei dintr-un tablou secvenial este zero; totui, putei crea un tablou secvenial folosind valoarea unu sau orice alt valoare ntreag ca valoare minim a cheii. n cazul n care cunoastei valoarea minim a cheii unui tablou secvenial, putei parcurge iterativ tabloul folosind o bucl for. Pentru aceasta, iniializai variabila de bucl la valoarea cea mai redus a cheii. Folosii funcia count() pentru a forma expresia de test a buclei. Funcia count() returneaz numrul elementelor dintr-un tablou. Iat un exemplu:

Cod:

<?php $test = array(0=>"valoare a", 1=>"valoare b", 2=>"valoare 3"); $maxim = count($test); for ($w=0;$w<$maxim;$w++) { echo "<br>$w => $test[$w]"; } ?>
Prima instruciune creeaz tabloul. Cea de-a doua instruciune obine numrul elementelor din tablou. Instruciunea for folosete variabila bucl $w pentru a parcurge iterativ tabloul; corpul instruciunii include o instruciune echo care afieaz cheia i valoarea fiecrui element din tablou. Datele de ieire arat astfel:

Citat:

0 => valoarea 1 1 => valoarea 2 2 => valoarea 3


Cutarea ntr-un tablou secvenial Exemplu:

Cod:

<?php $test = array(0=>"valoare a", 1=>"valoare b", 2=>"valoare 3"); $cautare = "valoare b"; // se cauta in tabloul $test valoarea $cautare $maxim = count($test);

echo "<br>Se cauta cuvantul $cautare in tabloul test."; for ($w=0; $w < $maxim; $w++) { echo "<br>Se compara cuvantul cu $test[$w]"; if ($cautare == $test[$w]) { echo "<br>A fost gasit cuvantul $cautare in tabel la nr. $w"; } } ?>
Prima instruciune creeaz tabloul n care se va cuta. Desigur, ntr-o aplicaie iterativ real, tabloul nu va fi iniializat cu valori literale imediat anterior operatiei de cutare. ntr-o aplicaie real, coninutul tabloului este supus la variaii. Cea de-a doua instruciune atribuie valoarea "valoare b" variabilei $cautare; n exemplu, se caut n tablou valoarea stocat n variabila $cautare. Dup comentariu, urmtoarea instruciune obine numrul elementelor din tablou i stocheaz aceast valoare n variabila $maxim. Instruciunea for funcioneaza ca mai nainte; de data aceasta ns, corpul ei conine alte instruciuni i se execut o alt operaie. O instruciune echo afieaz valoarea fiecrui element al tabloului pe masur ce bucla for avanseaz. Instruciunea if testeaz fiecare element i afieaz un mesaj dac valoarea elementului este una i aceeai cu valoarea variabilei $cautare. 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. 1 Se compara cuvantul cu valoare 3 Instruciunea break Observai n exemplul dat mai sus c se continu cutarea chiar i dup stabilirea unei identiti. Cnd se caut ntr-un tablou, execuia cutrii poate fi sistat dup gsirea elementului dorit; continuarea cutrii n tablou nu face dect s iroseasc resursele calculatorului, fr a afecta rezultatele operaiei. Pentru a oprii execuia putei folosi instructiunea break, care determin ncheierea imediat a buclei care o conine. Iat cum ar arta exemplul anterior cu o instruciune break:

Cod:

<?php for ($w=0; $w < $maxim; $w++) { echo "<br>Se compara cuvantul cu $test[$w]"; if ($cautare == $test[$w]) { echo "<br>A fost gasit cuvantul $cautare in tabel la nr. $w"; break; } } ?>
Acum, dup stabilirea unei identiti, instruciunea break provoac sistarea buclei for. Datele

de ieire vor arta 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. 1 Instruciunea continue O instruciune corelat cu instruciunea break este continue. Instruciunea continue sisteaz rularea curent a buclei, determinnd evaluarea imediat a expresiilor de incrementare i de test. Ca un exemplu, s presupunem c dorii s cautai n tabloul $test pentru a determina numrul valorilor cu nume scurte, adic nume alcatuite din maxim 4 caractere. Iat un exemplu:

Cod:

<?php $test = array(0=>"a", 1=>"bbb", 2=>"ccccc"); // numara numele scurte $scurt = 0; $limita = count($test); for ($w = 0; $w < $limita; $w++) { $n = strlen($test[$w]); echo "<br>$test[$w] are $n caractere lungime."; if ($n > 4) continue; $scurt++; } echo "<br> Au fost gasite $scurt cuvinte cu nume scurte."; ?>
O instruciune de atribuire stabileste valoarea iniial a variabilei $scurt, folosit pentru a numra numele scurte gsite, la zero. Instruciunea for se aseamn celor folosite anterior. Corpul acestei instruciuni difer, desigur, de cele folosite anterior. Valoarea variabilei $n este stabilit ca fiind egal cu numrul caracterelor care compun cuvntul, folosind funcia strlen(), care calculeaz lungimea unui sir. Dac instruciunea if stabilete c elementul curent al tabloului face referire la un cuvnt lung, se execut instruciunea continue. Instruciunea continue determin trecerea cutrii la urmtorul element din tablou; dac nu au mai rmas elemente n tablou, bucla for i ncheie execuia. La finalizarea cutrii, o instruciune echo afieaz numrul cuvintelor scurte gsite 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. Parcurgerea iterativ a unui tablou non-secvenial n unele limbaje de programare, parcurgerea unui tablou non-secvenial este o operaie complicat. Cu toate acestea, PHP 4 include o instruciune foreach care simplific cutrile de

acest gen. Instruciunea foreach are urmtoarea form general:

Cod:

<?php foreach ($tablou as $cheie => $valoare) {corp} ?>


Instruciunea parcurge n mod iterativ tabloul denumit $tablou, stabilind valori adecvate pentru valorile variabilelor $cheie i $valoare aferente fiecrui element al tabloului. Iat un exemplu:

Cod:

<?php $test = array(10=>"mere", 20=>"metal", 21=>"Nume"); foreach ($test as $index => $continut) { echo "<br>$index => $continut"; } ?>
Pentru a cuta ntr-un tablou multi-dimensional, se folosesc instruciuni foreach mbricate. S lum de exemplu tabloul urmtor: Pagina pagina 1 pagina 2 pagina 3 Trafic mic mediu mare Procent 10 20 30

Tabloul poate fi creat folosind urmtoarele instruciuni PHP:

Cod:

<?php $date["pagina 1"] = array("mic", "10"); $date["pagina 2 "] = array("mediu", "20"); $date["pagina 3 "] = array("mare", "30"); ?>
Comanda care afieaz coninutul tabloului este:

Cod:

<?php foreach ($date as $continut => $valoare) { foreach ($valoare as $cheie => $rezultat) { echo "<br>$continut: $rezultat"; }

?>

Instruciunea foreach exterioar obine tabloul asociat cu fiecare pagin (pagina 1, 2 etc...); instruciunea foreach interioar parcurge iterativ coninutul. 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 afiat iniial data din ziua completrii formularului. M gndesc c uneori o s avei i voi nevoie de anumite date (de exemplu la o comand ntr-un formular s apar ntr-un cmp doar ceea ce exist n acel moment pe stoc, care stoc se gsete n baza de date mysql de pe server). Iat ce trebuie s facei:

Cod:

<form name="form1" method="post" action="pagina_de_test.php"> Data curenta: <input name="data" type="text" id="data" value=" <?php $data=date("d-h-Y",time()); echo $data; ?> "> <br> <br> <input type="submit" name="Submit" value="Trimite"> </form>
Dup cum observai, la valoarea cmpului "data" am introdus un mic script php care citete data curent de pe server i o timite browserului, acesta o afieaz n cmpul de text corespunztor. Putei ncerca i voi s citii anumite date dintr-un fiier txt sau din baza de date i s le afiai n formular. Dac dorii s apar un mesaj n interiorul cmpului dar s dispar cnd un utilizator vrea s introduc propriul lui text, codul ar fi cam aa:

Cod:

<form> <INPUT name=test id="test" onclick="this.value='';" value=cauta size=15 maxLength=30>

<INPUT name="submit" type=submit id="submit" value=GO> </form>


Dac cineva ncearc s scrie ceva, textul "caut" va dispare i va fi nlocuit cu mesajul introdus de utilizator. Preluarea i verificarea datelor dintr-un formular n aceeai pagin cu formularul De curnd cineva mi-a cerut s fac un formular cu un grup de butoane radio care s trimit datele pe e-mail. Simplu spun eu i m apuc de treab. Problema pe care ns am ntmpinato a fost c un grup de butoane radio trimite doar o valoare, indiferent ce buton e selectat. Mai jos avei codul de la script cu una din rezolvri (eu am gasit 3 variante de rezolvare a acestui script, 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']; // verificare if ($vot == "") // aici se verifica daca a fost selectat ceva { echo "<br>Nu ai votat. Incearca din nou."; } if ($vot == "vot_1") // daca e selectat vot 1 afiseaza si eventual trimite pe e-mail... { echo "<br>Ai votat numarul 1."; } if ($vot == "vot_2") // daca e selectat vot 2 afiseaza si eventual trimite pe e-mail... { echo "<br>Ai votat numarul 2."; } if ($vot == "vot_3") // daca e selectat vot 3 afiseaza si eventual trimite pe e-mail... { echo "<br>Ai votat numarul 3."; } // afisare continutul variabilei vot echo "<br>Continutul casutei de vot este: ".$vot; } ?> <html> <head> <title>Formular de vot</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-88591"> </head> <body> <!-- aici incepe formul de votare -->

<form name="formular_vot" method="post" action="test_vot.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> <!-- aici se incheie formularul de vot --> </body> </html>
Dup cum observai, scriptul este mprit n 2 pri. Prima parte este codul php care verific dac a fost apsat butonul "Submit" i dac a fost apsat se preia valoarea butonului radio i se verific. Dac nu a fost apsat butonul "Submit" se sare peste codul php i se trece direct la partea html unde se afieaz butoanele radio. Lucrnd recent cu cteva formulare am ntmpinat unele dificulti pe care vreau s le descriu mai jos pentru a avea un punct de plecare n cazul n care mai am astfel de probleme. Pentru nceput o s explic cum se trimit i cum se preiau datele din formular n aceeai pagin. Avem urmtorul 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: ".$camp1; } } if (!isset($_POST['camp1'])) // daca nu a fost trimis { // se initializeaza variabilele $camp1 = ''; } ?>

<form name="form1" method="post" action=" <?php $_SERVER['PHP_SELF'] ?> "> <div align="center"> <input name="camp1" type="text" id="camp1" value=" <?php echo $camp1; ?> "> textfield<br> <input type="submit" name="Submit" value="Trimite"> </div> </form>
S explic puin codul de mai sus. Prima oar cnd se acceseaz pagina este logic c nu se trimite nici o valoare din formular. Dac nu ar fi fcut verificarea de setare a unei valori din formular (rndul if(isset($_POST['camp1']) ) i s-ar fi ncercat preluarea direct a valorii (rndul $camp1 = $_POST['camp1']; ) ar fi dat o eroare (dac avei configurat serverul s v arate toate erorile) n schimb, aa ai evitat o eventual eroare i scriptul ruleaz corect indiferent de setrile serverului... Observai c la preluarea variabilei trimise prin post se folosete un mic truc i anume numele variabilei este acelai cu numele cmpului trimis prin POST. n cazul cnd serverul are setat register_global = off este mai sigur s folosii astfel preluarea variabilelor pentru a nu v da eroare. Putei lucra i direct cu valoarea POST dar personal prefer s scriu mai puin folosind de fiecare dat numele variabilei ( $camp1 ) nu tot irul dat de valoarea POST ( $_POST['camp1'] ) E mai puin de scris iar dac folosesc variabila n alte locuri evit erorile generate de lipsa unei ghilimele (de genul echo 'ceva aici $_POST['camp1']; // aceasta comanda nu va merge pentru ca am uitat sa inchid ghilimelele pe cand asa echo '$camp1'; va merge intotdeauna). n continuare urmtorul rnd verific dac valoarea preluata din formular conine ceva sau nu. Dac exist ceva atunci afieaza mesajul mpreun cu ceea ce a fost introdus. Mai departe, n caz c se ncarc pagina prima data i formularul nc nu a fost trimis se iniializeaz valoarea variabilei pentru cmpul respectiv. n cazul n care nu se iniializeaz valoarea i se ncearc afisarea ei direct va aprea un mesaj de eroare (dac serverul e setat s afieze mesajele de eroare). Acum, dac suntei lmurii ce se ntmpl acolo s trecem mai departe (iar dac nu, atunci recitii articolul i vedei nc odat sursa pn nelegei :-P ) Afiarea unui text ntr-un cmp n form care dispare n cazul n care se introduce ceva n acel cmp De multe ori, am un formular n care vreau s scriu ceva ntr-un anumit cmp iar dac vizitatorul doreste s completeze acel cmp s nu stea s tearg mesajul meu ci s dispar automat textul introdus de mine i s rmn doar ce a introdus vizitatorul. Aa ceva se poate face simplu cu o scurt funcie javascript: Sursa: Exemplu:

<form name="form2" method="post" action="pagina.php"> <input name="textfield" type="text" value="acest text dispare" onmousedown=" this.value='' "> </form>
Preluarea datelor dintr-un cmp cu select multiplu n cazul n care n formular trebuie s existe i un textfield din care se pot selecta simultan mai multe cmpuri, preluarea datelor poate prea mai complicat, dar n realitate este la fel de simplu ca i pn acum, i anume:

Cod:

<?php if (isset($_POST['select'])) { foreach ($_POST['select'] as $cheie => $valoare) { echo "<br>A fost selectata valoarea ".$valoare; } } ?> <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, dac mai avei ntrebri discutm n forum.

Conversia tipurilor de variabile

PHP este ceea ce se numeste un limbaj de programare cu tipuri dinamice. O consecin a caracterului dinamic al tipurilor de variabile aferente limbajului PHP este aceea c nu trebuie s specificai tipul variabilelor. PHP determin tipul variabilei n funcie de tipul ultimei valori atribuite variabilei. Cu toate acestea, caracterul dinamic al tipurilor nu v scutete de problemele legate de tipuri. n continuare este o descriere a tipurilor acceptate i ceea ce se ntmpl cnd n cadrul expresiilor se folosesc dou sau mai multe tipuri. Conversia automat de tip S lum ca exemplu urmtorul script: $x = 1; $y = 2.5; $z = $x + $y; echo $z; Cnd o expresie aritmetic folosete mai multe tipuri, PHP execut conversia automat de tip.

Dac oricare dintre operanzi este de tip dublu, PHP trateaz ceilalti operanzi ca i cum ar fi de tip dublu, execut calculele i returneaz rezultatul ca valoare de tip dublu. Dac toti operanzii unei expresii sunt ntregi, PHP execut calculul i returneaz rezultatul sub forma de ntreg. n exemplul de mai sus, rezultatul va fi 3.5 o valoare de tip dublu. Este important de reinut c prin conversia de tip nu se modific tipurile operanzilor unei expresii; acetia sunt pur i simplu tratai ca i cum ar fi fost de alt tip. n cadrul exemplului, variabila $x rmne de tip ntreg, chiar dac PHP o trateaz ca o valoare de tip dublu pentru a executa calculele. irurile pot fi de asemenea supuse unei conversii de tip. S examinm urmtorul exemplu: $x = 1; $y = $x + "1 more"; echo $y; Valoarea afiata este 2, adic suma dintre valoarea variabilei $x i valoarea numeric a irului text, care este 1. Valoarea numeric i tipurile unui ir sunt determinate prin respectarea urmtoarelor reguli: 1. Dac irul ncepe cu o valoare numeric, valoarea irului este dat de valoarea numeric respectiv; n caz contrar, valoarea irului este zero. 2. Dac un punct zecimal sau un exponent (e sau E), este asociat cu valoarea numeric, tipul variabilei rezultate este dublu; n caz contrar, tipul valorii rezultante este un ntreg. Conversia manual de tip Dac preferai, putei prelua controlul conversiei de tip sau putei modifica tipul unei variabile. Pentru a prelua controlul conversiei de tip, putei converti forat un operand de la un tip la altul, proces cunoscut sub numele de conversie forat de tip sau pur i simplu conversie forat. n continuare avei un exemplu de conversie de tip: $x = 1; $y = 2.5; $z = $x + (integer) $y; echo $z; Conversia forat de tip, i anume (integer), determin tratarea variabilei $y ca pe un ntreg, iar valoarea acesteia devine 2, n loc de 2.5, care este valoarea real a variabilei $z. Tabelul urmtor indic i alte conversii forate de tip care se pot folosi: Conversia forat (int), (integer) (real), (double), (float) (string) (array) (object) Rezultat Conversie forat la ntreg Conversie forat la dublu Conversie forat la ir Conversie forat la tablou Conversie forat la obiect

Numeroase funcii furnizeaz nca o modalitate de a trata o variabil ca i cum ar fi de tip specificat. Tabelul urmtor prezint succint aceste funcii. Funcie doubleval() intval() strval() Exemplu: Operaie Trateaz argumentul ca fiind de tip dublu Trateaz argumentul ca fiind de tip ntreg Trateaz argumentul ca fiind de tip ir.

$x = $y = echo echo

1.5; intval($x); $x; $y;

Valoarea 1.5 este afiat ca valoare a variabilei $x, iar valoarea 1 este afiat ca valoare a variabilei $y. Nici conversia normal i nici cea forat nu modific tipul unui operand. Ambele mecanisme determin tratarea operanzilor ca i cum ar fi de un alt tip. Totui, modificarea tipului unei variabile este posibil prin utilizarea funciei settype(). Acest procedeu este ilustrat n continuare: $x = 1.5; settype($x, "integer"); echo $x; Valoarea afiata a variabilei $x este egal cu unitatea, deoarece fracia zecimal se pierde atunci cnd funcia settype() convertete valoarea dubl la o valoare ntreag. Putei obine acelai rezultat cu urmtoarea instruciune de atribuire, care folosete o conversie forat: $x = (integer) $x; Valorile posibile pentru al doilea argument al funciei settype(), i anume argumentul care specific tipul dorit, sunt: - integer - double - string - array - object O funcie conex, i anume gettype(), returneaz un ir care indic tipul variabilei specificate. Scriptul urmtor afieaza irul "integer", care indic tipul variabilei $x: $x = 1; echo gettype($x); Instruciuni de atribuire n cazul n care dorii o modalitate rapid de a scrie o instruciune de atribuire, putei folosi anumii operatori. Urmtoarele dou instruciuni de atribuire, una normal i una "rapid", au acelai efect: $x += 1; $x = $x + 1; Aceast instruciune de atribuire "rapid" v scutete de efortul de a scrie o variabil, $x n cazul exemplului nostru, n ambii membri ai instruciunii de atribuire. Tabelul urmtor rezum operatorii "rapizi" de atribuire pentru operaiile aritmetice i pentru iruri, furniznd un exemplu pentru fiecare operator i o instruciune de atribuire echivalent. Instruciune de atribuire "rapid" x += y x -= y x /= y x *= y x %= y Instruciune de atribuire normal x=x+y x=x-y x=x/y x=x*y x=x%y

x .= y

x=x.y

Scrierea instruciunilor swich, break i default

Instruciunea if v permite s luai o decizie n dou sensuri. Pentru a putea lua o decizie n mai multe sensuri, putei folosi mai multe instruciuni if, else sau elseif. Cu toate astea, cnd dorii ca programul dvs. s aleag dintr-un set de alternative care pot fi reprezentate prin valori ntregi, instruciunea switch este o opiune mai convenabil. De exemplu, s presupunem c valoarea variabilei $numar este 1, 2 sau 3, reprezentnd respectiv dimensiunile mic, medie i mare. Iat un mic program care afieaz dimensiunile asociate valorilor variabilei $numar:

Cod:

<?php switch ($numar) { case(1): echo "numar mic"; break; case(2): echo "numar mediu"; break; case(3): echo "numar mare"; break; default: echo "Acesta nu este un numar valabil"; } ?>
Aciunea unei instruciuni switch este determinat de valoarea unei expresii ntregi, nu de valoarea unei expresii condiionale. Numele variabilei este dat ntre parantezele care urmeaz dup cuvntul cheie switch. Parantezele acolade delimiteaz o serie de instruciuni case i o instruciune default opional, fiecare dintre instruciunile cuprinse ntre paranteze putnd avea instruciuni asociate. Cnd este executat, instruciunea switch ncearc s stabileasc o identitate ntre valoarea variabilei sale asociate i valoarea asociat unei instruciuni case. Se vor executa instruciunile asociate primei instruciuni case pentru care identitatea respectiv este valabil. Dac valoarea variabilei din instruciunea switch nu corespunde nici uneia dintre valorile asociate instructiunilor case, se vor executa instruciunile asociate instruciunii default, dac exist o asemenea instruciunie. Un procedeu de programare indicat const n aceea c fiecare instruciune case din cadrul unei instruciuni switch s se ncheie cu o instruciune break. Instruciunea break determin ncheierea exeuiei instruciunii switch, transfernd controlul urmtoarei instruciuni secveniale care succede instruciunii switch.(adic se continu cu restul codului din script) n absena instruciunii break, execuia trece la urmtoarea instruciune case sau default, fapt nedorit n majoritatea cazurilor. Nu este necesar s folosii numere ntregi consecutive n instruciunile case. Se pot folosi numere ntregi non-consecutive, numere cu virgul mobil sau iruri.

n exemplul urmtor avei o instruciune switch care testeaz valoarea variabilei $meniu. Instruciunea atribuie variabilei $submeniu o valoare dup cum urmeaz: dac $meniu este 1, $submeniu primeste valoarea 5; dac $meniu este 2, $submeniu primeste valoarea 10; altfel, $submeniu primete valoarea 0.

Cod:

<?php switch ($meniu) { case 1: $submeniu = 5; break; case 2: $submeniu = 10; break; default: $submeniu = 0; } ?>
PHP include numeroase instruciuni condiionale, incluznd instruciunile if, else, elseif i switch. Mai exist ns i alt mecanism de luare a deciziilor - operatorul condiional ?:, denumit uneori i operator ternar sau operator ntrebare-dou puncte. El constituie o alt modalitate de a scrie decizii n PHP. Operatorul condiional formeaz o expresie care se poate folosi n multe contexte PHP. Iat sintaxa de utilizare a acestuia: expresie-conditionala ? valoare-adevarat : valoare-fals Se observ cum semnul ntrebrii este separat de caracterul dou puncte prin valoarea valoare-adevarat. Operatorul condiional i evalueaz expresia condiionala. Dac expresia este evaluat la valoarea true (adevrat), operatorul condiional returneaz valoarea valoareadevarat; n caz contrar, returneaz valoarea valoare-fals. Operatorul condiional v permite s specificai deciziile ntr-o manier foarte concis. De exemplu, s lum urmtoarea instruciune de atribuire: $a = ($b > $c) ? 1 : 2 Aceast instruciune de atribuire compar valorile variabilelor $b i $c. Dac valoarea variabilei $b este mai mare dect aceea a variabilei $c, atunci variabilei $a i este atribuit valoarea 1; n caz contrar, variabilei respective i este atribuit valoarea 2.

Scrierea instruciunilor for

Revin n acest articol la detalierea instruciunii for, pe care o folosesc destul de des n ultima vreme. Instruciunea for este o instruciune bucl sau o instruciune iterativ; cu alte cuvinte, o instruciune care execut n mod repetat instruciunile asociate. Iat un exemplu de utilizare a unei instruciuni for:

Cod:

<?php $suma = 0; for ($n = 1; $n <= 3; $n++) $suma += $n; echo "<br>Suma intregilor de la 1 la $numar este $suma."; ?>
n exemplul de mai sus se calculeaz suma ntregilor cuprini ntre 1 i 3. Pentru aceasta, mai nti se iniializeaz variabila $suma la valoarea 0. Apoi, se execut o instruciune for care incrementeaz n mod repetat valoarea variabilei $suma. Pentru a vedea cum funcioneaz mecanismul aestei instruciuni, s examinm componentele instruciunilor for. Instruciunea for include trei expresii, care apar ntre paranteze; fiecare expresie este separat de vecina sa printr-un caracter punct i virgul. De asemenea, instruciunea for include o instruciune sau un grup de instruciuni, cunoscute sub numele de corpul instruciunii for. n exemplul de mai sus, instruciunea $suma += $n este corpul instruciunii for. S examinm mai amnunit cele trei expresii: - Prima expresie este expresia de iniializare. Aceasta se execut atunci cnd PHP ajunge la instruciunea for. n exemplu, expresia de iniializare atribuie valoarea 1 variabilei $n, variabil denumit variabila de ciclare sau index. - A doua expresie este expresia de test. Aceasta este o expresie condiional care indic dac se execut sau nu corpul instruciunii. n general, face referire la variabila de ciclare. n cadrul exemplului, expresia de test compar valoarea variabilei $n cu valoarea 3. Expresia de test este evaluat pentru prima data imediat dup evaluarea expresiei de iniializare. - Cea de-a treia expresie este expresia pas. n general, aceasta modific una sau mai multe variabile la care se face referire n expresia test. n cadrul exemplului, expresia pas incrementeaza valoarea variabilei $n. Secvena de execuie a unei instruciuni for este urmtoarea: 1. Se evaleaz expresia de iniializare. 2. Se evalueaz expresia test. 3. Dac rezultatul evalurii expresiei test este false, se execut etapa 7. 4. Se execut corpul buclei. 5. Se evalueaz expresia pas. 6. Se trece la etapa 2. 7. Se ncheie execuia instruciunii for, prin executarea urmtoarei instruciuni secveniale. Instruciunea for este util pentru numrare i executarea n mod repetat a unor aciuni. n acest site de exemplu am folosit instructiunea for pentru a trimite ctre fiecare user nscris la newsletter cte un e-mail de fiecare dat cnd este actualizat acest site.

Scrierea instruciunilor while i do while

Practic, instruciunile while i do while reprezint versiuni "manuale" ale instruciunii for. Dac o instruciune for are trei expresii, o instruciune while sau do while are una singur, i anume expresia de test. Aa cum se ntmpl de obicei, expresiile unei instruciuni for sunt opionale; fr o expresie de iniializare sau o expresie pas, o instruciune for opereaz n acelai mod ca o instruciune while. n consecin, urmtoarele dou instruciuni sunt echivalente:

Cod:

<?php for ( ; $i <= 3; ) $suma += $i; while ($i <= 3) $suma += $i; ?>
Cnd folosii o instruciune while, trebuie s furnizai un mecanism oarecare, analog expresiei de incrementare a instruciunii for, care actualizeaz variabilele la care se face referire n expresia de test. De asemenea, suntei responsabil cu iniializarea tuturor valorilor folosite n expresia de test. Secvena de execuie a unei instruciuni while este urmtoarea: 1. Se evalueaz expresia test. 2. Dac rezultatul este false, se trece la etapa 5. 3. Se execut corpul buclei. 4. Se trece la etapa 1. 5. Se prsete bucla, prin executarea urmtoarei instruciuni secveniale. Iat un exemplu care utilizeaz instruciunea while:

Cod:

<?php $n = 0; $suma = 0; while ($n <= 3) { $suma = $suma + $n; $n++; } echo "Suma este $suma."; ?>
Remarcai c instruciunea $n = 0; iniializeaz bucla i c instruciunea $n++; incrementeaz valoarea variabilei bucla $n. Instruciunea while este cea mai util atunci cnd un alt program necesar execut deja aceste funcii; n asemenea situaii, instruciunea while este mai clar dect o instruciune for degenerat, creia i lipsesc una sau mai multe dintre expresiile sale obinuite. Instruciunea do while este oarecum asemntoare instruciunii while. Diferena este aceea c instruciunea do while i execut corpul nainte de a-i evalua expresia de test. Astfel, corpul buclei unei instruciuni do while este ntotdeauna executat cel puin o dat; corpul unei instruciuni while este omis dac expresia de test are iniial valoarea false. Secvena de execuie a unei instruciuni do while este urmtoarea: 1. Se execut corpul buclei. 2. Se evalueaz expresia de test. 3. Dac rezultatul este adevrat, se trece la etapa 1. 4. Se ncheie execuia buclei, prin executarea urmtoarei instruciuni secveniale. Iat un exemplu care folosete o instruciune do while. Observai c amplasarea expresei de test imediat dup corpul buclei v reamintete faptul c executarea corpului are loc nainte de evaluarea expresiei de test:

Cod:

<?php $suma = 0; $n = 1; do { $suma += $n; $n++; } while ($n <= $numar); echo "<br>Suma intregilor cuprinsi intre 1 si $numar este $suma."; ?>
Instruciunile while i do while sunt foarte asemntoare. Utilizarea instruciunii do while este o chestiune de comoditate, nu de necesitate. Se pot scrie aplicaii php folosind doar instruciuni while.

Introducere n Clase PHP

Cnd ncepi s lucrezi cu PHP, i dai seama c sunt multe locuri n care trebuie s scrii aceai bucat de cod. Unii dintre voi probabil s-au prins c aceasta se poate rezolva cu o funcie, asta economisind ceva timp atunci cnd vei vrea s refolosii codul. Pur i simplu declarai o funcie i i spunei acelei funcii ce informaie vrei s foloseasc. Metoda este similar celei de mai jos:

Cod:

<?php function Functia_Mea($variabila) { // Foloseste $variabila aici: echo $variabila; } ?>


i apoi doar apelezi funcia atunci cnd ai nevoie de ea:

Cod:

<?php Functia_Mea("Salut, bine ai venit pe site"); ?>


i funcia va afia la ieire "Salut, bine ai venit pe site"

Ei bine, dup un timp se vor aduna prea multe funcii i te vei aglomera. Folosind Clase PHP, poi ncepe s pui acele funcii n nite "cutii" unde sunt stocate i folosite. Clasele PHP s-au dovedit a fi foarte valoroase, atunci cnd sunt gndite i cnd e scris codul bine. V voi face o introducere n Clase i v voi da cteva exemple unde pot fi folosite. Sper ca la sfritul acestui tutorial te vei gndi s implementezi nite clase proprii economisind astfel timp n viitoarele proiecte. Dar haideti s lsm vorbria i s ncepem s ne stocm funciile n interiorul Claselor.

Structura Clasei Cnd v gndii la clase v-a ncuraja s v gndii ca la "codul din spate". Codul va fi stocat n spatele site-ului, iar n fa va fi un bloc de cod foarte uor de neles. Voi pune toate rutinele complicate n clasa ta, iar scriptul care folosete acea clas va fi mai uor de neles pentru c va avea un cod "curat". Acesta nu este singurul motiv pentru care poi folosi clasele, dar este motivul pentru care eu le folosesc. OK, s aruncm o privire pe clas: Cod:

<?php class Clasa_mea { var $email; // folosim o functie fara variabile function verifica_email() { if (ereg("^.+@.+\..+$", $this -> email)) return(true); else return(false); } // Folosim o functie cu variabile function scoate_imag($cevahtml) { $cevahtml = preg_replace("/(<img)(.*?)(>)/si", "", $cevahtml); return $cevahtml; } } ?>
Clasa de mai sus a fost compus din 2 funcii simple. Vom analiza funciile pentru a nelege despre ce este vorba aici. Mai nti trebuie s declarm o clas: class Clasa_mea { Vom crea nite variabile ce pot fi folosite n oricare din funciile din interiorul clasei fr s trebuiasc s fie specificate pentru fiecare funcie. Vom face asta prin "var $nume_var", priviti mai jos pentru exemplul $email pe care l vom folosi.

var $email; n continuare, s analizm prima funcie. Funcia aceasta valideaz mail-ul introdus de utilizator. Caut text n ambele pri ale simbolului "@" care este structura unei adrese de email. Aceast funcie va prelua variabila $email definit n scriptul nostru care apeleaz clasa i verific validitatea email-ului. Dac adresa de email trece de aceast verificare i este o adres valid, vom returna "TRUE", altfel vom returna "FALSE". Voi explica asta puin mai trziu.

Cod:

<?php // folosim o functie fara variabile function verifica_email() { if (ereg("^.+@.+\..+ $ " , $this -> email)) return ( true ); else return ( false ); } ?>
Uitndu-v la funcia de mai sus, ai remarcat c am folosit " $this->email " unde $this-> e un constructor special care indic n interiorul clasei ctre o variabil sau o alt funcie. La nceput am definit var $email, acum avem $this->email . Vei vedea cum s atribuii o valoare lui $this->email cnd vom folosi "efectiv" scriptul ce apeleaz clasa . Nota: putei de asemenea folosi n interiorul unei funcii dintr-o clas, o alt funcie ce se afl n aceeai clas. Doar introducei $this->numele_functiei($vars); i funcii din interiorul aceleiai clase se pot folosi reciproc. Pentru a v da un exemplu c putei pune aproape orice dorii n interiorul unei clase, am fcut aceast clas "cu scop general" ce poate fi utilizat n mai multe scopuri. Mai jos vei vedea o funcie pe care am introdus-o n aceast clas, funcie care elimin tag-urile unei imagini dintr-un string (ir de caractere). Am vrut s v art aceast clas i pentru c este o metod diferit de a apela funcia, aceast funcie va accepta o variabil ca parametru i trebuie s aib acea variabil definit atunci cnd o apelezi. Voi explica i acest lucru mai ncolo. Iat funcia mai jos:

Cod:

<?php // Folosim o functie cu variabile function scoate_imag($cevahtml) { $cevahtml = preg_replace( "/(<img)(.*?)(>)/si" , "" , $cevahtml); return $cevahtml; } ?>
Acum, nchidem clasa noastr i suntem gata s-o folosim!

} S numim acest fiier: "clsClasa_Mea.php" i s vedem cum l vom folosi n pagina urmtoare. Folosirea acestei Clase n Scripturile voastre PHP Primul lucru pe care trebuie s-l facem este s includem clasa. Nu este mare lucru, doar includei-o folosind: <? include "Clasa_Mea.php"; Acum putem ncepe distractia :) Avem clasa noastr inclus n script i trebuie s iniializm un obiect pe care s-l atribuim unei variabile. Iat cum se face: $clasa_mea = &New Clasa_Mea; Am creat un obiect numit $clasa_mea i acum putem accesa elementele din interiorul clasei Clasa_Mea pe care am creat-o mai devreme. Astea fiind fcute, avem variabila "$email" ce st degeaba n Clasa_Mea, aa ca i vom atribui o valoare: $clasa_mea -> email = "tu@undeva.com" ; Tinei minte c putei face: $clasa_mea->email = $_POST['email']; sau orice vrei cu ea. S rulm funcia verifica_email n interiorul clasei Clasa_Mea:

Cod:

<?php $verifica_email = $clasa_mea -> verifica_email(); if (!$verifica_email) { echo "Adresa de email nu este valida!"; } else { echo "Adresa de email este valida!"; } ?>
Tot ce am fcut este s atribuim o variabil funciei verifica_email() i apoi am fcut nite verificri de erori pe baza acelei variabile. Tinei minte ce a spus mai devreme, dac verifica_email returneaz TRUE, adresa coninut n variabila $email pe care i-am spus s-o verifice a trecut testul, dac nu a trecut testul va returna FALSE. Privind instruciunea if de mai sus, vei vedea c dac un "!" sau "Eroare" este detectat pe irul de caractere din $verifica_email, vom afia "Adresa de email este valida!". Haidei s ne uitm cum folosim funcia scoate_imag. nti vom crea un string cu HTML n interior.

$html_vechi = '<strong>Am o imagine aici: <img src="/imaginea_mea.jpg" height="100" width=" 200" >' ; Acum c avem $html_vechi i tim c are o imagine n interiorul HTML-ului, s scoatem acea imagine afar i s returnm rezultatul: $html_nou = $clasa_mea -> scoate_imag($html_vechi); echo "Aici este html-ul vechi $html_vechi <br /><br />" ; echo "Aici este html-ul nou $html_nou <br /><br />" ; Cnd vei privi $html_vechi i $html_nou, vei vedea c imaginea a fost eliminat cu succes. Dac ai neles ce s-a ntmplat pn acum, felicitrile mele, tocmai ai nvat noiunile elementare ale claselor! Dac nu, te sftuiesc s mai citeti acest tutorial nc o dat. l vei nelege pn la urm. Aa cum am spus mai devreme, clasele s-au dovedit a fi foarte eficiente. Ele sunt calea ctre "Object Oriented Programming" sau "Programarea Orientata pe Obiecte" - OOP. Cu OOP putei economisi foarte mult timp i putei crea o arhiv de obiecte sau clase pe care le putei folosi mereu. Referinte: Iat cteva link-uri pe care le putei vizita cnd v dezvoltai 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. Toate cele bune!

Sesiuni n PHP

n mod normal, o variabil local declarat ntr-o pagina .php este valabila doar n acea pagin, dac nu intervenim ntr-un fel pentru a o transfera i pe alte pagini unde avem nevoie de ea. Modalitile de pstrare a informaiilor pe tot parcursul aplicaiei sunt: - variabile globale - sesiuni - cookies - transferul variabilelor locale prin forme sau n header-ul unei alte pagini

Ce este o sesiune? O sesiune reprezint una din cile de a pstra datele de lucru ale unei aplicaii atunci cnd se face transferul de la o pagin la alta. PHP folosete n mod nativ sesiuni, aa cum fac i limbajele ASP i ColdFusion. Lucrul cu sesiuni nu este complicat. Fiecare sesiune trebuie declarat la nceputul paginii, cu ajutorul funciei:

session_start(); Aceast funcie face ca PHP s nregistreze un identificator unic al sesiunii (ID), iar acel identificator este trimis utilizatorului printr-un cookie. Totodat, pe server se creaz un fiier care va reine valorile variabilelor folosite n aceast sesiune. Fiierul are numele la fel cu identificatorul ID al sesiunii. Apoi trebuie declarat variabila (sau variabilele) cu care lucrm n cadrul acestei sesiuni. Pot fi create oricte variabile. session_register('sesiunea_mea'); Variabila $sesiunea_mea poate fi o variabil simpl sau un tablou (array). Exemplu: $sesiunea_mea = "Lucian"; sau $sesiunea_mea["id"] = 1; // cazul unui array $sesiunea_mea["nume_utilizator"] = "Lucian"; $sesiunea_mea["adresa"] = "Str.Florilor nr.14"; // etc. Variabilele definite n acest mod pot fi folosite pe toate paginile unei aplicaii, definite pe un domeniu dat, att timp ct cookie alocat acelei sesiuni este activ (nu expir). Folosirea sesiunilor este o cale mult mai uoara de lucru dect s transferm variabilele de la pagin la pagin. n php.ini pot fi setate diferite valori pentru parametri legai de sesiune cum ar fi (dup semnul egal am pus valorile implicite) : session.cookie_path = "/"; session.cookie_domain = ""; session.cookie_lifetime = "0"; // valoarea 0 nseamn c cookie pentru sesiune e valabil pn cnd browserul se va nchide. session.name = "PHPSESSID"; i altele . Exist posibilitatea ca un utilizator s nu accepte setarea de cookies pe computerul su. n acest caz, pentru identificarea unei sesiuni se poate folosi identificatorul acesteia. Putem aduga acest identificator n stringul care apleaz o pagin: <a href = "pagina_mea.php?<?=SID?">Click catre pagina mea</a> <?= este un mod mai scurt de a scrie comanda echo. <?= se poate folosi cu orice variabil, nu doar cu sesiuni. Un identificator PHPSESSID arat ca o nirurire aleatoare de caractere alfanumerice: PHPSESSID = 02993ab99sac988da9753330af72201 Dac PHP este compilat cu opiunea enable-trans-id, atunci identificatorul sesiunii este adugat automat la fiecare pagin. Iat un exemplu de definire al unei sesiuni: <? session_start(); session_register("variabila_mea"); $variabila_mea = "Aceasta este cursul online de PHP"; ?> $variabila_mea va putea fi folosit apoi pe toate paginile aplicaiei respective. // variabila simpl

Observaie important: Variabilele definite n sesiuni pot fi folosite ntr-o pagin doar dup ce a fost executat comada session_start(); Aceast comand i spune PHP-ului s verifice dac exist o sesiune i atunci s foloseasc variabilele acelei sesiuni ca variabile globale. Funciile session_start(), ca i setcookie() trebuie folosite ntotdeauna chiar la nceputul fiierului. Dac se trimite altceva ctre browser nainte de folosirea lor atunci vor exista erori la folosirea sesiunii sau a cookieurilor. Articol scris de Curs http://php.intercer.net (preluat de la phpromania.net)

Crearea i utilizarea funciilor

Procesul de executare a unei funcii se numete utilizarea, apelarea sau invocarea funciei. Pentru a folosi o funcie, scriei numele funciei, urmat de o pereche de paranteze. De exemplu, funcia rand(), care genereaz un numr ntreg aleator, poate fi apelat astfel: rand(); Majoritatea funciilor preiau argumente, reprezentnd valori de intrare care influeneaz operarea i rezultatul funciei. Pentru a specifica argumente, acestea se insereaz ntre paranteze; dac specificai mai mult de un argument, fiecare argument trebuie separat de vecinul su prin intermediul unei virgule. Argumentul unei funii poate fi o valoare literal, o variabil sau o expresie. Unele funcii PHP au argumente opionale, care pot fi specificate sau omise, n conformitate cu inteniile dumneavoastr. De exemplu, funcia rand() are dou argumente opionale. Primul argument al funciei indic valoarea ntreag cea mai mic pe care o va returna funcia; al doilea argument indic valoarea cea mai mare. Dac omitei ambele argumente, funcia returneaz o valoare cuprins ntre 0 i cel mai mare rezultat posibil. Dac dorii, putei specifica primul argument, omindu-l pe al doilea: rand(100); Astfel, funcia este obligat s returneze o valoare cuprins ntre 100 i cel mai mare rezultat posibil. Ca i rand(), majoritatea funciilor returneaz valori. Putei folosi ntr-o expresie valoarea returnat de o funcie. O situaie foarte frecvent n care se procedeaz astfel o constituie utilizarea valorii returnate de o funcie ntr-o expresie de atribuire, astfel nct valoarea s fie accesibil n mod repetat fr a se invoca funcia de mai multe ori. De exemplu: $test = rand(1, 15); Cnd se produce o eroare n timpul execuiei unei funcii, PHP genereaz mesaje de eroare. Uneori, asemenea mesaje de eroare sunt nedorite. n acest caz, putei suprima generarea mesajelor de eroare prin prefixarea numelui funciei invocate cu ajutorul caracterului @. De exemplu, pentru a ascunde mesajele de eroare care pot aprea n timpul execuiei funciei f(), invocai aceast funcie astfel: $a = @f(b); Definirea unei funcii n afar de a utiliza funciile din biblioteca de funcii a limbajului PHP, v putei defini i folosi

propriile funcii. Pentru a defini o funcie, respectai modelul urmtor: function nume_functie(nume_argument) { // aici se introduce corpul functiei } n acest exemplu, nume_functie este numele funciei, iar nume_argument este numele argumentului funciei. n PHP, numele funciilor nu prezint sensibilitate la diferena ntre majuscule i minuscule; ca atare, f() i F() reprezint referiri la aceeai funcie. Cuvntul cheie function, numele funciei i lista cu argumente alctuiesc antetul funciei. Termenul de corp al funciei se refer la instruciunile incluse ntre parantezele acolade care urmeaz dup antetul funciei. nstruciunile din corpul funciei sunt executate atunci cnd funcia este apelat. Dac dorii s definii o funcie care nu are argumente, putei omite nume_argument; dac dorii s definii o funcie cu mai multe argumente, putei include argumente suplimentare dup nume_argument, fiecare argment fiind separat de vecinul su prin intermediul unei virgule. Parantezele i numele argumentelor incluse ntre acestea poart numele de lista cu argumente. Ca exemplu, iat o funcie care calculeaz aria unui dreptunghi: function calculeaza_aria($inaltime, $latime) { return $inaltime * $latime; } Lista cu argumente a funciei calculeaza_aria include argumentele $latime i $inaltime. Corpul funciei este alctuit dintr-o singur instruciune; cu toate acestea, corpul unei funcii poate conine un numr arbitrar de instruciuni. Dac dorii ca funcia s returneze o valoare, trebuie s determinai funcia s execute o instruciune return care furnizeaz valoarea respectiv. Instruciunea return determin sistarea executrii funciei; nu este necesar ca aceasta s fie ultima instruciune fizic din corpul funciei. Dac definii o funcie care nu are nici o instruciune return, funcia va returna valoarea special NULL. Apelarea unei funcii O funcie definit de utilizator poate fi apelat n acelai mod ca o funcie ncorporat. De exemplu: $aria = calculeaza_aria(2,4); Valorile argumentelor efective 2 i 4 le nlocuiesc pe acelea ale argumentelor formale din corpul funciei calculeaza_aria, care se comport ca i cum ar fi fost scris astfel: return 2 * 4; Atenie!! n PHP3, definiia unei funcii trebuie s precead linia de program care apeleaz funcia. n PHP4, definiia unei funcii poate fi plasat fie anterior liniei de program care apeleaz funcia, fie dup aceasta. Terminarea execuiei unei funcii O instruciune return determin sistarea execuiei funciei care o conine. n cazul n care dorii s sistai prelucrarea unui ntreg script, putei invoca funcia exit(). Iat un exemplu: function stop() { exit();

} echo "Prima linie<br>"; echo "Linia 2<br>"; stop(); echo "Linia 3<br>"; Rezultatul acestui script este afiarea primelor 2 linii, dar nu i a liniei 3. Prin apelarea funciei stop() se execut corpul funciei respective; la invocarea funciei exit(); execuia scriptului se ncheie. Funcii recursive Este posibil ca o funcie din PHP s se auto-apeleze. O funcie care procedeaz astfel se numete functie recursiva. Este recomandat s nu scriei funcii recursive. Cu toate acestea, putei scrie accidental o asemenea funcie i de aceea recomand s citii n continuare. Exemplu: function recursor() { return recursor(); } $a = recursor(); La invocarea funciei recursor(), aceasta invoc imediat funcia recursor(), care se auto-invoca instantaneu. Astfel, funcia recursor() este invocat n mod repetat, pn cnd se produce o eroare cunoscut sub numele de depire n sens pozitiv a stivei (stack overflow). Dac programul dvs. se ncheie cu o depire n sens pozitiv a stivei, o posibil cauz poate consta ntr-o recursie incorect. Definirea argumentelor prestabilite PHP4 va permite s definii funcii cu argumente prestabilite. Dac invocai o funcie care are un argument prestabilit, dar nu furnizai nici o valoare pentru argumentul respectiv, argumentul ia o valoare prestabilit specificat. Exemplu: function impozit_vanzari($cantitate, $rata=0.07) { echo "Cantitate = $cantitate<br>"; echo "Rata = $rata"; return $suma * $rata; } $cumparaturi = 123.45 echo "Cumparaturi = $cumparaturi<br>"; $impozit = impozit_vanzari($cumparaturi, 0.08); echo "Impozit = $impozit<br>"; $cumparaturi = 123.45; echo "Cumparaturi = $cumparaturi<br>"; $impozit = impozit_vanzari($cumparaturi); echo "Impozit = $impozit<br>"; Funcia impozit_vanzari preia dou argumente: un argument obligatoriu, denumit $cantitate, i un argument prestabilit, denumit $rata. Dac apelai funcia i furnizai un singur argument, valoarea argumentului respectiv se consider ca fiind valoarea argumentului $cantitate, iar valoarea 0.07 se foloseste ca valoare a argumentului $rata. Astfel, la prima invocare a funciei, $rata are valoarea 0.08, specificat drept al doilea argument al funciei. Cu toate

acestea, la a doua invocare a funciei, $rata are valoarea 0.07, deoarece este specificat valoarea unui singur argument. Este posibil ca o funcie s aib mai multe argumente prestabilite, dar rezultatul este deseori confuz. Exemplu: function test($valoare1 = 1, $valoare2 = 2) Care credei c va fi rezultatul dac este invocat urmtoarea funcie? x=test(3); Cu alte cuvinte, argumentul trebuie folosit ca valoare a variabilei $valoare1 sau ca valoare a variabilei $valoare2? PHP are reguli care controleaz asemenea situaii, dar regulile respective pot fi derutante. Ca atare, cel mai bine este s evitai problema prin definirea unui singur argument prestabilit i prin poziionarea unui argument prestabilit pe ultima poziie n lista cu argumente.

Utilizarea fiierelor incluse

Funciile PHP v permit s obinei accesul la programe PHP scrise anterior. Una din variante o constituie instruciunea require, care are urmtoarea form: require(numele_fisierului); De exemplu dorim s accesm datele din fiierul numit valori.inc. Pentru aceasta folosim urmtoarea comand: require("valori.inc"); Cnd este ncrcat un script PHP care conine o instruciune require, coninutul fiierului specificat - cunoscut sub numele de fiier de includere - este inserat n script, nlocuind instruciunea require. Dac fiierul de includere conine linii de program PHP, trebuie s includ etichetele <?php i ?>, amplasate n locaiile adecvate. Dei se obinuiete ca un fiier de includere s primeasc extensia de fiier inc, nu este obligatoriu s procedai astfel. Unii programatori PHP prefer s foloseasc extensia de fiier php pentru toate fiierele pe care le creeaz. Instruciunea require v poate scuti de un mare volum de munc. De exemplu, s presupunem ca scriei o aplicaie PHP care este alctuit din mai multe scripturi, iar fiecare script afieaz o pagina HTML care conine informaii standard n partea de sus a paginii. Putei crea un fiier script special, denumit antet.inc, care conine doar partea de sus a pagini (pentru exemplificare citii i vedei scriptul de la articolul "Contruieste un site cu php") Prin inseria instruciunii: require ("antet.inc"); la nceputul fiecrui script, determinai programul PHP s includ coninutul acelui fiier ca i cum coninutul respectiv ar face parte din acel script. Acest procedeu poate simplifica intreinerea programului, deoarece informaiile standard pot fi rezidente ntr-un singur fiier, ceea ce le face uor de localizat i revizuit. Atentie!!! Instruciunea require este prelucrat la ncrcarea scriptului PHP asociat, naintea legrii valorilor la variabilele corespunztoare. n consecin, nu putei folosi o expresie pentru a specifica numele fiierului care urmeaz a fi inclus de ctre o instruciune require. Totui,

putei folosi instruciunea include, care este o instruciune executabil ce determin evaluarea scriptului PHP dintr-un fiier specificat. De exemplu, instruciunea include din urmtorul program evalueaz fiierul pagina1.inc $fisier = 1; include ("pagina".$fisier.".inc"); La evaluarea fiierului de includere, instruciunile PHP pe care le conine sunt executate ca i cum ar fi aprut n textul scriptului apelant. Instruciunea corelat require_once asigur faptul c fiierul specificat este inclus o singur dat ntr-un script dat. n cazul n care creai fiiere de includere care folosesc instruciunea require pentru a include coninutul altor fiiere de includere, putei gsi instruciunea require_once util.

Funcii PHP pentru expresii regulate

Funcie ereg ereg_replace

Descriere execut o identificare cu o expresie regulat nlocuiete un sub-ir care corespunde unei expresii regulate execut o identificare cu o expresie regulat insensibil la diferena ntre eregi majuscule i minuscule nlocuiete un sub-ir care corespunde unei expresii regulate insensibile la eregi_replace diferena 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 diferena spliti ntre majuscule i minuscule) creaz o expresie regulat insensibil la diferena ntre majuscule i minuscule sql_regcase dintr-un ir care conine o expresie regulat.

Sintaxa: function ereg Semnificaia caracterelor ce se pot afla n ablon: ^ - nceput de ir $ - Sfrit de ir * - zero sau mai multe caractere + - unul sau mai multe caractere ? - zero sau un character {x,y}, unde x i y sunt doi ntregi reprezentnd limita inferioar i superioar a numrului de caractere necesare. x trebuie ntotdeauna definit. ( ) - Secvene de caractere | - operatorul SI (OR) . (punct) - reprezint orice caracter [ ] - orice caracter din intervalul specificat ^ n [ ] - orice altceva dect caracterele din interval ^.[$()|*+?{\ - nu trebuiesc precedate de backslash (\) n expresii regulate dac sunt n interiorul parantezelor ptrate [ ] Exemple:

ab* - "a","ab","abb","abbb", etc. ab+ - "ab","abb","abbb", etc. ab? - doar "a","ab" ab{2} - doar "abb" ab{2,} - "abb","abbb", "abbbb", etc. ab{2,4} - doar "abb","abbb", "abbbb" a(bc)* - "abc","abcbc","abcbcbc", etc. a(bc){1,3} - doar "abc","abcbc","abcbcbc" (a|b) - "a" sau "b" hi|hello - "hi" sau "hello" (b|cd)ef - "bef" sau "cdef" "^.{3}$" - orice ir cu exact 3 caractere [_a-zA-Z] - underscore sau orice liter din alfabetul latin [^a-zA-Z] - orice altceva nafar de litere [1-6] - numr cuprins ntre 1 i 6 [c-h] - minuscul cuprins ntre c i h [D-M] - majuscul cuprinsa ntre D i M Un exemplu mai complicat: ^.{2}[a-z]{1,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... ^.{2} urmat de 1 sau 2 litere minuscule... [a-z]{1,2} urmat de un underscore opional... _? urmat de zero sau mai multe cifre... [0-9] urmat de fie un numr ntre 1 i 6 sau o liter minuscul cuprins ntre a i f... *([1-6]|[a-f]) urmat de 2 caractere care nu sunt cifre... [^1-9]{2} urmat de unul sau mai multe litere "a" la sfritul irului... a+$ Echivalene: * - {0,} + - {1,} ? - {0,1} Forma simpl a funciei ereg() preia dou argumente: un ir care conine o expresie regulat i un ir subiect. Funcia returneaz true dac expresia regulat corespunde unui sub-ir al irului subiect; n caz contrar, returneaz false. Iat un exemplu mai simplu: $model="[sml]at"; $subiect="La noi in sat"; $rezultat=ereg($model, $subiect); Variabila $rezultat primete valoarea true, deoarece irul subiect conine sub-irul "sat", care corespunde expresiei regulate. Forma mai complex a funciei ereg() include un al treilea argument, un tablou care primete sub-iruri ce corespund poriunilor scrise ntre paranteze ale modelului. n scriptul de mai jos, este reprezentat modul de utilizare a acestei forme a funciei ereg(), pe care o folosete pentru a determina dac un ir conine o adres de e-mail corect format.

Cod:

// formularul html <form method="post" action="script_2.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-]+(.[a-zA-Z0-9-]+)*)$"> <br> <input type="submit"> </form> <?php // preluare valori din formular $sir = $_POST['sir']; $model = $_POST['model']; // Afisare date echo "<br>Sir: ".$sir; echo "<br>Expresie regulata: ".$model; // verificare if (get_magic_quotes_gpc()) { echo "<br>Eliminarea ghilimelelor magice"; $sir = stripslashes($sir); $model = stripslashes($model); echo "<br>Sir: ".$sir; echo "<br>Expresie regulata: ".$model; } $gasit = ereg($model, $sir, $echivalente); echo "<br>"; if ($gasit) { echo "<br>Valabil: true"; echo "<br>Componente: "; for ($i=0;$i<count($echivalente);$i++) { echo "<br>$echivalente[$i]"; } } else echo "<br>Valabil: false"; ?>
Funcia PHP sscanf(), adugat n versiunea PHP 4.01, este complementar funciei printf(). Dac funcia printf() genereaz date de ieire formatate, funcia sscanf() citete un ir, l interpreteaz prin referirea la un ir de formatare i stabilete valorile variabilelor specificate n funcie de coninutul irului. Exemplu:

Cod:

<?php $subiect = "01, 31, 2005";

$n = echo echo echo echo ?>

sscanf($subiect, "%d, %d, %d", &$luna, &$zi, &$an); "<br>Au fost gasite $n valori:"; "<br>luna=$luna"; "<br>zi=$zi"; "<br>an=$an";

Datele de ieire ale acestui exemplu sunt:

Citat: Au fost gasite 3 valori: luna=1 zi=31 an=2005

Utilizarea referinelor n PHP

n mod prestabilit, argumentele transferate unei funcii PHP sunt transmise prin valoare, ceea ce nseamn c valorile argumentelor sunt copiate i funciile utilizeaz copii ale valorilor argumentelor lor, nu argumentele n sine. Ca o consecin, o funcie PHP nu poate modifica valorile argumentelor sale. Acest fapt este n general util, deoarece astfel funciile devin mai uor de neles dac se limiteaz la a returna o valoare, fr a modifica valori. Totui, putei stabili ca o funcie s aib posibilitatea de a modifica valoarea unui argument, specificnd ca argumentul s fie transferat prin referin. Cnd un argument este transferat prin referin, valoarea sa nu este copiat; funcia lucreaz cu valoarea argumentului i are libertatea de a modifica acea valoare. Pentru a specifica faptul c un argument urmeaz a fi transferat prin referin, argumentul va fi prefixat cu un caracter ampersand (&) (mai cunoscut ca AND). Putei ataa acest prefix la argument n antetul funciei sau n apelul la funcie. Iat un exemplu care prezint apelul prin valoare i apelul prin referin:

Cod:

<?php function prin_valoare($x) { $x = 1; } function prin_referinta(&$x) { $x = 1; } $y = 0; prin_valoare($y); echo "<br>\$y=$y"; $y = 0; prin_valoare(&$y); echo "<br>\$y=$y"; $y=0; prin referinta($y);

echo "<br>\$y=$y; ?>


Dac rulai acest script, vei obine urmtoarele date de ieire:

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

Reinei c scriptul conine dou funcii, i anume prin_valoare() i prin_referinta(). Fiecare funcie preia un singur argument, denumit $x. Antetul funciei prin_referinta() specific faptul c argumentul sau este transferat prin referin; argumentul funciei prin_valoare() este transferat prin valoare, n conformitate cu practica prestabilit folosit n limbajul PHP. Fiecare funcie ncearc s modifice valoarea argumentului su. Primul paragraf al programului invoc funcia prin_valoare(), transfernd argumentul prin valoare. n consecin, funcia lucreaz cu o copie a argumentului su, iar valoarea variabilei $y nu se modific. Cel de-al doilea paragraf al programului invoc de asemenea funcia prin_valoare(); cu toate acestea, folosete un caracter ampersand pentru a determina transferul prin referin al valorii variabilei $y. n consecin, funcia modifica valoarea argumentului su, care se transforma din 0 n 1. Cel de-al treilea paragraf al programului invoc funcia prin_referinta(). Antetul funciei respective folosete un caracter ampersand pentru a specifica faptul c valoarea argumentului sau este transferat prin referin. n consecin, funcia modific valoarea argumentului sau, care se transform din 0 n 1. Prin utilizarea referinelor se evit suprasarcina de copiere a valorilor argumentelor i implicit se obine o vitez mai mare de execuie a programului. Cu toate acestea, programele devin astfel mai dificil de neles, iar referinele sau apelurile prin referin pot cauza erori de program. Cel mai indicat este s evitai referinele, acolo unde este posibil, i s definii funcii care returneaz valori, i nu funcii care modific valorile propriilor argumente.

Lucrul cu funcii list

n afar de modalitile de parcurgere iterativ a tablourilor, PHP ofer numeroase funcii care permit traversarea tablourilor, deplasndu-v nainte sau napoi, dup dorin. Prima dintre aceste funcii este current(), care returneaz valoarea curent a tabloului. Funcia current() folosete un pointer intern de tablou pe care PHP l creeaz pentru fiecare tablou. Cnd creai un tablou, pointerul intern de tablou este configurat astfel nct s fac referire la primul element al tabloului. Funciile next() i prev() modific pointerul intern al tabloului i se pot folosi alturi de funcia current() pentru a parcurge un tablou. Funcia next(), aa cum i arat i numele, modific pointerul intern al tabloului astfel nct acesta s fac referire la urmtorul element, n timp ce funcia prev() modific pointerul intern al tabloului astfel nct acesta s fac referire la elementul anterior. Iat un exemplu care prezint modul de operare al celor 3 funcii:

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 ieire sunt:

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

Funcia key() Funcia key() este corelat cu funcia current(). Dac funcia current() returneaz valoarea asociat elementului curent, funcia 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 ieire sunt:

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

Funcia each() O alt funcie util n parcurgerea tablourilor este each(). Funcia each() returneaz urmtoarea 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.

Observai c putei folosi valoarea cheie "0" sau "cheie" pentru a obine accesul la componenta cheie a perechii cheie-valoare; similar, putei folosi valoarea cheie "1" sau "valoare" pentru a obine accesul la componenta valoare a perechii cheie-valoare. Iat mai jos un exemplu al funciei 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 ieire sunt:

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

Funcia list() O alt funcie util n lucrul cu tablouri este funcia list(), care v permite s atribuii valori la numeroase variabile n cadrul unei instruciuni. Funcia list() este deseori folosit cu funcia each(), deoarece funcia list() faciliteaz accesul separat la cheia i la valoarea returnate de funcia each(). Forma generala de utilizare a funciei list() este: list($var1, $var2, ..., $varn) = valoare_tablou; Fiecare dintre variabilele specificate, de la $var1 la $varn, primete o valoare din tabloul valoare_tablou. ntr-un fel, funcia list() este opus funciei array(), deoarece funcia list() mparte un tablou ntr-o serie de valoari scalare, n timp ce funcia array() construiete un tablou dintr-o serie de valori scalare. Iat un exemplu de utilizare a funciei 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 ieire sunt:

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

PHP conine peste 40 de funcii pentru lucrul cu tablourile. De exemplu, funcia array_search() faciliteaz cutarea ntr-un tablou. Sortarea tablourilor Sortarea reprezint o alt operaie frecvent aplicat tablourilor. PHP furnizeaz o suit de funcii care faciliteaz sortarea unui tablou. De exemplu, un tablou poate fi creat dup cum urmeaz: $limbaje = array(1=>"Perl", 2=>"PHP", 4=>"Python"); Apoi, dorii s sortai tabloul n funcie de numele limbajului de programare. Pentru aceasta, pur i simplu invocai funcia sort(): sort($limbaje); Dup sortare, coninutul tabloului apare aa: 0 => PHP 1 => Perl 2 => Python Observai c secvena de sortare sau secvena de aranjare (cum este numit uneori) este sensibil la diferena dintre majuscule i minuscule. Deoarece litera H mare este sortata anterior literei e mic, PHP apare nainte de Python n datele de ieire sortate. Tabelul de mai jos prezint pe scurt funciile de sortare ale limbajului PHP, inclusiv rezultatul aplicrii fiecrei funcii tabloului folosit n exemplul anterior. Operaie Sortarea unui tablou n funcie de valoare Funcie 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 funcie de valoare

Sortarea unui tablou dup valoare, n ordine descendent

Sortarea unui tablou asociativ dup valoare, n ordine descendent

Sortarea unui tablou sau a unui tablou asociativ n funcie de cheie

Sortarea unui tablou sau a unui tablou asociativ n funcie de cheie, 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 dorii s efectuai o cutare fr sensibilitate la diferena ntre majuscule i minuscule, o modalitate ar fi utilizarea funciei natcasesort(), care sorteaz un tablou folosind o "ordine natural", care nu este sensibil la diferena ntre majuscule i minuscule. O alt modalitate const n a utiliza funcia usort() sau una dintre funciile sale conexe, n spe uksort() i uasort(). Aceste funcii v permit s definii o secven de aranjare personalizat, pe care o specificai prin desemnarea unei funcii care compar valorile n conformitate cu secvena de aranjare. Funcia usort() sorteaz valorile din tablou i returneaz un tablou secvenial; funcia uksort() sorteaz cheile tabloului, iar funcia uasort() sorteaz un tablou asociativ. De exemplu, urmtoarele instruciuni creeaz un tablou i l sorteaz ntr-o manier insensibil la diferena ntre majuscule i minuscule: $limbaje = array("Perl", "PHP", "Python"); usort($limbaje, "strcmpcase"); Funcia strcmpcase() este o funcie din biblioteca PHP care compar dou iruri fr a ine cont de mrimea literelor (majuscule sau minuscule). Funcia returneaz o valoare negativ dac primul ir este mai mic dect al doilea, zero dac irurile sunt identice, respectiv o valoare pozitiv dac primul ir este mai mare dect ala doilea. Putei implementa o secven de aranjare personalizat scriind propria dumneavoastr funcie i specificnd numele acesteia ca argument al funciei usort() sau al uneia din funciile sale conexe. Pur i simplu scriei o funcie care preia dou argumente ir i returneaz -1, 0 sau =1, n funcie de rezultatul comparaiei ntre valorile ir.

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 facilitilor oferite de limbajul Java prin intermediul unei biblioteci de funcii numit php_java. Pentru a utiliza facilitile oferite de limbajul Java n cadrul scripturilor PHP este necesar o platform Java care poate fi gsit la adresa http://java.sun.com/ i pachetul php_java care conine dou fiiere: biblioteca php_java.dll (pe platforme Windows) i pachetul php_java.jar care conine o clas care se ocup de ncrcarea celor folosite n script-urile PHP. Aceast clas este utilizat de ctre PHP pentru a executa funcii din clase Java i pentru a rula clase noi. Limbajul PHP poate utiliza cel puin urmtoarele versiuni de Java: 1.2.x, 1.3.x, 1.4.2. Eu am testat cu Java 2 SDK, Standard Edition 1.4.2_04 Cele dou fiiere ale pachetului php_java pot fi gsite 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 fiiere ale

pachetului php_java trebuie copiate n directorul extensions care poate fi gsit n directorul n care a fost instalat limbajul PHP. Configurare: Pentru a putea accesa clasele Java n cadrul script-urilor PHP trebuie configurat biblioteca php_java. Configurarea se realizeaz prin intermediul fiierului php.ini localizat pe platforme Windows n directorul sistemului de operare (n directorul Windows de obicei). n acest fiier trebuie adugat valoarea php_java.dll variabilei extension. Exist mai multe posibiliti pentru a face acest lucru. Una dintre ele este eliminarea caracterului ";" de la nceputul liniei: ;extension=php_java.dll dac o astfel de linie exist n fiierul php.ini, iar o alt varianta este adugarea liniei: extension=php_java.dll la sfritul fiierului. n continuare trebuie setate valori pentru urmtoarele patru variabile: - java.class.path - reprezint o list de directoare, arhive zip sau alte tipuri de pachete suportate de limbajul java (jar, ejb, war etc.) separate ntre ele prin caracterul ";" aceast list ar trebui s conin calea ctre pachetul php_java.jar, altfel nu se pot utiliza clase Java; - java.home - reprezint numele directorului n care este instalat platforma Java; - java.library - reprezint calea ctre maina virtual Java care se dorete a fi ncrcat; - java.library.path - reprezinta o list de directoare n care pot fi gsite anumite pachete de clase Java, n plus dect cele cu care este configurat platforma Java; directoarele din aceast list sunt separate ntre ele prin caracterul ";" Valorile pentru aceste variabile se seteaz n fiierul php.ini n cadrul sectiunii [Java]. (in cazul meu am setat astfel valorile: [Java] java.class.path=c:\php\extensions\php_java.jar java.home=c:\j2sdk1.4.2_04 java.library=C:\j2sdk1.4.2_04\jre\bin\server\jvm.dll java.library.path=c:\php\extensions\ Cu aceste setri fcute, maina virtual Java poate fi ncrcat i clasele pot fi utilizate n cadrul script-urilor PHP. Utilizare Clasele Java se instaniaza n PHP folosind constructorul clasei Java explicat mai jos. Metodele i proprietile statice sau dinamice ale claselor instaniate se acceseaz folosind operatorul de indirectare "->". De exemplu, dac avem o variabil $clasa creia i-a fost ataat ca valoare o clas Java, atunci pentru a afia reprezentarea textual a acesteia trebuie s utilizm metoda toString() (metod specific tuturor claselor Java) vom utiliza o instruciune de forma: echo $clasa->toString(); Clasa Java Aceast clas se folosete pentru a rula o clas a limbajului Java i reprezint, de fapt, o clas derivat din clasa java.lang.Object a limbajului Java. Constructorul acesteia primete mai muli parametrii, dintre care primul este un ir de caractere care reprezint numele clasei Java care se instaniaz, iar restul de parametrii reprezint parametrii pentru care se va apela constructorul clasei respective. n cazul n care nu se reuete rularea unei clase a limbajului

Java este generat o excepie Java, iar pentru a verifica dac a fost generat o astfel de excepie se folosete funcia java_last_exception_get care este prezentat mai jos. n continuare este un exemplu de utilizare a clasei Java, cu care putei verifica dac ai instalat i configurat corect clasele Java.

Cod:

<?php $system = new Java("java.lang.System"); echo "Versiunea Java este: "; echo $system -> getProperty("java.version")."<br>"; echo "Sistem de operare: "; echo $system -> getProperty("os.name")."<br>"; echo "Versiunea: "; echo $system -> getProperty("os.version")."<br>"; ?>
Funcia java_last_exception_get Aceast funcie returneaz o clas Java derivat din clasa java.lang.Exception care reprezint ultima exceptie care a fost generat sau valoarea logic false dac nu a fost generat nici o excepie de la nceputul execuiei script-ului sau de la ultimul apel al funciei java_last_exception_clear. Funcia java_last_exception_get nu are parametri.

Cod:

<form action = "test.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>"; $int = new Java ("java.lang.Integer"); $sir = $_POST['sir']; $i = $int->parseInt($sir); $error = java_last_exception_get(); if ($error) { echo "Sirul \"".$sir."\" nu este un numar intreg."; java_last_exception_clear(); } else { echo "Sirul \"".$i."\" este un numar intreg."; } } ?>

Funcia java_last_exception_clear Aceast funcie nu are nici un parametru i nu returneaz nici o valoare, n schimb efectul aplicrii ei este acela c este anulat ultima excepie Java care a fost generat de ctre maina virtual Java n timpul executrii de cod. Apelul acestei funcii este necesar, deoarece, n cazul n care a fost generat o excepie i nu a fost tratat, se poate ntmpla ca dup apelul unei funcii s tratam excepia greit. Importana librriei php_java Pentru programatorii de pagini web care cunosc att limbajul Java, ct i limbajul PHP, prezena acestei librrii are o foarte mare importan. Funciile scrise n Java sunt executate de ctre procesor mult mai repede dect cele scrise n PHP, iar utilizarea codului Java ofer o mai mare siguran creatorilor de pagini web dinamice.

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 funcii necesare pentru prelucrarea mesajelor primite de ctre un server de mail n vederea utilizrii datelor coninute. Cu ajutorul acestor funcii se pot realiza aplicaii interesante cum sunt administrarea listelor de discuii, transmiterea unor tiri tuturor utilizatorilor nscrii pe o anumit list, difuzarea de nouti cu privire la diverse apariii etc. Despre configurarea php Pentru a putea utiliza funciile oferite de limbajul PHP pentru a trimite mesaje de pot electronic, pe sistemele de operare din familia Windows sau *NIX este necesar s se seteze corect interpretorul PHP prin intermediul fiierului php.ini localizat n directorul n care este instalat sistemul de operare, respectiv n directorul /etc pe sistemele *NIX. Funcia mail() trimite mesajele prin intermediul unui server SMTP (Simple Mail Transfer Protocol) care poate fi gzduit de server-ul pe care este instalat interpretorul PHP sau de ctre un alt server accesibil interpretorului. n fisierul php.ini trebuie adugate variabilele avnd numele SMTP, smtp_port, sendmail_from si sendmail_path, dac acestea nu exist, sau trebuie modificate valorile acestora. - Variabila SMTP reprezint ip-ul sau adresa server-ului de mesaje electronice. Dac aceast variabil lipseste, atunci, pentru sistemele de operare din familia Windows se va ncerca folosirea sistemului pe care se afl instalat interpretorul pentru a transmite mesaje electronice, iar pentru sistemele de operare din familia *NIX se vor folosi setrile implicite ale sistemului. - Variabila smtp_port reprezint portul pe care rspunde server-ul de mesaje electronice i are valoarea implicit 25, pentru sistemele de operare din familia Windows sau setarea implicit a sistemului, pentru sistemele de operare din familia *NIX. - Variabila sendmail_from reprezint adresa de mail a expeditorului. Valoarea acestei variabile este folosit numai pentru sistemele de operare din familia Windows, iar pe sistemele de operare din familia *NIX se folosete setarea implicit a sistemului. - Variabila sendmail_path reprezint calea ctre aplicaia care se ocup de transmiterea mesajelor pe sistemele de operare din familia *NIX. Funcia mail Aceast funcie se folosete pentru a transmite un mesaj de pot electronic la una sau mai

multe csue potale. Funcia mail are cinci parametri de tip ir de caractere, dintre care ultimii doi sunt opionali. - Primul parametru reprezint o list a tuturor csuelor potale, separate prin caracterul "," care reprezint destinatarii mesajului ce se va transmite. O csu potal din lista destinatarilor poate fi specificat utiliznd unul dintre urmtoarele formate: "nume_destinatar <adresa_email>" sau "adresa_email", unde nume_destinatar reprezint numele proprietarului csutei potale adresa_mail i poate fi irul vid, iar adresa_email reprezint adresa csuei potale i are formatul "nume_utilizator@domeniu", unde domeniu reprezint numele serverului care gzduiete csua potala a utilizatorului nume_utilizator. n cazul utilizrii primului format, pentru a specifica un destinatar pentru mesajul care se va trimite, este obligatorie folosirea caracterelor "<" i ">" nainte, respectiv dup cmpul adresa_email, iar dac valoarea cmpului nume_destinatar conine caracterul spaiu este necesar utilizarea caracterului " naintea acestuia i dup acesta. De exemplu, adresa "Alex <php4@as.ro>" este o adres valid pentru un mesaj de pot electronic. - Al doilea parametru reprezint subiectul mesajului care se va transmite. - Cel de-al treilea parametru reprezint coninutul mesajului ce va fi transmis. Pentru a putea trimite mesaje care conin ataamente 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). - Cel de-al patrulea parametru reprezint o list de linii de antet suplimentare, separate prin irul de caractere "\r\n" (sfrit de linie), pentru mesajul care va fi transmis. - Ultimul parametru reprezint o list de opiuni suplimentare pentru aplicaia care va fi folosit pentru a efectua trimiterea mesajului i este dependent de aceasta. Funcia returneaz valoarea logic TRUE dac s-a reuit trimiterea mesajului i valoarea logic FALSE n caz contrar. Un exemplu este prezentat mai jos: mail('"Alex" <php4@as.ro>', "Mesaj de test", "Acesta este un mesaj de test") or die("Nu se poate trimite mesajul"); PEAR PEAR (PHP Extension and Application Repository) reprezint un proiect demarat de echipa de programatori PHP. Scopul acestui proiect este de a oferi o bibliotec structurat de clase open-source tuturor utilizatorilor limbajului PHP. Aceast bibliotec ofer, printre multe altele, un set de clase care pot fi folosite pentru a putea transmite mesaje electronice care s conin atasamente i al cror coninut poate fi n format HTML n loc de text. Acest set de clase poate fi descrcat de la adresa http://pear.php.net/package/Mail_Mime Pentru a putea folosi setul de clase Mail_Mime trebuie instalat mai nti pachetul PEAR de baz care poate fi gsit la adresa http://pear.php.net/ n continuare este prezentat clasa Mail_Mime, cea mai important clas necesar pentru a codifica n format MIME astfel de mesaje. Clasa Mail_Mime Aceast clas se folosete pentru a construi mesaje electronice n format MIME. Clasa Mail_Mime are ase funcii membru a cror funcionalitate este prezentat n continuare i un constructor. Constructorul Mail_Mime creaz o instan a clasei i are un singur parametru de tip ir de caractere, care este opional. Acest parametru reprezint terminatorul de linie care va fi utilizat de ctre clasa pentru a ncheia fiecare linie din mesaj i are valoarea implicit "\r\n".

Funcia Mail_Mime::setTxtBody Aceast funcie seteaz coninutul text al unui mesaj pentru ca acesta s poat fi vizualizat n cadrul unui client de mail de tip text cum este cazul aplicaiei mail prezent pe sistemele de operare din familia *NIX. Aceast funcie are doi parametri. - Primul parametru este de tip ir de caractere i reprezint coninutul mesajului sau numele fiierului care conine mesajul n format text. - Cel de-al doilea parametru este de tip logic i este opional. Dac acest parametru are valoarea TRUE, atunci se va considera c primul parametru reprezint numele unui fiier, iar dac are valoarea FALSE, atunci se va considera c primul parametru reprezint coninutul mesajului. Valoarea implicit a acestui parametru este FALSE. Funcia setTxtBody returneaz valoarea logic TRUE dac a reuit s adauge la mesaj coninutul i o instan a clasei PEAR_Error n caz contrar. Funcia Mail_Mime::setHTMLBody Aceast funcie seteaz coninutul HTML al unui mesaj pentru ca acesta s poat fi vizualizat n cadrul unui client de mail de tip HTML cum este cazul aplicaiei OUTLOOK prezent pe sistemele de operare din familia Windows. Aceast funcie are doi parametri. - Primul parametru este de tip ir de caractere i reprezint coninutul mesajului sau numele fiierului care conine mesajul n format HTML. - Cel de-al doilea parametru este de tip logic i este opional. Dac acest parametru are valoarea TRUE, atunci se va considera c primul parametru reprezint numele unui fiier, iar dac are valoarea FALSE, atunci se va considera c primul parametru reprezint coninutul mesajului. Valoarea implicit este FALSE. Funcia setHTMLBody returneaz valoarea logic TRUE dac a reuit s adauge la mesaj coninutul i o instan a clasei PEAR_Error n caz contrar. Funcia Mail_Mime::addHTMLImage Aceast funcie se folosete pentru a aduga o imagine n corpul unui mesaj, n cazul n care coninutul n format HTML utilizeaz imagini integrate. Aceast funcie are patru parametri. - Primul parametru este de tip ir de caractere i reprezint coninutul imagini sau numele fiierului care conine imaginea. - Al doilea parametru este de tip ir de caractere, este opional i reprezint tipul coninutului. 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 opional i reprezint numele care va fi dat imaginii. n cazul n care primul parametru conine imaginea, atunci este necesar ca acest parametru s apar, n caz contrar se va folosi numele fiierului transmis ca valoare pentru primul parametru. - Cel de-al patrulea parametru este de tip logic i este opional. Dac acest parametru are valoarea TRUE, atunci se va considera c primul parametru reprezint numele unui fiier, iar dac are valoarea FALSE, atunci se va considera c primul parametru reprezint coninutul unei imagini. Valoarea implicit a acestui parametru este TRUE. Funcia addHTMLImage returneaz valoarea logic TRUE dac a reuit s adauge la mesaj coninutul i o instan a clasei PEAR_Error n caz contrar. Funcia Mail_Mime::addAttachement Aceast funcie se folosete pentru a aduga un fiier la un mesaj i are cinci parametri, dintre care primii patru au aceai semnificaie cu cei de la funcia precedent. Ultimul parametru este de tip ir de caractere, este opional i reprezinta tipul codificrii care va fi utilizat. Acest parametru are valoarea implicit "base64". Pentru fiiere ataate care nu sunt binare (ex. fiiere executabile, arhive...) se poate folosi valoarea "quoted-printable".

Functia Mail_Mime::headers Aceast funcie se folosete pentru a aduga linii de antet suplimentare la mesajul constituit de aceast clas. Funcia headers are un singur parametru de tip list, care are ca i chei numele cmpurilor antetelor i ca valori, valorile acestor cmpuri. Funcia returneaz o referin la o list de acelai tip care conine, pe lng elementele transmise ca parametru, i elementele adugate de aceast clas, pentru ca mesajul s fie recunoscut cum trebuie de ctre un client de mail. Aceast funcie nu poate fi apelat dup apelul funciei Mail_Mime::get. Functia Mail_Mime::get Aceast funcie se folosete pentru a obine coninutul mesajului electronic n format MIME, dup ce acesta a fost construit. Funcia get nu are nici un parametru i returneaz un ir de caractere care reprezint coninutul mesajului electronic codificat n format MIME. Pentru a transmite un mesaj folosind funcia mail prezentat i aceast clas, trebuie prelucrat irul liniilor de antet returnat de funcia Mail_Mime::headers astfel nct s se obin un ir de caractere, iar coninutul mesajului va fi constituit de irul de caractere rezultat n urma apelrii funciei Mail_Mime::get.

Informaii despre clasele ncrcate

n continuare sunt prezentate un set de funcii cu ajutorul crora se pot afla informaii despre clasele ncrcate ntr-un script. Funcia get_declared_classes Aceast funcie returneaz un tablou care conine numele tuturor claselor definite n momentul execuiei unui script PHP. Funcia class_exists Aceast funcie primete 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. Funcia get_parent_class Aceast funcie 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 funcia get_parent_class returneaz un ir de caractere care reprezint numele clasei care este printele direct al clasei al crui nume este dat de parametru. n cazul n care parametrul este de tip obiect, atunci funcia returneaz un ir de caractere care reprezint numele printelui direct al clasei a crei instan este reprezentat de obiectul dat ca parametru. Funcia is_a

Aceast funcie are doi parametri. Primul parametru este de tip obiect, iar al doilea este de tip ir de caractere. Funcia 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 obine valoarea logic TRUE. Funcia is_subclass_of Funcia is_subclass_of are aceiai parametri cu funcia anterioar. Funcionalitatea ei difer fa de funcia 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 crui nume este dat de cel de-al doilea parametru. n condiiile exemplului anterior, n urma apelului is_subclass_of(obj, "cls3") se va obine valoarea logic FALSE. Funcia get_class_methods Aceast funcie are un parametru care poate fi de tip ir de caractere care reprezint numele unei clase sau de tip obiect. Funcia get_class_methods returneaz un tablou ale crui 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 funcia returneaz valoarea logic FALSE. Functia get_class_vars Aceast funcie are un singur parametru de tip ir de caractere care reprezint numele unei clase i returneaz un tablou ale crui elemente sunt de tip ir de caractere i care reprezint valorile implicite ale variabilelor definite n cadrul clasei. Tabloul rezultat n urma apelului acestei funcii este indexat dup numele variabilelor definite n cadrul clasei. Funcia get_class Aceast funcie primete ca parametru un obiect i returneaz numele clasei care reprezint tipul obiectului primit ca parametru. Funcia get_object_vars Aceast funcie are un singur parametru de tip obiect i returneaz un tablou ale crui elemente sunt de tip ir de caractere i care reprezint valorile variabilelor definite n cadrul acestuia. Tabloul rezultat n urma apelului acestei funcii este indexat dup numele variabilelor definite n cadrul obiectului. Funcia get_object_vars se aseamn foarte mult cu funcia get_class_vars. Functia call_user_method Aceast funcie realizeaz apelul unei metode care aparine unei clase sau unui obiect cu parametrii specificai. Funcia call_user_method are mai muli 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 crui nume este dat de acest parametru. Restul parametrilor reprezint parametrii cu care se va apela metoda al crui nume este dat de primul parametru. Funcia call_user_method_array Aceast funcie are aceeai funcionalitate cu funcia anterioar cu diferena c are doar trei parametri, iar al treilea parametru este un tablou unidimensional care conine parametrii cu care se va apela metoda dat de primul parametru pentru clasa sau obiectul reprezentat de cel de-al doilea parametru. Funcia eval Aceast funcie primete ca parametru un ir de caractere care reprezint o secven de cod PHP i realizeaz execuia acestuia. Funcia dl Aceast funcie realizeaz ncrcarea n timpul execuiei script-ului a unor extensii externe, dac acest lucru este permis de setrile interpretorului PHP. Funcia dl primete ca parametru un ir de caractere care reprezint calea ctre extenia care trebuie ncrcat i returneaz valoarea logic TRUE dac s-a reuit ncrcarea extensiei i valoarea logic FALSE n caz contrar. Funcia extension_loaded Aceast funcie verific dac o anumit extensie este ncarcat. Funcia primete un parametru de tip ir de caractere care reprezint numele unei extensii i returneaz o valoare logic corespunztoare. Funcia get_declared_classes Funcia get_declared_classes nu are nici un parametru i returneaz un tablou unidimensional care conine numele tuturor claselor ncrcate n mediul de execuie n momentul apelrii 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 aplicaie care monitorizeaz accesrile unei pagini web i afieaz rezultatul sub forma unei imagini. Pentru a profita de aceast facilitate n limbajul PHP trebuie activat mai nti biblioteca php_gd2. Acest lucru se face prin adugarea urmtoarei linii (dac nu exist deja) n fiierul de configurare php.ini (pentru sistemele Windows): extension = php_gd2.dll n acest moment sunt disponibile funciile de prelucrare i generare dinamic de imagini. Aceast librrie permite adugarea de text n cadrul imaginilor generate i ofer suport pentru

imagini n mai multe formate. Pentru a obine imagini de calitate foarte bun, aceast bibliotec ofer suport integrat pentru bibliotecile FreeType 1, FreeType 2 i T1Lib, care au ca scop ncrcarea i desenarea font-urilor independent de platform. Formate de imagini suportate Pentru a afla ce formate de imagini suport biblioteca instalat (n funcie de versiunea PHP) se poate executa funcia gd_info().

Cod:

<?php var_dump(gd_info()); ?>


Citat:

array(12) { ["GD Version"]=> string(27) "bundled (2.0.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 funcie l reprezint un vector cu mai multe componente. Se poate observa c printre aceste componente se afl versiunea bibliotecii i facilitile oferite. Formatele de imagini suportate de biblioteca php_gd2 sunt GIF, JPG, PNG, WBMP i XBM (XPM). Se observ c biblioteca folosit nu permite salvarea imaginilor n format GIF. Crearea dinamica a imaginilor Pentru a crea imagini n mod dinamic avem la dispoziie dou opiuni. Putem crea o imagine care este bazat pe o palet de culori (pentru acest tip de imagini avem la dispoziie doar 256

de culori cu care putem opera) sau putem crea o imagine cu un numr neprecizat de culori (true color). Funciile cu ajutorul crora putem crea imagini sunt: - imagecreate - aceast funcie creaz o imagine goal care este bazat pe o palet de culori; primete ca parametru dou numere ntregi care reprezint dimensiunile imaginii (limea i nlimea) i returneaz o variabil de tipul resource care reprezint identificatorul de acces la imaginea nou creat; - imagecreatetruecolor - aceast funcie creaz o imagine care are fundalul negru i un numr nedefinit de culori; primete ca parametri dou numere ntregi care reprezint dimensiunile imaginii (limea i nlimea) i returneaz o variabil de tipul resource care reprezint identificatorul de acces la imaginea nou creat. Trebuie avut n vedere, c pentru a afia o imagine dinamic pe o pagin web trebuie realizat o pagin care are un element IMG al crui atribut src s indice calea ctre script-ul PHP care creeaz imaginea.

Cod:

// pagina web contine: <HTML> <TITLE> Imagine dinamica </TITLE> <BODY> <IMG src="imagine.php"> </BODY> </HTML> <?php // pagina imagine.php contine: header("Content-type: image/png"); $img = imagecreate(100,100); $fundal = imagecolorallocate($img, 150, 200, 100); imagepng($img); imagedestroy($img); ?>
Mai jos avei un exemplu al scriptului prezentat mai sus:

ncrcarea imaginilor Biblioteca permite, de asemenea, citirea de imagini aflate la o anumit locaie i ncrcarea acestora n memorie pentru prelucrare i, eventual, publicare. Funciile care ncarc imagini deja existente sunt: - imagecreatefromgif - aceast funcie primete ca parametru o cale spre un fiier, care se poate afla i la distan, i returneaz o variabil de tipul resource care reprezint identificatorul de acces la imaginea de tipul GIF ncrcat;

- imagecreatefromjpeg - aceast funcie primete ca parametru o cale spre un fiier, care se poate afla i la distan, i returneaz o variabil de tipul resource care reprezint identificatorul de acces la imaginea de tipul JPG ncrcat; - imagecreatefrompng - aceast funcie primete ca parametru o cale spre un fiier, care se poate afla si la distan, i returneaz o variabil de tipul resource care reprezint identificatorul de acces la imaginea de tipul PNG ncrcat; - imagecreatefromwbmp - aceast funcie primete ca parametru o cale spre un fiier, care se poate afla i la distan, i returneaz o variabil de tipul resource care reprezint identificatorul de acces la imaginea de tipul WBMP ncrcat; - imagecreatefromxbm - aceast funcie primete ca parametru o cale spre un fiier, care se poate afla i la distan, i returneaz o variabil de tipul resource care reprezint identificatorul de acces la imaginea de tipul XBM ncrcat; - imagecreatefromxpm - aceast funcie primete ca parametru o cale spre un fiier, care se poate afla i la distan, i returneaz o variabil de tipul resource care reprezint identificatorul de acces la imaginea de tipul XPM ncrcat; - imagecreatefromstring - aceast funcie primete ca parametru un ir de caractere care conine reprezentarea binar a unei imagini, i returneaz o variabil de tipul resource care reprezint identificatorul de acces la imaginea ncrcat.

Cod:

<?php header("Content-type: image/png"); $im=imagecreatefrompng("images/logo.png"); imagepng($im); imagedestroy($im); ?>


i exemplul concret l vedei mai jos:

Desenarea de imagini Pentru a desena pe o imagine creat dinamic sau ncrcat dintr-un fiier avem la dispoziie mai multe funcii: - imagearc - deseneaz pe o imagine un arc de elips; primete ca parametri identificatorul de acces la imaginea pe care se va desena, coordonata x a centrului elipsei, coordonata y a centrului eclipsei, lungimea i nlimea elipsei, unghiurile de start i de stop ale arcului i culoarea cu care se va desena; desenarea se face n sens trigonometric; - imagefilledarc - deseneaz pe o imagine un arc de elips haurat; are aceeai parametri cu funcia anterioar la care se mai adaug unul care reprezint stilul haurii i care poate avea valorile: IMB_ARC_PIE, IMG_ARC_CHORD, IMG_ARC_NOFILL, IMG_ARC_EDGED; - imageline - deseneaz o linie pe imagine; primete ca parametri identificatorul de acces al imaginii pe care se va desena, coordonata x a primului capt de linie, coordonata y a primului capt de linie, coordonata x a celui de-al doilea capt, coordonata y a celui de-al doilea capt i culoarea cu care se va desena linia; - imagedashedline - deseneaz o linie punctat pe o imagine; are aceeai parametri ca funcia anterioar i va folosi stilul implicit sau cel setat de utilizator. - imagesetthickness - seteaz grosimea cu care se vor trasa liniile pentru o anumit imagine; primete ca parametri identificatorul de acces al imaginii i un numr ntreg care reprezint grosimea cu care se vor desena liniile pe imagine;

- imageellipse - deseneaz o elips pe o imagine; primete ca parametri identificatorul de acces al imaginii pe care se va desena, coordonata x i y a centrului elipsei, lungimea i nlimea elipsei i culoarea cu care se va desena; - imagefilledellipse - deseneaz o elips plin; are aceeai parametri cu funcia anterioar; - imagepolygon - deseneaz un poligon pe o imagine; primete ca parametri identificatorul de acces al imaginii pe care se va desena poligonul, un tablou ale crui elemente sunt numere ntregi i reprezint coordonatele punctelor poligonului care se va desena, numrul de puncte ale poligonului i culoarea cu care se va desena; tabloul cu punctele poligonului conine pe pozitiile pare coordonatele x ale punctelor, iar pe pozitiile impare coordonatele y ale punctelor; - imagefilledpolygon - deseneaz un poligon plin; are aceeai parametri cu funcia anterioar; - imagerectangle - deseneaz un dreptunghi pe o imagine; primete ca parametri identificatorul de acces al imaginii pe care se va desena, coordonata x i y a colului din partea stng-sus a dreptunghiului, coordonata x i y a colului din partea dreapta-jos a dreptunghiului i culoarea cu care se va desena; - imagefilledrectangle - deseneaz un dreptunghi plin; are aceeai parametri cu funcia anterioar; - imagefill - umple cu o culoare o zon de pe imagine care are aceeai culoare cu cea a punctului care se afl la coordonatele specificate ca parametru; primete ca parametri identificatorul de acces al imaginii pe care se va face umplerea, coordonata x a unui punct din zona care se va umple cu culoare, coordonata y a punctului i culoarea cu care se va umple. - imagefilltoborder - umple cu o culoare o zon de pe imagine care este mrginit de o culoare specificat ca parametru; primete ca parametri identificatorul de acces al imaginii pe care se va face umplerea, coordonata x a unui punct din zona care se va umple cu culoare, coordonata y a punctului, culoarea punctelor cu care este mrginit zona i culoarea cu care se va umple; - imagesetpixel - schimb culoarea unui punct de pe o imagine; primete ca parametri identificatorul de acces al imaginii, coordonata x a punctului a crui culoare se va schimba, coordonata y a punctului i noua culoare a acestuia; - imagecolorat - returneaz culoarea unui anumit punct de pe imagine; primete ca parametri identificatorul de acces al imaginii, coordonata x a punctului i coordonata y a punctului; - imagecolorallocate - primete ca parametri identificatorul de acces al unei imagini, o valoare pentru componenta rou a unei culori, o valoare pentru componenta verde a unei culori i o valoare pentru componenta albastru a unei culori i returneaz un numr ntreg care reprezint culoarea avnd cele trei componente; n cazul n care imaginea se bazeaz pe o palet de culori, atunci se returneaz indicele culorii din palet; dac n paleta de culori nu exist o culoare care s aib toate cele trei componente, atunci ea este adaugat la paleta de culori a imaginii; - imagecolordeallocate - primete ca parametri identificatorul de acces al unei imagini i o culoare; n cazul n care imaginea specificat ca parametru se bazeaz pe o palet de culori, atunci culoarea este eliminat din palet.

Cod:

<?php header("Content-type: image/png"); $im = imagecreate(250,250); $red = imagecolorallocate ($im,255,0,0); $blue = imagecolorallocate ($im,0,0,255); $green = imagecolorallocate ($im,0,255,0); $yellow = imagecolorallocate ($im,255,255,0); $cyan = imagecolorallocate ($im,0,255,255); $magenta = imagecolorallocate ($im,255,0,255); imagefill($im,229,229,$cyan); imagefill($im,30,100,$magenta); imagefill($im,80,160,$yellow); imagefilledrectangle($im,0,0,50,100,$red); imagefilledellipse($im,100,100,50,50,$green);

imagesetthickness($im,3); $poly = array(10,10,200,50,255,100,150,200,100,75,50,50); imagefilledpolygon($im,$poly,6,$blue); imageline($im,0,229,229,0,$red); imagepng($im); imagedestroy($img); ?>


Rezultatul exemplului l vedeti mai jos:

Scrierea textului pe imagini n continuare sunt prezentate cteva funcii utilizate pentru a scrie un text sau un caracter pe o imagine. Funcia imagechar Aceast funcie scrie pe o imagine primul caracter al unui ir de caractere. Funcia imagechar are ase parametri: - primul parametru este identificatorul de acces la imaginea pe care se va desena - cel de-al doilea parametru reprezint identificatorul de acces la font-ul care va fi folosit pentru a scrie caracterul pe imagine. Acest identificator este de tip numr ntreg i poate avea valorile predefinite 1, 2, 3, 4 sau 5 sau poate fi un numr returnat de o funcie care ncarc un font de pe disc. - cel de-al treilea parametru reprezint coordonata x a colului stnga-sus de unde va ncepe scrierea caracterului; - cel de-al patrulea parametru reprezint coordonata y a colului stnga-sus de unde va ncepe scrierea caracterului; - al cincilea parametru reprezint irul de caractere din care va fi scris doar primul caracter; - cel de-al aselea parametru reprezint culoarea cu care se va scrie pe imagine.

Cod:

<?php header("Content-type: image/png"); $im = imagecreate(100,100); $fundal = imagecolorallocate($im, 0, 0, 225);

$verde = imagecolorallocate ($im,0,255,0); imagechar($im, 5, 15, 10, 'a', $verde); imagepng($im); imagedestroy($im); ?>
Rezultatul este:

Funcia imagecharup Aceast funcie scrie un caracter vertical pe o imagine. Are aceeai parametri ca funcia anterioara.

Cod:

<?php header("Content-type: image/png"); $im = imagecreate(100,100); $fundal = imagecolorallocate($im, 0, 0, 225); $verde = imagecolorallocate ($im,0,255,0); imagecharup($im, 5, 15, 10, 'a', $verde); imagepng($im); imagedestroy($im); ?>
Rezultatul codului de mai sus:

Funcia imagestring Aceast funcie scrie un text pe o imagine i are aceeai parametri ca funcia imagechar.

Cod:

<?php header("Content-type: image/png"); $im = imagecreate(100,100); $fundal = imagecolorallocate($im, 0, 0, 225); $verde = imagecolorallocate ($im,0,255,0);

imagestring($im, 5, 15, 10, 'test', $verde); imagepng($im); imagedestroy($im); ?>


Rezultatul:

Funcia imagestringup Aceast funcie scrie vertical un text pe o imagine i are aceeai parametri ca funcia imagechar.

Cod:

<?php header("Content-type: image/png"); $im = imagecreate(100,100); $fundal = imagecolorallocate($im, 0, 0, 225); $verde = imagecolorallocate ($im,0,255,0); imagestringup($im, 5, 15, 40, 'test', $verde); imagepng($im); imagedestroy($im); ?>
Rezultatul este:

Funcia imagerotate Aceast funcie 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 crui laturi sunt paralele cu axele Ox i Oy i care conine imaginea rotit. Funcia are trei parametri: - primul reprezint identificatorul de acces la imagine; - al doilea este de tip real i reprezint unghiul cu care se va roti imaginea; - al treilea parametru este de tip ntreg i reprezint culoarea cu care se va umple dreptunghiul care va conine imaginea rotit. Funcia imagerotate returneaz un identificator de acces la imaginea rotit.

Cod:

<?php header("Content-type: image/png"); $im = imagecreate(100,100); $fundal = imagecolorallocate($im, 0, 0, 225); $verde = imagecolorallocate ($im,0,255,0); imagestringup($im, 5, 55, 40, 'test', $verde); $imrot = imagerotate($im, 45, $verde); imagepng($imrot); imagedestroy($imrot); ?>
i rezultatul din exemplul de mai sus este:

Funcia imagetruecolorpalette Aceast funcie realizeaz transformarea unei imagini care nu folosete o palet de culori ntro imagine care folosete o palet de culori. Funcia imagetruecolorpalette are trei parametri: - primul reprezint identificatorul de acces al imaginii care va fi transformat; - cel de-al doilea parametru este de tip logic i reprezint modul n care se va face transformarea: dac imaginea va fi fr zgomot (valoarea logic FALSE implic o aproximare mai slab a culorilor); dac imaginea va fi cu zgomot (valoarea TRUE implic o aproximare mai bun a culorilor); Funcia jpeg2wbmp Aceast funcie transform o imagine din formatul JPEG n formatul WBMP. Funcia are cinci parametri. Primul parametru reprezint calea spre fiierul de tip JPEG care va fi transformat. Al doilea parametru reprezint calea spre fiierul care va conine rezultatul transformrii. Urmtorii doi parametri sunt de tip ntreg i reprezint nlimea i limea noii imagini, iar ultimul parametru, tot de tip ntreg, reprezint pasul cu care se va parcurge imaginea pentru a fi transformat. Funcia png2wbmp Aceast funcie transform o imagine din formatul PNG n formatul WBMP. Are aceeai parametri ca funcia anterioar, cu observaia c primul parametru reprezint calea spre un fiier de tipul PNG. Funcia imageinterlace Aceast funcie seteaz proprietatea interlace a unei imagini la valoarea logic precizat ca parametru sau la valoarea logic TRUE dac acest parametru lipsete. Aceast funcie este

foarte important n cazul n care dorii ca site-ul vostru s aib o navigabilitate bun, chiar dac nu s-au ncrcat integral toate elementele grafice prezente n cadrul lui. n cazul n care avei o vitez de acces la internet mic sau imaginea pe care dorii s o ncrcai este mare, nu este nevoie s ateptai ncrcarea ntregii imagini pentru a vedea ce este n ea. O astfel de imagine se ncarc adaptiv, i n momentul n care s-a ncheiat transferul imaginii ctre browser, pe imagine se pot observa toate detaliile. De fapt, teoretic vorbind, o imagine este mprit n subimagini de aceeai dimensiune i calitate diferit (din ce n ce mai bun), care suprapuse dau ca rezultat imaginea iniial. Practic nu se ntmpl chiar aa, dar efectul obinut este cel precizat anterior. Funcia are doi parametri. Primul parametru reprezint identificatorul de acces la imaginea pentru care se dorete setarea proprietii interlace, iar al doilea parametru este de tip logic i reprezint valoarea pe care o va avea aceast proptietate. Cel de-al doilea parametru poate lipsi, dar proprietatea interlace atribuit unei imagini va primi valoarea TRUE. Publicarea n diverse formate Pentru a publica o imagine generat dinamic se poate utiliza una dintre funciile: imagegif, imagepng, imagejpeg sau imagewbmp. Aceste funcii primesc ca parametru un identificator de imagine i tipresc la ieirea standard imaginea n format GIF, PNG, JPEG sau WBMP. Primele trei funcii se folosesc pentru a genera o imagine care s poata fi vizualizat ntr-un browser ncrcat de pe un calculator, iar ultima se folosete pentru ca imaginea generat s poata fi vizualizat n cadrul unui browser care suport WAP.

Funcii 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. Funcia mysql_connect Aceast funcie realizeaz conectarea la un server MySQL. Funcia mysql_connect primete cinci parametri opionali: - primul reprezint numele server-ului MySQL i dac lipsete se ncearc conectarea la calculatorul curent. - cel de-al doilea reprezint numele utilizatorului i n caz c acesta lipsete se folosete valoarea root ca nume de utilizator. - al treilea parametru reprezint parola utilizatorului i n caz c lipsete se folosete irul vid n momentul conectrii la server. - al patrulea parametru este de tip logic i are rolul de a indica motorului PHP c n cazul n care exist o conexiune la acelai server s se mai creeze nc una n loc s se reutilizeze cea existent. - ultimul parametru este de tip ntreg i reprezint proprietile pe care le va avea conexiunea. Acest ultim parametru poate fi o combinaie a valorilor: a) MYSQL_CLIENT_COMPRESS - indic server-ului c va trebui s trimit date comprimate. b) MYSQL_CLIENT_IGNORE_SPACE - indic server-ului MySQL faptul c va trebui s ignore spaiile care urmeaz dup numele funciilor. c) MYSQL_CLIENT_INTERACTIVE - indic server-ului MYSQL s nu nchid conexiunea dup scurgerea unui anumit interval de timp n care script-ul nu a emis cereri ctre acesta. Funcia mysql_connect returneaz valoarea logic FALSE n cazul n care a euat conectarea la server-ul de baze de date i un identificator de acces la conexiunea ctre server-ul MySQL n

cazul n care conectarea a reuit. n continuare sunt prezentate 2 modaliti de conectare la un server MySQL:

Cod:

<?php // varianta 1 $conectare = mysql_connect("nume_server", "user", "parola"); if ($conectare === FALSE) { echo "Conectare esuata."; } else { echo "Conexiune stabilita."; } mysql_close($conectare); // varianta 2 $conectare = mysql_connect("nume_server", "user", "parola") or die("Con ectare esuata."); mysql_select_db("nume_tabel", $conectare) or die("Nu se poate alege baza de date!"); $interogare = "SELECT * FROM nume_tabel"; $resultat = mysql_query($interogare) or die("Nu se poate executa intero garea!"); // afisare rezultat // ... // inchidere conexiune mysql_close($conectare); ?>
Funcia mysql_close Aceast funcie primete ca parametru un identificator de acces la o conexiune spre un server MySQL i realizeaz nchiderea acesteia. Funcia mysql_ping Funcia mysql_ping verific dac server-ul de MySQL a nchis conexiunea sau nu. 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. Funcia mysql_create_db Aceast funcie este utilizat pentru a crea o nou baz de date pe server-ul MySQL. Funcia are doi parametri. Primul este de tip ir de caractere i reprezint numele bazei de date care va fi creat, iar cel de-al doilea parametru reprezint identificatorul de acces la conexiunea ctre server-ul MySQL. Funcia returneaz valoarea logic TRUE n cazul n care a reuit s creeze baza de date i valoarea logic FALSE n caz contrar. Funcia mysql_drop_db

Aceast funcie este folosit pentru a terge o baz de date. Funcia mysql_drop_db are doi parametri. Primul este de tip ir de caractere i reprezinta numele bazei de date care va fi tears, iar cel de-al doilea parametru reprezint identificatorul de acces la conexiunea ctre server-ul MySQL. Funcia returneaz valoarea logic TRUE n cazul n care s-a reuit tergerea bazei de date i valoarea logic FALSE n caz contrar. Funcia mysql_select_db Aceast funcie seteaz baza de date pentru o conexiune ctre un server MySQL pentru interogrile care vor urma. Funcia mysql_select_db are doi parametri. Primul este de tip ir de caractere i reprezint numele bazei de date care va fi folosit pentru interogrile ulterioare, iar cel de-al doilea parametru reprezint identificatorul de acces la conexiunea ctre serverul MySQL. Funcia returneaz valoarea logic TRUE n cazul n care s-a reuit 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. Funcia mysql_query Aceast funcie se folosete pentru a interoga o anumit baza de date. Funcia are 3 parametri: - primul este de tip ir de caractere i reprezint cererea emis server-ului MySQL; - al doilea parametru reprezint identificatorul de acces al unei conexiuni ctre server; - al treilea parametru este opional i de tip ntreg i reprezint modul n care va fi returnat rezultatul. Ultimul parametru poate avea valorile MYSQL_USE_RESULT sau MYSQL_STORE_RESULT. n cazul n care ultimul parametru lipsete, pentru interogare se va folosi valoarea MYSQL_STORE_RESULT, iar rezultatul primit va fi stocat n zone tampon pn cnd va fi utilizat. Dac, pentru ultimul parametru, se folosete valoarea MYSQL_USE_RESULT, atunci rezultatul primit nu va fi stocat, deoarece va fi procesat imediat dup apelul funciei. Utilizarea funciei folosind valoarea MYSQL_USE_RESULT pentru ultimul parametru are acelai efect cu aplicarea funciei mysql_unbuffered_query fr a folosi ultimul parametru. Funcia 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, SHOW, EXPLAIN i DESCRIBE i nu a aparut nici o eroare, iar n cazul apariiei unei erori, este returnat valoarea logic FALSE. n cazul n care funcia mysql_query este apelat pentru o interogare care nu presupune primirea unui rezultat, este returnata valoarea logic TRUE i valoarea logic FALSE n cazul apariiei unei erori. n continuare avei un exemplu de interogare a unei baze de date. n exemplu se face selecia primelor 10 nregistrri din tabel:

Cod:

<?php $conectare = mysql_connect("localhost","root","parola") or die("Nu sa p utut efectua conectarea la bd."); mysql_select_db("nume_tabel", $conectare) or die("Nu se poate selecta t abelul din bd!"); $interogare = "SELECT * FROM nume_tabel LIMIT 0,10"; $rezultat = mysql_query($interogare) or die("Nu se poate executa intero garea!"); while ($rand = mysql_fetch_array($rezultat, MYSQL_BOTH)) { echo '<br />'.$rand['coloana_X']; } mysql_free_result($rezultat);

mysql_close($conectare); ?>
Funcia mysql_unbuffered_query Aceast funcie se folosete pentru a interoga o anumit baz de date i are aceeai parametri cu funcia anterioar. Diferena dintre aceast funcie i mysql_query este aceea c, n cazul funciei mysql_unbuffered_query, dac ultimul parametru lipsete, se folosete la interogarea bazei de date valoarea MYSQL_USE_RESULT. Funcia mysql_real_escape_string Aceast funcie este util n momentul n care se dorete introducerea n cadrul unei interogri a unui ir de caractere care nu poate fi interpretat corect de ctre server-ul MySQL i realizeaz transformarea irului ntr-unul care poate fi interpretat. Funcia mysql_real_escape_string are doi parametri. Primul este de tip ir de caractere i reprezint irul care va fi transformat, iar cel de-al doilea reprezint identificatorul de acces la o conexiune ctre un server MySQL. Funcia returneaz un ir de caractere care poate fi interpretat corect de ctre server-ul MySQL. De exemplu, dac apelm aceast funcie pentru irul de caractere "D'apoi" vom obine rezultatul "D\'apoi", deoarece caracterul ' (apostrof) are o alt semnificaie pentru server-ul MySQL dac nu e precedat de caracterul "\". Funcia mysql_free_result Aceast funcie se folosete pentru a elibera memoria alocat stocrii unui rezultat primit n urma unei interogari de la un server MySQL. Funcia mysql_free_result are un singur parametru, i anume o variabil de tip resurs a crei valoare a fost setat folosind una dintre funciile mysql_query sau mysql_unbuffered_query. Funcia returneaz valoarea logic TRUE n cazul n care a reuit s elibereze memoria utilizat de variabila de tip resurs primit ca parametru i valoarea logic FALSE n caz contrar. Funcia mysql_num_rows Aceast funcie returneaz numrul de nregistrri coninute de ctre un rezultat primit de la server-ul MySQL. Funcia mysql_num_rows are un singur parametru, i anume o variabil de tipul resurs a crei valoare a fost setat folosind una dintre funciile mysql_query sau mysql_unbuffered_query. Funcia returneaz un numr ntreg care reprezint numrul de nregistrri coninute de variabila de tip resurs primit ca parametru. n continuare este un exemplu de utilizare a acestei funcii. n exemplu se afieaz numrul total de nregistrri din tabel.

Cod:

<?php $conectare = mysql_connect("localhost", "user", "parola") or die("Nu se poate conecta la server"); mysql_select_db("nume_bd", $conectare) or die("Nu se poate selecta baza de date"); $rezultat = mysql_query("SELECT * FROM nume_tabel", $conectare) or die("Nu se poate face interogarea la baza de date"); $total = mysql_num_rows($rezultat); echo "In tabel exista ".$total." inregistrari in acest moment."; mysql_free_result($rezultat);

mysql_close($conectare); ?>
Funcia mysql_info Aceast funcie returneaz un ir de caractere care conine informaii referitoare la ultima interogare a unei baze de date n urma creia nu s-a primit nici un rezultat, cum este cazul funciilor INSERT sau UPDATE. Funcia mysql_info are un singur parametru care reprezint identificatorul de acces al unei conexiuni spre un server MySQL. Funcia mysql_affected_rows n cazul interogrilor n urma crora nu se obine nici un rezultat, se poate folosi funcia mysql_affected_rows pentru a verifica numrul de nregistrri care au fost actualizate la ultima nterogare a bazei de date, pentru celelalte tipuri de interogri putndu-se folosi funcia mysql_num_rows. Funcia mysql_affected_rows are un singur parametru care reprezint identificatorul de acces al unei conexiuni spre un server MySQL i returneaz un numr ntreg, care reprezint numrul de nregistrri actualizate la ultima interogare a bazei de date. Funcia mysql_fetch_array Aceast funcie transform o nregistrare dintr-un rezultat primit de la server-ul MySQL ntr-o list. Funcia mysql_fetch_array colecteaz datele referitoare la nregistrarea curent i le returneaz sub forma unei liste ale crui elemente pot fi accesate folosind numele cmpurilor, numrul lor de ordine sau folosind ambele moduri. Dac nu mai sunt nregistrri de prelucrat, funcia returneaz valoarea logic FALSE. Aceast funcie are doi parametri: - primul parametru este de tipul resurs, a crui valoare a fost setat folosind una dintre funciile mysql_query sau mysql_unbuffered_query; - al doilea parametru este opional, este de tip ntreg i reprezint modul n care sa face transformarea. Cel de-al doilea parametru poate avea una din valorile urmtoare: - MYSQL_ASSOC - elementele din lista rezultat pot fi accesate folosind doar numele cmpurilor; - MYSQL_NUM - elementele din lista rezultat pot fi accesate folosind doar numerele de ordine ale cmpurilor; - MYSQL_BOTH - elementele din lista rezultat pot fi accesate folosind ambele moduri prezentate anterior; Funcia mysql_fetch_assoc Aceast funcie transform o nregistrare dintr-un rezultat primit de la server-ul MySQL ntr-o list i are acelai efect cu cel al folosirii funciei mysql_fetch_array, folosind pentru cel de-al doilea parametru valoare MYSQL_ASSOC. Funcia mysql_fetch_num Aceast funcie transform o nregistrare dintr-un rezultat primit de la server-ul MySQL ntr-o list i are acelai efect cu cel al folosirii funciei mysql_fetch_array, folosind pentru cel de-al doilea parametru valoarea MYSQL_NUM. Funcia mysql_stat

Aceast funcie returneaz un ir de caractere care reprezint statusul server-ului MySQL i are un singur parametru care reprezint identificatorul de acces la o conexiune ctre un server MySQL.

Cod:

<?php $conectare = mysql_connect("localhost", "user", "parola") or die("Nu se poate conecta la server"); $stare = explode(' ', mysql_stat($conectare)); print_r($stare); mysql_close($conectare); ?>

Utilizarea irurilor

Secvene escape Pentru a include caractere speciale n cadrul irurilor trebuie s folosii anumite secvene escape. n tabelul de mai jos este prezentat setul de secvene escape folosit n PHP. Secvena escape \n \r \t \\ \$ \" \xxx \xnn Semnificaie salt la linie nou retur de car caracter de tabulare pe orizontal backslah simbolul dolarului ghilimele duble caracterul asociat valorii ASCII xxx, exprimat sub forma unui numr n octal caracterul asociat valorii ASCII xxx, exprimat sub forma unui numr n hexazecimal

n afar de ultimile dou secvene din tabelul de mai sus, celelalte au fost prezentate n articolul Cteva informaii despre documentarea i depanarea unui script. Fiecare dintre aceste secvene escape folosete un cod ASCII (American Standard Code for Information Interchange) pentru reprezentarea unui caracter. Codurile ASCII sunt valori ntregi, care sunt cuprinse ntre 0 i 255; fiecare liter sau simbol folosit frecvent n limbile vest-europene are asociat un cod ASCII. De exemplu, codul ASCII asociat literei A este 65, iar codul asociat cifrei 1 este 49. Pentru \xxx puteti folosi reprezentarea n octal (baza 8) a unui cod ASCII pentru specificarea caracterului corespunztor. De exemplu, valoarea zecimal 65 (care este codul ASCII al literei A) poate fi reprezentat n octal sub forma 101. Ca atare, puteti reprezenta litera A folosind secvena escape "\101". Pentru \xnn putei folosi reprezentarea n hexazecimal (n baza 16). Pentru valoarea zecimal 65 poate fi reprezentat n hexazecimal cu nr 41. Deci putei scrie "\41". Utilizarea codurilor ASCII n tabelul de mai jos sunt prezentate cteva funcii PHP folosite la utilizarea codurilor ASCII. Iat un scurt exemplu de utilizare a funciei ord() pentru a determina codul ASCII corespunztor unui anumit caracter:

$caracter="A"; $numar=ord($caracter); echo "<br>Valoarea ASCII a caracterului ".$caracter." este ".$numar; Datele de ieire ale acestui exemplu sunt: Valoarea ASCII a caracterului A este 65 Funcie chr(n) dechex(n) decoct(n) hexdec(n) octdec(n) ord(c) Descriere Returneaz Returneaz n. Returneaz Returneaz n. Returneaz Returneaz

caracterul avnd codul ASCII dat de n. valoarea hexazecimal echivalent cu valoarea zecimal dat de valoarea n octal echivalent cu valoarea zecimal dat de n. valoarea zecimal echivalent cu valoarea hexazecimal dat de valoarea zecimal echivalent cu valoarea n octal dat de n. codul ASCII echivalent caracterului c.

n continuare este un exemplu care afieaz echivalenele n zecimal, octal, respectiv hexazecimal al caracterelor ASCII ale cror coduri sunt cuprinse ntre 32 i 127:

Cod:

<?php for ($i=32; $i<128; $i++) { $c=chr($i); $octal=decoct($i); $hex=dechex($i); echo "<br>Nr. zecimal= $i - octal= $octal - hexa=$hex - caracter ec hivalent=$c"; } ?>
Pentru caracterul cu nr 32 caracterul echivalent este un spaiu. irurile delimitate ntre ghilimele simple Dac dorii, putei scrie un ir ntre ghilimele simple, nu neaprat duble. Un motiv n acest sens l constituie facilitatea posibilitii de includere a ghilimelelor duble. Exemplu: echo "<img src=\"pixel.php\" alt=\"\" height=\"1\" width=\"1\">"; Acest ir poate fi scris i astfel: echo '<img src="pixel.php" alt="" height="1" width="1">'; irurile delimitate ntre ghilimele simple se comport ntr-un mod diferit fa de irurile delimitate prin ghilimele duble: - Singurele secvene escape permise n cadrul irurilor delimitate prin ghilimele simple sunt \\ i \'. - Nu se execut substituia variabilelor atunci cnd datele de ieire sunt reprezentate printr-un ir delimitat prin ghilimele simple. n consecin dac folosii ghilimele simple ca n exemplul urmtor:

$x = "test"; echo 'x este $x'; datele de ieire vor arta aa: x este $x. Pentru a evita astfel de situai preferabil e s folosii ghilimele duble sau afiarea valorilor din variabile n afara ghilimelelor simple, ca n exemplul urmtor: $x = "test"; echo 'x este '.$x; Crearea datelor de ieire formatate PHP include dou funcii utile pentru generarea datelor de ieire formatate, n spe printf()i sprintf(). Funcia printf() afieaz datele sale de ieire, n timp ce funcia sprint() returneaz datele sale de ieire sub forma unor valori ir. n general, fiecare funcie preia dou sau mai multe argumente. Primul argument este un ir, denumit ir de formatare, care specific formatul datelor de ieire, iar celelalte argumente specific valorile care vor constitui datele de ieire. Iat un exemplu simplu de utilizare a funciei printf(): printf("Valoarea lui n este: %d", $n); $rezultat = sprintf(Valori: %d, %f", $n, $x); irul de formatare const dintr-o serie de caractere i directive ordinare. Un caracter ordinar este orice caracter, n afara caracterului %. Caracterele ordinare sunt pur i simplu copiate la ieire. Directivele reprezint secvene de caractere care ncep cu simbolul % acestea determin modul n care va fi formatat argumentul corespunztor. O directiv simpl, cum este cea din exemplul precedent, poate consta dintr-un caracter % urmat de un specificator de tip, precum d, care arat c argumentul trebuie tratat ca numr zecimal. Cu toate acestea, o directiv mai sofisticat poate include urmtoarele componente, care trebuie s apar n ordinea indicat: - Specificator de completare (opional): Un specificator de completare precizeaz caracterul care se va folosi pentru a completa rezultatul pn la dimensiunea cerut a irului. n cazul n care caracterul de completare este omis, rezultatul este completat cu spaii. Specificatorul de completare poate fi un caracter spaiu sau un 0 (zero). Un specificator de completare de tip spaiu este folosit frecvent cu irurile, iar un specificator de completare zero se folosete mai ales alturi de numere. Un alt caracter de completare poate fi specificat prin prefixarea acestuia cu un singur semn ('). De exemplu, pentru a completa un rezultat cu liniue de subliniere, specificai '_ drept caracter de completare. - Specificator de aliniere (opional): Un specificator de aliniere indic dac rezultatul trebuie s fie aliniat la stnga sau la dreapta. Dac specificatorul de aliniere este omis, rezultatul va fi aliniat la dreapta; dac se indic o cratim (-) drept specificator de aliniere, rezultatul va fi aliniat la stnga. - Specificator de lime (opional): este un ntreg care determin numrul minim de caractere ale rezultatului; sau, dac argumentul este de tip double, numrul minim de caractere situate la stnga punctului zecimal. Dac rezultatul conine un numr mai redus de caractere, atunci va conine i caractere de completare. - Specificator de precizie (opional): este un punct zecimal, urmat de un ntreg care determin numrul de cifre dup punctul zecimal pe care trebuie sa le conina rezultatul. Specificatorul de precizie nu are nici un efect pentru alte tipuri dect double. - Specificatorul de tip (obligatoriu): Specificatorul de tip determin modul de tratare i afiare a argumentului. Tabelul de mai jos rezum specificatorii de tip disponibili. Specificator de tip Descriere b Trateaz argumentul ca pe un ntreg i l afieaz ca valoare binar.

c d f o s x X

Trateaz argumentul ca pe un ntreg i afieaz caracterul cu aceeai valoare ASCII ca i argumentul. Trateaz argumentul ca pe un ntreg i l afieaz ca valoare zecimal. Trateaz argumentul ca pe o valoare de tip double i l afieaz ca valoare cu virgul mobil. Trateaz argumentul ca pe un ntreg i l afieaz ca pe o valoare scris n octal. Trateaz argumentul ca pe un ir i l afieaz. Trateaz argumentul ca pe un ntreg i l afieaz ca numr hexazecimal, cu litere scrise cu minuscule. Trateaz argumentul ca pe un ntreg i l afieaz ca numr hexazecimal, cu litere scrise cu majuscule..

Dac dorii s inserai simbolul procentului n datele de ieire ale unui apel la funcia printf() sau sprintf(), inserai dou caractere % n locul dorit. La apariia a dou caractere %, funciile printf() i sprintf() tiu c dorii s inserai un simbol al procentului, nu o directiv de formatare. Tabelul de mai jos prezint rezultatele aplicrii a diferite iruri de formatare valorilor selectate. Remarcai c, n cazul omiterii cifrelor zecimale, se produce automat o rotunjire. n tabelul de mai jos spaiile au fost nlocuite prin caracterul ^, pentru a vedea mai bine amplasarea acestora. Valoare 100 100 100 100 100 12.345 12.345 12.345 12.345 "test" "test" Format %d %b %o %x %f %'^-10f %'^10f %'^-10.2f %'10.2f %'^-10s %'^10s Rezultat 100 1100100 144 64 100.000000 12.345000^^^^^^^^ ^^^^^^^^12.345000 12.35^^^^^^^^ ^^^^^^^^12.35 test^^^^^^ ^^^^^^test

Dac preferai, putei folosi funcia number_format(), care returneaz o valoare de tip ir coninnd un rezultat formatat. Putei apela funcia cu unul, dou sau patru argumente: number_format(numar) number_format(numar, zecimale) number_format(numar, zecimale, punct_zecimal, separator_mii) Argumentul numar specific valoarea numeric pe care dorii s o formatai. Argumentul zecimale specific numrul dorit de cifre zecimale. Argumentul punct_zecimal precizeaz caracterul ce se va folosi drept punct zecimal, iar argumentul separator_mii precizeaz caracterul care se va folosi ca separator al miilor. n mod prestabilit, rezultatul este formatat fr zecimale, este inserat un punct naintea cifrelor care compun partea zecimal, respectiv se foloeste o virgul pentru separarea miilor. Exemplu: number_format(1.234, 2) returneaz valoarea 1.23

Manipularea irurilor i scrierea expresiilor regulate

PHP conine peste 70 de funcii care lucreaz cu iruri. Aceast pagin descrie cele mai utilizate funcii. Aceste funcii v permit s obinei lungimea unui ir, s eliminai dintr-un ir caracterele de tip spaiu i s convertii caracterele unui ir n majuscule sau minuscule. Obinerea lungimii unui ir Funcia strlen() returneaz lungimea irului specificat ca argument al funciei. Iat un exemplu: $sir="ceva caractere"; $numar=strlen($sir); echo "<br>Lungimea sirului este de $numar caractere"; Eliminarea caracterelor dintr-un ir Numeroase funcii PHP v permit s eliminai caracterele de tip spaiu alb de la una sau ambele extremiti ale unui ir. Caracterele de tip spaiu alb sunt caractere precum spaiu, tabulator i caracter de salt la linie nou, care nu dispun de nici o reprezentare vizibil. Aceste funci sunt prezentate n tabelul de mai jos. Funcie chop(s) ltrim(s) rtrim(s) trim(s) Descriere Returneaz valoarea lui s, eliminnd dreapta a irului. Similar cu rtrim(). Returneaz valoarea lui s, eliminnd stnga a irului. Returneaz valoarea lui s, eliminnd dreapta a irului. Similar cu chop(). Returneaz valoarea lui s, eliminnd

spaiile albe de la extremitatea din spaiile albe de la extremitatea din spaiile albe de la extremitatea din spaiile albe de la ambele extremiti.

Conversia irurilor la majuscule sau minuscule Funcia strtoupper() returneaz valoarea argumentului su, convertit la majuscule. Funcia conexa strtolower() returneaz valoarea argumentului su, convertit la minuscule. Compararea irurilor i cutarea n iruri PHP furnizeaz patru funcii care sunt deosebit de utile pentru compararea irurilor. Aceste funcii sunt enumerate mai jos. Fiecare funcie returneaz o valoare al crei semn determin rezultatul comparaiei. Funcia strncasecmp() a fost adugat n versiunea PHP 4.0.2. Descriere Execut o comparaie fr sensibilitate la diferena ntre majuscule i minuscule. Returneaz o valoare mai mic dect zero dac s1 este mai mic strcasecmp(s1, s2) dect s2, o valoare mai mare dect zero dac s1 este mai mare dect s2, respectiv 0 n celelalte cazuri. Execut o comparaie cu sensibilitate la diferena ntre majuscule i minuscule. Returneaz o valoare mai mic dect zero dac s1 este mai mic strcmp(s1, s2) dect s2, o valoare mai mare dect zero dac s1 este mai mare dect s2, respectiv 0 n celelalte cazuri. strncasecmp(s1, La fel ca strcasecmp() doar c la comparaie sunt luate n considerare un s2, n) numr de n caractere. La fel ca strcmp() doar c la comparaie sunt luate n considerare un numr strncmp(s1, s2, n) de n caractere. Funcie

Descoperirea i extragerea sub-irurilor PHP include numeroase funcii care gsesc i extrag sub-iruri, adic pri dintr-un ir. Cele mai importante funcii de acest gen sunt rezumate mai jos: Funcie strchr(s1, s2) Descriere Returneaz toate irurile s1 de la prima apariie a irului s2 i pn la sfrit. Dac s1 nu este gsit, funcia returneaz FALSE. Funcia strstr() execut aceeai operaie. Returneaz toate irurile s1 de la prima apariie a irului s2 i pn la sfrit. Dac s1 nu este gsit, funcia returneaz FALSE. irurile s1 i s2 sunt comparate fr a se ine cont dac literele sunt majuscule sau minuscule. Returneaz poziia ntreag a primei apariii a irului s2 n s1. Dac s2 nu este gsit, funcia returneaz FALSE. Returneaz toate irurile s1 de la ultima apariie a irului s2 i pn la sfrit. Dac s1 nu este gsit, funcia returneaz FALSE. La comparaie este folosit numai primul caracter al irului s2. Returneaz toate irurile s1 de la prima apariie a irului s2 i pn la sfrit. Dac s1 nu este gsit, funcia returneaz FALSE. Funcia strchr() execut aceeai operaie. Returneaz poriunea irului s specificat de indexul ntreg start, respectiv de indexurile start i lung. Prima poziie a irului este poziia 0.

stristr(s1, s2) strpos(s1, s2) strrchr(s1, s2) strstr(s1, s2) substr(s, start) substr(s, start, lung)

Mai jos este dat un exemplu care folosete funciile de mai sus:

Cod:

<?php $s = "de la deal la vale si iar inapoi la vale mergand spre deal"; $b = "al"; $n = strpos($s, $b); echo "<br>strpos(\"$s\", \"$b\"): $n"; $n = strchr($s, $b); echo "<br>strchr(\"$s\", \"$b\"): $n"; $n = strrchr($s, $b); echo "<br>strrchr(\"$s\", \"$b\"): $n"; $rezultat = substr($s, 6, 4); echo "<br>substr(\"$s\", 6, 4): $rezultat"; ?>
O potenial dificultate n utilizarea funciei strpos() const n aceea c poate fi greu de sesizat diferena dintre valoarea returnat 0, care arat c sub-irul a fost gsit n poziia iniiala a irului, i valoarea returnat FALSE, care arat c sub-irul nu a fost gsit. Mai jos este un scurt exemplu care indic un mod adecvat de testare a valorii returnate de funcia strpos(), astfel nct s se poat face diferena ntre cele dou rezultate: $poz = strpos(s1, s2); if ($poz === FALSE) {

// sub-sirul nu a fost gasit... } Procedeul prezentat folosete operatorul de identitate (===) pentru a determina dac valoarea returnat este identic (nu doar aritmetic egal) cu valoarea FALSE. Dac folosii n schimb operatorul de egalitate (==), este posibil ca rezultatul s fie incorect; FALSE are valoarea numeric 0, valoare returnat i dac sub-irul este gsit n poziia initial a irului. Acest procedeu presupune utilizarea versiunii PHP 4.0b3 sau a unei versiuni ulterioare; n versiunile anterioare ale limbajului PHP, funcia strpos() returna o valoare ir. nlocuirea unui sub-ir O operaie frecvent folosit n programare const n gsirea unui sub-ir i nlocuirea sa cu o valoare nou. PHP are dou funcii deosebit de utile pentru asemenea operaii, i anume str_replace()i substr_replace(). Funcie str_replace(cauta, inlocuire, subiect) Descriere Se caut n irul subiect sub-irul cauta; dac sub-irul este gsit, returneaz valoarea subiect, nlocuindu-se prima apariie a irului cauta cu inlocuire.

substr_replace(subiect, Returneaz valoarea subiect, nlocuind sub-irul care ncepe de la start inlocuire, start, i avnd lungimea lungime cu irul inlocuire. lungime) Remarcai c funcia str_replace() noteaz sub-irul prin valoarea sa, n timp ce funcia substr_replace() noteaza sub-irul prin pozitia sa n interiorul irului subiect. Mai jos avei un exemplu de utilizare a acestor funcii:

Cod:

<?php $subiect = "de la deal la vale si iar inapoi la vale mergand spre deal" ; $cauta = "deal"; $inlocuire = "DEAL"; $rezultat = str_replace($cauta, $inlocuire, $subiect); echo "<br>str_replace(\"$cauta\", \"$inlocuire\", \"$subiect\"): $rezul tat"; $rezultat = substr_replace($subiect, $inlocuire, 6, 4); echo "<br>substr_replace(\"$subiect\", \"$inlocuire\", 6, 4): $rezultat" ; ?>
Scrierea expresiilor regulate n articolul Funcii PHP pentru expresii regulate am vorbit despre semnificaia caracterelor care se afl ntr-un sablon. n continuare o s detaliez mai mult expresiile regulate. - S presupunem, de exemplu, c dorii s specificai un ir care poate include litera b sau litera c. Putei face aceasta folosind expresia regulat [bc]. Prin includerea valorilor posibile ntre paranteze, formai o expresie regulat echivalent cu formularea "alege oricare din aceste valori". - S presupunem c dorii s specificai un ir care poate include orice vocal; expresia regulat [aeiou] v poate fi de ajutor. Dac dorii s permitei i utilizarea majusculelor, putei

scrie [aeiouAEIOU]. - S presupunem c dorii s specificai un ir care poate include orice caracter scris cu majuscule. Putei scrie [abcdefghijklmnopqrstuvwxyz] sau putei folosi forma mai compact [a-z], unde prin cratim se nelege o serie de caractere consecutive. - S presupunem c dorii s specificai irurile sat, mat i lat. Pentru aceasta, avei nevoie de expresia regulat [sml]at. Semnificaia acestei expresii regulate este urmtoarea: "alege oricare dintre literele s, m i l i scrie dup litera respectiv literele at". - Dac un caracter ^ este primul simbol menionat ntre parantezele drepte, acesta are ca efect inversarea semnificaiei expresiei regulate plasate ntre paranteze. De exemplu, expresia regulat [^a-z] corespunde oricrui caracter diferit de un caracter scris cu minuscule. - Pentru a specifica faptul c o expresie regulat se poate repeta, expresia regulat va fi urmat de o pereche de paranteze acolade, care includ limitele superioar i inferioar ale repetiiei. De exemplu, expresia regulat [aerou]{1,4} corespunde unui ir care este compus din 1-4 vocale. - Pentru a specifica repetarea mai multor pri ale unei expresii regulate, includei prile respective ntre paranteze. De exemplu, expresia regulat ([sml]at){1,2} corespunde unui numr de una sau dou repetri ale oricruia dintre irurile "sat", "mat" sau "lat". - Unele valori care se repet sunt att de frecvent folosite, nct au abrevieri: Abreviere + * ? Semnificaie {1,n}, unde n este un numr arbitrar de mare {0,n}, unde n este un numr arbitrar de mare {0,1}

- S presupunem c dorii s reprezentai o nmulire. Dac folosii caractere minuscule pentru operanzi, putei obine ceva de genul [a-z]*[a-z]. Totui, aceast expresie regulat nu are semnificaia dorit, deoarece * este un factor de repetiie, nu un caracter dintr-un ir. Pentru a dezactiva semnificaia special a caracterului *, trebuie s l prefixai cu un caracter backslash: [a-z]\*[a-z]. - Pentru a specifica faptul c o expresie regulat corespunde numai unui sub-ir care include caracterul iniial al unui ir subiect, prefixai expresia regulat cu un caracter ^. De exemplu, expresia regulat ^[sml]at corespunde sub-irurilor "sat", "mat" sau "lat" numai dac acestea apar la nceputul irului subiect. - Similar, pentru a arta c o expresie regulat corespunde numai unui sub-ir care include caracterul final al unui ir subiect, anexai la expresia regulat caracterul $. De exemplu, expresia regulat [sml]at$ corespunde sirurilor "sat", "mat" sau "lat" numai dac acestea apar la sfritul irului subiect. - Expresia regulat ^[sml]at$ corespunde sub-irurilor "sat", "mat" sau "lat" numai dac irul subiect este identic cu unul dintre aceste sub-iruri. Pentru uurina creeri unor expresii regulate putei utiliza i un program de genul Regex Coach cu care s va facei propria expresie pe care apoi s o folosii n scripturile dvs.

Utilizarea variabilelor cookie

Variabilele cookie sunt utile pentru stocarea preferinelor utilizatorilor i a altor informaii care trebuie reinute atunci cnd utilizatorul trece la o nou pagin web. Valorile majoritii variabilelor dispar atunci cnd scriptul PHP care le conine i ncheie execuia. Spre deosebire de acestea, valorile variabilelor cookie se pot pstra un timp indefinit. Browserul utilizatorului stocheaza variabilele cookie n unitatea de hard-disk local a utilizatorului. La ce este util o variabil cookie? De exemplu pentru pstrarea preferinelor utilizatorului. Cnd utilizatorul revine la pagina vizitat, variabilele cookie permit browserului s recunoasc utilizatorul i s restaureze opiunile selectate de utilizator. Din pacate, variabilele cookie nu constituie soluia perfect pentru un mediu de stocare pe termen lung i prezint o serie de dezavantaje cum ar fi:

- Un utilizator poate dezactiva variabilele cookie prin stabilirea unei opiuni a browserului. - n anumite situaii, variabilele cookie pot fi vizualizate de ali utilizatori. - Un site poate stoca numai 20 de variabile cookie i numai 4 KB de informaii n unitatea de hdd local a utilizatorului. - Numeroase versiuni ale browserelor frecvent folosite au erori care le mpiedic sa foloseasc variabilele cookie n mod adecvat. n ciuda acestor dezavantaje, variabilele cookie rmn cea mai populara tehnic pentru obinerea unui mediu de stocare pe termen lung. Accesul la o variabil cookie Dac ai creat o variabil cookie, valoarea acesteia este automat pus la dispoziie ca variabil PHP avnd acelai nume cu acela al variabilei cookie. De exemplu, s presupunem c ai creat o variabil cookie denumit "anotimp" i c i atribuii valoarea "vara". Aceast pereche numevaloare este apoi pus la dispoziia fiecrui script PHP asociat paginilor dvs de web. Deci putei afia valoarea variabilei cookie folosind urmtoarea instruciune: echo "Valoarea variabilei cookie este $anotimp"; Aceast comand va afia: Valoarea variabilei cookie este vara Variabila PHP de tip tablou asociativ HTTP_COOKIE_VARS conine numele i valoarea fiecrei variabile cookie curent. Dac dorii s vizualizai fiecare variabil cookie disponibil i valoarea acesteia, putei invoca funcia phpinfo(), care afieaz valoarea tabloului HTTP_COOKIE_VARS. De asemenea putei folosi i urmtorul script pentru a afia toate numele i valorile variabilelor cookies: foreach ($HTTP_COOKIE_VARS as $nume => $valoare) echo "<br>$nume => $valoare"; Crearea unei variabile cookie Pentru a crea o variabil cookie, trebuie invocat funcia setcookie(), care are urmtoarea sintax: setcookie(nume, valoare, expirare) Argumentul nume specific numele variabilei cookie, iar argumentul valoare specific valoarea variabilei. Argumentul expirare indic momentul expirrii variabilei cookie; dup ora specificat, variabila cookie nu mai este accesibil. n general, este convenabil s se specifice momentul expirrii folosind funcia time(), care returneaz intervalul de timp (exprimat n secunde) scurs de la 1 ianuarie 1970. Putei aduga o valoare de tip decalaj (offset), care specific intervalul de timp pe durata cruia variabila cookie trebuie s fie accesibil. De exemplu: setcookie ("anotimp", "vara", time()+3600); Aceast instruciune creeaz o variabil cookie denumit "anotimp", care are valoarea "vara". Variabila cookie va fi disponibil timp de o ora (3600 secunde) de la crearea sa. Dac preferai, putei specifica momentul expirrii folosind funcia mktime(). Aceast funcie are urmtoarea form: mktime (ore, minute, secunde, luna, zi, an) De exemplu urmtoarea inscruciune creeaz o variabil cookie care expir la o secund dup

miezul nopii primei zile a anului 2008: setcookie("anotimp", "vara", mktime(0,0,1,1,1,2008)); Atenie!!! Valorile variabilelor cookie sunt trimise de ctre browser ca parte a antetelor HTTP. Ca atare, valorile variabilelor cookie trebuie s fie stabilite anterior expedierii oricror altor valori ctre browser. Trimiterea chiar i a unui singur spaiu v poate mpiedica s configurai valoarea unei variabile cookie. Pentru a evita problemele, asigurai-v c un script PHP care stabilete o valoare a unei variabile cookie este plasat la nceputul fiierului, nainte de a trimite alte taguri html sau alte caractere ctre browser. De asemenea, stabilii valoarea variabilei cookie nainte de a executa o instruciunie echo sau alt instruciune PHP care trimite browserului date de ieire. Aceste reguli se aplic la fel i la crearea sesiunilor despre care am discutat n articolele de pe acest site. tergerea unei variabile cookie Deoarece o variabil cookie are o dat de expirare, aceasta va fi tears automat la un oarecare interval de timp dup crearea sa. Totui, putei terge o variabil cookie imediat. Pentru aceasta, fixai momentul expirrii variabilei cookie la un moment de timp din trecut. Exemplu: setcookie("anotimp", "", time()-3600); Aceast instruciune stabilete timpul de expirare cu o or (3600 de secunde) n urm. Remarcai c valoarea variabilei cookie este exprimat sub forma unui ir vid; din moment ce variabila cookie nu va mai fi disponibil, valoarea sa nu mai are importan. Stocarea mai multor valori ntr-o variabil cookie Deoarece un site web poate stoca numai 20 de variabile cookie n sistemul unui utilizator, capacitatea de a stoca mai multe valori ntr-o singur variabil cookie este util. Pentru aceasta, inserai valorile ntr-un tablou i folosii funcia serialize() pentru a "mpacheta" elementele tabloului ntr-un ir; ulterior, putei recupera valoarea tabloului folosind funcia unserialize(). Mai jos avei un exemplu:

Cod:

<?php // se creeaza un tablou for ($i = 0; $i < 30; $i++) { $tablou[$i] = $i; } // se impacheteaza intregul tablou intr-un sir $s = serialize($tablou); // se creeaza o variabila cookie setcookie("cookies", $s); if (isset($cookies)) { // se despacheteaza valoarea variabilei cookie $rezultat = unserialize(stripslashes($cookies)); // afiseaza elementele tabloului din variabila cookie foreach ($rezultat as $i => $cookie) {

echo "<br>$i => $cookie"; } ?> }

Acest procedeu reuete s ocoleasc limita celor 20 de variabile cookie dar nu poate depi limita celor 4 KB de date stocate ntr-o variabil cookie pentru fiecare site web n parte. Specificarea accesului la o variabil cookie Funcia setcookie() poate prelua maximum ase argumente, inclusiv trei argumente despre care nu am discutat nc. Iat formatul complet al funciei setcookie(): setcookie(nume, valoare, expirare, cale, domeniu, sigur) n afar de argumentele nume, valoare, expirare pe care le-am descris n acest articol, mai este i argumentul cale care v permite s specificai calea URL asociat variabilei cookie. n mod prestabilit, variabila cookie este disponibil pentru scripturile din directorul care conine scriptul n care a fost configurat variabila respectiv, precum i pentru scripturile din subdirectoarele aferente directorului respectiv. n particular, scripturilor din directoarele printe ale directorului care conine scriptul nu li se permite accesul prestabilit la variabila cookie. Pentru a pune variabila cookie la dispoziia scripturilor dintr-un anumit director i din subdirectoarele sale, specificai o valoare a argumentului cale. De exemplu, pentru a pune variabila cookie la dispoziia ntregului arbore de directoare, specificai "/" ca valoare a argumentului cale; pentru a face variabila cookie disponibil n directorul /test i n subdirectoarele sale, specificai "/test/" ca valoare a argumentului cale. O complicaie n utilizarea argumentului cale o constituie modalitatea de identificare a numelor directoarelor. Specificnd "/test/" ca valoare a argumentului cale, variabila cookie va deveni disponibil n /test1, /test2 i n toate directoarele cu nume similare, pe lng directorul /test i sub-directoarele sale. Dac nu este specificat nici un argument domeniu, o variabil cookie este disponibil numai pentru scripturile rezidente pe serverul web care a creat variabila respectiv. Argumentul domeniu v permite s specificai numele de domeniu asociat unei variabile cookie. n consecina, variabila cookie va fi disponibil numai pentru paginile web din cadrul domeniului specificat. De exemplu, s presupunem c un script din serverul web http://www.subdomeniu.domeniu.com creeaz o variabil cookie. n mod prestabilit, variabila cookie este disponibil numai pentru gazda respectiv. Cu toate acestea, putei face variabila cookie disponibil pe ntreg domeniu subdomeniu.domeniu.com, specificnd "subdomeniu.domeniu.com" ca valoare a argumentului domeniu. Specificaia Netscape pentru variabile cookie (http://wp.netscape.com/newsref/std/cookie_spec.html) impune ca argumentul domeniu s conin minimum dou caractere punct. Ca atare, nu trebuie s specificai un ir de tipul "domeniu.com" ca valoare a argumentului domeniu. Argumentul sigur este o valoare ntreag, care specific dac o variabil cookie trebuie trimis prin intermediul unei conexiuni sigure (HTTPS). Specificai valoarea 1 pentru a mpiedica transmiterea variabilei cookie n cazul n care conexiunea nu este sigur; pentru a permite transmiterea variabilei cookie prin conexiuni HTTP obinuite, specificai valoarea 0. Deoarece browserele stocheaz variabilele cookie n unitatea de hdd local, utilizatorii unui sistem pot obine accesul la fiierele cookie i pot citi sau chiar modifica informaiile coninute n fiierele respective. O modalitate de a preveni situaia prezentat const n criptarea datelor stocate n variabilele cookie. Pentru aceasta, putei folosi funciile Mcrypt din PHP. Funciile n cauz sunt incluse n biblioteca libmcrypt, care nu face parte din versiunea instalat n mod prestabilit a limbajului PHP. Dei argumentele expirarei cale ale funciei setcookie() sunt opionale, unele versiuni ale principalelor browsere prezint erori care le determin s refuze variabilele cookie dac aceste

argumente nu sunt specificate. Ca atare, n general este recomandat s specificai aceste argumente. Meniune: nainte de a trimite date HTML unui browser, un server web trimite, n general, unul sau mai multe antete HTTP; aceste antete sunt cunoscute sub numele de antete de rspuns al serverului. Similar, nainte de a trimite informaii unui server web, un browser web trimite, n general, unul sau mai multe antete HTTP; aceste antete sunt cunoscute sub numele de antete de cerere. Antetele de rspuns ale serverului frecvent folosite descriu configuraia serverului i furnizeaz informaii referitoare la adresa URL solicitat de client. Antetele de cerere utilizate de obicei descriu configuraia clientului i formatele de date acceptabile de ctre client. n afar de antetele de rspuns ale serverului i de antetele de cerere, protocolul HTTP folosete antete generale i antete de entitate. Antetele generale sunt folosite att de ctre clieni, ct i de ctre servere, pentru a specifica informaii precum data curent i opiunile de conexiune. Antetele de entitate descriu formatul datelor schimbate de un client i un server.

Expedierea mesajelor de pot electronic

n articolul Transmiterea mesajelor prin e-mail folosind PHP i PEAR am mai discutat depre funcia mail() i cum se transmite un mesaj cu ajutorul acestei funcii. n acest articol o s ncerc s aprofundez mai detaliat expedierea i recepionarea mesajelor de e-mail. Configuraia PHP standard accept expedierea mesajelor de e-mail prin intermediul SMTP (abreviere de la Simple Mail Transfer Protocol). Acesta este protocolul standard folosit pentru transferul mesajelor de e-mail de la un sistem la altul prin internet. Mesajele de e-mail sunt alctuite din dou pri: o serie de antete de mesaj i un corp. Antetele de mesaj indic adresa destinatarului i subiectul mesajului, precum i alte informaii. Corpul conine mesajul n sine. Un exemplu de trimitere a unui mesaj prin intermediul funciei mail: mail (destinatar, subiect, corp, antete) unde destinatar indic adresa de e-mail a destinatarului, subiect specific antetul de e-mail care conine subiectul mesajului, corp este corpul mesajului i antete specific adresele de email suplimentare, precum antetul from sau alte antete... Exemplu: mail ("adresa_mea@server.ro", "Mesaj de test", "Corpul mesajului", "From: adresa_mea@server.ro"); Putei specifica mai muli destinatari prin separarea fiecrui destinatar de urmtorul prin intermediul unie virgule: mail ("adresa1@server1.ro, adresa2@server2.ro, adresa3@server3.ro", "Mesaj de test", "Corpul mesajului", "From: adresa_mea@server.ro"); Funcia mail() returneaz TRUE dac serverul SMTP accept mesajul; n caz contrar, returneaz FALSE. Reinei c acceptarea de ctre serverul SMTP nu garanteaz transmiterea ctre destinatar a mesajului dvs. Nu exist nici o modalitate 100% sigur de a verifica faptul c mesajul a fost trimis, aa cum nu exist nici o modalitate absolut sigur de a garanta c destinatarul a citit mesajul, l-a neles i c a fost de acord cu el. Unele servere SMTP refuz s accepte adrese i antete care conin spaii albe la sfrit. Pentru aceasta folosii funcia trim() nainte de a trimite mesajul. Recepionarea mesajelor de e-mail

Recepionarea mesajelor de e-mail este un proces oarecum mai complex dect expedierea lor. Dei SMTP face parte din configuraia PHP standard, IMAP (protocolul de recepionare a mesajelor Interim Mail Access Protocol) nu este o component a acestei configuraii. Dac administratorul serverului nu a configurat serverul PHP astfel nct s lucreze cu IMAP, exemplele urmtoare nu vor funiona. Un server IMAP este accesibil n acelai mod ca i un fiier oarecare. Mai nti, trebuie deschisa o conexiune cu serverul, apoi se pot trimite cereri serverului i se pot primi rspunsuri de la acesta. Dup terminarea utilizrii serverului, trebuie nchis conexiunea. Pentru a deschide o conexiune cu un server IMAP, folosii funcia imap_open(): imap_open (cutie_postala, identificator_utilizator, parola) Argumentul cutie_postala specific patru elemente: - Numele gazdei sau adresa IP a serverului IMAP - Protocolul care va fi utilizat (IMAP) - Portul care se va folosi pentru conectarea serverului (n general 143) - Cutia potal care va fi deschis (n general INBOX) Argumentul foloseste numeroi delimitatori pentru a separa un element de altul. Iat o valoare caracteristic a argumentului: {localhost/imap:143}INBOX n cadrul acestui exemplu, numele gazdei este localhost; acest lucru este posibil cnd un server PHP i un server IMAP ruleaz pe acelai sistem gazd. n caz contrar, trebuie s specificai numele gazdei care ruleaz sistemul IMAP: {mail.yahoo.com/imap:143}INBOX Celelalte argumente ale funciei imap_open(), identificator_utilizator i parola, specific identificatorul de utilizator i parola folosite pentru a obine accesul la serverul IMAP. Aa cum funcia fopen() returneaz un identificator pe care l putei folosi pentru a obine accesul la un fiier, la fel i funcia imap_open() returneaz un identificator pe care l putei folosi pentru a obine accesul la serverul IMAP. Dac PHP nu poate deschide o conexiune cu serverul IMAP, funcia imap_open() returneaza FALSE. Dac un script se ncheie cu mesajul "Call to undefined function: imap_open", aceasta arat c PHP nu a fost configurat pentru a folosi IMAP. Exemplu:

Cod:

<?php $server = "{mail.as.ro/imap:143}"; $utilizator = "php4"; $parola = "parola"; $identificator = imap_open($server."INBOX", $utilizator, $parola); if ($identificator === false) { echo "Nu se poate deschide cutia poatala"; } ?>
n afar de directorul INBOX standard, IMAP permite unui utilizator s defineasc directoare, care pot fi folosite pentru stocarea i organizarea mesajelor primite. n orice moment, un director IMAP - INBOX sau un alt director - este considerat ca fiind directorul curent. Dup ce

ai stabilit o conexiune cu un server IMAP, putei cere serverului s desemneze alt dosar ca dosar curent:

Cod:

<?php $server = "{mail.as.ro/imap:143}"; $utilizator = "php4"; $parola = "parola"; $identificator = imap_open($server."INBOX", $utilizator, $parola); if ($identificator === false) { echo "Nu se poate deschide cutia poatala"; } else { // se schimba directorul curent $prefix = "~/mail/"; $director = $server.$prefix."INBOX"."nume_director"; $schimba = imap_reopen($identificator, $director); if ($schimba === false) { echo "Nu se poate deschide directorul specificat"; } } ?>
De obicei, numele directoarelor IMAP sunt obinute prin prefixarea numelui dosarului cu particula "~/mail/" i "INBOX", aa cum am artat n exemplu. Cu toate acestea, un administrator de sistem poate configura o alt politic de atribuire a numelor. Dac dorii s afiati directoarele existente n csua de mail putei folosi urmtorul script:

Cod:

<?php echo "Lista directoarelor"; $directoare = imap_listmailbox($identificator, $server, $prefix, "*"); if ($directoare == false) { echo "A aparut o eroare la afisarea directoarelor"; } else { foreach ($directoare as $cheie=>$valoare) { echo "\n $cheie=>$valoare"; } } ?>
Dac dorii s creai un director nou folosii funcia imap_createmailbox() astfel:

Cod:

<?php $director = "diverse"; $director = $server.$prefix."INBOX.".$director; $creare = imap_createmailbox($identificator, $director); if ($creare === false) { echo "Nu s-a putut crea directorul"; } ?>
Numele unui director IMAP trebuie s conin numai litere, cifre i caractere de subliniere. Dac dorii s creai un sub-director, putei proceda astfel incluznd un punct n numele directorului. Punctul se comport ca separator de cale, analog caracterului slash folosit n cile din cadrul sistemului de fiiere. Pentru modificarea numelui unui director din csua de email folosii funcia imap_renamemailbox() astfel:

Cod:

<?php $director_vechi = $server.$prefix."INBOX.".$director_vechi; $director_nou = $server.$prefix."INBOX.".$director_nou; $modificare = imap_renamemailbox($identificator, $dosar_vechi, $dosar_n ou); if ($modificare === false) { echo "A aparut o eroare la modificarea numelui directorului"; } ?>
Pentru tergerea unui director folosii funcia imap_deletemailbox():

Cod:

<?php $director = $server.$prefix."INBOX.".$director; $stergere = imap_deletemailbox($identificator, $director); if ($stergere === false) { echo "A aparut o eroare la stergerea directorului"; } ?>
Spre deosebire de mesajele IMAP care rmn n cutia potal pn cnd le tergei, un director IMAP ters este eliminat imediat i n mod irevocabil. Fii ateni atunci cnd scriei programe care terg directoare sau atunci cnd folosii scripturi care conin asemenea programe. Dup deschiderea unei conexiuni IMAP, putei obine acces la informaii care descriu cutia potal curent. De exemplu, pentru a afla cte mesaje sunt n cutia potala se invoc funcia imap_num_msg():

imap_num_msg($identificator) n continuare este o variant prin care putei obine diferite informaii despre coninutul cutiei potale:

Cod:

<?php $nr_mesaje = imap_num_msg($identificator); echo "Cutia postala contine $nr_mesaje mesaje"; $nr_mesaje_recente = imap_num_recent($identificator); echo "Cutia postala contine $nr_mesaje_recente mesaje recente"; $obiect_cutie_postala = imap_mailboxmsginfo($identificator); if ($obiect_cutie_postala) { $tablou_cutie_postala =&;nbsp;get_object_vars($obiect_cutie_postala ); foreach ($obiect_cutie_postala as $cheie=>$valoare) { echo "\n $cheie: $valoare"; } } ?>
Rezultatul de ieire 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 urmtoare:

Cod:

<?php echo "Afisarea starii cutiei postale"; $obiect_cutie_postala = imap_mailboxmsginfo($identificator); print_r($obiect_cutie_postala); ?>

Funcia PHP print_r() afieaz valoarea unui obiect. Aceast metod este cu mult mai simpl dect cea folosit anterior, dar formatul datelor de ieire este cu mult mai puin inteligibil. n continuare este un exemplu care afieaz o list de mesaje din directorul curent:

Cod:

<?php echo "Antete de mesaje in cutia postala curenta:" $antete = imap_headers($identificator); if ($antete == false) { echo "A aparut o eroare la afisarea mesajelor"; } else { foreach ($antete as $cheie=>$valoare) { echo "\n $valoare"; } } ?>
Funcia imap_headers() returneaz un tablou unde fiecare element descrie un mesaj din directorul curent. O chestie ciudat a serviciului IMAP const n aceea c fiecare mesaj dintr-un director are att un numr, ct i un identificator. Numrul reprezint pozia mesajului n directorul respectiv; aceast valoare se poate modifica la adugarea mesajelor, respectiv la tergerea mesajelor din dosar. Pe de alt parte, identificatorul unui mesaj nu se modific niciodat. IMAP furnizeaz funcii care v permit s determinai identificatorul unui mesaj dac este dat numrul su i invers. Iat funciile descrise mai jos: imap_uid($identificator, $numar) si imap_msgno($identificator, $id) O limitare a funciei imap_headers() este aceea c nu separ fiecare caracteristic a mesajului n cmpuri distincte, astfel nct acestea s fie uor accesibile pentru un script. Funcia de bibliotec IMAP imap_fetch_overview() returneaz un tablou asociativ care descrie un mesaj. Iat un exemplu care afieaz informaiile despre mesaje:

Cod:

<?php $nr_mesaj = 1; $mesaje = imap_fetch_overview($identificator, $nr_mesaj, 0); foreach ($mesaje as $mesaj) { foreach ($mesaj as $proprietate=>$valoare) { echo "\n $proprietate: $valoare"; }

?>

Al doilea argument al funciei imap_fetch_overview() v permite s specificai o list sau un domeniu de mesaje pentru care funcia returneaz vederi de ansamblu. Datele de ieire conin urmtoarele informaii: subiectul mesajului numele i adresa de e-mail ale expeditorului data la care a fost trimis mesajul numrul mesajului identificatorul mesajului dimensiunea mesajului n octei indicatoare care precizeaz dac: = mesajul este recent = mesajul a fost citit = mesajul a primit un rspuns = mesajul a fost marcat n vederea tergerii = mesajul este o ciorn

Pentru a obine corpul unui mesaj (care include coninutul efectiv al mesajului) putem utiliza scriptul de mai jos:

Cod:

<?php // afisare dupa numar $numar = imap_msgno($identificator, $id) $corp = imap_body($identificator, $numar, FT_UID); echo $corp; ?>
Antetele de mesaj conin informaii importante, care n general nu apar n corpul mesajului, precum data i subiectul mesajului. Mai jos este dat o variant de afiare a acestor informaii:

Cod:

<?php $n = 0; $numar = 0; $obiect_antet = imap_header_info($identificator, $numar); $antete = get_object_vars($obiect_antet); foreach ($antete as $proprietate=>$valoare) { if (!is_array($valoare)) { echo "\n $proprietate: $valoare"; } else { foreach ($valoare as $sub_valoare) {

} ?> }

echo "\n $proprietate: "; $sub_valori = get_object_vars($sub_valoare); for_each ($sub_valoare as $articol=>$valoare_articol) { echo "\n $articol=>$valoare_articol"; } }

Obiectul returnat de funcia de biblioteca IMAP imap_headerinfo() include urmtoarele informaii: data expedierii mesajului subiectul mesajului Identificatorul mesajului la care s-a rspuns prin acest mesaj, dac exist indicatoare de mesaj, cum sunt cele returnate de funcia imap_fetch_overview() numele i adresa de e-mail ale: = expeditorului = persoanei care primete rspunsul, dac este specificat = destinatarilor = destinatarilor eventualelor copii (cc:) = destinatarilor eventualelor copii la indigo necunoscute (bcc:), dac informaiile respective sunt disponibile Numeroase elemente ale tabloului asociativ au valori de tip tablou. Pentru parcurgerea iterativ i afiarea valorii acestor elemente se folosete o bucl mbricat. Pentru aplicai mai puin pretenioase se poate utiliza exemplul urmtor:

Cod:

<?php $antete = imap_headerinfo($identificator, $numar); print_r($antete); ?>


Folosind funcia print_r() se genereaz date de ieire mai puin inteligibile. Pentru a terge un mesaj IMAP, mai nti l marcai n vederea tergerii i apoi l eliminai. Mesajele marcate pentru tergere, dar care nu au fost nc eliminate, sunt numai semnalate ca terse i sunt n continuare accesibile. Iat un exemplu care v permite s tergei un mesaj prin specificarea numrului sau a identificatorului mesajului:

Cod:

<?php $stergere = imap_delete($identificator, $id, FT_UID); if ($stergere == false) { echo "Nu se poate sterge mesajul"; } ?>

Pentru a elimina mesajele terse, testai urmtorul script:

Cod:

<?php $eliminare = imap_expunge($identificator); if ($eliminare == false) { echo "Nu s-a reusit eliminarea mesajelor"; } ?>
n cazul n care dorii s vedei exact ce eroare a returnat una din funciile bibliotecii IMAP, putei folosi funcia imap_errors() astfel:

Cod:

<?php $erori = imap_errors(); if ($erori) { foreach ($erori as $cheie=>$valoare) { echo "\n $cheie: valoare"; } } ?>
Pentru copierea unui mesaj din directorul curent ntr-un alt director se poate folosi funcia imap_mail_copy() astfel:

Cod:

<?php $numar = 0; $director = $prefix."INBOX.".$director; echo "Se copiaza mesajul $numar in directorul $director"; $nr_mesaje = "".$numar; $copiere = <;/span>imap_mail_copy($identificator, $nr_mesaje, $director ); if ($copiere === false) { echo "A aparut o eroare la copierea mesajului specificat"; } ?>
Deoarece serverele IMAP nu coopereaza la copierea unui mesaj de la un server la altul, nu este necesar - sau posibil - s se specifice numele gazdei serverului la copierea mesajelor IMAP. Cnd ai terminat de utilizat un server IMAP, trebuie s l nchidei, aa cum nchidei un fiier atunci cnd ai terminat cu el. Iat cum se poate nchide o conexiune IMAP:

Cod:

<?php $inchidere = imap_close($identificator); if ($inchidere === false) { echo "Nu se poate inchide cutia postala"; } ?>
Biblioteca IMAP furnizeaz multe alte funcii n afara celor descrise n acest articol. De exemplu, funciile imap_search() i imap_scanmailbox() v permit s cutai mesaje care satisfac criteriile specificate. De exemplu, putei cuta mesaje al cror corp conine anumite texte. n cazul n care furnizorul de servicii internet dispune de un server POP, nu de un server IMAP, putei avea acces la cutia potal POP cu ajutorul sistemului PHP, folosind biblioteca IMAP. Pur i simplu deschidei o conexiune cu serverul POP specificnd o cutie potala POP astfel: $mbox = imap_open("{localhost/pop3:110}INBOX", $identificator_utilizator, $parola); Numele gazdei, protocolul i numrul portului sunt asemntoare cu valorile similare folosite pentru conectarea la un server IMAP. De asemenea, putei folosi biblioteca IMAP pentru a v conecta la un server de informaii folosind NNTP (Network News Transfer Protocol). Pentru aceasta, deschidei o conexiune astfel: $nntp = imap_open("{localhost/nntp:119}comp.test", "", ""); Pentru mai multe informaii putei consulta manualul php de la adresa www.php.net.

Stocarea unor date ierarhice ntr-o baz de date

Fie c vrei s v construii propriul forum, s v publicai mesajele dintr-un mailing list' pe propriul site de pe internet sau s v scriei propriile CMS, va veni un moment cnd vei dori s stocai datele ierarhice ntr-o baz de date. i, dac nu folosii o baz de date cu suport XML, tabelele nu sunt ierarhice; ele nu sunt dect un fiier plat. Va trebui s gasii un mod de a traduce ierarhia ntr-un fiier plat. Stocarea arborilor este o problem obinuit, cu multiple soluii. Exist 2 abordri importante: modelul listei adiacente i algoritmul parcurgerii arborelui cu preordine modificat. n acest articol vom explora aceste 2 metode de salvare a datelor ierarhice. Ca exemplu voi folosi arborele dintr-un magazin alimentar fictiv de pe internet. Acest magazin i sorteaz alimentele dup categorie, culoare i tip. Arborele arat astfel:

Acest articol conine un numr de exemple de coduri care arat cum se salveaz i se restabilesc datele. Deoarece folosesc eu nsumi acest limbaj i muli ali oameni l folosesc sau l cunosc, am ales s scriu exemplele n PHP. Probabil c-l putei traduce uor n limbajul pe care vi-l dorii. Metoda recursiv Prima i cea mai elegant abordare pe care o vom ncerca se numete metoda recursivitii . Este o abordare elegant pentru c vei avea nevoie de o simpl funcie care s se repete n arborele dvs. n magazinul nostru de alimente tabelul arat astfel:

Dup cum vedei salvai "printele" fiecrui nod. Putem vedea c "Pear" este un copil al lui "Green" care este un copil al "Fruit" s.a.m.d. Nodul rdcin, "Food", nu are o valoare parental. Pentru simplificare, am folosit valoarea "title" pentru a identifica fiecare nod. Bineneles, ntr-o baz de date real, ar trebui s folosii id-ul numeric al fiecrui nod. Dai-mi arborele Acum c am introdus arborele nostru n baza de date, e timpul s scriem o funcie de afiare. Aceast funcie va trebui s nceap la nodul rdcin - nodul fr nici un printe i ar trebui dup aceea s arate toi copiii acelui nod. Pentru fiecare dintre aceti copii, funcia ar trebui s

restabileasc i s arate toate nodurile copii ale acelui copil. Pentru aceti copii, funcia ar trebui s arate din nou toi copiii s.a.m.d. Aa dup cum probabil c ai observat, exist un tipar regulat n descrierea acestei funcii. Putem pur i simplu s scriem o funcie care restabilete copiii unui anumit nod printe. Acea funcie ar trebui atunci s porneasc o alt instan a ei nsi pentru fiecare dintre aceti copii, pentru a-i arta pe toi copiii acestora. Acesta este mecanismul recursiv care-i d metodei numele de " metoda recursivitii".

Cod:

<?php // $parent este parintele copiilor pe care vrem sa-i vedem // $level creste cand inaintam in arbore, // folosit pentru a arata un arbore frumos indentat function display_children($parent, $level) { // restabileste toti copiii $parent $result = mysql_query('SELECT title FROM tree '.'WHERE parent="'. $parent.'";'); // arata fiecare copil while ($row = mysql_fetch_array($result)) { // indenteaza si arata titlul acestui copil echo str_repeat(' ',$level).$row['title']."\n"; // foloseste din nou aceasta functie pt a arata // copiii acestui copil display_children($row['title'], $level+1); } } ?>
Pentru a arta ntregul nostru arbore, vom pune n aplicare funcia cu un "string" gol cum ar fi $parent i $row =0; display_children(' ',0); Pentru arborele magazinului nostru de alimente funcia returneaz:

Citat: Food Fruit Red Cherry Yellow Banana Meat Beef Pork

Observai c, dac vrei s vedei un sub-arbore, putei indica funciei s porneasc cu un alt nod. De exemplu, pentru a arta sub-arborele "Fruit", ar trebui s punei n aplicare

display_children('Fruit',0); Calea ctre un nod Cu aproximativ aceeai funcie, putei cuta calea spre un nod, dac tii numele sau id-ul acelui nod. De exemplu, calea spre "Cherry" este "Food" > "Fruit" > "Red". Pentru a gsi aceast cale, funcia noastr va trebui s porneasc la cel mai profund nivel : "Cherry". Dup aceea, ea caut printele acestui nod i-l adaug la cale. n exemplul nostru, acesta ar fi "Cherry". Dac stim c "Red" este printe pentru "Cherry", putem calcula calea spre "Cherry", folosind calea spre "Red". Si acest lucru ne este dat de funcia pe care tocmai am folosit-o: cutnd n mod recursiv prinii, vom gsi calea ctre orice nod din arbore.

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 '.'WHERE title="'. $node.'";'); $row = mysql_fetch_array($result); // salveaza calea in aceasta ordine $path = array(); // 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, este numele // parintelui lui $node $path[] = $row['parent']; // ar trebui sa adaugam calea spre parintele acestui nod // la cale $path = array_merge(get_path($row['parent']), $path); } // returneaza calea return $path; } ?>
Aceast funcie restabilete acum calea ctre un nod dat. Ea restabilete calea ca o dispunere, ca un array, aa c pentru a arta calea putem folosi print_r(get_path('Cherry')); Dac facei acest lucru pentru "Cherry", vei vedea c:

Citat:

ARRAY ( [0] => Food [1] => Fruit

[2] => Red )


Dezavantaje Aa cum tocmai am vzut, aceasta este o metod excelent. E uor de neles i codul de care avem nevoie este de asemenea simplu. Atunci care sunt dezavantajele modelului acestei structuri de date? n majoritatea limbajelor de programare, este lent i ineficient. Acest lucru se datoreaz n special recursivitii. Avem nevoie de o interogare n baza de date pentru fiecare nod din arbore. Cum fiecare interogare dureaz destul de mult, aceasta face ca funcia s fie foarte lent cnd se aplic pe arbori mari. Al doilea motiv pentru care aceast metod nu este att de rapid, este limbajul de programare pe care probabil l vei folosi. Spre deosebire de limbaje cum ar fi Lisp, cele mai multe limbaje nu sunt concepute pentru funcii recursive. Pentru fiecare nod, funcia pornete o alt instan a ei nsi. Aa c, pentru un arbore cu patru nivele, vei pune n aplicare patru instane ale funciei n acelai timp. i cum fiecare funcie ocup o felie de memorie i are nevoie de ceva timp pentru a porni, recursivitatea este foarte lent atunci cnd este aplicat pe arbori mari. Parcurgerea n preordine modificat a arborelui Acum, s aruncm o privire asupra unei alte metode de stocare a arborilor. Recursivitatea poate fi lent, aa c n-ar trebui s folosim o funcie recursiv. Am dori de asemenea s micorm numrul interogrilor n baza de date. Am prefera s avem o singur interogare pentru fiecare activitate. Vom ncepe prin a aeza arborele nostru n poziie orizontal. Pornim de la nodul rdcin ("Food") i scriem 1 n stnga lui. Urmm arborele spre "Fruit" i scriem 2 lng el. n acest fel, mergem de-a lungul marginilor arborelui n timp ce scriem cte un numr n stnga i n dreapta fiecrui nod. Ultimul numr este scris n dreapta nodului "Food". n aceast imagine, putei vedea ntregul arbore numerotat i cteva sgei care arat ordinea numerotrii.

Vom numi aceste numere stngul i dreptul (de exemplu valoarea stng pentru "Food" este 1, valoarea dreapt este 18). Dup cum vedei, aceste numere indic relaia care se stabilete ntre fiecare dintre aceste noduri. Deoarece "Red" are numerele 3 i 6, el este un descendent al nodului 1-18 "Food". n acelai fel, putem spune c toate nodurile cu valorile din stanga mai mari dect 2 i valorile din dreapta mai mici dect 11 sunt descendeni ai nodului 2-11 "Fruit". Structura arborelui este acum stocat n valorile din stnga i din dreapta. Aceast metod de a merge de jur mprejurul arborelui i de a numra nodurile se numete algoritmul "Parcurgerea n preordine modificat a arborelui"

nainte de a continua, s vedem cum arat aceste valori n tabelul nostru:

Dup cum observai, cuvintele "left" i "right" au un neles special n SQL. De aceea, va trebui s folosim "lft" i "rgt" pentru a identifica coloanele. Observai de asemenea c nu prea mai avem nevoie de coloana printe . Avem acum valorile "lft" i "rgt" pentru a stoca structura arborelui. Extragerea datelor din Arbore Dac vrei s artai arborele folosind un tabel cu valorile din stnga i din dreapta, va trebui mai nti s identificai nodurile pe care vrei s le restabilii. De exemplu, dac vrei subarborele "Fruit", va trebui s selectai numai nodurile cu o valoare-stnga cuprins ntre 2 i 11. n SQL, aceasta ar nsemna: SELECT * FROM tree WHERE lft BETWEEN 2 AND 11; Aceast interogare returneaz:

Ei bine, iat un arbore ntreg ntr-o singur interogare. Pentru a arta acest arbore aa cum am procedat cu funcia noastr recursiv, va trebui s adugm o clauz ORDONEAZA DUPA la aceast interogare. Dac adugai i tergei rnduri din tabelul dvs, probabil c el nu va fi n ordinea corect. De aceea, ar trebui s ordonm rndurile dup valoarea lor din stnga. SELECT * FROM tree WHERE lft BETWEEN 2 AND 11 ORDER BY lft ASC; Ultima problem care ne-a mai rmas este indentarea. Pentru a arta structura arborelui, copiii ar trebui indentai ceva mai mult dect printele lor. Putem face aceasta, pstrnd o stiv a valorilor din dreapta. De fiecare dat cnd ncepei cu copiii unui nod, adugai valoarea din dreapta a acelui nod la stiv. tii c toi copiii acelui nod au o valoare-dreapta mai mic dect valoarea din dreapta a printelui, aa c, dac o s comparai valoarea din dreapta a nodului curent cu ultimul nod din dreapta aflat n stiv, o s putei vedea dac nc mai artai copiii acelui printe. Cnd ai terminat de artat un nod,

ndeprtai valoarea sa din partea dreapt din stiv. Dac vei numra elementele din stiv, vei obine nivelul nodului curent.

Cod:

<?php function display_tree($root) { // acum, restabileste toti descendentii nodului $root $result = mysql_query('SELECT lft, rgt FROM tree '.'WHERE title="'. $root.'";'); $row = mysql_fetch_array($result); // incepe cu o stiva $right goala $right = array(); // acum, restabileste toti descendentii nodului $root $result = mysql_query('SELECT title, lft, rgt FROM tree '. 'WHERE lft BETWEEN '.$row['lft'].' AND '. $row['rgt'].' ORDER BY lft ASC;'); // 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); } } // arata titlul nodului indentat echo str_repeat(' ',count($right)).$row['title']."\n"; // adauga acest nod la stiva $right[] = $row['rgt']; } } ?>
Dac vei folosi acest cod, vei obine exact acelai arbore pe care l-ai obinut cu funcia recursiv discutat mai sus. Noua noastr funcie va fi probabil mai rapid, nu este recursiv i folosete doar dou interogri Calea ctre un nod Cu acest nou algoritm, va trebui de asemenea s gsim un nou mod de a obine calea ctre un anumit nod. Pentru a obine aceast cale, vom avea nevoie de o list a tuturor strmoilor acelui nod. Cu structura noului nostru tabel, nu este foarte greu. Cnd v uitai, de exemplu, la nodul 45 "Cherry", o s vedei c valorile din stnga ale tuturor strmoilor sunt mai mici dect 4, n timp ce toate valorile din dreapta sunt mai mari dect 5. Pentru a obine toi strmoii, putem folosi aceast interogare: SELECT title FROM tree WHERE lft < 4 AND rgt > 5 ORDER BY lft ASC;

Observai c, ntocmai ca n investigaia noastr precedent, trebuie s folosim clauza ORDONEAZA DUPA pentru a sorta nodurile. Aceast interogare va returna:

Citat:

+-------+ | title | +-------+ | Food | | Fruit | | Red | +------Acum nu ne rmne dect s intrm pe fiecare rnd pentru a gsi calea spre "Cherry". Ci descendeni Dac mi dai valorile din stnga i din dreapta ale unui nod, v pot spune ci descendeni are, folosind puin matematic. Deoarece fiecare descendent incrementeaz valoarea din dreapta a nodului cu 2, numrul descendenilor poate fi calculat cu: $descendants = (right - left - 1) / 2 Cu aceast formul simpl, v pot spune c nodul 2-11 "Fruit" are 4 noduri descendeni i c nodul 8-9 "Banana" este doar un copil, nu un printe. Automatizarea parcurgerii arborelui Acum c ai vzut cteva dintre lucrurile uoare pe care le putei face cu acest tabel, e timpul s nvm cum putem automatiza crearea acestui tabel. Cu toate c este un exerciiu plcut atunci cnd e fcut prima dat i cu un arbore mic, avem cu adevrat nevoie de un scenariu care s fac toat aceast numrtoare i nconjur al arborelui pentru noi. S scriem un scenariu care transform o list adiacent ntr-un tabel traversal al arborelui cu preordine modificat.

Cod:

<?php function rebuild_tree($parent, $left) { // valoarea din dreapta a acestui nod este valoarea din stanga + 1 $right = $left+1; // obtine toti copiii acestui nod $result = mysql_query('SELECT title FROM tree '.'WHERE parent="'. $parent.'";'); while ($row = mysql_fetch_array($result)) { // executarea recursiva a acestei functii pt fiecare // copil al acestui nod

// $right este valoarea dreapta curenta, care este // incrementata de functia rebuild_tree() $right = rebuild_tree($row['title'], $right); } // am obtinut valoarea din stanga, si acum ca am procesat // copiii acestui nod stim si valoarea din dreapta mysql_query('UPDATE tree SET lft='.$left.', rgt='.$right.' WHERE ti tle="'.$parent.'";'); // returneaza valoarea din dreapta a acestui nod + 1 return $right+1; } ?>
Aceasta este o funcie recursiv. Ar trebui s-o pornii cu rebuild_tree('FOOD',1); atunci funcia restabilete toi copiii nodului "Food". Dac nu exist copii, ea stabilete valorile din stnga i din dreapta ale acestui nod. Valoarea din stnga este dat, 1, iar valoarea din dreapta este valoarea din stnga plus 1. Dac exist copii, aceast funcie se repet i ultima valoare din dreapta este restabilit. Aceast valoare este folosit atunci ca valoare din dreapta a nodului "Food". Recursivitatea face ca aceast funcie s fie, prin complexitatea ei, destul de greu de neles. Totui, ea ajunge la acelai rezultat la care am ajuns noi manual la nceputul acestui capitol. Ea merge n jurul arborelui, adugnd cte un nod pentru fiecare nod pe care l vede. Dup ce ai pus n aplicare aceast funcie, vei vedea c valorile din stnga i din dreapta rmn aceleai (o verificare rapid, valoarea din dreapta a nodului rdcin ar trebui s fie egal cu de dou ori numrul nodurilor). Adugarea unui nod Cum adugm un nod la arbore? Exist dou abordri: putei pstra coloana printe n tabelul dvs i doar s pornii din nou funcia rebuild_tree() o funcie simpl dar nu aa de elegant; sau putei reactualiza valorile din stnga i din dreapta ale tuturor nodurilor n partea dreapt a fiecrui nod nou. Prima opiune este simpl. Folosii metoda listei adiacente pentru reactualizare i algoritmul parcurgerii arborelui cu preordine modificat pentru restabilire. Dac vrei s adugai un nou nod, adugai-l la tabel i setai coloana printe. Apoi, nu v rmne dect s repornii funcia rebuild_tree(). Aceast opiune este uoar, dar nu foarte eficient cu arbori mari. Cea de-a doua modalitate de a aduga i terge noduri const n reactualizarea valorilor din stnga i din dreapta ale tuturor nodurilor n partea dreapt a noului nod. S ne uitm la un exemplu. Vrem s adugm un nou tip de fruct, o "Strawberry", ca ultim nod i copil al "Red". Mai nti, va trebui s facem puin loc. Valoarea - dreapta de la "Red" ar trebui schimbat din 6 n 8, iar nodul 7-10 "Yellow" ar trebui schimbat n 9-12 etc. Reactualizarea nodului "Red" nseamn c va trebui s adugm 2 la toate valorile din stanga i din dreapta mai mari dect 5. Vom folosi interogarea: UPDATE tree SET rgt=rgt+2 WHERE rgt>5; UPDATE tree SET lft=lft+2 WHERE lft>5; Acum putem aduga un nou nod "Strawberry" pentru a umple noul spaiu. Acest nod are valoarea - stnga 6 i valoarea - dreapta 7.

INSERT INTO tree SET lft=6, rgt=7, title='Strawberry'; Dac pornim funcia noastr display_tree();, 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 rnd, algoritmul parcurgerii arborelui cu preordine modificat pare greu de neles. Este cu siguran mai greu dect metoda listei adiacente. Totui, odat ce v-ai obinuit cu proprietile valorilor din stnga i din dreapta, este evident c putei face cu aceast tehnic aproape tot ce fceai cu metoda listei adiacente i c algoritmul traversal al arborelui cu preordine modificat este mult mai rapid. Reactualizarea arborelui impune mai multe investigaii, ceea ce dureaz mai mult, dar restabilirea nodurilor se realizeaz cu o singur interogare. Concluzie Acum v-ai familiarizat cu ambele metode de stocare a arborilor ntr-o baz de date. Dei prefer oarecum parcurgerea arborelui cu preordine modificat, n cazul dvs. metoda listei adiacente ar putea fi mai bun. V las s judecai singuri. Lecturi suplimentare Mai multe despre Arbori n SQL de specialistul n baze de date Joe Celko: http://searchdatabase.techtarget.com/tip/1,289483,sid13_gci537290,00.html Alte dou metode pentru a opera cu datele ierarhice: http://www.evolt.org/article/Four_ways_to_work_with_hierarchical_data/17/4047/index.html Xindice, baza de date XLM nativ: http://xml.apache.org/xindice/ O explicaie a recursivitii: http://www.strath.ac.uk/IT/Docs/Ccourse/subsection3_9_5.html Autor articol: De Gijs Van Tulder - 30 aprilie 2003 (Traducere efectuat de Dragos dup articolul original)

PHP 5, 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 plcea). Motivul? Data viitoare cnd am nevoie de ceva asemntor s pot gsi repede i ct de ct documentat informaiile necesare, innd cont c la un moment dat voi pierde aceste lucruri printr-un col al hdd-ului. I. Noiuni ncerc s respect ct mai exact regulile publicate sub numele de Coding Standards pe pagina de web PEAR. Documentaia "inline" a claselor, metodelor i atributelor este foarte folositoare cnd citesc codul surs al unui fiier scris n urm cu 6 luni. De obicei folosesc phpDocumentor pentru a genera din codul php documenii n mod profesional. Am gsit i un tutorial aici. II. Intro Primul exemplu prezentat n aceast serie se refer la implementarea conceptului de factory n php. Acest exemplu nu este complet i nu poate fi considerat un exemplu standard al ideii de factory. Pentru a-mi rspunde la ntrebarile "Ce este un Factory?", "La ce m ajut?", "Este folositor?", "Se merit?" am citit articolul "The Factory Method" de Harry Fuecks. Am parcurs cu atenie codul postat acolo, i am mai citit i paginile astea ce fac parte din prezentarea "2002 International PHP Conference: Applied OO PHP: APIs, Design Patterns and Useful Objects - Chuck Hagenbuch". Google mi-a mai adus cteva articole interesante. ntr-un final, m-am hotrt s implementez un exemplu scris n java. Pentru teste, o s folosesc php CLI i un director numit trace_factory. III. Interfaa. Din documentaia prezentat n manual, printr-o interaf putem creea un obiect care specific metodele pe care o clas trebuie s le implementeze, fr a defini ns comportamentul acestor metode. Traducerea interfeei din java n PHP 5 arat cam aa:

Cod:

<?php /** * Is the Trace Interface * It contains common methods for every implementation * @package test.factory.trace * @access public

*/ interface Trace { /** * Turn on and off debugging * @param bool debug */ public function setDebug($debug); /** * Write out a debug message * @param string message to debug */ public function debug($message); /** * write out an error message * @param string message to debug */ public function error($message); } ?>
fiier pe care l-am salvat cu numele de ITrace.php. Continund exemplu, vom scrie dou implementri, prima, va afia mesajele n consol (sau pagina web dac se renun la CLI) iar cea dea doua, va scrie mesajele ntr-un fiier text. IV. StdoutTrace.php

Cod:

<?php include_once('ITrace.php'); /** * It display the trace to stdout * * @package test.factory.trace * @access public */ class StdoutTrace implements Trace { /** * debug * @var bool * @access private */ private $debug; /** * Sets the debug * @param bool debug * @return void * @access public */

public function setDebug($debug) { $this->debug = $debug; } /** * 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")." DEBUG >>>>".$message."\n"; } } /** * 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")." ERROR >>>>".$message."\n"; } } ?>
Fiierul l-am salvat cu numele de StdoutTrace.php n acelai director. V. FileTrace.php

Cod:

<?php include_once('ITrace.php'); /** * It logs the trace to a file * * @todo: implement a custom Exception class * @package test.factory.trace * @access public */ class FileTrace implements Trace { /** * It`s the file handler

);

* @var handler * @access private */ private $handler; /** * Is the file name * @var string * @access private */ private $file; /** * debug * @var bool * @access private */ private $debug; /** * 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 ".$file." is not writable,\n Or it dosent exist in ".__METHOD__." at ".__LINE__."!\n" } $this->handler = fopen($file, "a+"); }

/** * Sets the debug * @param bool debug * @return void * @access public */ public function setDebug($debug) { $this->debug = $debug; } /** * 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) {

// only print if debug is true fwrite($this->handler<;/span>, date("d-m-Y H:i:s")." DEBUG >>>> ".$message."\n"); } } /** * 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, date("d-m-Y H:i:s")." ERROR >>>> ". $message."\n"); } /** * Is the Destructor * just close the handle * @access public * return void */ public function __destruct() { if($this->handler===true) { fclose($this->handler); } } } ?>
Fiierul l-am salvat cu numele de FileTrace.php n acelai director. VI. Factory

Cod:

<?php include_once('FileTrace.php'); include_once('StdoutTrace.php'); /** * Is the factory * * @access public * @package test.factory.trace */ class TraceFactory {

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

nu cred c i are rostul (poate se ntmpl altceva n $this->handler = fopen($file, "a+") ?). Am decis, ca n PHP s nlocuiesc atributul: private java.io.PrintWriter pw cu $handler, i am constatat c n PHP pentru a scrie ceva ntr-un fiier este mai intuitiv i mai uor de reinut. Comparaie: pw = new java.io.PrintWriter( new java.io.FileWriter( "c:\trace.log" ) ); (nu o s reint foarte uor linia asta) cu $this->handler = fopen($file, "a+"); din constructori, sau cu modalitatea de scriere (de exemplu): pw.println( "DEBUG: " + message ); pw.flush(); (??) cu fwrite($this->handler, date("d-m-Y H:i:s") . " DEBUG >>>> " . $message . "\n"); Dar, asta este deja o alt discuie. Pentru o mai mare flexibilitate, am decis ca numele fiierului n care s log-m mesajele s fie pasat n constructor (parc a vrea s mearg i pe linux i pe windows n aceiai manier, nu folosind un nume de fiier predefinit: c:\trace.log). Acest lucru, aduce i modificri directe n factory. n schimb, n StdoutTrace lucrurile sunt destul de clare, exact ca n exemplu, cu meniunea c numele obiectului prezentat n exemplu (SystemTrace), l-am nlocuit cu StdoutTrace. Voi continua cu explicaii pentru TraceFactory. Exact ca n exemplul urmat, am declarat metoda ca fiind static, adugnd n plus parametrul $file, reprezentnd numele fiierului n care voi loga mesajele. Folosesc un bloc try/catch pentru a intercepta exceptia aruncat de constructorul din FileTrace. Poate c sensul exemplului s-a schimbat n momentul n care am decis s pasez numele fiierului n care se face logarea. Ca o mic traducere, ncerc (try) s returnez o nou instan a obiectului FileTrace, dac nu reusec acest lucru (catch), initializez StdoutTrace care va merge sigur avnd astfel posibilitatea de a afia mesajele de eroare/debug. n partea urmtoare, o s ncerc i o implementare a acestui exemplu, cu toate c acum este destul de intuitiv. VIII. O implementare Am scris fiierul runTrace.php:

Cod:

<?php include_once('TraceFactory.php');

$filename = 'logger.log'; touch($filename); $t = &TraceFactory::getTrace($filename); $t->error("O eroare de test!"); $t->setDebug(true); $t->debug("Debug is true"); for($i=1;$i<10;$i++) { $t->debug("Tha lup :: ".$i); } unset($t); $t = &TraceFactory::getTrace(); $t->error("Ceva de test!"); $t->setDebug(true); $t->debug("True Debug"); for($i=1;$i<10;$i++) { $t->debug("Za I :: " . $i); } $t->error("FOO IS BAR MUST DIE !!!"); ?>
Dup execuie, n consol rezultatul a fost:

Citat: $ php runTrace.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 fiierul logger.log am:

Citat: 15-01-2005 14:42:24 ERROR >>>> O eroare de test! 15-01-2005 14:42:24 DEBUG >>>> Debug is true

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, comentez linia: touch($filename); i terg fiierul logger.log, rezultatul va fi (normal, doar n consol, cci constructorul din FileTrace va arunca excepia ntruct fiierul nu va exista): $ php runTrace.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 !!!

Totui, nu sunt mulumit de codul scris, i mai mult, pasnd $file ca parametru n factory, i implicit i constructorului din FileTrace m-am ndeprtat prea mult de exemplul de la care am pornit. O s ncerc s rescriu FileTracei TraceFactory pentru a ajunge la utilitatea i concluziile prezentate n exemplul urmat:

Citat: Further, factory methods prove useful when you're not sure what concrete implementation of a class to

instantiate. Instead, you can leave those details to the factory method. In the above examples your program didn't know whether to create FileTrace or SystemTrace instances. Instead, you can program your objects to simply use Trace and leave the instantiation of the concrete implementation to a factory method.

IX. Ceva corecturi Aa cum ziceam n finalul ultimului capitol, m-am decis s rescriu FileTrace i TraceFactory, pentru a fi ct mai aproape de modelul urmat. FileTrace.php

Cod:

<?php include_once('ITrace.php'); /** * It logs the trace to a file * * @todo: implement a custom Exception class * @package test.factory.trace * @version 0.2 * @access public */ class FileTrace implements Trace { /** * It`s the file handler * @var handler * @access private */ private $handler; /** * debug * @var bool * @access private */ private $debug; /** * The construnctor * it opens the file handler * * @param string the file name * @return void * @access public */ public function __construct() { $file = 'logger.log'; if((!is_file($file)) or (!is_writable($file))) { throw new Exception("The file ".$file." is not writable,\nOr

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

} ?>

TraceFactory.php

Cod:

<?php /** * Is the factory * * @version 0.2 * @access public * @package test.factory.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'); return new FileTrace(); } catch (Exception $ex) { include_once('StdoutTrace.php'); $t = new StdoutTrace(); $t->error("Could not instantiate FileTrace:\n".$ex>getMessage()); return $t; } } } ?>

X. Alte explicaii Am ncercat s m apropii ct mai mult de exemplul pe care l-am urmat. Mai bine, constructorul din FileTrace, ar putea fi rescris aa:

Cod:

<?php

function __construct() { $file = 'logger.log'; $this->handler = @fopen($file, "a"); if($this->handler===false) { throw new Exception("Cannot create the file hanled!"); } } ?>
ns, pe windows ar fi mai greu de testat, nu ar trebui s existe ngrijorri legate de faptul c nu a putea crea fiierul logger.log. Pe linux, innd cont de permisiunile care trebuiesc setate pentru directorul n care lucrez ar fi totui posibil. XI. O alt implementare Am rescris i mini testul runTrace.php astfel:

Cod:

<?php include_once('TraceFactory.php'); $t = &TraceFactory::getTrace(); $t->error("O eroare de test!"); $t->setDebug(true); $t->debug("Debug is true"); for($i<;/span>=1;$i<10;$i++) { $t->debug("Tha lup :: ".$i); } unset($t); $t = &TraceFactory::getTrace(); $t->error("Ceva de test!"); $t->setDebug(true); $t->debug("True Debug"); for($i=1;$i<10;$i++) { $t->debug("Za I :: ".$i); } $t->error("FOO IS BAR MUST DIE !!!"); ?>
Teste? Rezultatele au fost previzibile. FileTrace nu a aruncat nici o excepie cu constructorul din capitolul X deci totul a fost logat n fiierul logger.log. Pot fi linitit acum, mi pot scrie scripturile mai departe, folosind i o metod de logare a evenimentelor produse pe parcursul lor, fr s ma intereseze dac se produce ntr-un fiier sau pe consol, este treaba factory-ului s decid lucrul sta.

PHP 5, SQLite n Factory?

n articolul anterior am prezentat notiunea de factory n PHP 5. n continuare o s aprofundez aceste tehnici raportate la o baz de date. XII. SQLite? Dup un timp, am zis s ncerc s mai creez nc un produs pentru factory-ul descris n tutorialul precedent. Mi-ar fi plcut s am posibilitatea s log-ez erorile i mesajele de debug ntr-un tabel al unei baze de date. i cum nc nu am avut posibilitatea s lucrez cu SQLite, am decis ca acesta s fie tipul de baz de date pe care o s l folosesc. 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.0 trebuie s folosesc SQLite 2.8.15, nu SQLite 3.0.8. Bazele de date create cu SQLite 3.0.8 vor putea fi accesate din viitorul PHP 5.1, deci mai am de asteptat pn n a doua jumtate a acestui an. Ce este SQLite? Deci, folosind clientul SQLite, versiune 2.8.15 m-am pus pe treab, i am creat o baz de date nou: $ sqlite logger.db Am aflat c mi pot scrie sql-ul linitit i apoi l pot importa ntr-o baz de date SQLite. dump.sql:

Cod:

BEGIN TRANSACTION; CREATE TABLE logger (id INTEGER PRIMARY KEY,message TEXT,timeEnter DATE ); CREATE TRIGGER insert_logger_timeEnter AFTER INSERT ON logger BEGIN UPDATE logger SET timeEnter = DATETIME('NOW') WHERE rowid = new.rowid; END; COMMIT;
Lucruri obinuite aici: un tabel cu numele logger, ce conine un cmp id de tip INTEGER cheie primar, un cmp message, unde evident voi ine mesajele i timeEnter n care voi pstra data introducerii unui mesaj nou. n plus, am creat un TRIGGER, astfel la fiecare insert pe care l voi face, cmpul timeEnter se va actualiza singur (nu o s fie nevoie s i mai zic insert into logger (timeEnter) values DATETIME('NOW'), insert into logger (message) values ($message) va fi destul pentru a actualiza cele 3 campuri). Am descoperit astfel i triggeri n SQLite, dup ce am citit i tutorialul asta. Am importat fiierul dump.sql cu comanda: $ sqlite logger.db < dump.sql Binarul (fiierul .exe pe Windows) ar trebui s fie n PATH pentru a avea comanda sqlite la

prompt. XIII. Un nou produs, SQLite Tinnd cont c va trebui s implementez metodele interfeei Trace i, urmnd exemplul din FileTrace am scris destul de repede i uor SQLiteTrace.php:

Cod:

<?php // merge cu sqlite 2.8.15 pe php 5.0! /* ----------> SQL DUMP BEGIN TRANSACTION; CREATE TABLE logger (id INTEGER PRIMARY KEY,message TEXT,timeEnter DATE ); CREATE TRIGGER insert_logger_timeEnter AFTER INSERT ON logger BEGIN UPDATE logger SET timeEnter = DATETIME('NOW') WHERE rowid = new.rowid; END; COMMIT; <---------- SQL DUMP */ include_once('ITrace.php'); /** * It logs the trace to a sqlite db * * @todo: implement a custom Exception class * @package test.factory.trace * @access public */ class SQLiteTrace implements Trace { /** * It`s the db handler * @var handler * @access private */ private $handler; /** * debug * @var bool * @access private */ private $debug; /** * The construnctor * it opens the db handler * * @return void * @access public */ public function __construct() {

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

*/ public function __destruct() { @sqlite_close($this->handler); } } ?>


XIV. Un nou Creator Am reuit s rescriu i TraceFactory.php astfel:

Cod:

<?php /** * Is the factory * * @version 0.3 * @access public * @package test.factory.trace */ class TraceFactory { /** * It trys to get a trace * * @access public * @return object Trace, a trace instance */ public static function &getTrace() { try { include_once('FileTrace.php'); return new FileTrace(); } catch (Exception $ex) { try { include_once('SQLiteTrace.php'); $t_sqlite = new SQLiteTrace(); $t_sqlite->error("Could not instantiate FileTrace:\n". $ex->getMessage()); return $t_sqlite; } catch(Exception $sqlite_ex) { include_once('StdoutTrace.php'); $t = new StdoutTrace(); $t->error("Could not instantiate SQLiteTrace:\n". $sqlite_ex->getMessage()); return $t;

} } ?> }

Chiar dac nu mi place prea mult blocul:

Cod:

<?php try { } catch (Exception $ex) { try { } catch(Exception $sqlite_ex) { ?> }

Tracerul meu este funcional avnd 3 metode distincte de a loga mesajele: ntr-un fiier, ntr-o baz de date sau direct pe consol (nu prea o s vd lucrul sta prea curnd totui). XV. Neajunsuri n momentul de fa, sincer s fiu, nu mi dau seama unde a putea implementa acest exemplu. A vrea s l continui, aducd n discuie un alt procedeu: observer, mai mult, mi-ar plcea s am mai multe nivele de logare (debug/info/error/alert/emergency). Metoda getTrace nu mi se pare prea flexibil, 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.4 * @access public * @package test.factory.trace */

class TraceFactory { /** * It trys to get a trace * * @param string driver, it can be File or SQLite * @access public * @return object Trace, a trace instance */ public static function &getTrace($driver='') { $drivers = array('File','SQLite'); if(!in_array($driver, $drivers)) { include_once('StdoutTrace.php'); return new StdoutTrace(); } try { $rs = $driver.'Trace'; include_once($rs.'.php'); return new $rs(); } catch (Exception $ex) { include_once('StdoutTrace.php'); $t = new StdoutTrace(); $t->error("Could not instantiate ".$driver.":\n".$ex>getMessage()); return $t; } } } ?>
iar testul urmtor, runTrace.php mi-ar loga mesaje n fiierul text n prima parte, n baza de date SQLite n partea de mijloc i n final a afia i ceva n consol:

Cod:

<?php include_once('TraceFactory.php'); $t = &TraceFactory::getTrace('File'); $t->error("O eroare de test!"); $t->setDebug(true); $t->debug("Debug is true"); for($i=1;$i<10;$i++) { $t->debug("Tha lup :: ".$i); } unset($t); $t = &TraceFactory::getTrace('SQLite'); $t->error("Ceva de test!"); $t->setDebug(true);

$t->debug("True Debug"); for($i=1;$i<10;$i++) { $t->debug("Za I :: ".$i); } $t->error("FOO IS BAR MUST DIE !!!"); unset($t); $t = &TraceFactory::getTrace('Unknow_driver'); $t->error("Ajunge in consola!"); $t->setDebug(true); $t->debug("True Debug a fos setat"); for($i=1;$i<10;$i++) { $t->debug("I-ul :: ".$i); } $t->error("Fatal!!!"); ?>
Rmne ns de discutat despre diferite niveluri de log i de introducerea unui observer care s m anune n cazul n care se produce o eroare n sistem. Pn una-alta, rmn cu PEAR::Log, dar o s continui totui acest articol prin introducerea componentelor de mai sus, cea ce nseamn un sitem de logare a mesajelor ct de ct complet i utilizabil n producie (chiar dac constat c SQLite nu este chiar att de rapid :) ).

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