Sunteți pe pagina 1din 184

Introducere (PHP - Hypertext Preprocessor )

Limbajul PHP a fost creat in anul 1994 de catre Rasmus Lerdorf, care incerca sa-si personalizeze propria pagina Web; din acest motiv limbajul a fost numit initial PHP adica: Personal Home Page (pagina de baza personala). Ulterior limbajul a fost perfectionat, utilitatea si caracteristicile sale s-au dezvoltat treptat, ajungand sa aiba semnificatia Hypertext Preprprocesor (PHP). Preprocesarea consta in aceea ca datele sunt interpretate(preprocesate) de catre serverul Web inainte ca acesta sa genereze cod HTML. PHP este una dintre cele mai interesante tehnologii pentru site-uri si programare web, imbina caracteristici dintre cele mai complexe cu simplitatea n utilizare. PHP a devenit un instrument de frunte pentru dezvoltarea aplicatiilor Web. Spre deosebire de alte instrumente pentru aplicatii Web, cum este Perl, PHP este un limbaj de programare comod pentru ncepatori, chiar si pentru cei care nu au mai desfasurat activitati de programare. Daca sunteti un cunoscator al limbajului HTML, dar nu aveti experienta n materie de programare, va puteti pune ntrebarea: care sunt functionalitatile suplimentare pe care le poate asigura cunoasterea limbajului PHP? Ca si alte limbaje de scripting pentru Web, PHP va permite sa furnizati un continut Web dinamic, adica un continut Web care se modifica automat de la o zi la alta sau chiar de la un minut la altul. Continutul Web este un element important n sustinerea traficului unui sit Web; de regula, vizitatorii nu vor mai reveni la o pagina Web care contine aceleasi informatii ca si cele prezentate la ultima vizita. Pe de alta parte, siturile Web frecvent actualizate pot atrage cantitati enorme de trafic. Mai mult, spre deosebire de limbajele de scripting, precum JavaScript, PHP ruleaza pe serverul Web, nu n navigatorulul Web. n consecinta, PHP poate obtine accesul la fisiere, baze de date si alte resurse inaccesibile programului JavaScript. Acestea constituie bogate surse de continut dinamic, care atrag vizitatorii. In plus, putem folosi limbajul PHP pentru a generera cod Java Script. Secventele de cod PHP pot fi incluse intr-un fisier HTML; ulterior serverul Web va identifica aceasta secventa de cod , va procesa acesta secventa de cod generand cod HTML iar la final va inlocui secventa de cod PHP cu codul HTML. Printre caracteristicile cele mai importante ale imbajului enumeram: - simplicitate : acest limbaj este simplu de folosit, fiind accesibil si neprogramatorilor. Datorita acestui fapt el a devenit cel mai popular limbaj de script pentru generarea de pagini HTML dinamice. - usor de folosit : limbajul are o sintaxa asemanatoare limbajului C, care este foarte popular in randul programatorilor. De aceea programatorii care au cunostine de C sau Perl vor face foarte rapid trecerea spre PHP. Pe de alta parte anumite aspecte cum ar fi: declararea si folosirea variabilelor este mult simplificata in PHP, spre deosebire de C++ sau alte limbaje de nivel inalt. - eficienta : specificatiile limbajului includ folositea tehnicilor de POO (Programare orientata pe obiecte) iar acest lucru contribuie la marirea productivitatii: un programator PHP poate folosi module scrise de un alt programator fara sa fie nevoit sa cunoasca detalii specifice de implementare a codului. - cross-platform : exista implementari ale limbajului pe mai multe sisteme de operare, cele mai populare fiind cele de pe sistemele Linux si Windows. In acest caz daca scriem cod PHP care ruleaza pe un sistem Linux, ulterior vom

putea folosi acest cod pe un server care ruleaza Windows si viceversa. - gratis : PHP reprezinta un program Open Source, oricine poate folosi acest limbaj fara a fi nevoit sa plateasca ceva. De asemenea utilizatorii au access la sursele PHP (scrise in limbajul C). Site-ul oficial al limbajului PHP se afla la :www.php.net , datorita popularitatii acestui limbaj exista numeroase siteuri Web care prezinta informatii despre PHP, exemple de cod, forum de discutii , etc. Acest curs de initiere in PHP si MySQL este menit a prezenta elemente introductive de programare si dezvoltare a paginilor web folosind PHP. Este important sa retineti ca nu reprezinta decat un punct de plecare cu lectii si tutoriale php introductive. Dezvoltarea Web este o activitate solicitanta, iar viitorul dezvoltator Web trebuie sa dispuna de multe abilitati, printre care si pe aceea de programator. Dezvoltatorii Web ncepatori vor gasi n aceast curs un prim pas util si amical n activitatea de programare n PHP.

Scrierea scripturilor PHP elementare


Invatati sa creati un script PHP cu cele mai simple instructiuni PHP Invatati sa documentati si sa executati un script PHP

Un script PHP poate fi foarte simplu sau foarte complex. Totusi, scrierea chiar si a unui script PHP complex este relativ simpla, necesitand doar un editor de texte obisnuit. In aceasta lectie veti invata modul de creare si de executare a programelor PHP, veti invata sa creati scripturi PHP simple, care afiseaza in navigatorul web un text simplu. De asemenea, veti invata sa va documentati scripturile, astfel incat dumneavoastra si alte persoane sa puteti intelege rapid scopul si structura acestora. Mai intai trebuie sa instalati un server web (Apache) si modulul pt. limbajul PHP, acestea sunt gratuite, le puteti gasi pe net si instala pe fiecare, dar pentru incepatori e recomandat un program care le are deja configurate (si cu MySQL), precum WampServer, sau sa incarcati scriptul pe un server web unde este instalat PHP. Daca nu aveti deja instalat PHP, descarcati de aici -> WampServer, dezarhivati si instalati programul. (cand este pornit, veti observa o iconita specifica in colltul cu ceasul). Fisierele .php in care veti scrie scripturile trebuie sa le salvati in directorul www din "wamp", apoi, ca sa le testati scrieti in browser adresa http://localhost/fisier.php 1. Scrierea scripturilor PHP Pentru a crea scripturi PHP, majoritatea programatorilor PHP folosesc un editor de texte obisnuit. Puteti folosi orice editor de texte doriti. Sub Microsoft Windows puteti utiliza programul Windows Notepad. Daca preferati, puteti folosi editoare specializate, gen Notepad++. Totusi, trebuie sa tineti cont sa fie un editor de text ce salveaza fisierele cu format text obisnuit simplu. Daca folositi UNIX sau Linux, puteti crea scripturi PHP folosind un program precum "vi", "emacs" sau "pico". Programul in sine nu conteaza, atata vreme cat poate crea fisiere text ASCII.

Nota : - Unele editoare de texte, precum "Notepad++" sau "vi", asigura un suport special pentru scrierea programelor PHP. De exemplu, au o caracteristica de colorare a elementelor de sintaxa ce determina scrierea diferitelor elemente ale codului PHP in culori diferite. Procedeul de colorare a elementelor de sintaxa faciliteaza depistarea erorilor din programele proprii.

2. Scrierea scheletului programelor PHP Fiecare program PHP include doua linii speciale, care indica serverului PHP ca textul cuprins intre cele doua linii este alcatuit din instructiuni PHP. Practic, aceste linii pot fi asimilate copertelor unei carti, care pastreaza unitatea programului dumneavoastra PHP. Intre aceste doua linii vor fi scrise instructiunile PHP. Pentru a incepe sa scrieti un program PHP, deschideti editorul dumneavoastra de texte si introduceti urmatoarele doua linii : <?php ?> - Acesta este un cod de inceput si nu afiseaza nimic. Apoi, salvati scriptul dumneavoastra sub forma de fisier text, in directorul "www" din "wamp", cu un nume care respecta urmatoarele reguli:

Este recomandat ca numele fisierului sa fie alcatuit numai din caractere minuscule, cifre si liniute. Utilizarea de spatii, majuscule si alte caractere ar putea crea probleme pe sisteme de operare diferite. Extensia numelui fisierelor trebuie sa fie .php. Asigurati-va ca ati ales un nume semnificativ, care sa descrie functia scriptului dumneavoastra, astfel incat sa-l puteti identifica rapid dupa saptamani sau chiar luni de la crearea acestuia. Veti descoperi ca liniutele sunt utile pentru separarea cuvintelor care alcatuiesc numele fisierului, marind astfel lizibilitatea acestuia. De exemplu, un fisier care contine un script PHP ce va permite sa vizualizati salariile angajatilor poate primi numele "saarii-angajati.php". Chiar si la mult timp dupa crearea fisierului respectiv, nu veti avea probleme in a determina scopul acestuia. 3. Afisarea datelor de iesire intr-un browser Web Programele PHP executa trei categorii de operatii elementare:

Obtin date de la un utilizator. Executa prelucrari ale datelor, respectiv obtine accesul la datele stocate in fisiere si baze de date si le manipuleaza. Afiseaza date astfel incat un utilizator sa le poata vizualiza. Primele doua operatii sunt oarecum mai dificil de realizat decat cea de-a treia. Totusi, afisarea datelor astfel incat acestea sa fie vizibile utilizatorului este o operatie foarte simpla. Asa cum paragrafele unui text scris sunt compuse din propozitii, programele PHP sunt alcatuite din instructiuni. Regulile care controleaza formarea propozitiilor se numesc sintaxa. Acelasi termen este folosit si pentru a desemna regulile care guverneaza formarea instructiunilor PHP. Iata un exemplu pentru crearea instructiunii PHP care trimite date de iesire la un browser Web, astfel incat acestea sa fie vizibile pentru un utilizator:

<?php echo "scrieti aici un text oarecare"; ?>

Observati ca instructiunea incepe cu un cavant "echo" si se incheie cu un caracter punct si virgula (;). Constructia echo trimite datele de iesire care vor fi afisate de browser. Ghilimelele duble se folosesc pentru delimitarea unei expresii de tip text, in cazul nostru "scrieti aici un text oarecare" (se pot folosi si ghilimele simple). In locul propozitiei "scrieti aici un text oarecare" puteti plasa aproape orice text, cu exceptia altor ghilimele. Totusi, pentru moment, trebuie sa includeti numai litere, cifre, spatii si semne de punctuatie folosite in alfabetul latin, precum virgula, caracterul punct si virgula, punctul, semnul de intrebare si semnul exclamarii. De asemenea, puteti include caracterele < >, folosite pentru delimitarea etichetelor HTML, respectiv caracterul /, folosit pentru a indica membrul de inchidere al unei perechi de etichete HTML. De exemplu, iata o instructiune PHP care are drept date de iesire un fragment dintr-un vers din Scrisoarea a III-a de Eminescu: <?php echo "<h2> Iata vine-un sol de pace</h2>"; ?> - Ca sa vedeti rezultatul, salvati fisierul cu acest cod in directorul www din "wamp", de exemplu cu denumirea teste.phpsi apelati in browser adresa http://localhost/teste.php (programul WampServer trebuie sa fie pornit). Perechea de etichete H2 determina formatarea datelor de iesire ca titlu HTML de nivel 2. Scripturile PHP pot fi incluse si in fisiere cu cod HTML, ca in urmatorul exemplu (dar salvate cu extensia ".php"): <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Test PHP</title> </head> <body> <?php echo "<h4> Exemplu de script PHP inclus in HTML</h4>" ; ?> </body> </html> In browser va aparea :

Exemplu de script PHP inclus in HTML


Pot fi incluse si scripturi mai complicate ce contin zeci sau chiar sute de linii, atata timp cat acestea sunt incluse intre cele doua linii specifice limbajului PHP: <?php ?>

4. Documentarea unui script PHP In afara de a furniza nume descriptive fisierelor ce contin scripturile dumneavoastra PHP, e necesar sa includeti in interiorul fiecarui script atat comentarii care sa permita unui cititor sa determine cu usurinta utilitatea

scriptului, cat si alte informatii referitoare la script. De exemplu, puteti include un comentariu care precizeaza numele autorului scriptului si ce face acesta. Iata un model sintactic pentru comentariile PHP: // Scrieti aici comentariul dumneavoastra (pe o singura linie) Dupa cum se poate vedea, un comentariu incepe cu doua caractere slash, urmate de un spatiu. n continuare, linia contine comentariul dumneavoastra, care poate include orice caractere doriti, inclusiv caractere speciale. Iata un exemplu simplu de script PHP care include comentarii: <?php // Script de la MarPlo.net // Acest script afiseaza un mesaj vizibil pentru utilizator. echo "Acesta este un script foarte simplu."; ?>

Nota: Fiecare linie a comentariului trebuie sa inceapa cu doua caractere slash //. Totusi, puteti crea un comentariu din mai multe linii si in alte moduri. Iata un exemplu: /* Acesta este un comentariu pe mai multe linii. Poate fi alcatuit dintr-un numar oricat de mare de linii. */ Pentru a adauga un comentariu alcatuit din mai multe linii, scrieti la inceput caracterele /*, iar la sfarsit trebuie sa se incheie cu caracterele */. Intre cele doua perechi de caractere, puteti scrie orice text doriti, folosind oricate linii doriti.

5. Executarea unui script PHP Dupa ce ati creat un script PHP, veti dori sa-l executati. Sa luam un alt exemplu, ce contine cod HTML si comentarii: Deschideti editorul dumneavoastra de texte si introduceti urmatoarele linii : <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Test PHP</title> </head> <body>
<?php // Script test // Acest script afiseaza un mesaj vizibil pentru utilizator. echo "Primul meu script PHP."; ?> </body> </html>

Salvati fisierul cu numele test-script.php Daca ati instalat un server de PHP pe calculatorul dumneavoastra, salvati fisierul in directorul www al serverului. Deschideti browserul si scrieti adresa URL http://localhost/test-script.php Daca nu aveti instalat un server de PHP pe calculator, incarcati (prin FTP) fisierul test-script.php pe un server pe web unde este instalat PHP. Dupa ce v-ati incarcat fisierul cu scriptul, sunteti pregatit pentru a obtine

accesul la acesta. Deschideti browserul Web si apelati adresa URL asociata scriptului dumneavoastra. Adresa URL trebuie sa fie alcatuita din adresa URL identificata de administratorul serverului unde ati incarcat scriptul, urmata de un slash (/), urmata de numele fisierului care contine scriptul dumneavoastra. Daca adresa URL se incheie deja cu un caracter slash, nu trebuie sa mai inserati inca un asemenea caracter inainte de numele scriptului dumneavoastra. De exemplu, daca domeniul serverului unde ati incarcat scriptul e http://www.marplo.net/ ca adresa URL a catalogului care contine scripturile dumneavoastra PHP, puteti obtine accesul la scriptul dumneavoastra prin intermediul adresei URL http://www.marplo.net/test-script.php Daca ati tastat corect adresa URL a scriptului dumneavoastra, iar scriptul respectiv nu contine erori, veti vedea datele de iesire ale scriptului dumneavoastra. Felicitari! Ati devenit programator PHP! In browser va aparea:
Primul meu script PHP.

Tipuri de siruri si variabile


nvatati tipul variabilelor in PHP nvatati sa folositi ghilimele si caractere escape pentru a specifica valori de tip sir speciale Numere si siruri, tipul variabilelor Programele de calculator manipuleaza datele, care reprezinta informatii. Programele PHP folosesc doua categorii principale de date: numere si siruri. Numerele sunt compuse mai ales din cifre, n timp ce un sir poate contine orice caracter, inclusiv cifre, litere si simboluri speciale. Decizia privind modul de stocare a datelor este importanta, n mod caracteristic, datele se stocheaza sub forma de numere atunci cnd se doreste executarea unor operatii matematice asupra datelor, deoarece numerele sunt stocate ntr-un mod care permite efectuarea de calcule. Pe de alta parte, sirurile sunt stocate folosind o modalitate care faciliteaza ntelegerea lor de catre operatorul uman. Datele trebuie stocate sub forma de siruri daca formatul acestora nu este numeric sau daca doriti ca operatorul uman sa fie capabil de a introduce sau de a vizualiza datele. Practic, puteti asimila numerele cu un mod de stocare a datelor n interiorul calculatorului. Sirurile se pot asimila unui mod de stocare a datelor n afara calculatorului. Aceste doua mari categorii de date: numere si siruri, formeaza opt tipuri principale de variabile :

Boolean Integer Float String Array Object Resource Null

In mod normal tipul variabilelor nu este specificat explicit; acesta va fi evaluat de catre interpretorul PHP la momentul run-time (in momentul executarii scriptului).

1. Tipul boolean

Variabilelele de tipul boolean pot lua doar doua valori : FALSE sau TRUE
Variabilele de alt tip decat boolean pot fi convertite la tipul boolean prin operatorul cast (bool) sau (boolean), plasate inaintea valorilor, desi in general nu e nevoie de aceasta converrire, valoarea fiind automat recunoscuta de PHP.

2. Tipul integer

PHP foloseste doua categorii de numere: ntregi (tipul integer) si duble, cu virgula (tipul float) Variabilele integer reprezinta numerele intregi, ele pot fi specificate in format zecimal, hexazecimal sau octal. Numerele ntregi reprezinta numerele fara parte fractionara folosite la numarare, plus zero si numerele negative. Cu alte cuvinte, n PHP termenul de ntreg are aceeasi semnificatie ca si n matematica. De exemplu, numarul 100 poate fi reprezentat n PHP sub forma de ntreg. Scrierea numerelor PHP este simpla. Un ntreg PHP se obtine prin scrierea cifrelor care i alcatuiesc valoarea. Daca valoarea este negativa, scrieti un semn minus imediat la stnga numarului. Evitati sa scrieti spatii sau virgule ca parte a unui ntreg PHP. Iata cteva exemple de numere PHP ntregi : 215678 - Numar in reprezentare zecimala 0x1A8; - Numar in reprezentare hexazecimala (reprezinta: 1*16*16 + 10*16 + 8 = 424 (in zecimal)) 067 - Reprezinta: 6*8 + 7 = 55 (in zecimal) Valorile minime, respectiv maxime pe care le poate lua o variabila de tip integer depind de sistemul de operare pe care ruleaza modulul PHP. De exemplu pentru un sistem Windows valoarea unui integer se memoreaza pe 32 de biti: 31 bit pentru numar si un bit pentru semn. In acest caz valorile unui intreg se afla in intervalul :-213 repectiv: 213. Daca incercam sa folosim un integer cu valori care ies din acest inteval vor avea de-a face cu un fenomen de depasire :integer overflow. In acest caz interpretorul PHP converteste acesta valoare intr-o valoare de tip float (care are un interval mai extins de valori).
In PHP simpla impartire a doua valori intregi va produce ca rezultat o variabila de tip float. Pentru a obtine doar partea intreaga acestui rezultat putem folosi operatorul cast (int) in fata rezultatului. Ex.: echo (int)8.7; (va returna 8) Pentru a rotunji rezultatul la intregul cel mai apropiat de valoarea reala se poate folosi functia round(), unde intre paranteze se adauga valoarea. Ex.: echo round(8.7); (va returna 9)

3. Tipul float

Reprezinta variabile de tip real [numerele cu virgula], (n lb. engleza se foloseste punctul zecimal n loc de virgula). De exemplu 2.5 In general, numerele duble (tipul float) sunt stocate folosindu-se formatul standard IEEE-64, care furnizeaza 64 de biti. Acest format va permite sa stocati valori care pot merge pna la 1,8 x 10 la puterea 308 sub forma de numere duble si furnizeaza aproximativ 14 cifre dupa punctul zecimal (sau cifre semnificative) de precizie. Iata cteva exemple de numere duble (tipul float)

123.4567 1.2e3;

- Numar de tip float - Reprezinta: 1.2 * 103

4. Tipul string

Reprezinta o insiruire de caractere, fiecare caracter este memorat pe 1 byte; setul de caractere este limitat la 256 valori distincte. Dimensiunea sirurilor poate fi oricat de mare in PHP, nu exista specificatii care sa limiteze numarul maxim de caractere dintr-un sir. Spre deosebire de ntregi si de numere float, care contin cifre, sirurile pot contine orice caracter. Ca atare, sirurile sunt utile pentru stocarea datelor care nu pot fi calculate, precum nume, fraze si adrese. In PHP, un sir poate fi declarat in mai multe feluri: 1) Un mod simplu de a declara un sir este prin delimitarea cu ghilimele simple (' ') Daca dorim ca sirul sa contina caracterul ' va trebui sa inseram inaintea lui caracterul escape \. Daca dorim ca sirul sa contina caracterul \ va trebui sa dublam acest caracter. Acest comportament este exemplificat in exemplul urmator: <?php $var1 = 'Acesta este un sir de test'; echo 'Curs \'PHP\''; echo '<br />Vrei sa stergi C:\\*.* ?'; echo '<br />Variabila var1=$var1'; echo "<br />Variabila var1=$var1"; ?> In browser va aparea: Curs 'PHP' Vrei sa stergi C:\*.* ? Variabila var1=$var1 Variabila var1=Acesta este un sir de test
Observati diferenta dintre ultimile doua linii! In penultima linie, unde s-a folosit gilimele simple pentru delimitarea sirului, variabila $var1 nu este expandata adica nu este afisat valoarea variabilei var1=Acesta este un sir de test ci exact textul scris (numele ei).

Pentru a realiza afisarea valorii variabilei si nu numele acesteia, se folosesc ghilimelele duble, precum in ultima linie a exemplului de mai sus.

2) O alta metoda pentru a specifica un sir n PHP este prin folosirea ghiimelelor duble (" "). Daca intr-un sir delimitat prin ghilimele duble vrem ca acesta sa afiseze numele unei variabile, nu valoarea acesteia, adaugam un caracter backslash (\) inaintea numelui variabiei. Exemplu; echo "Numele variabilei este \$var"; Acest cod va afisa Numele variabilei este $var, oricare ar fi valoarea variabilei "$var". Caracterele care alcatuiesc sirul sunt incluse ntre ghilimele duble (" "); De exemplu, sirul reprezentnd numele fizicianului care a formulat teoria relativitatii este "Albert Einstein". Asa cum s-a explicat, un sir poate contine date numerice; de exemplu, "3.14159". Daca se doreste adaugarea de ghilimele duble intr-un sir delimitat de ghilimele duble, se adauga caracterul \ in fata acestora. Exemplu; echo "Numele programului este \"PHP\"."; Prin delimitarea cu ghilimele duble PHP faciliteaza includerea n siruri a unor caractere speciale, precum caracterele de salt la linie noua sau retur de car, prin furnizarea de secvente escape care reprezinta caractere speciale. Iata secventele escape folosite n PHP:

\n - salt la linie noua \r - retur de car (rand nou) \t - caracter de tabulare pe orizontala \\ - backslash \$ - simbolul dolarului \ - ghilimele duble

Ca exemplu, iata un sir care include un retur de car, urmat de un salt la linie noua: "Salut, lume!\r\n".
Retineti ca fiecare secventa escape ncepe cu un backslash (\). Pentru a include un backslash ntr-un sir, trebuie sa folositi doua caractere backslash.

Pe langa imbricarea variabilelor in cadrul sirurilor delimitate prin ghilimele duble, PHP pune la dispozitie operatorul de concatenare a sirurilor: . (punct) . Acest operator adauga un sir la sfarsitul altui sir. De exemplu: <?php $nume = 'Popescu'; $prenume='Costel'; echo 'Numele de familie este '.$nume. 'iar prenumele este '.$prenume; ?> In browser va aparea: Numele de familie este Popescu iar prenumele este Costel In anumite situatii este necesar sa accesam unul dintre caracterele unui sir. Pentru aceasta putem folosi parantezele{} ca in exemplul de mai jos: <?php $var1 = 'Acesta este un sir de test'; echo $var1{0}; // Afisaza A (primul caracter din sir)

echo $var1{2}; ?> Ae

// Afisaza e (al treilea caracter din sir)

Rezultatul afisat va fi

3) Sintaxa heredoc este o alta modalitate de a delimita siruri In acest caz delimitatorul este ("<<<"); acesta trebuie urmat de un identificator unic, dupa care urmeaza sirul de caractere, iar secventa se incheie din nou cu identificatorul mentionat. Identificatorul de incheiere trebuie sa se afle in prima coloana a liniei, acesta poate contine caractere alfanumerice dar neaparat trebuie sa inceapa cu o litera, nu cu o cifra sau alt semn. Veti intelege mai bine studiind exemplu de mai jos: <?php $var1 = <<< EOT Exemplu de sir care foloseste delimitatorul heredoc. EOT; echo $var1; ?> Rezultatul afisat va fi: Exemplu de sir care foloseste delimitatorul heredoc.

5. Tipul array

Reprezinta un vector de valori (care creaza o matrice, vezi Lectia 9 despre matrice), fiecare element al matricei are asociat o cheie. Aceasta cheie va fi folosita ulterior la identificarea unui element specific at matricei. In PHP tipul array se mai numeste si tip map ordonat, deoarece elemente vectorului sunt ordonate dupa campul cheie. Variabilele de tip array si lucrul cu acestea vor fi prezentate mai detaliat in lectiile urmatoare. Iata un exemplu simplu de variabile array: <?php $fructe[0] = 'mere'; $fructe[1] = 'caise'; $fructe[2] = 'piersici'; ?>

6. Tipul object

Reprezinta de fapt instanta unei clase declarate in PHP. O clasa este o structura care contine variabile membru si functii membru. Variabilele de tip object si lucrul cu acestea vor fi prezentate detaliat in lectiile urmatoare.

7. Tipul resource

Este un tip special de variabila care pastreaza o legatura spre resurse externe. Exemple de resurse externe: manipulatori pentru deschidere de fisiere, conectare la baze de date, compresia fisierelor, resurse COM, etc...

8. Tipul NULL

Reprezinta varibilele care nu au inca atribuita o valoare. O variabila se considera a avea valoarea Null daca:

- este setata explicit prin atribuirea valorii NULL - nu a fost asignata inca o valoare acestei variabile - variabila a fost stearsa prin functia unset();

Putem afla tipul unei variabile folosind functia gettype() care returneaza un string (sir) continand tipul variabilei cercetate. Observati si studiati exemplul de mai jos <?php $var1 = TRUE; $var2 = 100; $var3 = 23.88; $var4 = "Nume"; $var[5] = "fructe"; echo gettype($var1); echo '<br />'.gettype($var2); echo '<br />'.gettype($var3); echo '<br />'.gettype($var4); echo '<br />'.gettype($var[5]); echo '<br />'.gettype($var6); ?> In browser va aparea: boolean integer double string string NULL
Observati ca utima linie afisata este NULL, asta deoarece $var6 nu are nici o valoare determinata

Variabile si operatori PHP


ntelegeti diferenta dintre valori literale si variabile nvatati modul de utilizare a operatorilor pentru combinarea valorilor n expresii nvatati modul de utilizare a functiilor pentru executarea operatiilor elementare

1. Valori literale si variabile Categoriile de valori despre care ati nvatat pna acum se numesc valori literale. Deseori, este convenabil sa atribui un nume unei valori, similar procedeului comun folosit n algebra. O valoare cu nume se numeste variabila, deoarece este posibila modificarea valorii asociate numelui. Prin contrast, o valoare literala este fixa. In limbajul PHP variabilele sunt reprezentate prin semnul $ urmat de numele variabilei. Numele variabilei este case sensitive, adica conteaza daca numele este scris cu litere mari sau mici. Intotdeuna numele variabilelor trebuie sa inceapa cu o litera sau o liniuta de subliniere (_) si poate fi urmat de litere sau cifre. Iata cateva exemple de nume de variabila:

$var $Numar $_elemente

Pentru a asocia o valoare unei variabile, veti scrie ceea ce se numeste o instructiune de atribuire. Iata un exemplu simplu: $temperatura = 33.5; Numele variabilei este urmat de un semn egal (=), care identifica instructiunea ca fiind o instructiune de atribuire. Semnul egal este urmat de valoarea care urmeaza a fi atribuita variabilei, n acest exemplu, valoarea este data de valoarea literala dubla (float) 33.5. Caracterul punct si virgula (;) marcheaza sfrsitul instructiunii. Exemplul anterior a atribuit unei variabile o valoare-literala. De asemenea, puteti atribui valoarea unei variabile catre o alta variabila, prin scrierea unei instructiuni de atribuire astfel: $castigator = $nume; n acest caz, valoarea variabilei $nume devine valoarea variabilei $castigator. Acest procedeu se numeste atribuire prin referinta. Astfel o modificare facuta asupra lui $nume se va propaga automat si asupra variabilei $castigator. Iata exemplul de mai sus asa cum va aparea intr-un script PHP simplu : <?php $nume = "Cosmin"; $castigator = $nume; echo $castigator; ?> Rezultatul afisat va fi: Cosmin Forma valorii unei variabile se numeste tipul variabilei. Tipul unei variabile se poate modifica daca atribuiti variabilei o valoare de un tip diferit fata de cel al valorii curente a variabilei. De exemplu, instructiunea de atribuire $x = 3; Atribue variabilei $x tipul integer. Daca instructiunea de atribuire $x = 3.5; va fi executata ulterior, variabila $x devine de tip float.
Desi instructiunile de atribuire din limbajul PHP si ecuatiile matematice folosesc ambele semnul egal, cele doua notiuni sunt foarte diferite, deoarece atribuirea nu

este acelasi lucru cu egalitatea. Atribuirea este o operatie care nlocuieste o valoare cu o alta. Pe de alta parte, egalitatea este o relatie ntre doua valori. Cnd doua valori sunt egale, acestea ramn egale pentru totdeauna. Totusi, puteti atribui o valoare unei variabile si ulterior puteti atribui aceleiasi variabile o alta valoare. Cu alte cuvinte, egalitatea este permanenta; atribuirea nu este.

Variabilele declarate mai sus sunt definite de utilizator. In PHP exista si alte variabile numite "variabile predefinite" care rezida in nucleul PHP, sunt alocate automat de catre modulul PHP, si sunt accesibile in program. In continuare enumeram citeva dintre aceste "Variabile Superglobale" (accesibile din toate scripturile PHP):

$GLOBALS contine referinte la variabilele globale disponibile in scriptul curent. $_SERVER variabile definite de server sau relative la contextul in care se executa scriptul curent $_GET variabile furnizate scriptului prin adresa URL $_POST variabile furnizate scriptului prin metoda HTTP POST (in general prin formulare) $_COOKIE variabile furnizate scriptului prin HTTP cookie $_FILES furnizeaza scriptului fisierele uploadate $_SESSION variabile care sunt inregistrate in sesiunea scriptului 2. Operatori Pentru a va ajuta sa efectuati calcule si prelucrari ale datelor, PHP include o diversitate de operatori si functii utile. Cnd combinati valorile literale si variabilele cu operatori si functii, construiti ceea ce este cunoscut sub numele de expresii. Operatorii sunt simboluri specifice care realizeaza o actiune specifica in cadrul unei expresii. Operatorii actioneaza asupra variabilelor prezente in expresie. De exemplu in cadrul expresiilor matematice vom folosi operatori aritmetici.

$a + $b $a - $b $a * $b $a / $b $a%$a $a +=$b $a -=$b $a *=$b $a /=$b $a++ $a--

Adunare : a+b Scadere : a-b Inmultire: a*b Impartire: a/b Moule :restul impartirii lui a la b Echivalent cu: $a = $a + $b Echivalent cu: $a = $a - $b Echivalent cu: $a = $a * $b Echivalent cu: $a = $a / $b Incrementare ; Ecivalent cu $a = $a +1 Decrementare; Echivalent cu $a = $a -1

O proprietate interesanta a operatorului de mpartire este aceea ca returneaza o valoare ntreaga daca ambii sai operanzi sunt ntregi si rezultatul

este un ntreg; n caz contrar, returneaza o valoare cu virgula (de tip float). Astfel, instructiunea de atribuire $x = 10/3; atribuie valorii $x valoarea cu virgula 3.3333333333333, chiar daca operanzii operatorului de mpartire sunt ambii ntregi. Similar operatorului de mpartire, operatorul modulo executa o mpartire; cu toate acestea, operatorul modulo returneaza restul, nu ctul mpartirii. De exemplu, prin mpartirea lui 10 la 3 se obtine ctul 3 si restul 1. Deci, instructiunea de atribuire $x = 10%3; atribuie variabilei $x valoarea 1. Operatorii de incrementare $a++ si decrementare $a-- au un efect diferit daca sunt scrisi ++$a respectiv --$a In primul caz, daca avem de exemplu $x= $a++; i-se atribue lui $x valoarea variabilei $a dupa care se efectueaza operatia de incrementare ($a = $a + 1) Dar daca avem $x = ++$a= se efectueaza operatia de incrementare ($a = $a + 1) dupa care i-se atribue lui $x noua valoarea a lui $a
Ca n matematica, PHP evalueaza operatorii de nmultire si de mpartire anterior operatorilor de adunare, respectiv scadere. Aceasta caracteristica se numeste precedenta. Datorita precedentei, instructiunea $x=1+2*3; atribuie variabilei $x valoarea 7, chiar daca operatorul de adunare apare naintea celui de nmultire. Se respecta regulile din matematica. Daca doriti sa controlati precedenta unei expresii, puteti folosi paranteze. De exemplu, instructiunea $x=(1+2)*3; atribuie variabilei $x valoarea 9, deoarece partea inclusa ntre paranteze a expresiei este evaluata prima, asa cum se procedeaza n algebra.

In afara de acesti operatori numerici, PHP include un operator de concatenare a sirurilor (.), denumit uneori operator de unire, deoarece functia sa consta n unirea sirurilor. Sa observam urmatorul exemplu: <?php $var1 = 'Ionescu'; echo 'Numele candidatului este '.$var1; $var2 = 'Candidat: '; $var2 .= $var1; echo "<br />$var2"; ?> Rezutatul afisat va fi: Numele candidatului este Ionescu Candidat: Ionescu In exemplul de mai sus se observa folosirea operatorului de concatenare . (punct) Acest operator adauga la sfarsitul sirului curent noul sir furnizat ca parametru. Expresia $a .= 'Sir de test' este echivalenta cu : $a = $a . 'Sir de test'.

3. Functii n afara de operatori, PHP include functii care executa operatii utile. Iata unele exemple de functii:

abs(x) - Returneaza valoarea absoluta a lui 'x' ceil(x) - Returneaza valoarea 'x', rotunjita la ntregul imediat superior floor(x) - Returneaza valoarea 'x', rotunjita la ntregul imediat inferior max(x,y,...) - Returneaza valoarea maxima a unui set de valori min(x,y,...) - Returneaza valoarea minima a unui set de valori pow(x,n) - Returneaza numarul 'x', ridicat la puterea specificata 'n' strftime(f) - Returneaza data curenta, formatata conform continutului parametrului 'f' sqrt(x) - Returneaza radacina patrata a lui 'x'
n afara de acestea, PHP include multe alte functii. Consultati site-ul www.php.net

Majoritatea functiilor necesita una sau mai multe valori de intrare, cunoscute sub numele de argumente. De exemplu, functia "sqrt" necesita un argument (aici este 'x') care specifica valoarea a carei radacina patrata trebuie calculata. Unele functii, precum min si max, preiau un numar nedefinit de argumente. Alte functii nu necesita nici un fel de argumente. Pentru a putea folosi o functie n mod corespunzator, trebuie sa cunoasteti:

Numele functiei Actiunea functiei si valoarea returnata de aceasta, daca exista Numarul argumentelor preluate de functie Semnificatia fiecarui argument

Iata un exemplu simplu care foloseste o functie pentru calculul lungimii laturilor unui patrat, daca este cunoscuta aria patratului:

$latura=sqrt($arie);

Retineti modul n care argumentul functiei este inclus ntre paranteze, precum si modul n care functia si argumentul sau sunt folosite ntr-un mod asemanator cu o valoare literala sau o variabila. Iata un exemplu care prezinta modul de utilizare a functiei "max", care preia mai multe argumente:

$punctaj_maxim=max($punctaj1, $punctaj2, $punctaj3);

Rezultatul dat variabilei "$punctaj maxim" va fi determinat de functia "max", aceasta determinand valoarea cea mai mare a argumentelor din paranteza. Observati ca fiecare argument este separat de vecinul sau printr-o virgula.

Utilizarea formularelor HTML

nvatati sa trimiteti date prin formulare HTML nvatati sa preluati date trimise prin GET si POST

1. Proiectarea unui formular Principalele sarcini n proiectarea unui formular HTML le constituie alegerea controalelor HTML care vor fi incluse n formular, selectarea amplasamentului controalelor si alegerea numelui acestora. Studiati lectia HTML despre Formulare, aceasta explica modul de realizare a fiecarui obiect dintr-un formular HTML si va va ajuta sa invatati rolul acestor elemente HTMLL. 2. Crearea unui formular Un formular HTML trebuie sa contina un buton de expediere, submit, pe care utilizatorul executa clic pentru a trimite datele din formular la scriptul PHP. Formularele se creaza folosind etichete specifice incadrate in tag-ul <form> </form> ca in exemplul de mai jos: <form action="script.php" method="post"> Nume:<input type="text" name="nume" /> <br /><input type="submit" name="submit" value="Trmite formular" /> </form> In browser se va vedea: Nume: Fiecare element al formularului trebuie introdus intre etichetele <form> si </form>. Atributul "action" indica fisierul cu scriptul care va primi datele de la formular si reprezinta una dintre cele mai importante precizari. Fiecare element, camp dintr-un formular trebuie sa aibe un nume distinct, dat prin atributul "name"; acest nume este folosit de scriptul PHP la care sunt trimise datele, astfel, scriptul PHP recunoaste datele din campul respectiv folosind numele acestuia. 3. Utilizarea metodelor GET si POST Atributul "method" poate avea doua valori : GET si POST. Diferenta intre metodele GET si POST consta in modul in care informatia din formular este transmisa scriptului care o prelucreaza. - Metoda GET trimite toate informatiile adunate ca parte a adresei URL; aceste informatii sunt vizibile pentru utilizator. - Metoda POST transmite informatia intr-o maniera invizibila pentru utilizator si poate transmite o cantitate mai mare de date decat GET. Folosind exemplul de formular de mai sus, metoda GET va transmite serverului o adresa URL ca cea de mai jos:

http://www.marplo.net/script.php?nume=Popescu

iar in cazul folosirii metodei POST, in URL va aparea doar:

http://www.marplo.net/script.php

Metoda GET permite transmiterea unui volum limitat de informatii catre server; de asemenea nu este recomandata folosirea acestei metode in cazul in care dorim sa transmitem date personale(de exemplu parolele introduse intr-un formular pot fi vizualizate de oricine in browserul de Web). 4. Receptionarea datelor de la un formular HTML In general datele din formular sunt preluate de scriptul PHP prin urmatoarea formula:

$_POST['nume'] - daca este folosit method="post" $_GET['nume'] - daca este folosit method="get"

- unde "nume este valoarea atributului name al elementului din formularul HTML. Sa luam un exemplu practic de formular HTML care trimite date (prin method="post") la un script PHP unde acestea vor putea fi vizualizate. Salvam scriptul de mai jos intr-un fisier pe care-l numim "test-form.php" <?php $nume = $_POST['nume']; $email = $_POST['email']; $parola = $_POST['parola'];
echo "Nume = $nume"; echo "<br />E-mail = $email"; echo "<br />Parola = $parola"; ?>

Scriem urmatorul cod HTML intr-un alt fisier "form.html", pe care-l salvam in acelasi director cu scriptul PHP de mai sus. <!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" xml:lang="ro" lang="ro"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title> Test-Form </title> <head> <body> <form action="test-form.php" method="POST"> Nume:<input type="text" name="nume" /> <br />Email:<input type="text" name="email" /> <br />Parola:<input type="password" name="parola" /> <br /><input type="submit" name="submit" value="Trmite datele" /> </form> </body> </html> In browser va aparea:
Nume: Email: Parola:

Completam datele din formular, de exemplu: la Nume : Popescu, la Email : plomar@uv.ro si Parola : parola_mea

Dupa ce am competat datele, apasam clic pe butonul "Trimite datele", acestea vor fi trimise la scriptul PHP "test-form.php", care le va prelucra si va afisa urmatorul rezultat: Nume = Popescu E-mail = plomar@uv.ro Parola = parola_mea Sa intelegem exemplu de mai sus. Folosind formularul de mai sus, atributul NAME din fiecare eticheta INPUT atribuie fiecarei casete cu text un nume, astfel scriptul PHP va putea recunoaste datele scrise in casete. In scriptul "test-form".php" vom accesa variabilele:

$nume va primi informatia introdusa in campul Nume $email va primi informatia introdusa in campul Email $parola va primi informatia introdusa in campul Parola

Deoarece cunoastem metoda prin care trimitem datele catre scriptul PHP, "POST", am folosit variabila PHP globala _POST pentru a prelua datele din formular:

$_POST['nume'] $_POST['email'] $_POST['parola']

Constructia echo trimite datele de iesire care vor fi afisate de browser


Variabile PHP globale: _GET si _POST reprezinta de fapt variabile de tip array, fiecare element se poate accesa prin cheia a sa; in cazul nostru cheia fiecarui element este data de atributul : NAME al casetelor din formular

5. Trimiterea de date unui script prin adresa URL In afara de a expedia unui script datele printr-un formular, puteti expedia date cu ajutorul adresei URL a paginii. Pentru aceasta, atasati la sfarsitul adresei URL un semn al ntrebarii (?) si apoi includeti o serie de perechi "numevaloare" (separate prin &), ca in exemplu urmator:

http://www.marplo.net/fisier.php? nume1=valoare1&nume2=valoare2 Exemplul include numai doua perechi "nume-valoare"; cu toate acestea, puteti include oricte asemenea perechi doriti (separate prin caracterul &), in functie de limita impusa de browser. Pentru a prelua si folosi datele dintr-o astfel de adresa URL, folositi in interiorul scriptului PHP expresia "$_GET['nume'], ca in exemplu urmator"

$var1 = $_GET['nume1'] $var2 = $_GET['nume2']

Unde "nume1" si "nume2" sunt numele variabilelor din adresa URL, iar "$var1" si "$var2" sunt variabilele care vor fi folosite in scriptul PHP (din "fisier.php") si a caror valori vor fi "valoare1" respectiv "valoare2" continute in adresa URL.

Daca doriti sa trimiteti unui script, prin intermediul adresei sale URL, caractere speciale precum un semn al intrebarii, un semn egal sau un ampersand, se poate crea confuzie. Pentru a functiona corect, un sir trebuie sa fie codificat URL. Pentru a codifica URL un sir, caracterele speciale se nlocuiesc cu echivalentele lor hexazecimale, precedate de un simbol procent (%). Pentru alte detalii, consultati lectia despre Utilizarea caracterelor speciale, subtitlul 4 ( Conversia adreselor URL). De exemplu, forma codificata URL a sirului "la multi ani!" este %22la multi ani %21%22. Adresa URL rezultanta se numeste "sir de interogare" si nu poate contine spatii. Daca doriti sa trimiteti un spatiu ca parte a unui sir de interogare, trimiteti n locul spatiului un semn plus (+). Iata un exemplu de sir de interogare care codifica numele autorului acestui site:

http://www.marplo.net/script.php?autor=Mar+Plo

Unele dintre cele mai comune caractere speciale si echivalentele lor codificate URL sunt prezentate n tabelul de mai jos:

Caracter special . > ^ ~ + , / : ; = > [ \ ] _ { | } tab spatiu !

Echivalentul codificat URL *%2e %3e %5e %7e %2b %2c %2f %3a %3b %3c %3d %3e %5b %5c %5d %5f %7b %7c %7dc %09 %20 %21 %22

# $ % & ` ( ) @ `

%23 %24 %25 %26 %27 %28 %29 %40 %60

Variabile de mediu si erori


nvatati sa obtineti accesul la valorile variabilelor de mediu nvatati despre depanarea si tratarea erorilor

1. Obtinerea si utilizarea datelor de la o variabila de mediu Variabilele de mediu sunt folosite pentru stocarea optiunilor si a parametrilor care personalizeaza mediul de aplicatie. Aplicatiile pot obtine accesul la valorile variabilelor de mediu si in functie de acestea si pot ajusta comportamentul. De exemplu, calea de cautare a programelor MS-DOS este stocata ntr-o variabila de mediu denumita PATH. In general, comenzile sistemelor de operare sunt folosite pentru a configura variabilele de mediu si pentru a stabili valorile acestora. Cu toate acestea, unele aplicatii manipuleaza valorile variabilelor de mediu. Att serverul Web Apache, ct si serverul de aplicatie PHP folosesc variabile de mediu pentru a prezenta informatii de stare. Unele dintre cele mai importante variabile de mediu folosite de Apache si PHP sunt rezumate n tabelul de mai jos. Numeroase servere Web, altele dect Apache, furnizeaza o parte din aceste variabile de mediu sau chiar pe toate. Multe dintre aceste variabile reflecta caracteristicile cererii HTTP care a solicitat executia PHP. Puteti vizualiza toate variabilele de mediu disponibile pentru programele PHP prin invocarea functiei phpinfo() si vizualizarea datelor de iesire generate de aceasta. Vizualizarea datelor unei variabile de mediu se poate face folosind variabila $_SERVER si o cheie (intre paranteze patrate) ce repreinta numele variabilei de mediu.

De exemplu, pt. afisarea domeniului serverului unde ruleaza scriptul echo $_SERVER['SERVER_NAME'];

Variabila de mediu

Descriere

CONTENT_LENGTH CONTENT_TYPE

- Lungimea, n octeti, a corpului cererii. - Tipul MIME al datelor din corpul cererii. - Calea care constituie radacina arborelui catalogului cu DOCUMENT_ROOT documente al serverului Web. - Returneaza ersiunea protocolului CGI (Common Gateway GATEWAZ_INTERFACE Interface) folosit de serverul Web. HTTP_ACCEPT - Continutul antetului HTTP Accept. - Continutul antetului HTTP Accept-Charset:, care specifica HTTP_ACCEPT_CHARSET seturile de caractere ntelese de client. - Continutul antetului HTTP Accept-Encoding:, care HTTP_ACCEPT_ENCODING specifica tipurile de continuturi ntelese de client. - Continutul antetului HTTP Accept-Language:, care HTTP_ACCEPT_LANGUAGE specifica limbajele preferate de client. - Continutul antetului HTTP Connection:, care indica HTTP_CONNECTION optiunile solicitate de client. - Continutul antetului HTTP Host:, care indica numele de HTTP_HOST gazda, folosit de client la prezentarea cererii. - Adresa URL a paginii Web care a trimis clientul la pagina HTTP_REFERER curenta. - Continutul antetului HTTP user-Agent, care indica tipul si HTTP_USER_AGENT versiunea browser-ului folosit. PATH - Calea de executie asociata cu mediul serverului. - Sirul de interogare, daca exista, prin care a fost accesata QUERY_STRING pagina. REMOTE_ADDR - Adresa IP a clientului (vizitatorului). REMOTE_HOST - Numele de gazda al clientului. REMOTE_PORT - Adresa portului clientului de unde a pornit cererea. - Metoda de cerere HTTP folosita; de exemplu, GET, REQUEST_METHOD POST, PUT sau HEAD. - URI folosit pentru accesul la pagina curenta. URI este REQUEST_URI alcatuit dintr-un URL si un sir optional de interogare. SCRIPT_FILENAME - Numele de cale absolut al scriptului curent. SCRIPT_NAME - Adresa URL a scriptului curent. SERVER_ADMIN - Adresa de e-mail a administratorului serverului Web. - Numele de gazda asociat serverului Web care prelucreaza SERVER_HOST cererea. SERVER_PORT - Portul folosit de serverul Web pentru comunicatii. - Numele si versiunea protocolului prin intermediul caruia SERVER_PROTOCOL s-a executat cererea.

SERVER_SIGNATURE SERVER_SOFTWARE

- Sirul care identifica versiunea serverului Web si numele de gazda folosit pentru prelucrarea cererii. - Sirul care identifica programul server Web si versiunea acestuia.

- O lista completa a acestor variabile de mediu o gasiti la pagina oficiala $_SERVER Puteti obtine accesul la variabila de mediu folosind variabila $_SERVER care este de fapt un Array in care cheile elementelor sunt numele variabilelor de mediu De exemplu, urmatoarea instructiune echo trimite browserului adresa IP a clientului (vizitatorului): <?php $ip = $_SERVER['REMOTE_ADDR']; echo "Adresa dv. IP este $ip"; ?>
Afisarea sau nu a acestor variabile globale depinde de permisiunile facute la configurarea serverului PHP si de datele transmise.

2. Depanarea unui script Uneori, n locul datelor de iesire ale scriptului dumneavoastra, puteti vedea unul din urmatoarele:

Textul scriptului, n loc de datele de iesire ale acestuia O caseta de dialog, prin care sunteti ntrebat daca doriti sa descarcati fisierul care contine scriptul Un mesaj n care se spune ca scriptul nu exista Un mesaj n care se spune ca browserul dumneavoastra Web nu are permisiunea de a obtine accesul la script Un mesaj n care se spune ca scriptul dumneavoastra contine o eroare La vizualizarea rezultatelor unui script PHP se pot produce numeroase erori, chiar daca scriptul n sine este corect. - Daca vedeti textul scriptului dumneavoastra sau o caseta de dialog prin care sunteti ntrebat daca doriti sa descarcati fisierul care contine scriptul, este posibil ca extensia fisierului script sa fie incorecta sau ca serverul PHP sa nu functioneze. Desi fisierele script PHP trebuie sa aiba, n general, extensia .php, este posibil (dar mai rar) ca un administrator de sistem sa configureze un server PHP astfel nct acesta sa impuna o alta extensie de fisier. Astfel, daca scriptul dumneavoastra esueaza din unul dintre aceste doua motive, luati legatura cu administratorul dumneavoastra de sistem. - Daca vedeti un mesaj n care se spune ca scriptul nu exista, este posibil ca dumneavoastra sa fi tastat incorect adresa URL. Verificati daca ati tastat corect adresa URL identificata de administratorul dumneavoastra de sistem, precum si daca ati atasat corect la aceasta numele fisierului care contine scriptul, folosind un slash numai daca adresa URL identificata de administratorul dumneavoastra de sistem nu se ncheie cu acest caracter. - Daca vedeti un mesaj n care se arata ca browserul dumneavoastra Web nu are permisiunea de a obtine accesul la script, poate ca este necesar sa

modificati permisiunile fisierului script. Pentru a afla cum trebuie procedat, consultati-va cu administratorul de sistem. - Daca vedeti un mesaj n care se spune ca scriptul dumneavoastra contine o eroare, verificati daca nu a aparut vreuna din urmatoarele probleme:

O eroare de tastare, cum ar fi scrierea gresita a cuvntului echo O eroare de punctuatie, cum ar fi paranteze, ghilimele sau punct si virgula, lipsa sau inserate gresit Neincluderea sau includerea eronata a liniilor de delimitare a scriptului, n speta <?php si ?> Un marcaj de comentariu ( / / ) care lipseste sau care a fost introdus gresit De exemplu, iata un script care contine un tip de eroare frecvent ntlnit. Puteti identifica eroarea? <?php // Acest script contine o eroare de sintaxa echo "Salut, World Wide Web!; ?> Din script lipseste caracterul ghilimele duble de nchidere, care trebuie sa delimiteze expresia de tip text. Daca ncercati sa executati acest script, puteti vedea doar o pagina goala sau o eroare similara celei prezentate n continuare. Parse error. Parse error in /home/bmccarty/public_html/php/module-01/syntaxerror.php On line 7 Mesajul de eroare ncearca sa va indice sursa erorii, indicnd numarul liniei la care s-a produs eroarea. Totusi, remarcati ca mesajul va ndruma spre linia 7 a unui script care contine numai 4 linii. Din moment ce ghilimelele duble de nchidere lipsesc, serverul PHP cauta dincolo de sfrsitul scriptului pentru a gasi ghilimelele duble respective. Ca atare, serverul PHP este oarecum derutat cu privire la sursa erorii. Morala este aceea ca nu puteti conta n totalitate pe serverul PHP pentru a determina locatia erorii; folositi numarul de linie furnizat de server numai ca ndrumar pentru a depista locatia probabila a erorii. 3. Tratarea erorilor Modulul PHP poate fi configurat astfel incat sa afiseze erorile intilnite in codul PHP. Acest lucru poate fi foarte util in cazul depanarii programelor. Pentru a activa afisarea erorilor exista doua metode:

- modificarea parametrului display_errors din fisierul de configurare "php.ini" - folosirea functiei ini_set(display_errors); In cazul primei metode trebuie sa avem drepturi de administrator pentru a modifica fisierul php.ini. Nu se recomanda setarea parametrului display_errors la valoarea 1(TRUE) in cazul site-urilor de productie; mesajele de eroare afisate nu sint folositoare utilizatorului. Pe de alta parte aceasta ar contribui la marirea riscului unui atac. A doua metoda consta in folositrea functiei ini_set, care permite unui script sa redefineasca temporar un parametru din fisierul de configurare php.ini.

Consideram un exemplu de cod in care intentionat incercam sa citim variabile care nu exista: <?php ini_set('display_errors',1); echo "Valoarea transmisa este ".$var; ?> In exemplul de mai sus daca variabila cu nume: "var" nu exista PHP va afisa un mesaj de eroare de genul: Notice: Undefined variable: var Putem determina tipurile de erori pe care le semnaleaza PHP folosind functia: error_reporting(). Aceasta preia o constanta care specifica nivelul la care se afiseaza erorile.

error_reporting(E_ALL) - semnaleaza toate tipurile de erori error_reporting(E_ALL & ~E_NOTICE) - semnaleaza toate erorile in afara de anunturi error_reporting(0) - dezactiveaza acesta caracteristica. Exemplu : <?php ini_set('display_errors',1); error_reporting(E_ALL & ~E_NOTICE);
echo "Valoarea transmisa este ".$_GET['orase']; ?>

Testati acest exemplu pentru a vedea rezultatul.

Constante si tipuri de variabile


nvatati sa definiti si sa utilizati constantele nvatati sa folositi variabilele dinamice nvatati sa convertiti valorile dintr-un tip n altul

n aceasta lectie vom discuta despre constante si variabile dinamice. Puteti scrie programe PHP utile si complexe fara a utiliza constante sau variabile dinamice. Daca utilizarea constantelor poate facilita citirea programelor dumneavoastra, variabilele dinamice au un efect contrar. Din acest motiv, n general se recomanda evitarea variabilelor dinamice, mai ales de catre programatorii PHP ncepatori. Totusi, va puteri afla n situatia de a lucra la un program PHP scris de o persoana care foloseste aceste variabile; prin urmare, trebuie sa aveti cunostinte despre variabilele dinamice, indiferent daca le folositi sau nu n propriile dumneavoastra programe. 1. Utilizarea constantelor O constanta este pur si simplu o valoare care este... constanta, cu alte cuvinte o valoare care nu se modifica, n acest sens, constantele sunt opusele variabilelor, deoarece valoarea unei variabile se poate modifica pe durata

executiei unui program. Pentru a defini o constanta, folositi functia define(). Sa consideram urmatorul exemplu:

define("PI", 3.14159);

- Aceasta instructiune defineste constanta "PI", atribuindu-i valoarea 3.14159. Dupa ce a fost definita, o constanta se poate folosi n cadrul unei expresii. De exemplu, puteti calcula aria unui cerc dupa cum urmeaza:

$arie = PI * $raza * $raza;

- Observati ca referintele la o constanta nu folosesc simbolul dolarului. Astfel, o constanta poate fi cu usurinta deosebita de o variabila. Multi programatori scriu numele constantelor folosind numai majuscule, ceea ce le face si mai simplu de identificat. O functie conexa, defined(), poate determina daca o anumita constanta a fost definita. De exemplu, cu ajutorul urmatoarei instructiuni PHP puteri determina daca fost definita constanta Pi:

echo defined("PI");

- Retineti ca numele care va fi testat este delimitat prin ghilimele duble. Functia defined() returneaza valoarea 1 (unu) daca respectiva constanta a fost specificata; n caz contrar, returneaza zero In acest exemplu, instructiunea echo va afisa valoarea 1. Pe lnga sporirea lizibilitatii programelor, constantele pot facilita modificarea acestora. Sa presupunem ca ati scris un program care contine multe calcule ce folosesc valoarea 3,14159, iar ulterior ati descoperit ca trebuia sa folositi valoarea mai exacta 3,1415926535898. Descoperirea si modificarea fiecarei aparitii a valorii originale poate fi o activitate mare consumatoare de timp. Dar, daca ati definit o constanta pentru reprezentarea valorii, numarul 3,14159 va aparea o singura data n program si va fi necesara doar o singura modificare a constantei. Valoarea "pi" este folosita extrem de frecvent n unele calcule. Pentru comoditate, PHP furnizeaza o functionalitate mai indicata dect definirea unei constante cu valoarea pi, functia pi() returneaza valoarea respectiva, cu 14 cifre semnificative (3.1415926535898). Astfe, puteti calcula aria unui cerc folosind urmatoarea expresie:

$arie= pi() * $raza * $raza;

2. Lucrul cu variabile dinamice Daca o constanta poate spori lizibilitatea si simplitatea modificarii programelor, variabilele dinamice ngreuneaza ntelegerea si posibilitatea de a opera schimbari n program. Iata un exemplu simplu de variabila dinamica, denumita "$$film" : <?php $oameni_buni = 12;

$film = "oameni_buni"; echo $$film; ?>

O variabila dinamica este denumita folosind doua simboluri ale dolarului ($$) si este asociata cu o variabila obisnuita care are un nume similar si include un singur simbol al dolarului. In exemplul de mai sus, variabila dinamica $$film este asociata cu variabila obisnuita, dar cu aceasi nume, $film. Valoarea unei variabile obisnuite da numele (fara un simbol al dolarului) unei a doua variabile ordinare, n exemplu nostru, a doua variabila obisnuita este $oameni_buni. Valoarea acestei a doua variabile obisnuite este valoarea variabilei dinamice: n exemplu, aceasta este valoarea 12. Deci valoarea variabiei dinamice $$film, si care va fi afisata de functia "echo" este 12. O variabila dinamica nu contine, practic, propria sa valoare. n schimb, contine amplasamentul unde se poate gasi valoarea; cu alte cuvinte, numele unei alte variabile. Daca variabilele dinamice vi se par derutante, asa e, variabilele dinamice sunt derutante. Sunt rar folosite, uneori este posibila reducerea dimensiunilor unui program folosind una sau mai multe variabile dinamice. 3. Lucrul cu tipuri de variabile In lectia 2 ati invatat despre tipul variabilelor: Boolean, Integer, Float, String, Array, Object, Resource, Null. . O consecinta a caracterului dinamic al tipurilor de variabile din limbajului PHP este aceea ca nu trebuie sa specificati tipul variabilelor. PHP determina tipul variabilei n functie de tipul ultimei valori atribuite variabilei. Cu toate acestea, caracterul dinamic al tipurilor nu va scuteste de problemele legate de tipuri. Trebuie sa cunoasteti tipurile acceptate si ceea ce se ntmpla cnd n cadrul expresiilor se folosesc doua sau mai multe tipuri. Sa luam n considerare urmatorul script PHP scurt:

$x = 1; $y = 2.5; $z = $x+$y; echo $z;

- Instructiunea de atribuire care stocheaza o valoare n variabila $z este interesanta, deoarece expresia din membrul drept include un operand Integer (ntreg) si un operand de tip float. Ce valoare va aparea la iesire? Raspunsul corect este3.5, o valoare de tip float. Cnd o expresie aritmetica foloseste mai multe tipuri de variabile, PHP executa conversia automata a tipului. Daca unul dintre operanzi este de tip float, PHP trateaza ceilalti operanzi ca si cum ar fi de tip float, executa calculele si returneaza rezultatul ca valoare de tip float. Este important sa ntelegeti faptul ca prin conversia de tip nu se modifica tipurile variabilelor unei expresii; acestia sunt pur si simplu tratati ca si cum ar fi fost de un alt tip. In cadrul exemplului, variabila $x ramne de tip nteger, chiar daca PHP o trateaza ca o valoare de tip float pentru a executa calculele. Sirurile (variabilele de tip string) pot fi de asemenea supuse unei conversii de tip. Sa examinam urmatorul exemplu:

$x = 1; $y = $x+ "inca 1"; echo $y

- Aici cuvntul "inca" din sirul text este ignorat. Valoarea afisata este 2, adica suma dintre valoarea variabilei $x si valoarea numerica a sirului text, care este 1. Valoarea numerica si tipurile unui sir sunt determinate prin respectarea urmatoarelor reguli:

1. Daca sirul ncepe cu o valoare numerica, valoarea sirului este data de valoarea numerica respectiva; n caz contrar, valoarea sirului este zero. 2. Daca un punct zecimal sau un exponent (e sau E), este asociat cu valoarea numerica, tipul variabilei rezultante este float; n caz contrar, tipul valorii rezultante este un ntreg. 4. Conversia manuala a tipului variabilelor Daca preferati, puteti prelua controlul conversiei tipului variabilei sau puteti modifica tipul unei variabile. Pentru a prelua controlul conversiei de tip, puteti converti fortat un operand de la un tip la altul, proces cunoscut sub numele de "conversie fortata de tip" sau pur si simplu conversie fortata. n continuare, este dat un exemplu unei astfel de conversie de tip, unde puteti vedea modul de efectuare a acesteia:

$x = 1; $y = 2.5; $z = $x + (int)$y; echo $z

Conversia fortata de tip, si anume (int), determina tratarea variabilei $y ca pe un ntreg (integer), iar valoarea acesteia devine 2, n loc de 2.5, care este valoarea reala a variabilei $y. Astfel valoarea lui $z care va fi afisata de expresia "echo" este 3. Tabelul urmator indica si alte conversii fortate de tip care se pot folosi si expresiile care trebuesc utiizate:

Conversie fortata Rezultat (int), (integer) - Conversie fortata la ntreg (real), (double), - Conversie fortata la dublu (float) (string) - Conversie fortata la sir - Conversie fortata la tablou (array) (matrice) (object) - Conversie fortata la obiect
O alta modalitate de a trata o variabila ca si cum ar fi de un tip specificat este folosirea unor functii specifice. Ca exemplu de utilizare a uneia dintre functiile respective, luati n considerare si studiati urmatorul exemplu:

<?php $x = 1.5; $y = intval($x); echo $x; echo "<br />$y"; ?>

Rezultatul afisat va fi: 1.5 1 Valoarea 1.5 este afisata ca valoare a variabilei $x, iar valoarea l este afisata ca valoare a variabilei $y. Tabelul urmator prezinta si alte functii foosite pentru a trata o variabila ca si cum ar fi de alt tip.

Functie Operatie doubleval(), floatval()- Trateaza argumentul ca fiind de tip dublu. intval() - Trateaza argumentul ca fiind de tip ntreg. strval() - Trateaza argumentul ca fiind de tip string
Nici conversia normala si nici cea fortata nu modifica tipul unei variabile. Ambele mecanisme determina tratarea variabilelor doar in expresia respectiva ca si cum ar fi de un alt tip. Totusi, modificarea tipului unei variabile este posibila prin utilizarea functiei settype(). Acest procedeu este ilustrat n urmatorul exemplu:

$x = 1.5; settype($x,"integer"); echo $x; // Va afisa valoarea 1

- Tipul variabilei $x va fi schimbat in "integer", astfel valoarea afisata a variabilei $x este 1, deoarece fractia zecimala se pierde atunci cnd functia settype() converteste valoarea float la o valoare ntreaga. Valorile posibile pentru al doilea argument al functiei settype(), si anume argumentul care specifica tipul dorit, sunt:

"integer" "double" "string" "array" "object"

Sa ne amintim din lectia 2 ca exista o functie conexa, gettype(), care returneaza un sir care indica tipul variabilei specificate. Scriptul urmator afiseaza "integer", care indica tipul variabilei $x: $x = 1; echo gettype($x);

Scrierea instructiunilor PHP conditionale (I)


nvatati sa definiti si sa folositi valorile de tip adevarat/fals nvatati sa ntelegeti si sa scrieti instructiunile if si else

1. Utilizarea valorilor de tip adevarat/fals Majoritatea programelor utile nu se comporta n exact acelasi mod la fiecare rulare a acestora, n schimb, programele iau decizii, executnd uneori o operatie si alteori alta, n functie de circumstante. Programele PHP iau decizii prin evaluarea unor expresii conditionale si executa instructiuni bazate pe rezultatele acestor evaluari. Expresiile conditionale sunt asimilate ca avnd una din doua valori: TRUE (adevarat) sau FALSE (fals). Uneori, expresiile conditionale se mai numesc si expresii booleene, n onoarea matematicianului care le-a studiat, George Boole. Constanta TRUE are valoarea l, iar FALSE are valoarea 0. O modalitate utila de a forma o expresie conditionala consta n utilizarea operatorilor logici pentru compararea a doua valori numerice. Sa luam urmatorul exemplu:

$a<1;

Aceasta expresie conditionala foloseste operatorul <, care are, n esenta, aceeasi semnificatie ca n algebra. Expresia are valoarea TRUE daca si numai daca valoarea variabilei $a este mai mica dect 1; n toate celelalte cazuri, are valoareaFALSE. Puteti forma expresii conditionale complexe prin unirea a doua expresii conditionale cu ajutorul unui operator logic. De exemplu, expresia urmatoare este adevarata daca ambele expresii conditionale care o compun sunt adevarate:

$a < 1 AND $b < 1

Cu alte cuvinte, expresia este adevarata daca att variabila $a, ct si variabila $b au valori mai mici dect 1. PHP furnizeaza un set de asemenea operatori relationali, prezentati pe scurt n tabelul de mai jos.
Puteti folosi operatorii logici pentru compararea sirurilor; cu toate acestea, un sir care apare ntr-o expresie conditionala este convertit la o valoare numerica nainte de evaluarea expresiei. Deseori, se ajunge la rezultate neasteptate, n general, valorile sirurilor trebuie sa fie comparate folosind o functie de comparare a sirurilor; aceste functii vor fi explicate n lectiile urmatoare.

Operator $a < $b $a > $b $a >= $b $a <= $b $a = $b

Operatori logici Descriere - TRUE daca valoarea lui $a este mai mica dect valoarea lui $b. - TRUE daca valoarea lui $a este mai mare dect valoarea lui $b. - TRUE daca valoarea lui $a este mai mare sau egala cu valoarea lui $b - TRUE daca valoarea lui $a este mai mica sau egala cu valoarea lui $b - TRUE daca valoarea lui $a este egala cu valoarea lui $b.

- TRUE daca $a si $b sunt identice; cu alte cuvinte, daca $a si $b au acelasi tip si aceeasi valoare $a != $b - TRUE daca valoarea lui $a este diferita de valoarea lui $b - TRUE daca $a si $b nu sunt identice; cu alte cuvinte, daca $a si $b nu $a !== $b sunt de acelasi tip si aceeasi valoare $x AND $y - TRUE daca att $x, ct si $y sunt adevarate $x && $y - TRUE daca att $x, ct si $y sunt adevarate. $x OR $y - TRUE daca minimum una din expresiile $x sau $y este adevarata. $x || $y - TRUE daca minimum una din expresiile $x sau $y este adevarata. $x XOR $y - TRUE daca numai una din expresiile $x sau $y este adevarata. !$x - TRUE daca $x este FALSE NOT $x - TRUE daca $x este FALSE $a == $b
Retineti ca puteti prefixa o expresie conditionala cu operatorul !, care inverseaza valoarea "TRUE" sau "FALSE" a operandului sau.

Observati ca PHP foloseste doi operatori logici care executa aceeasi operatie (AND si &&) respectiv (OR si ||). Cu toate acestea, operatorii difera din punctul de vedere al precedentei caracteristica care determina ordinea n care sunt executate operatiile n timpul evaluarii expresiilor. Operatorii && si || au o precedenta relativ ridicata, n timp ce operatorii AND si OR au o precedenta relativ redusa. Este la fel ca in aritmetica unde, intr-o ecuatie ca aceasta: a + b * c se executa intai inmultirea si apoi adunarea, chiar daca ordinea lor este alta (daca nu sunt folosite paranteze). La fel si in PHP, se pot folosi paranteze rotunde pentru a controla ordinea executarii operatiilor. Pentru comoditate, puteti forma expresii conditionale fara un operator logic. De exemplu, daca $a este o variabila numerica, puteti folosi expresia $a ca expresie conditionala. Expresia este considerata ca avnd valoarea FALSE daca valoarea variabilei $a este zero, respectiv valoarea TRUE daca valoarea variabilei respective este diferita de zero. Daca folositi un sir ca expresie conditionala, expresia are valoarea FALSE daca sirul este vid sau daca are valoarea speciala "\0", care simbolizeaza un octet cu valoarea zero. Similar, utilizarea unei valori nedefinite ca expresie conditionala determina obtinerea valorii FALSE. Daca folositi un tablou sau un obiect ca expresie conditionala, aceasta are valoarea FALSE daca tabloul sau obiectul sunt vide (fara vreo valoare); n caz contrar, expresia are valoarea TRUE. 2. Scrierea instructiunilor "if" Expresiile conditionale sunt esentiale pentru scrierea instructiunilor conditionale, prin care se iau decizii. Una dintre cele mai simple si folosite instructiuni conditionale este instructiunea : if.

If(conditie) { Instructiune(1); Instructiune(2);

..................

- Dupa cum se observa dupa if urmeaza o pereche de paranteze rotunde in interiorul carora se plaseaza conditia, adica o expresie logica a carei rezultat poate fi TRUE sau FALSE. Daca si numai daca rezultatul expresiei logice (conditia) este TRUE se vor executa instuctiunile : Instructiune(1), apoi Instructiune(2), etc... Se observa ca acest set de instructiune se plaseaza intre acolade. Doar intr-un singur caz aceste acolade nu sunt necesare si anume: in cazul in care este scrisa doar o singura instructiune. Daca rezultatul expresiei logice dintre paranteze rotunde este FALSE , setul de instructiuni dintre acolade nu se va executa, controlul programului va trece mai departe. Iata inca un exemplu, practic: <?php $numar = 12; if ($numar > 10) echo "Acesta este un numar mai mare decat 10"; ?> - Atunci cnd este executat scriptul, instructiunea if evalueaza expresia conditionala $numar > 10, care este adevarata (TRUE) numai daca valoarea variabilei $numar este mai mare dect 10. Daca valoarea variabilei $numar este mai mare decat 10, se va executa instructiunea echo, in caz contrar programul va trece mai departe.
In general, limbajul PHP ignora spatiile albe. In mod conventional, o instructiune asociata unei instructiuni "if" este scrisa decalat n raport cu aceasta. Acest procedeu este recomandat deoarece prin utilizarea sa este facilitata citirea programului.

Utilizarea instructiunii "else" Sa presupunem ca doriti sa executati o instructiune atunci cnd o conditie este TRUE si o alta instructiune cnd conditia este FALSE. Instructiunea else va permite sa procedati astfel, dupa cum urmeaza:

} else {

If(conditie) { Instructiune(1); Instructiune(2); .................. Instructiune(3); Instructiune(4); ..................

} In acest din urma caz daca expresia logica din paranteze: conditie este adevarata se vor executa instructiunile: Instructiune(1); Instructiune(2); , iar daca valoarea expresiei logice : conditie are valoarea FALSE se vor executa instructiunile: Instructiune(3); Instructiune(4); Instructiunea asociata unei instructiuni if sau else poate fi ea nsasi o

instructiune if. O asemenea instructiune if se numeste "instructiune if imbricata". Iata un exemplu de instructiune if imbricata: <?php $numar = 88; if ($numar > 10) if ($numar > 100) echo "Acesta este un numar mai mare decat 100"; else echo "Acesta este un numar mai mic decat 100, dar mai mare decat 10"; else echo "Acesta este un numar mic"; ?> Exemplul afiseaza mesajul "Acesta este un numar mai mare decat 100" daca valoarea variabilei $numar depaseste 100; n caz contrar, daca valoarea variabilei $numar este mai mare dect 10 si mai mica decat 100, se afiseaza mesajul "Acesta este un numar mai mic decat 100, dar mai mare decat 10". Daca valoarea variabilei $numar este mai mica sau egala cu 10, exemplul afiseaza mesajul "Acesta este un numar mic". Instructiunile if imbricate pot deveni extrem de dificil de nteles daca numarul de instructiuni si nivelul de imbricare nu sunt relativ reduse. Deci trebuie sa le folositi cu economie. O instructiune corelata att cu instructiunea if, ct si cu instructiunea else, este instructiunea elseif. Cnd este folosita corect, poate fi mai simplu de nteles dect o instructiune if imbricata, logic echivalenta cu aceasta. Iata un exemplu de instrutiune elseif: <?php $numar = 88; if ($numar > 100 ) echo "Acesta este un numar mai mare decat 100"; elseif ($numar > 10) echo "Acesta este un numar mai mic decat 100, dar mai mare decat 10"; elseif ($numar > 1) echo "Acesta este un numar mic"; else echo "Acesta este un numar foarte mic"; ?> Exemplul extinde functionalitatea exemplului anterior, afisnd mesajul "Acesta este un numar foarte mic" pentru valori ale variabilei $numar mai mici sau egale cu 1. ntr-un caz general, cu o instructiune if si cu o instructiune else poate fi asociat un numar mult mai mare de instructiunielseif. PHP evalueaza expresiile conditionale n mod succesiv, pornind de la expresia conditionala asociata instructiunii "if". PHP executa instructiunea asociata primei expresii conditionale care are valoarea TRUE; daca nici o expresie conditionala nu are valoarea TRUE, PHP executa instructiunea asociata cu instructiunea else. Este permisa omiterea instructiunii else, caz n care nu este executata nici o instructiune daca nici una din expresiile conditionale nu are valoarea TRUE.

Scrierea instructiunilor PHP conditionale (II)

nvatati sa ntelegeti si sa scrieti instructiunea switch si instructiunile conexe acesteia nvatati sa ntelegeti si sa scrieti instructiunile while, do while si for 1. Scrierea instructiunilor switch, break si default In cazul in care vrem sa comparam valoarea unei singure variabile cu o succesiune de valori, in locul instructiunii "if" putem folosi instructiunea switch: De exemplu, sa presupunem ca valoarea variabilei $numar este l, 2 sau 3, reprezentnd respectiv dimensiunile "mica", "medie" si "mare". Iata un mic script care afiseaza dimensiunile asociate valorilor variabilei $numar, folosind functiaswitch alaturi de break si default care vor fi explicate mai jos: <?php switch($numar) { case(1): echo "mic"; break; case(2): echo "mediu"; break; case(3): echo "mare"; break; default: echo "Acesta nu este un cod valabil"; } ?> - Actiunea unei instructiuni switch este determinata de valoarea unei expresii ntregi, nu de valoarea unei expresii conditionale. Numele variabilei este dat ntre parantezele care urmeaza dupa cuvntul cheie switch. Acoladele delimiteaza o serie de instructiuni case si o instructiune default optionala, fiecare dintre instructiunile cuprinse ntre acolade putnd avea instructiuni asociate. Cnd este executata, instructiunea switch ncearca sa stabileasca o identitate ntre valoarea variabilei sale si valoarea asociata unei instructiuni case. Se vor executa instructiunile asociate primei instructiuni "case" pentru care identitatea respectiva este valabila. Daca valoarea variabilei din instructiunea switch nu corespunde nici uneia din valorile asociate instructiunilor case, se vor executa instructiunile asociate instructiunii default, daca exista o asemenea instructiune (ne este obligatorie). Un procedeu de programare indicat consta n aceea ca fiecare instructiune case din cadrul unei instructiuni switch sa se ncheie cu o instructiune break. ; Instructiunea break determina ncheierea executiei instructiunii switch, sare peste "case-urile" ramase si se executa codurile care mai sunt (daca exista) dupa "switch". n absenta instructiunii "break", executia trece la urmatoarea instructiune "case" sau "default", fapt nedorit n majoritatea cazurilor.
Nu este necesar sa folositi numere ntregi consecutive n instructiunile case ale unei instructiuni switch. Daca preferati, puteti folosi numere ntregi nonconsecutive, numere cu virgula sau siruri.

2. Operatorul ? : Operatorul conditional ?:, denumit uneori "operator ternar" sau "operator ntrebare-doua puncte", constituie o alta modalitate de a scrie decizii n PHP. Acest operator formeaza o expresie care se poate folosi n multe contexte PHP. Iata sintaxa de utilizare a acestuia:

expresie-conditionala ? valoare-TRUE : valoare-FALSE

Observati cum semnul ntrebarii este separat de caracterul doua puncte prin valoarea valoare-TRUE. Operatorul conditional si evalueaza expresia conditionala. Daca expresia este evaluata la valoarea TRUE, operatorul conditional returneaza valoarea valoareTRUE; n caz contrar, returneaza valoarea valoare-FALSE. De exemplu, sa luam n considerare urmatoarea instructiune de atribuire, care foloseste un operator conditional:

$a = ($b > $c) ? 10 : 20

Aceasta instructiune de atribuire compara valorile variabilelor $b si $c. Daca valoarea variabilei $b este mai mare dect aceea a variabilei $c (adica TRUE), atunci variabilei $a i este atribuita valoarea 10; n caz contrar, variabilei respective i este atribuita valoarea 20. 3. Scrierea instructiunilor "for" Instructiunea for este o instructiune bucla sau o instructiune iterativa; cu alte cuvinte, o instructiune care executa n mod repetat instructiunile asociate. Sintaxa generala a instructiunii for este urmatoarea:

for(expresie1; conditie; expresie2) { Instructiune(1); Instructiune(2); Instructiune(3); .............

} expresie1 se executa o singura data si anume la inceputul instructiunii; conditie este o expresie logica ; instructiunea forse executa atita timp cat valoarea expresiei : conditie are valoarea TRUE. De fiecare data dupa executia instructiunilor dintre acolade se executa : expresie2. Iata un exemplu practic de utilizare a unei instructiuni for: <?php $suma = 0; for ($n=1; $n<=3; $n++) { $suma += $n; echo "<br /> Suma intregilor de la 1 la $n este $suma."; } ?> Rezultatul afisat va fi:

Suma intregilor de la 1 la 1 este 1 Suma intregilor de la 1 la 2 este 3 Suma intregilor de la 1 la 3 este 6

n exemplu se calculeaza suma ntregilor cuprinsi ntre l si 3. Pentru aceasta, mai nti se initializeaza variabila $suma la valoarea 0. Apoi se executa o instructiune for care incrementeaza n mod repetat valoarea variabilei $suma. Pentru a vedea cum functioneaza mecanismul acestei instructiuni, sa examinam componentele instructiunilor for. Instructiunea "for" include trei expresii, care apar ntre paranteze; fiecare expresie este separata de vecina sa printr-un caracter punct si virgula(;).

Prima expresie este expresia de initializare. Aceasta se executa atunci cnd PHP ajunge la instructiunea for. In exemplu, expresia de initializare atribuie valoarea variabilei $n, ($n=1) variabila denumita "variabila de ciclare" sau "index". A doua expresie este expresia de test. Aceasta este o expresie conditionala care indica daca se executa sau nu corpul instructiunii, n general, face referire la variabila de ciclare. In cadrul exemplului, expresia de test compara valoarea variabilei $n cu valoarea 3 ($n <= 3). Expresia de test este evaluata pentru prima data imediat dupa evaluarea expresiei de initializare. Cea de-a treia expresie este expresia pas. n general, aceasta modifica una sau mai multe variabile la care se face referire n expresia test. n cadrul exemplului, expresia pas incrementeaza valoarea variabilei $n ($n++). Dupa care se trece la corpul instructiunii for, aici, instructiunea $suma += $n si echo "Suma intregilor de la 1 la $n este $suma."; reprezinta corpul instructiunii for. Dupa executarea corpului functiei se verifica din nou expresia de test (conditie) dintre paranteze, daca rezultatul este TRUE se trece mai departe la expresia "pas" (a treia din paranteze) si mai departe la corpul functiei for. Dupa aia din nou la expresia de test dintre paranteze..., pana cand rezultatul este FALSE (in exemplu nostru, $n>3)
Instructiunea for este utila pentru numarare si executarea n mod repetat a unor actiuni.

4. Scrierea instructiuni while Practic, instructiunile while si do while reprezinta versiuni "manuale" ale instructiunii for. Daca o instructiune forare trei expresii, o instructiune while sau do while una singura, si anume expresia de test (conditia). Fara o expresie de initializare sau o expresie pas, instructiune "for" opereaza n acelasi mod ca o instructiune "while". n consecinta, urmatoarele doua instructiuni sunt echivalente:

for ( ; $i<= 3; ) { $suma += $i; } while ($i <= 3) { $suma ++ $i; }

Instructiunea while executa un set de instructiuni atita timp cit valoarea expresiei "conditie" este adevarata: Forma generala a instructiuni while este urmatoarea :

while(conditie) { Instructiune(1); Instructiune(2); Instructiune(3); .............

Setul de instructiuni Instructiune(1), Instructiune(2), etc... se vor executa atita timp cit valoarea expresiei logice "conditie" are valoarea TRUE. Sa studiem un exemplu practic: <?php $n = 0; $suma = 0; while ($n <= 3) { $suma = $suma +$n; $n++; } echo "Suma este $suma"; ?> In scriptul de mai sus avem la inceput (in afara lui "while") $n = 0 si $suma = 0, se verifica conditia din paranteza a functiei while ($n<=3), cum aceasta este TRUE (deoarece la aceasta etapa $n = 0), se trece la executarea corpului functiei unde : $suma = $suma + $n si $n++ (adica $n = $n + 1), astfel acum $n va fi egal cu 1, se verifica din nou conditia din paranteze, care este TRUE ($n fiind acum egal cu 1), se executa iar corpul functiei..., si tot asa se executa aceasta "bucla" pana cand la verificarea conditiei din paranteze rezultatul este FALSE, in acest moment se incheie executia functiei while si se trece mai departe la urmatoarea functie (in cazul nostru: echo "Suma este $suma";, unde dupa executia functiei while $suma a devenit egala cu 6). In browser va aparea urmatorul rezultat: Suma este 6 5. Scrierea instructiuni do while Diferenta dintre instructiunea while si instructiunea do while este urmatoarea: daca la instructiunea while se verifica intai conditia si numai daca rezultatul este TRUE se trece la executarea corpului functiei, in cazul functiei do while intai se executa corpul functiei si dupa aceea se verifica conditia. De la do while corpul functiei va fi executat cel putin o singura data, indiferent de rezultatul conditiei. Forma generala a instructiuni do while este urmatoarea :

do { Instructiune(1); Instructiune(2); Instructiune(3); ............. } while(conditie);

Iata exemplul prezentat la functia while, de data aceasta folosind functia do while : <?php $n = 0; $suma = 0; do { $suma = $suma +$n; $n++; } while ($n <= 3); echo "Suma este $suma"; ?> Rezultatul va fi acelasi: "Suma exte 6".
n general, este bine sa fiti prudent si sa folositi instructiunea while, care evalueaza o conditie de test nainte, de executarea corpului acesteia. Astfel, se evita executarea eronata a corpului buclei.

Utilizarea matricelor (tablouri) - (1)

nvatati modul de utilizare a matricelor pentru stocarea mai multor valori nvatati cum sa accesati datele unei matrice (tablou) Parcurgerea iterativa a unui tablou secvential 1. Utilizarea matricelor Deseori este convenabila stocarea mai multor valori ntr-o variabila. O asemenea variabila se numeste matrice sau "tablou", iar valorile individuale se numesc elementele matricei. Aici, ambele denumiri: "matrice" sau "tablou" reprezinta acelasi lucru, fapt pentru care vom folosi orcare dintre aceste denumiri. Fiecare element al unei matrici are doua elemente importante: cheia si valoarea elementului. Matricele pot fi create folosind doua medode principale:

1 - utilizand direct instructiunile de atribuire 2 - folosind sintaxa array() despre care am vorbit in Lectia 2 despre tipul variabilelor.

1. Crearea de matrice folosind functia de atribuire Pentru a crea o matrice, atribuiti unui element al matricei o valoare si o cheie. De exemplu, urmatoarea instructiunea de atribuire:

$clasa[1] = "geometrie";

creeaza un tablou denumit "$clasa" si un element cu valoarea "geometrie" identificat prin cheia "1".

Pentru a stoca n matrice o a doua valoare, puteti folosi urmatoarea instructiune de atribuire:

$clasa[2] = "algebra";

Pentru a obtine acces la un element al matricei, specificati numele matricei si valoarea cheii. De exemplu, instructiunea de atribuire

$clasa_mate = $clasa[1];

Atribuie valoarea "geometrie" variabilei $clasa_mate. Cheile folosite pentru identificarea elementelor unei matrice nu trebuie sa fie obligatoriu numere consecutive; nici macar nu trebuie sa fie numere. De exemplu, iata instructiuni de atribuire care creeaza o matrice ce stocheaza preferinte n materie de fructe:

$preferinte[Nelu] = "cirese"; $preferinte[Radu] = "mere"; $preferinte[Gabi] = "pere";

2. Crearea de matrice folosind sintaxa array() Dincolo de utilizarea instructiunilor de atribuire, cealalta modalitate principala de creare a unui tablou PHP consta n utilizarea functiei array(). Iata un exemplu simplu, care creeaza un tablou avnd drept chei valori ntregi consecutive:

$limbaje = array("Perl", "PHP", "Python");

Deoarece valoarea cheilor nu a fost specificata, acestea vor fi automat trecute de program ca numere intregi consecutive, incepand de la "0" (prima cheie va avea valoarea '0', a doua cheie va avea valoarea '1', ...) Aceasta instructiune creeaza o matrice care contine urmatoarele asocieri:

0 => Perl 1 => PHP 2 => Python Daca doriti sa asociati unei valori o anumita cheie, puteti folosi operatorul =>, astfel:

$limbaje = array(10=>"Perl", "PHP", "Python");

Aceasta instructiune creeaza urmatoarea matrice:

10 => Perl 11 => PHP 12 => Python

Ca si n cazul utilizarii unei instructiuni de atribuire pentru crearea unei matrice valorile cheilor nu trebuie sa fie consecutive si nici macar ntregi:

$limbaje = array("PHP"=>"Ridicat", "Python"=>"Mediu", "Perl"=>"Redus"); Aceasta instructiune creeaza urmatoarea matrice:

PHP => Ridicat Python => Mediu Perl => Redus 2. Matrici multi-dimensionale Este posibil ca un element al matricei sa fie de asemenea o matrice. In acest caz avem de-a face cu o matrice multi-dimensionala. Sa luam un exemplu practic : <?php $multiDimArray[firstLine] = array(1=>10, 2=>20, "a"=>"alpha"); $multiDimArray["nextLine"] = array(1=>20, 2=>40, "b"=>"beta");
echo "<br />".$multiDimArray["firstLine"][1]; echo "<br />".$multiDimArray["nextLine"][1]; echo "<br />".$multiDimArray["firstLine"][2]; echo "<br />".$multiDimArray["firstLine"]["a"]; echo "<br />".$multiDimArray["nextLine"]["b"]; ?>

Sau putem scrie acelasi script si astfel (rezultatul e acelasi) :


<?php $multiDimArray = array("firstLine"=>array(1=>10, 2=>20, "a"=>"alpha"), "nextLine"=>array(1=>20, 2=>40, "b"=>"beta")); echo "<br />".$multiDimArray["firstLine"][1]; echo "<br />".$multiDimArray["nextLine"][1]; echo "<br />".$multiDimArray["firstLine"][2]; echo "<br />".$multiDimArray["firstLine"]["a"]; echo "<br />".$multiDimArray["nextLine"]["b"]; ?>

Rezultatul afisat va fi urmatorul :


10 20 20 alpha beta

In exemplul de mai sus am declarat un array cu 2 linii si 3 coloane. Prima linie este identificata de array-ul cu numele "fisrtLine", iar ce-a de-a doua linie este identificata de "nextLine".
Observati de asemenea foloasirea in functia "echo" a operatorului de concatenare "." impreuna cu "<br />" (care este un element din XHTML), pentru ca la afisarea in browser fiecare rezultat al functiei "echo" sa fie trecut pe o linie noua. In caz contrar rezultatele ar fi fost pe aceeasi linie : 10 20 20 alfa beta

3. Accesul la datele unui tablou Cnd ati stocat date ntr-un tablou, puteti obtine acces la valoarea unui element al tabloului sau i puteti modifica valoarea prin intermediul cheii asociate elementului. De exemplu, sa presupunem ca folositi urmatoarele instructiuni pentru a crea un tablou:

$x = array(1=>10, 2=>100, 3=>1000);

Puteti obtine acces la valoarea asociata cheii 2 prin intermediul unei instructiuni ca aceasta:

$y = 3*$x[2];

Similar, puteti modifica valoarea asociata cheii 3 prin intermediul unei instructiunu ca aceasta:

$x[3] = 101;

4. Parcurgerea iterativa a unui tablou Uneori, n loc de a obtine accesul la un singur element al unui tablou sau de a-l modifica, doriti sa obtineti accesul la mai multe elemente ale tabloului. De exemplu, sa presupunem ca doriti sa determinati daca n tablou exista o anumita cheie sau valoare. Sau sa presupunem ca tabloul reprezinta preturi si doriti sa micsorati fiecare valoare cu 10 procente. Operatii de acest gen implica parcurgerea iterativa a tabloului sau, altfel spus, accesul la fiecare element al tabloului. - Parcurgerea iterativa a unui tablou secvential Un tablou ale carui chei sunt valori ntregi consecutive se numeste "tablou secvential". n general, valoarea cea mai mica a unei chei dintr-un tablou secvential este zero; totusi, puteti crea un tablou secvential folosind valoarea 1 sau orice alta valoare ntreaga ca valoare minima a cheii. n cazul n care cunoasteti valoarea minima a cheii unui tablou secvential, puteti parcurge iterativ tabloul folosind o bucla for. Pentru aceasta, initializati variabila de bucla la valoarea cea mai redusa a cheii. Folositi functia count()pentru a forma expresia de test (conditia) a buclei. Functia count() returneaza numarul elementelor dintr-un tablou. Iata un exemplu simplu <?php $limbaje = array(0=>"Perl", 1=>"PHP", 2 =>"Python"); $limita = count($limbaje); for ($i = 0; $i < $limita; $i++) { echo "<br />$i => $limbaje[$i]"; } ?> Prima variabila $imbaje creeaza tabloul. Cea de-a doua variabila $limita foloseste instructiunea count() pentru a obtine numarul elementelor din tablou.

Instructiunea for foloseste variabila bucla $i pentru a parcurge iterativ (element cu element) tabloul; corpul instructiunii include o instructiune echo care afiseaza cheia si valoarea fiecarui element din tablou. Datele de iesire vor fi astfel: 0 => Perl 1 => PHP 2 => Python Sa ne concentram asupra problemei de a determina daca un tablou contine o anumita valoare. Iata un exemplu: <?php $limbaje = array(0=>"Perl", 1=>"PHP", 2 =>"Python"); $cauta = PHP; // se cauta in tabloul $limbaje valoarea $cauta $limita = count($limbaje); for ($i = 0; $i < $limita; $i++) { echo "<br />Determinarea unei identitati cu $limbaje[$i]"; if ($cauta == $limbaje[$i]) { echo "<br />$cauta este un limbaj excelent."; } } ?> Prima variabila $imbaje creeaza tabloul n care se va cauta. Cea de-a doua instructiune atribuie valoarea "PHP" variabilei $cauta; (n exemplu, se cauta n tablou valoarea stocata n variabila $cauta). Dupa comentariu (care incepe cu //), urmatoarea instructiune obtine numarul elementelor din tablou si stocheaza aceasta valoare n variabila $limita. Instructiunea for functioneaza ca mai nainte; de data aceasta nsa, corpul sau contine alte instructiuni si se executa o alta operatie. O instructiune echo afiseaza valoarea fiecarui element al tabloului pe masura ce iteratia (parcurgerea tabloului) avanseaza. Instructiunea if testeaza fiecare element si afiseaza un mesaj daca valoarea elementului este una si aceeasi cu valoarea variabilei $cauta. Iata rezultatul rularii exemplului: Determinarea unei identitati cu Perl Determinarea unei identitati cu PHP PHP este un limbaj excelent. Determinarea unei identitati cu Python Instructiunea break Observati ca iteratia continua chiar si dupa gasirea valorii cautate. Cnd se cauta ntr-un tablou, executia cautarii poate fi oprita dupa gasirea elementului dorit; continuarea iteratiei n tablou nu face dect sa iroseasca resursele calculatorului, fara a afecta rezultatele operatiei. Pentru a opri executia unei iteratii, puteti folosi instructiunea break, care determina ncheierea imediata a buclei care o contine. Iata cum se poate revizui exemplul anterior, astfel nct sa includa o instructiune break: <?php $limbaje = array(0=>"Perl", 1=>"PHP", 2 =>"Python"); $cauta = PHP; // se cauta in tabloul $limbaje valoarea $cauta $limita = count($limbaje); for ($i = 0; $i < $limita; $i++) { echo "<br />Determinarea unei identitati cu $limbaje[$i]";

} ?>

if ($cauta == $limbaje[$i]) { echo "<br />$cauta este un limbaj excelent."; break; }

Acum, dupa stabilirea unei identitati, instructiunea break provoaca sistarea buclei for. Iata datele de iesire rezultate, care acum omit examinarea inutila a elementului tabloului asociat cu limbajul "Python": Determinarea unei identitati cu Perl Determinarea unei identitati cu PHP PHP este un limbaj excelent. Instructiunea continue O instructiune corelata cu instructiunea break este continue. Instructiunea continue opreste secventa curenta a buclei, determinnd evaluarea imediata a expresiilor de incrementare si de test. Ca un exemplu, sa presupunem ca doriti sa cautati n tabloul $limbaje pentru a determina numarul limbajelor care au nume scurte, adica nume alcatuite din maximum 4 caractere. Iata un exemplu care executa aceasta prelucrare a datelor: <?php $limbaje = array(0=>"Perl", 1=>"PHP", 2 =>"Python"); $scurt = 0; $limita = count($limbaje); for ($i = 0; $i < $limita; $i++) { $n = strlen($limbaje[$i]); echo "<br />$limbaje[$i] are $n caractere lungime"; if ($n > 4) continue; $scurt++; } echo "<br />Au fost gasite $scurt limbaje cu nume scurte."; ?> O instructiune de atribuire stabileste valoarea initiala a variabilei $scurt la zero, folosita pentru a numara numele scurte gasite. Instructiunea for se aseamana celor folosite anterior. Corpul acestei instructiuni difera, desigur, de cele folosite anterior. Valoarea variabilei $n este stabilita ca fiind egala cu numarul caracterelor care compun numele limbajului, folosind functia strlen(), care calculeaza lungimea unui sir. Daca instructiunea if stabileste ca elementul curent al tabloului face referire la un limbaj cu nume lung, se executa instructiunea continue. Instructiunea continue determina trecerea iteratiei la urmatorul element din tablou, fara a mai executa expresia "$scurt++"; daca nu au mai ramas elemente n tablou, bucla for si ncheie executia. La finalizarea iteratiei, o instructiune echo afiseaza numarul numelor scurte de limbaje gasite n tablou. Iata rezultatul: Perl are 4 caractere lungime PHP are 3 caractere lungime Python are 6 caractere lungime Au fost gasite 2 limbaje cu nume scurte.

Utilizare Array (matrice) - (2)


Parcurgerea iterativa a unui tablou non-secvential Lucrul cu functii lista Sortarea tablourilor Transformarea matricelor in siruri si a sirurilor in matrice (array)

1. Parcurgerea iterativa a unui tablou non-secvential In lectia precedenta a fost prezentata modalitatea de citire a elementelor din matrice secventiala - adica matrice ale caror chei sunt numere intregi consecutive. Tablourile de date pot avea si elemente ale caror chei pot fi numere aleatoare sau chiar cuvinte, aceste matrici se numesc "matrici non-secventiale". P0entru citirea datelor dintr-un tablou non-secvential se poate folosi instructiunea foreach care simplifica iteratiile de acest gen. Instructiunea foreach are urmatoarea forma generala:

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

- Instructiunea parcurge n mod iterativ (element cu element) tabloul denumit "tablou", stabilind valori adecvate pentru valorile variabilelor "$cheie" si "$valoare" aferente fiecarui element al tabloului. Iata un exemplu simplu: <?php $limbajele = array(10=>"Perl", 20=>"PHP", 21=>"Python"); foreach ($limbaje as $index => $limbaj) { // parcurge iterativ tabloul echo "<br />$index =>$limbaj"; } ?> - Remarcati ca instructiunea echo face pur si simplu referire la valorile variabilelor $index si $limbaj, carora li se atribuie n mod automat valorile cheii, respectiv elementului curent.
10 =>Perl 20 =>PHP 21 =>Python

Cateodata este nevoie sa parcurgem datele unui tablou multi-dimensional. Pentru a parcurge tabloul n mod iterativ, folositi instructiuni foreach imbricate: Pentru a invata modul de parcurgere a unui tablou multi-dimensional, sa studiem urmatorul exemplu: <?php $date = array("PHP"=>array("simplu", "popular"), "Python"=>array("simplu", "nepopular"), "Pearl"=>array("dificil", "popular")); foreach ($date as $limbaj => $valoare) { foreach($valoare as $cheie =>$caracteristica) { echo "<br />$limbaj : $caracteristica"; } } ?>

- Instructiunea foreach exterioara obtine cate un tablou asociat cu fiecare limbaj; a doua instructiune foreach, interioara, parcurge iterativ fiecare tablou obtinut de prima instructiune foreach. Iata rezultatul: PHP : simplu PHP : popular Python : simplu Python : nepopular Pearl : dificil Pearl : popular 2. Lucrul cu functii lista n afara de modalitatile de parcurgere iterativa a tablourilor, PHP ofera numeroase functii care va permit traversarea tablourilor, deplasndu-va nainte sau napoi prin elementele acestuia. Prima dintre aceste functii este current(), care returneaza valoarea curenta a tabloului. Functia current() foloseste un pointer intern de tablou, pe care PHP l creeaza pentru fiecare tablou. (Cnd creati un tablou, pointerul intern de tablou este configurat astfel nct sa faca referire la primul element al tabloului). Functiile next() si prev() modifica pointerul intern al tabloului si se pot folosi alaturi de functia current() pentru a parcurge un tablou. Functia next(), asa cum i arata si numele, modifica pointerul intern al tabloului astfel nct acesta sa faca referire la urmatorul element, n timp ce functia prev() modifica pointerul intern al tabloului astfel nct acesta sa faca referire la elementul anterior. Iata un exemplu care prezinta modul de operare al functiilor mentionate: <?php $limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python"); $curent = current($limbaje); echo "<br />functia current() a returnat $curent"; $urmator = next($limbaje); echo "<br />functia next() a returnat $urmator"; $urmator = next($limbaje); echo "<br />functia next() a returnat $urmator"; $anterior = prev($limbaje); echo "<br />functia prev() a returnat $anterior"; ?> Iata datele de iesire ale exemplului: functia current() a returnat Perl functia next() a returnat PHP functia next() a returnat Python functia prev() a returnat PHP
Observati modul n care sunt utilizate functiile prev() si next() pentru deplasarea napoi, respectiv nainte, n interiorul tabloului.

3. Functia key() Functia key() este corelata cu functia current(). Daca functia current() returneaza valoarea asociata elementului curent, functia key() returneaza cheia asociata elementului curent. Iata un exemplu care ilustreaza modul de operare al acestei functii: <?php $limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");

$curent = current($limbaje); $cheie = key($limbaje); echo "<br />functia current() a returnat $curent"; echo "<br />functia key() a returnat $cheie"; ?>

Iata datele de iesire ale exemplului:


functia key() a returnat 10

4. Functia each() O alta functie utila n parcurgerea tablourilor este each(). Functia each() returneaza perechea "cheie-valoare" care se afla la pozitia curenta din tabloul specificat. Perechea "cheie-valoare" este returnata sub forma unui tablou asociativ cu patru elemente, dupa cum urmeaza:

Cheie Valoare 0 - Componenta cheie a perechii cheie-valoare curenta 1 - Componenta valoare a perechii cheie-valoare curenta key - Componenta cheie a perechii cheie-valoare curenta value - Componenta valoare a perechii cheie-valoare curenta
- Observati ca puteti folosi valoarea cheie "0" sau "key" pentru a obtine accesul la componenta cheie a perechii "cheie-valoare"; similar, puteti folosi valoarea cheie "1" sau "value" pentru a obtine accesul la componenta valoare a perechii "cheie-valoare". Pentru a intelege mai bine cum se foloseste functia each(), studiati exemplul urmator: <?php $limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python"); $fiecare = each($limbaje); $zero = $fiecare[0]; $unu = $fiecare[1]; $cheie = $fiecare['key]; $valoare = $fiecare['value];
echo "<br />zero=$zero"; echo "<br />unu=$unu"; echo "<br />cheie=$cheie"; echo "<br />valoare=$valoare"; ?>

Iata datele de iesire ale exemplului: zero=10 unu=Perl cheie=10 valoare=Perl 5. Functia list() O alta functie utila n lucrul cu tablouri este functia list(), aceasta va permite sa atribuiti valori la numeroase variabile n cadrul unei instructiuni. Functia list() este deseori folosita cu functia each(), deoarece functia list() faciliteaza accesul separat la cheia si la valoarea returnate de

functia each(). Forma generala de utilizare a functiei list() este urmatoarea: list($var1, $var2, .., $varn) = valoare_tablou; Fiecare dintre variabilele specificate, de la $var1 la $varn, primeste o valoare din tabloul "valoare_tablou". ntr-un fel, functia list() este opusa functiei array(), deoarece functia list() mparte un tablou ntr-o serie de valori scalare, n timp ce functia array() construieste un tablou dintr-o serie de valori scalare. Iata un exemplu care ilustreaza modul de utilizare a functiei list(): <?php $limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python"); list($cheie, $valoare) = each($limbaje); echo "<br />cheie = $cheie, valoare = $valoare"; $urmator = next($limbaje); echo "<br />urmator = $urmator"; ?> Iata datele de iesire ale exemplului: cheie = 10, valoare = Perl urmator = Python
PHP contine peste 40 de functii pentru lucrul cu tablourile. De exemplu, functia array_search() faciliteaza cautarea ntr-un tablou. Pentru informatii despre aceasta functie si despre alte functii utilizate n lucrul cu tablouri, vizitati site-ul www.php.net.

6. Sortarea tablourilor Sortarea reprezinta o alta operatie frecvent aplicata tablourilor. PHP furnizeaza o suita de functii care faciliteaza sortarea unui tablou. De exemplu, un tablou poate fi creat dupa cum urmeaza: $limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python"); Apoi, doriti sa sortati tabloul n ordine alfabetica, in functie de numele limbajului de programare. Pentru aceasta, pur si simplu invocati functia sort(): sort($limbaje); Dupa sortare, continutul tabloului apare in ordinea cum se poate vedea mai jos:

0 => PHP 1 => Perl 2 => Python

Observati ca secventa de sortare sau secventa de aranjare (cum este numita uneori) este sensibila la diferenta ntre majuscule si minuscule. Deoarece litera "H" mare este sortata inaintea literei "e" mic, PHP apare nainte de Python n datele de iesire sortate. Iata un exemplu practic de folosire a functiei sort() : <?php $arr = array(0=>'Popescu', 1=>'Avram', 5=>'Cristian',3=>'Dan'); sort($arr); foreach($arr as $key=>$nume) { echo "<br />Cheie=$key Valoare=$nume"; } ?> Rezultatul afisat este urmatorul :

Cheie=0 Valoare=Avram Cheie=1 Valoare=Cristian Cheie=2 Valoare=Dan Cheie=3 Valoare=Popescu

- Se observa ca instructiunea sort($arr) sorteaza matricea $arr dupa campul valoare (oridine alfabetica). - Observam de asemenea ca valorile campului cheie a fost alterata, fara sa conteze valoarea sau ordinea cheilor. Daca dorim sa sortam in ordine inversa alfabetic, folosim functia rsort() Iata acelasi exemplu, da cu functia rsort() <?php $arr = array(0=>'Popescu', 1=>'Avram', 5=>'Cristian',3=>'Dan'); rsort($arr); foreach($arr as $key=>$nume) { echo "<br />Cheie=$key Valoare=$nume"; } ?> Acum rezultatul afisat este urmatorul : Cheie=0 Valoare=Popescu Cheie=1 Valoare=Dan Cheie=2 Valoare=Cristian Cheie=3 Valoare=Avram - Se observa ca si in acest caz au fost alterate valorile initiale ale cheilor. Pentru a sorta matricea "$arr" pastrand corelarea initiala dintre valori si cheile corespunzatoare se folosesc functiileasort(), respectiv arsort(). Incercati-le singuri. In afara de acestea mai sunt si alte functii utile pentru sortarea tablourilor. Iata un tabel care prezinta functiile folositoare pentru sortarea unui tablou, impreuna cu rezultatul aplicarii fiecarei functii. Vom lua ca model pentru exemplificare urmatoarea matrice:

$limbaje = array(10=>"Perl", 20=>"PHP", 21=>"Python");

Functie sort()

Operatia efectuata - Sortarea unui tablou n functie de valoare, in ordine alfabetica, fara sa se tina cont de cheile initiale - Sortarea unui tablou n functie de valoare, in ordine alfabetica, pastrand corelarea initiala dintre valori si cheile corespunzatoare - Sortarea unui tablou n functie de valoare, in ordine invers alfabetica, fara sa se tina cont de cheile initiale - Sortarea unui tablou n functie de valoare, in ordine invers alfabetica, pastrand corelarea initiala dintre valori si cheile corespunzatoare

asort()

rsort

arsort

Rezultat 0 => PHP 1 => Perl 2 => Python 20 => PHP 10 => Perl 21 => Python 0 => Python 1 => Perl 2 => PHP 21 => Python 10 => Perl 20 => PHP

ksort - Sortarea unui tablou n functie de cheie, in ordine ascendenta

krsort - Sortarea unui tablou n functie de cheie, in ordine descendenta

10 => Perl 20 => PHP 21 => Python 21 => Python 20 => PHP 10 => Perl

O modalitate de a executa o cautare fara sensibilitate la diferenta ntre majuscule si minuscule ar fi utilizarea functiei natcasesort(), care sorteaza un tablou folosind o ordine care nu este sensibila la diferenta ntre majuscule si minuscule. O alta modalitate consta n a utiliza functia usort() sau una dintre functiile sale conexe, n speta uksort() si uasort(). Functia usort() sorteaza valorile din tablou si returneaza un tablou secvential; functia uksort() sorteaza cheile tabloului, iar functia uasort() sorteaza un tablou asociativ. De exemplu, urmatoarele instructiuni creeaza un tablou si l sorteaza ntr-o maniera insensibila la diferenta ntre majuscule si minuscule:

$limbaje = array("Perl", "PHP", "Python"); usort($limbaje, "strcmpcase"); foreach($limbaje as $key=>$nume) { echo "<br />$key => $nume"; } Functia strcmpcase() este o functie din biblioteca PHP care compara doua siruri fara a tine cont de majuscule sau minuscule. Functia returneaza o valoare negativa daca primul sir este mai mic dect al doilea, zero daca sirurile sunt identice, respectiv o valoare pozitiva daca primul sir este mai mare dect al doilea. Rezultatul va fi :

0 => Perl 1 => PHP 2 => Python Pentru mai multe informatii despre functia usort() si despre functiile sale conexe, examinati site-ul www.php.net Transformarea sirurilor in matrice si invers PHP pune la dispozitia utilizatorilor functii pentru conversia intre siruri si matrice. Acestea pot fi utile in situatii in care valoarea matricelor trebuie memorate in baza de date. Pentru a transforma un sir intr-o matrice folosim functia explode(). Sintaxa aceste functii este:

$matrice = explode(" ", $sir);

- In loc de spatiul dintre (" "), ca indiciu de separare, poate fi scris orice caracter; dupa cum se doreste impartirea sirului. Iata un exemplu: <?php $sir = "Popescu Avram Cristian Dan"; $matrice = explode(" ",$sir); foreach($matrice as $key=>$nume) { echo "<br />Cheie = $key Valoare = $nume"; } ?> Acest cod va produce urmatorul rezultat: Cheie = 0 Valoare = Popescu Cheie = 1 Valoare = Avram Cheie = 2 Valoare = Cristian Cheie = 3 Valoare = Dan Pentru a transforma o matrice intr-un sir, folosim functia implode(). Sintaxa aceste functii este:

$sir = implode(" ", $matrice);

- In loc de spatiul dintre (" "), ca semn de separare a elementelor in sir, poate fi scris orice caracter; dupa cum se doreste crearea sirului. In continuare, pentru exemplificare, folosind exemplul de mai sus, sortam matricea "$matrice" alfabetic si apoi transferam matricea intr-un alt sir , de aceasta data sortat (Observati folosirea caracterelor ( \" ) in expresia echo, pentru ca la iesire rezultatul sa contina ghilimele): <?php $matrice = array("Popescu", "Avram", "Cristian", "Dan"); sort($matrice); $sir = implode(" - ",$matrice); echo "<br />Sirul rezultat : \"$sir\""; ?> Acest cod va produce urmatorul rezultat: Sirul rezultat : "Avram - Cristian - Dan - Popescu"

Utilizarea functiilor

nvatati sa apelati functiile nvatati sa atribuiti unei variabile numele unei functii nvatati sa ascundeti mesajele de eroare generate n timpul executiei unei functii nvatati sa folositi date si scripturi aflate n fisierele externe

nvatati sa definiti propria functie

Am folosit pana acum de mai multe ori termenul de functii. In cadrul acestei lectii veti nvata mai multe despre utilizarea functiilor si despre modul de definire a propriilor dumneavoastra functii. Functiile reprezinta secvente de cod care sunt apelate foarte frecvent in cadrul codului PHP. Folosirea intensiva a functiilor contribuie la o structurare mai buna a codului; ideea este ca o problema complexa sa o divizam in mai multe subprobleme, fiecare astfel de subproblema sa fie executata in cadrul unei functii. Pe de alta parte folosirea frecventa a functiilor duce la micsorarea cantitatii de cod scris; prin urmare vom avea un cod care se executa mai eficient. 1. Utilizarea unei functii Pentru a folosi o functie, scrieti numele functiei, urmat de o pereche de paranteze. De exemplu, functia rand(), care genereaza un numar ntreg aleator, poate fi apelata astfel:

rand()

Majoritatea functiilor preiau argumente, reprezentnd valori, de intrare care influenteaza operarea si rezultatul functiei. Pentru a specifica argumente, acestea se insereaza ntre paranteze; daca specificati mai mult de un argument, fiecare argument trebuie separat de vecinul sau printr-o virgula. Argumentul unei functii poate fi o valoare literala, o variabila sau o expresie. Unele functii PHP au argumente optionale, care pot fi specificate sau omise, n conformitate cu intentiile dumneavoastra. De exemplu, functia rand() are doua argumente optionale. Primul argument al functiei indica valoarea ntreaga aleatoare cea mai mica pe care o va returna functia; al doilea argument indica valoarea cea mai mare. Daca omiteti ambele argumente, functia returneaza o valoare cuprinsa ntre 0 si cel mai mare rezultat posibil. Puteti folosi valoarea returnata de o functie ntr-o expresie, astfel valoarea va fi accesibila n mod repetat fara a se invoca functia de mai multe ori Iata un exemplu in care functia rand() returneaza o valoare aleatoare cuprinsa intre 1 si 500, atribuind valoarea unnei variabile "$nr" :

$nr = rand(1, 500); echo $nr;

Cnd se produce o eroare n timpul executiei unei functii, PHP genereaza mesaje de eroare. Uneori, asemenea mesaje de eroare sunt nedorite. n acest caz, puteti suprima generarea mesajelor de eroare prin adaugarea in fata numelui functiei a caracterului @. De exemplu,, pentru a suprima mesajele de eroare care pot aparea n timpul executiei functiei "f()", scriem aceasta functie dupa cum urmeaza:

y = @f(x);

Totusi, indicat este sa scrieti scripturi care sa nu genereze erori, ascunderea lor nu rezolva problema ce cauzeaza eroarea.

O functie utila, recomandata a fi folosita in script-uri este functia isset() si este cel mai des folosita cu "if()". isset() preia ca argument de obicei o variabila si arata daca aceasta a fost sau nu setata.

De exemplu: isset($nr)

- Functia returneaza TRUE daca variabila "$nr" are setata o valoare (diferita de NULL), in caz contrar returneaza FALSE. Aceasta functie este foarte utila in determinarea caror comenzi sa fie executate in functie daca o anumita variabila a fost setata sau nu. Previne aparitia unor erori care apar in cazuri de variabile nule si ajuta si la securitate. De exemplu, sa presupunem ca avem un cod PHP care vrem sa fie executat numai daca prin adresa URL o fost transmisa o variabila "id", adica o adresa de forma http://www.domeniu.site/script.php?id=un_id, folosim functia isset() astfel: <?php if (isset($_GET['id'])) { // Se executa codul dorit } ?> - $_GET['id'] preia valoarea lui "id" din URL, iar functia isset() verifica daca aceasta valoare exista (daca in URL este "id=ceva"). Daca aceasta exista, returneaza TRUE iar functia "if", avand astfel valoarea TRUE, va executa codul dintre acoladele ei.
Functia isset() este utila si pentru situatii de verificarii a inexistentei unei variabile, prin adaugarea caracterului (!) in fata ei. Astfel daca o anumita variabila rezulta a nu fi setata, ii atribuim o valoare sau executam un anume cod special pt. asta. Exemplu: if (!isset($_GET['id'] { die('Pagina apelata este inaccesibila.'); }

2. Utilizarea fisierelor incluse Functiile PHP va permit sa obtineri accesul la programe PHP scrise anterior, create ntr-un alt fisier extern. Pentru aceasta puteti folosi functia require(), care are urmatoarea forma:

require("nume_fisier")

Cnd este ncarcat un script PHP care contine o instructiune require, continutul fisierului specificat este inserat si executat n script, nlocuind instructiunea require. De exemplu, sa presupunem ca realizam un site in PHP care este alcatuita din mai multe pagini, iar fiecare pagina contine in partea de sus acelasi cod HTML. In loc sa scriem de fiecare data, pentru fiecare pagina, acelasi cod HTML, il scriem o singura data intr-un fisier separat (de exemplu "antet.php") iar in paginile unde vrem sa fie inclus codul HTML folosim functia require()

Prin insertia instructiunii la nceputul scriptului din fiecare pagina PHP, ca in exemplu urmator: <?php require("antet.php"); ?> - cu aceasta determinati programul PHP sa includa continutul fisierului "antet.php" ca si cum continutul respectiv ar face parte din acel script. Acest procedeu poate simplifica ntretinerea site-ului, deoarece informatiile standard pot fi tinute ntr-un singur fisier, ceea ce le face usor de localizat si de modificat. O alta functie, similara instructiunii require este functia include(). Spre deosebire de functia require() care introduce datele din fisierul extern intocmai cum sunt scrise, functia include() este o instructiune executabila ce determina evaluarea scriptului PHP din fisierul extern si codul acestuia este executat ca si cum ar fi aparut n textul scriptului unde este inclus. Sintaxa functiei include() este urmatoarea:

include("nume_fisier.php");

Functia corelata require_once() asigura faptul ca fisierul specificat este inclus o singura data ntr-un script dat. n cazul n care creati fisiere externe care si ele folosesc instructiunea require pentru a include continutul altor fisiere externe, puteti gasi instructiunea require_once utila.

3. Definirea unei functii n afara de a utiliza functiile din biblioteca de functii a limbajului PHP, va puteti defini si folosi propriile functii. Pentru a defini o functie, in PHP functiile incep intotdeauna cu declaratia: function, ca in exemplul urmator:

function nume_functie(nume_argument) { Aici se insereaza corpul functiei

Cuvntul cheie "function", "numele_functiei" si "nume_argument" alcatuiesc antetul functiei. Termenul de corp al functiei se refera la instructiunile incluse ntre acolade care urmeaza dupa antetul functiei. Instructiunile din corpul functiei sunt executate atunci cnd functia este apelata. Numele functiilor nu prezinta sensibilitate la diferenta ntre majuscule si minuscule; ca atare, "f()" si "F()" reprezinta referiri la aceeasi functie. Daca doriti sa definiti o functie care nu are argumente, puteti omite "nume_argument"; daca doriti sa definiti o functie cu mai multe argumente, puteti include argumente suplimentare dupa "nume_argument", fiecare argument fiind separat de vecinul sau printr-o virgula. Parantezele si numele argumentelor incluse ntre acestea poarta numele de lista cu argumente. Ca exemplu, iata o functie care calculeaza aria unui dreptunghi: <?php function arie($lungime, $latime) { return $lungime * $latime; } ?>

Lista cu argumente a functiei "arie()" include argumentele $latime si $inaltime. Corpul functiei este alcatuit dintr-o singura instructiune; cu toate acestea, corpul unei functii poate contine mai multe instructiuni. Daca doriti ca o functie sa returneze o valoare, trebuie sa determinati functia sa execute o instructiune return care furnizeaza valoarea respectiva. Instructiunea return determina sistarea executarii functiei; nu este necesar ca aceasta sa fie ultima instructiune fizica din corpul functiei. Daca definiti o functie care nu are nici o instructiune return (sau pentru date de iesire, precum "echo"), functia va returna valoarea speciala NULL. 4. Apelarea unei functii definite de utilizator O functie definita de utilizator poate fi apelata ca orice functie. De exemplu, iata o instructiune care apeleaza functia "arie()" din exemplul anterior: <?php function arie($lungime, $latime) { return $lungime * $latime; } $rezultat = arie(5,3); echo "Aria exte : $rezultat"; ?> Valorile argumentelor 5 si 3 le nlocuiesc pe acelea ale argumentelor din corpul functiei, care se comporta ca si cum ar fi fost scrisa astfel:

return 5*3

Rezultatul afisat al acestui script va fi : Aria exte : 15 5. Terminarea executiei unui script O instructiune return determina sistarea executiei functiei care o contine. In cazul n care doriti sa sistati prelucrarea unui ntreg script, puteti invoca functia exit(). Iata un exemplu simplu: <?php function stop() { exit(); } echo "<br />Unu..."; echo "<br />Doi..."; stop(); echo "<br />Trei..."; ?> Dupa executie, scriptul afiseaza: Unu... Doi... Rezultatul acestui script include cuvintele "Unu" si "Doi", dar nu si cuvntul "Trei". Prin apelarea functiei "stop()" se executa corpul functiei respective; la invocarea functiei, exit(), executia scriptului se ncheie.

6. Functii recursive Este posibil ca o functie din PHP sa se auto-apeleze. O functie care procedeaza astfel se numeste "functie recursiva". Totusi, daca nu aveti experienta de programare, este recomandat sa nu scrieti functii recursive. Cu toate acestea, puteti scrie accidental sau intalni o asemenea functie, deci este util sa stiti unele notiuni referitoare la aceasta. Studiati scriptul urmator care defineste si invoca o functie recursiva simpla: <?php function recursor($nr) { $nr++; if ($nr<8) { return recursor($nr); }
return $nr; } $x = recursor(3); echo $x; ?>

- Daca rulati acest script, rezultatul afisat va fi 8. - Variabila "$x" primeste ca valoare functia "recursor()" careia ii transmite ca argument numarul 3. - Functia "recursor()" incrementeaza cu o unitate valoarea argumentului, prin "$nr++;" care devine 4, apoi conditia "if ($nr<8)" verifica daca aceasta variabila din functie e mai mica decat 8, in caz afirmativ se executa comanda "return recursor($nr);" care sisteaza executia altui cod din functie si auto-apeleaza iar functia (cu noua valoare a lui "$nr" ca argument) care iar incrementeaza valoarea lui "$nr" si verifica din nou conditia care iar autoapeleaza functia, ... si tot asa pana cand "$nr" va avea valoarea 8 si la verificare conditiei "if" aceasta returneaza FALSE si se trece mai departe la executia comenzii "return $nr;" care va returna 8 ca valoare a variabilei "$x". Functia "echo" va afisa valoarea lui "$x", adica 8. 7. Definirea argumentelor prestabilite PHP va permite sa definiti functii cu argumente prestabilite. Daca apelati o functie care are un argument prestabilit, dar nu furnizati nici o valoare pentru argumentul respectiv, argumentul ia o valoare prestabilita specificata la inceput. Iata un exemplu simplu, studiati-l cu atentie: <?php function impozit_vanzari($cantitate, $rata = 0.0725) { return $cantitate * $rata; }
$cumparaturi = 123.45; echo "<br />cumparaturi = $cumparaturi"; $impozit1 = impozit_vanzari($cumparaturi, 0.09); echo "<br />impozit1 = $impozit1"; $cumparaturi = 123.45; echo "<br /><br />cumparaturi = $cumparaturi"; $impozit2 = impozit_vanzari($cumparaturi);

echo "<br />impozit2 = $impozit2"; ?>

Rezultatu afisat va fi: cumparaturi = 123.45 impozit1 = 11.1105


cumparaturi = 123.45 impozit2 = 8.950125

Functia impozit_vanzari preia doua argumente: un argument obligatoriu, denumit $cantitate, si un argument prestabilit, denumit $rata. Daca apelati functia si furnizati un singur argument, valoarea argumentului respectiv se considera ca fiind valoarea argumentului $cantitate, iar valoarea 0.0725 se foloseste ca valoare a argumentului $rata. Astfel, la prima invocare a functiei, pentru "impozit1", $rata are valoarea 0.09, specificata drept al doilea argument al functiei. Cu toate acestea, la a doua invocare a functiei, pentru "impozit2", $rata are valoarea 0.0725 deoarece este specificata valoarea unui singur argument, si astfel "$rata" a preluat valoarea prestabilita initial.

Variabile si referinte in functii


nvatati sa folositi variabile globale, locale si statice nvatati sa folositi referintele

Variabilele functiilor in PHP sunt de doua tipuri principale:


Variabile globale Variabile locale

Variabilele globale sunt create n exteriorul functiei, n timp ce variabilele locale sunt create n interiorul unei functii. 1. Utilizarea variabilelor globale Asa cum s-a explicat anterior, variabilele globale sunt cele declarate n afara oricarei functii. Totalitatea locurilor unde este accesibila o variabila se numeste "domeniu de existenta al variabilei". Variabilele globale nu pot fi accesibile din interiorul corpului unei functii; cu alte cuvinte, domeniul de existenta al unei variabile globale, nu include corpurile functiilor. Daca doriti sa obtineti accesul la o variabila globala n cadrul unei functii, puteti extinde domeniul de existenta al variabilei prin specificarea in functie a numelui variabilei, n cadrul unei instructiuni GLOBAL. Instructiunea GLOBAL are urmatoarea forma:

GLOBAL variabila1, variabila2, variabila3;

Iata un exemplu concludent : <?php $var1 = 135;

$var2 = 250; function Suma() { return $var1 + $var2; } echo "Suma este ". Suma(); ?>

- Functia "Suma()" foloseste variabilele $var1 si $var2 declarate anterior, dar aceste variabile nu au domeniu de valabilitate in interiorul functiei. Prin urmare rezultatul functiei este NULL. Pentru a rezolva aceasta problema vom declara cele doua variabile ca fiind variabile globale, ca in exempul urmator: <?php $var1 = 135; $var2 = 250; function Suma() { GLOBAL $var1, $var2; return $var1 + $var2; } echo "Suma este ". Suma(); ?> - In exemplul de mai sus declaratia: "GLOBAL $var1, $var2" face ca variabilele $var1 si $var2 sa fie recunoscute si in interiorul functiei. - Puteti scrie si cu litere mici "global", dar e mai usor de recunoscut cu litere mari. O alta metoda prin care putem solutiona aceasta problema este prin folosirea variabilei PHP predefinite $GLOBALS, dupa cum puteti vedea in exemplu urmator: <?php $var1 = 135; $var2 = 250; function Suma() { return $GLOBALS['var1'] + $GLOBALS['var2']; } echo "Suma este ". Suma(); ?> $GLOBALS este o variabila predefinita, este de fapt un array ; elementele acestei matrice au cheia egala cu numele variabilelor declarate si valoarea egala cu cea a variabilelor declarate. $GLOBALS este o variabila superglobala, ea va fi recunoscuta in orice script. Puteti folosi oricare din cele doua variante prezentate: instrucrtiunea GLOBAL sau variabila $GLOBALS. In cele doua exemple prezentate mai sus rezultatul afisat va fi acelasi : Suma este 385 2. Utilizarea variabilelor locale Variabilele locale sunt create in interiorul functiei si sunt distruse cand se ncheie apelul la functia respectiva. n consecinta, variabilele locale sunt disponibile numai pe durata executiei functiei asociate. Argumentele functiilor constituie un tip important de variabila locala. Cu toate acestea, puteti crea o variabila locala prin simpla atribuire a unei valori unei variabile din interiorul unei functii. Pentru a ilustra deosebirea dintre variabilele locale si cele globale, iata un script

care defineste o variabila locala denumita "$x" si o variabila globala cu acelasi nume: <?php function v_local() { $x = 5; echo "<br />In corpul functiei x = $x"; } $x = 2; echo "<br />In corpul scriptului x = $x"; v_local(); echo "<br />In corpul scriptului x = $x"; ?> Cand executati acest script, veti primi urmatoarele rezultate: In corpul scriptului x = 2 In corpul functiei x = 5 In corpul scriptului x = 2 Remarcati diferenta dintre cele doua variabile $x, chiar daca numele variabilelor este acelasi. Cand este apelata functia v_local(), $x ia valoarea 5, in rest, inainte si dupa, ia valoarea 2. Domeniul de existenta al variabilei globale $x nu se extinde n interiorul corpului functiei v_local(), iar domeniul de existenta al variabilei locale $x nu se extinde dincolo de corpul functiei respective. Cu alte cuvinte, domeniile de existenta ale celor doua variabile sunt complet distincte. 3. Utilizarea variabilelor statice Uneori este nevoie ca o variabila locala sa-si pastreze valoarea de la un apel al functie asociate la altul. Altfel spus, nu doriti ca variabila sa fie distrusa la ncheierea apelului la functie. Pentru acest lucru puteti folosi instructiunea STATIC (la fel cu "static"). Forma instructiunii STATIC este similara cu aceea a instructiunii GLOBAL.

STATIC $var1, $var2, $var3;

O variabila afisata ntr-o instructiune STATIC este cunoscuta sub numele de "variabila statica". Iata un exemplu care prezinta modul de utilizare a unei variabile statice: <?php function v_local() { $x = $x + 1; echo "<br /> x = $x"; } function v_static() { STATIC $x; $x = $x + 1; echo "<br /> x = $x"; } v_local(); v_local(); v_local();
v_static(); v_static();

v_static(); ?>

Daca rulati acest script, veti primi urmatoarele rezultate: x=1 x=1 x=1 x=1 x=2 x=3 Observati ca variabila locala $x, definita n cadrul functiei v_local(), este creata din nou la fiecare apelare a functiei, n consecinta, valoarea sa este ntotdeauna afisata ca fiind egala cu 1. Prin contrast, variabila statica $x, definita n cadrul functiei v_static(), si pastreaza valoarea de la un apel al functiei la urmatorul; ca atare, valoarea sa creste de fiecare data cnd este executata functia. 4. Utilizarea referintelor In mod prestabilit, argumentele transferate unei functii PHP sunt transmise prin valoare, ceea ce nseamna ca valorile argumentelor sunt copiate si functiile utilizeaza copii ale valorilor argumentelor lor, nu argumentele n sine. Ca o consecinta, o functie PHP nu poate modifica valorile argumentelor sale. Totusi, puteti stabili ca o functie sa aiba posibilitatea de a modifica valoarea unui argument, specificnd ca argumentul sa fie transferat prin referinta. Cnd un argument este transferat prin referinta, valoarea sa nu este copiata; functia lucreaza cu valoarea argumentului si are libertatea de a modifica acea valoare. Pentru a specifica faptul ca un argument urmeaza a fi transferat prin referinta, inaintea argumentului va fi adaugat un caracter ampersand (&). Puteti atasa acest caracter la argument n antetul functiei sau n apelul la functie. Iata un exemplu care prezinta apelul prin valoare si apelul prin referinta: <?php function p_valoare($a) { $a = 1; } function p_referinta(&$a) { $a = 1; }
$b = 0; p_valoare($b); echo "<br /> \$b = $b"; $b = 0; p_valoare(&$b); echo "<br /> \$b = $b"; $b = 0; p_referinta($b); echo "<br /> \$b = $b"; ?>

Dupa rulati acest script, veti obtine urmatoarele date de iesire: $b = 0 $b = 1 $b = 1

Retineti ca scriptul contine doua functii, si anume "p_valoare()" si "p_referinta()". Fiecare functie preia un singur argument, denumit $a. Antetul functiei "p_referinta()" specifica faptul ca argumentul sau este transferat prin referinta; argumentul functiei "p_valoare()" este transferat prin valoare. Primul paragraf al programului invoca functia "p_valoare()", transfernd argumentul prin valoare. n consecinta, functia lucreaza cu o copie a argumentului sau, iar valoarea variabilei $b nu se modifica. Cel de-al doilea paragraf al programului invoca de asemenea functia "p_valoare()"; dar, foloseste un caracter ampersand (&) pentru a determina transferul prin referinta al valorii variabilei $b. n consecinta, functia modifica valoarea argumentului sau, care se transforma din 0 n 1. Cel de-a treilea paragraf al programului invoca functia "p_referinta()". Antetul functiei respective foloseste un caracter ampersand (&) pentru a specifica faptul ca valoarea argumentului sau este transferata prin referinta, n consecinta, functia modifica valoarea argumentului sau, care se transforma din 0 n l.
Prin utilizarea referintelor se evita suprasarcina de copiere a valorilor argumentelor si implicit se obtine o viteza mai mare de executie a programului. Cu toate acestea, programele devin astfel mai dificil de nteles, iar referintele sau apelurile prin referinta pot cauza erori de program. Cel mai indicat este sa evitati referintele, acolo unde este posibil, si sa definiti functii care returneaza valori, si nu functii care modifica valorile propriilor argumente. In versiunile PHP 5+, transmiterea la functiei a unui parametru prin referinta "Call-time pass-by-reference",p_valoare(&$b), a fost scoasa din uz. Dar poate fi activata din php.ini, daca aveti acces, prin setarea 'true' la "allow_call_time_pass_reference".

Lucrul cu siruri (1)

nvatati sa utilizati secvente escape suplimentare pentru a include n siruri caracterele speciale nvatati sa utilizati codurile ASCII nvatati sa creati date de iesire formatate n Lectia 2 au fost prezentate sirurile, tipul de date PHP care stocheaza texte, n aceasta lectie veti nvata mai multe despre utilizarea sirurilor. 1. Crearea si afisarea sirurilor Sa recapitulam notiunile elementare ale sirurilor

Valorile de tip sir sunt secvente de caractere incluse ntre ghilimele duble sau simple Puteti include un caracter special n cadrul unui sir folosind o secventa escape care reprezinta caracterul special. Variabilele pot fi de tip string si li-se poate atribui o valoare de tip sir. Operatorul de concatenare, punct, ( . ) se poate folosi pentru unirea sirurilor. PHP poate converti n mod automat o valoare numerica ntr-un sir, respectiv valoarea unui sir ntr-un numar.

Secventele escape folosite n PHP:

\n - salt la linie noua \r - retur de car (rand nou) \t - caracter de tabulare pe orizontala \\ - backslash \$ - simbolul dolarului \" - ghilimele duble \xxx - caracterul asociat valorii ASCII xxx, exprimata sub forma unui numar in octal \xnn - caracterul asociat valorii ASCII xxx, exprimata sub forma unui numar n hexazecimal 2. Secvente escape si cod ASCII Ultimele doua secvente escape prezentate mai sus folosec un cod ASCII (America Standard Code for Information Interchange) pentru reprezentarea unui caracter. Codurile ASCII sunt valori ntregi, care sunt cuprinse ntre 0 si 255; fiecare litera 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 l este 49. Prima secventa escape necunoscuta (\xxx) va permite sa folositi reprezentarea n octal (baza 8) a unui cod ASCII pentru specificarea caracterului corespunzator. De exemplu, valoarea zecimala 65 (care este codul ASCII al literei A) poate fi reprezentata n octal sub forma 101. Ca atare, puteti reprezenta litera A folosind secventa escape "\101". Cea de-a doua secventa escape necunoscuta (\xnn) va permite sa folositi reprezentarea hexazecimala (n baza 16) a unui cod ASCII pentru specificarea caracterului corespunzator. De exemplu, valoarea zecimala 65 (care este codul ASCII al literei A) poate fi reprezentat sub forma hexazecimala 41. Ca atare, puteti reprezenta litera A cu ajutorul secventei escape "\41". Valoarea unui numar zecimal este suma produselor dintre fiecare cifra care l compune si o putere a lui 10. De exemplu, numarul zecimal 123 are valoarea l x 10 la puterea 2 + 2 x 10 la puterea 1 + 3 x 10 la puterea 0 = 1x100 + 2x10 + 3x1. Puteti determina valoarea unui numar reprezentat folosind o alta baza prin nlocuirea lui 10 cu valoarea bazei respective ntr-o expresie ca aceea prezentata anterior. De exemplu, valoarea hexazecimala 123 este echivalenta cu valoarea zecimala l x 16 la puterea 2 + 2 x 16 la puterea 1 + 3 x 16 la puterea 0 = l x 156 + 2 x 16 + 3 x l = 291. Similar, valoarea n octal 123 este echivalenta cu valoarea zecimala 1x8 la puterea 2 + 2x8 la puterea 1 + 3x8 la puterea 0 = 1x64 + 2x8 + 3xl=83. Daca vi se pare complicat sa calculam astfel, nu intrati n panica; n continuare veti nvata sa determinati valoarea n octal sau hexazecimal echivalenta cu orice valoare zecimala, folosind functii PHP. 3. Utilizarea codurilor ASCII Numeroase functii PHP sunt deosebit de folositoare la utilizarea codurilor ASCII. Aceste functii sunt enumerate n tabelul urmator.

Functii folositoare n utilizarea codurilor ASCII

Functie chr(/n) dechex(n) decoct(n) hexdec(n) octdec(n) ord(c)

Descriere - Returneaza caracterul avnd codul ASCII dat de "n" - Returneaza valoarea hexazecimala echivalenta cu valoarea zecimala data de "n" - Returneaza valoarea n octal echivalenta cu valoarea zecimala data de "n" - Returneaza valoarea zecimala echivalenta cu valoarea hexazecimala data de "n" - Returneaza valoarea zecimala echivalenta cu valoarea n octal data de "n" - Returneaza codul ASCII echivalent caracterului "c"

Iata un exemplu de utilizare a functiei ord() pentru a determina codul ASCII corespunzator unui anumit caracter: <?php $c = "A"; $n = ord($c); echo "<br /> Valoarea ASCII a caracterului $c este $n"; ?> Scriptul va afisa urmatorul rezultat: Valoarea ASCII a caracterului A este 65 Iata un exemplu care afiseaza echivalentele n octal, respectiv hexazecimal al caracterelor ASCII ale caror coduri sunt cuprinse ntre 33 si 40: <?php for ($i=33; $i<40; $i++) { $c=chr($i); $octal = decoct($i); $hex = dechex($i); echo "<br /> $i (octal $octal, hex $hex): caracter - $c"; } ?> Scriptul va afisa urmatorul rezultat: 33 (octal 41, hex 21): caracter - ! 34 (octal 42, hex 22): caracter - " 35 (octal 43, hex 23): caracter - # 36 (octal 44, hex 24): caracter - $ 37 (octal 45, hex 25): caracter - % 38 (octal 46, hex 26): caracter - & 39 (octal 47, hex 27): caracter - ' 4. Crearea datelor de iesire formatate PHP include doua functii utile pentru generarea datelor de iesire formatate, n speta printf() si sprintf(). Functia printf() afiseaza datele sale de iesire, n timp ce functia sprintf() returneaza datele sale de iesire sub forma unei valori sir. n general, fiecare functie preia doua sau mai multe argumente. Primul argument este un sir, denumit sir de formatate, care specifica formatul datelor de iesire, iar celelalte argumente specifica valorile care vor constitui datele de iesire. Iata un exemplu simplu de utilizare a functiei sprintf():

<?php $num = 8.7; echo $num; $num = sprintf("%05.2f", $num); echo '<br>'. $num; ?>

- Rezultatul afisat va fi: 8.7 08.70 - Cu ajutorul expresiei "%05.2f", sprintf() formateaza numarul din $num astfel incat acesta sa fie format din 5 caractere dintre care unul punct (.) si 2 zecimale. Iata si doua exemple de utilizare a functiei printf(): <?php $n = 8; printf("Valoarea lui n este: %d", $n); ?> - Va afisa "Valoarea lui n este: 8". Al doilea exemplu, putin mai complicat, prezinta modul de utilizare a functiei printf() cu mai multe argumente pentru datele de iesire: <?php $sir = 'Aceasta este lectia %d din cursul %s'; $num = 13; $tip = 'PHP'; printf($sir, $num, $tip); ?> - Includerea datelor formatate in sir se face in ordinea adaugarii variabilelor intre parantezele functiei "sprintf()". - Va afisa "Aceasta este lectia 13 din cursul PHP". Sirul de formatare consta dintr-o serie de caractere si directive ordinare. Un caracter ordinar este orice caracter, n afara caracterului "%". Caracterele ordinare sunt pur si simplu copiate la iesire. Directivele reprezinta secvente de caractere care ncep cu simbolul "%"; aceste determina modul n care va fi formatat argumentul corespunzator. O directiva simpla, cum este cea din exemplul precedent, poate consta dintr-un caracter "%" urmat de un specificator de tip, precum "d", care arata ca argumentul trebuie tratat ca numar zecimal. Cu toate acestea, o directiva mai sofisticata poate include urmatoarele componente, care trebuie sa apara n ordinea indicata:

Specificator de completare (optional): - Un specificator de completare precizeaza caracterul care se va folosi pentru a completa rezultatul pna la dimensiunea ceruta a sirului, n cazul n care caracterul de completare este omis, rezultatul este completat cu spatii. Specificatorul de completare poate fi un caracter spatiu sau un 0 (zero). Un specificator de completare de tip spatiu este folosit frecvent cu sirurile, iar un specificator de completare zero se foloseste mai ales alaturi de numere. Un alt caracter de completare poate fi specificat prin prefixarea acestuia cu un singur semn al citarii ('). De exemplu, pentru a completa un rezultat cu liniute de subliniere, specificati '_ drept caracter de completare.

Specificator de aliniere (optional): - Un specificator de aliniere indica daca rezultatul trebuie sa fie aliniat la stnga sau la dreapta. Daca specificatorul de aliniere este omis, rezultatul va fi aliniat la dreapta; daca se indica o cratima (-) drept specificator de aliniere, rezultatul va fi aliniat la stnga. Specificator de latime (optional): - Un specificator de latime este un ntreg care determina numarul minim de caractere ale rezultatului; sau, daca argumentul este de tip double, numarul minim de caractere situate la stnga punctului zecimal. Daca rezultatul contine un numar mai redus de caractere, atunci va contine si caractere de completare. Specificator de precizie (optional): - Un specificator de precizie este un punct zecimal, urmat de un ntreg care determina numarul de cifre dupa punctul zecimal pe care trebuie sa le contina rezultatul. Specificatorul de precizie nu are nici un efect pentru alte tipuri dect double (float). Specificator de tip (obligatoriu): - Specificatorul de tip determina modul de tratare si afisare a argumentului.

Tabelul urmator prezinta specificatorii de tip disponibili.

Specificatorii de tip PHP folositi la formatarea sirurilor Specificator de Descriere tip - Trateaza argumentul ca pe un ntreg si l afiseaza ca valoare b binara - Trateaza argumentul ca pe un ntreg si afiseaza caracterul cu c aceeasi valoare ASCII ca si argumentul - Trateaza argumentul ca pe un ntreg si l afiseaza ca valoare d zecimala - Trateaza argumentul ca pe o valoare de tip double si l f afiseaza ca valoare cu virgula mobila - Trateaza argumentul ca pe un ntreg si l afiseaza ca pe o o valoare scrisa n octal s - Trateaza argumentul ca pe un sir si l afiseaza - Trateaza argumentul ca pe un ntreg si l afiseaza ca numar x hexazecimal, cu litere scrise cu minuscule - Trateaza argumentul ca pe un ntreg si l afiseaza ca numar X hexazecimal, cu litere scrise cu majuscule
Daca doriti sa inserati simbolul procentului n datele de iesire ale unui apel la functia printf() sau sprintf(), inserati doua caractere "%". Tabelul urmator prezinta rezultatele aplicarii a diferite siruri de formatare valorilor selectate. Studiati tabelul si verificati daca ati nteles corect modul de operare a specificatorilor din cadrul fiecarui sir de formatare. Remarcati ca, n cazul omiterii cifrelor zecimale, se produce automat o rotunjire. Spatiile au fost nlocuite prin accente circumflexe(^), pentru a facilita determinarea numarului de spatii si a amplasarii acestora.

Exemple de rezultate ale utilizarii a diferite siruri de formatare Valoare Format Rezultat 100 %d 100 100 %b 1100100 100 %o 144 100 %x 64 100 %f 100.000000 12.345 %^-10f 12.345000^^^^^^^^ 12.345 %^10f ^^^^^^^^12 .345000 12.345 %^-10.2f 12.35^^^^^^^^ 12.345 %10.2f ^^^^^^^^12.35 test %^-10s test^^^^^^ test %^10s *^^^^^^test
Daca utilizarea functiilor printf() si sprintf() pentru formatarea numerelor pare cam greoaie, puteti folosi functianumber_format(), care returneaza o valoare de tip sir continnd un rezultat formatat. Puteti apela functia cu unul, doua sau patru argumente:

number_format(numar) number_format(numar, zecimale) number_format(numar, zecimale, punct_zecimal, separator_mii) - Argumentul "numar" specifica valoarea numerica pe care doriti sa o formatati. - Argumentul "zecimale" specifica numarul dorit de cifre zecimale. - Argumentul "punct_zecimal" precizeaza caracterul ce se va folosi drept punct zecimal. - Argumentul "separator_mii' precizeaza caracterul care se va folosi ca separator al miilor. n mod prestabilit, rezultatul este formatat fara zecimale, este inserat un punct (.) naintea cifrelor care compun partea zecimala, respectiv se foloseste o virgula (,) pentru separarea miilor. De exemplu, apelul la functia number_format(1.234, 2) returneaza valoarea 1.23 Functia PHP sscanf(), este complementara functiei printf(). Daca functia printf() genereaza date de iesire formatate, functia sscanf() citeste un sir, l interpreteaza prin referirea la un sir de formatare si stabileste valorile variabilelor specificate n functie de continutul sirului. Sa luam n considerare urmatorul exemplu: <?php $subiect = "08,25,2008"; $n = sscanf($subiect, "%d,%d,%d", &$luna, &$zi, &$an); echo "Au fost gasite $n valori"; echo "<br /> luna = $luna"; echo "<br /> zi = $zi";

echo "<br /> an = $an"; ?>

Datele de iesire ale acestui script sunt: Au fost gasite 3 valori luna = 8 zi = 25 an = 2008

Lucrul cu siruri (2)


nvatati sa maniupulati sirurile folosind diferite functii Invatati sa lucrati cu subsiruri

1. Manipularea sirurilor PHP contine peste 70 de functii care lucreaza cu siruri. Aceasta sectiune descrie cateva functii pe care este posibil sa le utilizati frecvent. Aceste functii va permit sa obtineti lungimea unui sir, sa eliminati dintr-un sir caracterele de tip spatiu alb, sa convertiti caracterele unui sir n majuscule sau minuscule si altele. - Functia strlen() returneaza lungimea sirului specificat ca argument al functiei. Iata un exemplu simplu de utilizare a functiei strlen(): <?php $s = "Acesta este un sir"; $n = strlen($s); echo "<br /> Lungimea sirului este: $n"; ?> Scriptul de mai sus va afisa: Lungimea sirului este: 18 - Numeroase functii PHP va permit sa eliminati caracterele de tip spatiu alb de la una sau ambele extremitati ale unui sir. Iata un exemplu; care prezinta modul de operare al acestor functii: <?php $s = " Acesta este un sir "; $n = strlen($s); echo "<br /> Lungimea sirului este: $n";
$trim =chop($s); // Elimina spatiile albe din partea dreapta a sirului $n = strlen($trim); echo "<br /> Lungimea sirului este: $n"; $trim = ltrim($s); // Elimina spatiile albe din partea stanga a sirului $n = strlen($trim); echo "<br /> Lungimea sirului este: $n"; $trim = rtrim($s); // Elimina spatiile albe din partea dreapta a sirului $n = strlen($trim); echo "<br /> Lungimea sirului este: $n"; $trim = trim($s); $n = strlen($trim); // Elimina spatiile albe din ambele parti a sirului

echo "<br /> Lungimea sirului este: $n"; ?>

Scriptul de mai sus va afisa: Lungimea sirului este: 36 Lungimea sirului este: 27 Lungimea sirului este: 27 Lungimea sirului este: 27 Lungimea sirului este: 18 Urmatorul tabel prezinta Functiile PHP de eliminare a caracterelor din siruri:

Functii PHP de eliminare a caracterelor din siruri Functie chop(s) ltrim(s) rtrim(s) trim(s) Descriere - Returneaza valoarea lui 's', eliminnd spatiile albe de la extremitatea din dreapta a sirului. Similar cu rtrim() - Returneaza valoarea lui 's', eliminnd spatiile albe de la extremitatea din stnga a sirului - Returneaza valoarea lui 's', eliminnd spatiile albe de la extremitatea din dreapta a sirului. Similar cu chop() - Returneaza valoarea lui 's', eliminnd spatiile albe de la ambele extremitati

- Functia strtoupper() returneaza valoarea argumentului, convertita la majuscule. - Functia strtolower{) returneaza valoarea argumentului, convertita la minuscule. - Functia ucfirst{) returneaza valoarea argumentului, cu primul caracter din sir majuscula. Nici una din functii nu modifica valoarea argumentului, valoarea convertita este cea returnata ca rezultat al functiei. Iata un scurt exemplu, care prezinta modul de operare a acestor functii: <?php $s = "abcdefg"; $rezultat = strtoupper($s); $rezultat2 = ucfirst($s); echo "<br />strtoupper('$s'): $rezultat"; echo "<br />ucfirst('$s'): $rezultat2"; $s = "ABCDE"; $rezultat = strtolower($s); echo "<br />strtolower('$s'): $rezultat"; ?> Scriptul de mai sus va afisa: strtoupper(abcdefg): ABCDEFG ucfirst(abcdefg): Abcdefg strtolower(ABCDE): abcde 2. Compararea sirurilor PHP furnizeaza patru functii care sunt deosebit de utile pentru compararea sirurilor. Aceste functii sunt enumerate n tabelul urmator. Fiecare functie returneaza o valoare al carei semn determina rezultatul comparatiei; nu trebuie sa ncercati sa interpretati valoarea returnata efectiva.

Functii PHP de comparatie ntre siruri Functia strcasecmp(s1, s2) Descriere - Executa o comparatie fara sensibilitate la diferenta ntre majuscule si minuscule. Returneaza o valoare mai mica dect zero daca 's1' este mai mic dect 's2', o valoare mai mare dect zero daca 's1' este mai mare dect 's2', respectiv 0 n celelalte cazuri. - Executa o comparatie cu sensibilitate la diferenta ntre majuscule si minuscule. Returneaza o valoare mai mica dect zero daca 's1' este mai mic dect 's2', o valoare mai mare dect zero daca 's1' este mai mare dect 's2', respectiv 0 n celelalte cazuri.

strcmp(s1, s2)

- Executa o comparatie fara sensibilitate la diferenta ntre majuscule si minuscule. La comparatie sunt luate n considerare un numar de 'n' strncasecmp(s1, s2, n) caractere. Returneaza o valoare mai mica dect zero daca 's1' este mai mic dect 's2', o valoare mai mare dect zero daca 's1' este mai mare dect 's2', respectiv 0 n celelalte cazuri. - Executa o comparatie cu sensibilitate la diferenta ntre majuscule si minuscule. La com paratie sunt luate n considerare un numar de 'n' caractere. Returneaza o valoare mai mica dect zero daca 's1' este mai mic dect 's2', o valoare mai mare dect zero daca 's1' este mai mare dect 's2', respectiv 0 n celelalte cazuri.

strncmp(s1,s2, n)

Iata un scurt exemplu care prezinta modul de utilizare a acestor functii: <?php $s1 = "abcd"; $s2 = "ABCE"; $rezultat = strcasecmp($s1, $s2); echo "<br /> Functia strcasecmp a returnat $rezultat"; $rezultat = strcmp($s1, $s2); echo "<br /> Functia strcmp a returnat $rezultat"; $rezultat = strncasecmp($s1, $s2, 3); echo "<br /> Functia strncasecmp returnat $rezultat"; $rezultat = strncmp($s1, $s2, 3); echo "<br /> Functia strncmp a returnat $rezultat"; ?> Scriptul de mai sus va afisa: Functia strcasecmp a returnat -1 Functia strcmp a returnat 1 Functia strncasecmp returnat 0 Functia strncmp a returnat 1 Datele de iesire va arata ca functia strcasecmp() a identificat sirul "abcd" ca fiind mai mic dect "ABCE", in schimb, functia strcmp(), la fel ca si functia strncmp(), a identificat sirul "abcd" ca fiind mai mare dect "ABCE". Aceasta s-a ntmplat deoarece literele minuscule au n secventa ASCII o pozitie superioara literelor scrise cu majuscule; litera 'A' are valoarea ASCII 65, iar litera 'a' are valoarea ASCII 97. De asemenea, datele de iesire arata ca functia strncasecmp() a identificat sirul "s1" ca egal cu "s2", deoarece au fost luate in considerare numai primele 3 caractere.

3. Descoperirea si extragerea sub-sirurilor PHP include numeroase functii care gasesc si extrag sub-tiruri, adica parti dintr-un sir. Cele mai importante functii de acest gen sunt rezumate n tabelul urmator:

Functii PHP de extragere si cautare Functie strchr(s1,s2) Descriere - Returneaza toate sirurile 's1' de la prima aparitie a sirului 's2' si pna la sfrsit. Daca 's1' nu este gasit, functia returneaza FALSE. Functia strstr() executa aceeasi operatie - Returneaza toate sirurile 's1' de la prima aparitie a sirului 's2' si pna la sfrsit. Daca 's1' nu este gasit, functia returneaza FALSE. Sirurile 's1' si 's2' sunt comparate fara a se tine cont daca literele sunt majuscule sau minuscule - Returneaza pozitia (nr. intreg) a primei aparitii a sirului 's2' n 's1'.Daca 's2' nu este gasit, functia returneaza FALSE - Returneaza toate sirurile 's1' de la ultima aparitie a sirului 's2' si pna la sfrsit. Daca 's1' nu este gasit, functia returneaza FALSE. La comparatie este folosit numai primul caracter al sirului 's2' - Returneaza toate sirurile 's1' de la prima aparitie a sirului 's2' si pna la sfrsit. Daca 's1' nu este gasit, functia returneaza FALSE. Functia strchr() executa aceeasi operatie

stristr(s1,s2)

strpos(s1,s2) strrchr(s1,s2)

strstr(s1,s2)

substr(s, starf) - Returneaza portiunea sirului 's' specificata de indexul ntreg 'start' substr(s, start, lung) respectiv de indexurile 'start' si 'lung'. Prima pozitie a sirului este pozitia 0.
Iata un exemplu simplu, care prezinta modalitatile de utilizare a mai multor functii de extragere si cautare: <?php $s = "the cat on the mat near the bat"; $b = "at"; $n = strpos($s, $b); echo "<br /> strpos(\"$s\", \"$b\"): $n";
$s = "the cat on the mat near the bat"; $b = "at"; $n = strchr($s, $b); echo "<br /> strchr(\"$s\", \"$b\"): $n"; $s = "the cat on the mat near the bat"; $b = "at"; $n = strrchr($s, $b); echo "<br /> strrchr(\"$s\", \"$b\"): $n"; $s = "the cat on the mat near the bat"; $rezultat = substr($s, 4, 3); echo "<br /> substr(\"$s\", 4, 3): $rezultat"; ?>

Studiati cu atentie scriptul si tabelul de mai sus pentru a intelege datele de iesire. Iata si datele de iesire: strpos("the cat on the mat near the bat", "at"): 5 strchr("the cat on the mat near the bat", "at"): at on the mat near the bat strrchr("the cat on the mat near the bat", "at"): at substr("the cat on the mat near the bat", 4, 3): cat O potentiala dificultate n utilizarea functiei strpos() consta n aceea ca poate fi greu de sesizat diferenta dintre valoarea returnata 0, care arata ca sub-sirul a fost gasit n pozitia initiala a sirului, si valoarea returnata FALSE, care arata ca sub-sirul nu a fost gasit. Iata un scurt exemplu care indica un mod adecvat de testare a valorii returnate de functia strpos(), astfel nct sa se poata face diferenta ntre cele doua rezultate: <?php $poz = strpos($s1, $s2); if ($poz == FALSE) { echo "<br /> sub-sirul nu a fost gasit"; } ?> Procedeul prezentat foloseste operatorul de identitate (==) pentru a determina daca valoarea returnata este identica - nu doar aritmetic egala - cu valoarea FALSE. 4. nlocuirea unui sub-sir O operatie frecvent folosita n programare consta n gasirea unui sub-sir si nlocuirea sa cu o valoare noua. PHP are doua functii deosebit de utile pentru asemenea operatii, si anume str_replace() si substr_replace(). Mai jos sunt prezentate pe scurt aceste functii. Remarcati ca functia str_replace() noteaza sub-sirul prin valoarea sa, n timp ce functia substr_replace() noteaza sub-sirul prin pozitia sa n interiorul sirului subiect.

str_replace(cauta, nlocuire, subiect) - Se cauta n sirul 'subiect' sub-sirul 'cauta'; daca sub-sirul este gasit, returneaza valoarea 'subiect', nlocuindu-se prima aparitie a sirului 'cauta' cu 'nlocuire'. substr_replace(subiect, nlocuire, start, lungime) Returneaza valoarea 'subiect', nlocuind sub-siruf care ncepe de la 'start' si avnd lungimea 'lungime' cu sirul 'nlocuire'. Iata un exemplu care prezinta modul de utilizare a acestor functii: <?php $subiect = "the cat on the mat near the bat"; echo "<br /> Subiect : $subiect";
$cauta = "cat"; $inlocuire = "DOG"; $rezultat = str_replace($cauta, $inlocuire, $subiect); echo "<br /> str_replace : $rezultat"; $inlocuire = "CAT"; $rezultat = substr_replace($subiect, $inlocuire, 4, 3); echo "<br /> substr_replace : $rezultat"; ?>

Iata si rezultatul exemplului : Subiect : the cat on the mat near the bat str_replace : the DOG on the mat near the bat substr_replace : the CAT on the mat near the bat

Expresii regulate, regex


Invatati sa scrieti si sa utilizati expresii regulate Invatati sa verificati sirurile in functie de expresii regulate

1. Scrierea expresiilor regulate (Regex) Expresiile regulate (regex) sunt un sir de caractere sablon care descriu multimea cuvintelor posibile care pot fi formate cu acele caractere, respectand anumite reguli. Aceste expresii regulate folosesc paranteze (rotunde, patrate, acolade) prin care formeaza regulile de formare a cuvintelor. Utilitatea cea mai frecventa a unei expresii regulate consta n a recunoaste daca un sir contine sau nu cuvinte sau sub-sir care pot fi formate prin expresia regulata respectiva.

De ex.: expresia m[ai]r poate forma cuvintele: mar si mir

Sa presupunem ca doriti sa specificati un sir care poate include orice vocala. Puteti face aceasta folosind expresia regulata [aeiou]. Prin includerea valorilor posibile ntre paranteze, formati o expresie regulata echivalenta cu formularea "alege oricare din aceste valori". Daca doriti sa permiteti si utilizarea, majusculelor, puteti scrie[aeiouAEIOU]. Sa presupunem ca doriti sa specificati un sir care poate include orice caracter scris cu minuscule. Puteti scrie:[abcdefghijklmnopqrstuvwxyz]. Sau puteti folosi o forma mai compacta [a-z], unde prin cratima se ntelege "o serie de caractere consecutive". Sa presupunem ca doriti sa specificati intr-o expresie regulata sirurile "sat", "mat" si "lat". Pentru aceasta, aveti nevoie de expresia regulata [sml]at. Semnificatia acestei expresii regulate este urmatoarea: "alege oricare din literele 's', 'm' si 'l' si scrie dupa litera respectiva literele 'at'". Daca un accent circumflex (^) este primul simbol mentionat ntre parantezele drepte, acesta are ca efect inversarea semnificatiei expresiei regulate plasate ntre paranteze.

De exemplu, expresia regulata [^a-z] corespunde oricarui caracter care nu este o litera mica. Pentru a specifica faptul ca o expresie regulata se poate repeta, expresia regulat va fi urmata de o pereche de acolade, care includ limitele superioara si inferioara ale repetitiei.

De exemplu, expresia regulata [aeiou]{1,4} corespunde sirurilor care pot contine intre 1 si 4 vocale. Pentru a specifica repetarea mai multor parti ale unei expresii regulate, includeti partile respective ntre paranteze rotunde.

De exemplu, expresia regulata ([sml]at){1 ,2} corespunde unui numar de una sau doua repetari ale oricaruia dintre sirurile "sat", "mat" sau "lat".

Pentru a simplifica scrierea de reguli intr-o expresie regulata se folosesc anumite caractere "speciale" Sa presupunem ca doriti sa reprezentati o nmultire intre doua numere, puteti obtine ceva de genul [0-9]*[0-9]. Totusi, aceasta expresie regulata nu are semnificatia dorita, deoarece '*' este un factor de repetitie, nu un caracter dintr-un sir. Pentru a dezactiva semnificatia speciala a caracterului '*', trebuie sa-l prefixati cu un caracter backslash: [0-9]\*[0-9]. Pentru a specifica faptul ca o expresie regulata corespunde numai unui sub-sir care include anumite caractere la inceput, prefixati expresia regulata cu un accent circumflex "^". De exemplu, expresia regulata ^[sml]at corespunde sub-sirurilor "sat", "mat" sau "lat" numai daca acestea apar la nceputul sirului subiect. Similar, pentru a arata ca o expresie regulata corespunde numai unui sub-sir care include anumite caractere la sfarsit, anexati la expresia regulata un simbol al dolarului "$". De exemplu, expresia regulata [sml]at$ corespunde sirurilor "sat", "mat" sau "lat" numai daca acestea apar la sfrsitul sirului subiect. Iata o lista cu mai multe caractere speciale si rolul lor in expresiile regulate:

^ - indica inceputul liniei $ - indica sfarsitul liniei . - (punct) orice caracter [] - un caracter dintre cele din paranezele patrate [^] - orice caracter, in afara celor din paranezele patrate \ - scoate din contextul formari expresiei caracterul care urmeaza + - caracterul (expresia) anterior acestui semn se poate repeta odata si de cate ori e posibil (de la 1 la infinit) * - caracterul (expresia) anterior acestui semn se poate repeta de cate ori e posibil sau niciodate (de la 0 la infinit) ? - caracterul (expresia) anterior acestui semn se poate repeta ce mult odata <> - un cuvant intreg (|) - lista de optiuni SAU {m, n} - repetarea expresiei de la "m" la "n" ori Iata cateva exemple de expresii regulate:

(.*) - Reprezinta toate caracterele (prin .) repetate de cate ori e posibil (dat de *) <salut> - Cuvantul "salut" (ci|co)tim - Reprezinta "citim" si "cotim" ^The .* hack$ - Sirurile care incep cu "the " si se sfarsesc cu " hack" ^www.[a-z0-9]+.ro$ - Reprezinta sirurile "www.---.ro" unde '---' poate fi orice litera sau cuvant ce contine litere mici si numere (^-\+[0-9]*) - Orice numar care incepe cu "-" sau "+"

^([a-zA-Z0-9]+[a-zA-Z0-9._%-]*@([a-zA-Z0-9-]+\.)+[a-zA-Z] {2,4})$ - Expresie regulata pentru adrese de e-mail

2. Utilizarea expresiilor regulate PHP include numeroase functii care lucreaza cu expresii regulate. Tabelul urmator descrie unele din aceste functii.

Functii PHP pentru expresii regulate Functie ereg Descriere - Executa o identificare cu o expresie regulata (deprecata incepand cu versiunea PHP 5.3 si anulata la PHP 6)

- nlocuieste un sub-sir care corespunde unei expresii regulate (deprecata ereg_replace incepand cu versiunea PHP 5.3 si anulata la PHP 6 - in locul ei poate fi folosita preg_replace) eregi - Executa o identificare cu o expresie regulata insensibila la diferenta ntre majuscule si minuscule (deprecata incepand cu versiunea PHP 5.3 si anulata la PHP 6)

- nlocuieste un sub-sir care corespunde unei expresii regulate insensibile la eregi_replace diferenta ntre majuscule si minuscule (deprecata incepand cu versiunea PHP 5.3 si anulata la PHP 6 - in locul ei poate fi folosita preg_replace) preg_replace split - Cauta in sir caracterele sau sablonul care se potriveste cu expresia regulata din functie si o inlocuieste cu alte valori date - Divide un sir ntr-un tablou folosind o expresie regulata (deprecata incepand cu versiunea PHP 5.3 si anulata la PHP 6 - in locul ei poate fi folosita preg_split) - Creaza o expresie regulata, insensibila la diferenta ntre majuscule si minuscule, dintr-un sir care contine o expresie regulata (deprecata incepand cu versiunea PHP 5.3 si anulata la PHP 6)

sql_regcase

In continuare este dat un exemplu cu functia ereg(). Forma simpla a functiei ereg() preia doua argumente: un sir care contine o expresie regulata si un sir subiect. Functia returneaza TRUE daca expresia regulata corespunde unui sub-sir al sirului subiect; n caz contrar, returneaza FALSE. - Iata un exemplu: <?php $model = "[sml]at"; $subiect = "La noi in sat"; $rezultat = ereg($model, $subiect); if ($rezultat) { echo 'Model inclus in subiect'; } ?>

- In acest script, variabila $rezultat primeste valoarea TRUE, deoarece sirul 'subiect' contine sub-sirul "sat", care corespunde expresiei regulate. Pentru verificare, instructiunea "if" verifica daca "$resultat" este TRUE si in caz afirmativ executa comanda dintre acolade, "echo" care afiseaza 'Model inclus in subiect'. - Pentru a verifica daca un sir contine numai litere si numere, puteti folosi direct functia ctype_alnum() - Deoarece functiile "ereg" au fost deprecate incepand cu versiunea PHP 5.3 si anulate din PHP 6, este indicat sa nu le mai folositi, cunoasterea lor e necesara daca le intalniti in scripturi mai vechi. Acestea au fost inlocuite cu functii "preg_" (Perl-Compatible). Mai multe detalii si exemple despre aceste functii gasiti in manualul Expresii regulate (compatibile Perl. Expresiile regulate compatigile Perl se adauga intre caractere "/". De exemplu sablonul ([a-z0-9]+) se foloseste /([a-z0-9]+)/. Iata un exemplu cu preg_grep(), aceasta returneaza un array compus din elementele unei matrice care contin sablonul, expresia regulata cautata. Acest exemplu va returna doar acele elementele dintr-o matrice care contin in ele subsirurile "casa" sau "masa". <?php $matrice = array('123casa', 'abc masa', '12-xy', '$asa_0/', '123abc casa'); $filtru = preg_grep("/([cm]asa)/", $matrice);
print_r ($filtru); ?> // Afiseaza elementele matricei

- Variabila "$matrice" contine un Array cu mai multe elemente cu siruri. - In variabila $filtru e preluat rezultatul functiei "preg_grep()" a carei prim parametru este un sablon de expresie regulata (adaugata intre ghilimele duble), iar al doilea este matricea in care e cautat sablonul. - Cu functia "print_r()" se va afisa elementele matricei obtinute in variabila "$filtru". Rezultatul afisat e urmatorul: Array ( [0]=>123casa [1]=>abc masa [4]=>123abc casa ) - Un ultim exemplu util, folosim functia preg_replace() si o expresie regulata pentru a elimina caracterelor speciale dintr-un sir <?php $sir = 'Sir& ce contine*a <caractere: speciale? /in co@nte>xt'; $sir = preg_replace("/([^ A-Za-z0-9_]+)/", "", $sir); echo $sir; ?> In acest exemplu avem un sir (stocat in variabila $sir) ce contine diferite caractere mai putin uzuale. Functia "preg_replace", impreuna cu expresia regulata "/(^ A-Za-z0-9_]+)/", pastreaza in $sir numai literele, cifrele, caracterul '_' si spatiu. Instructiunea "echo" va afisa urmatorul rezultat: Sir ce continea caractere speciale in context

Utilizarea variabilelor cookie

nvatati care este modul de functionare a variabilelor cookie

nvatati sa creati, sa obtineti accesul la variabilele cookie si sa le stergeti nvatati sa specificati optiunile dintr-o variabila cookie 1. Accesul la variabilele cookie Valorile majoritatii variabilelor dispar atunci cnd scriptul PHP care le contine si ncheie executia. Spre deosebire de acestea, valorile variabilelor cookie se pot pastra un timp indefinit. Pentru ca valorile lor sa se poata pastra, browserul utilizatorului stocheaza variabilele cookie n unitatea de hard-disc a utilizatorului. Majoritatea navigatoarelor de Web au posibilitatea sa activeze/dezactiveze cookie-urile. Trebuie sa tineti cont de acest lucru cand doriti sa folositi cookie in scripturile dv., totusi, comform statisticilor, in jur de 1% dintre utilizatori au optiunea cookie dezactivata. PHP pune la dispozitia utilizatorilor functii pentru transmiterea cookie-urilor de la server la browser, si modalitati de citire a cookie-urilor. Pentru a citi cooki-urile puteti utiliza variabila PHP de tip tablou $_COOKIE sau $_HTTP_COOKIE_VARS, acestea contin numele si valoarea fiecarei variabile cookie curenta. Daca doriti sa obtineti acces la acest tablou, puteti folosi un program ca urmatorul:

Foreach($_COOKIE as $nume => $valoare) echo "<br /> $nume => $valoare"; - $_COOKIE['numeCookie'] este o variabila super-globala, putand fi accesata si in functii fara a mai specifica "global". 2. Crearea unei variabile cookie Un lucru important de retinut este faptul ca cookie-urile trebuie sa fie transmise la browser inaintea oricarei alte informatii. Pentru a evita problemele, asigurati-va ca un script PHP care stabileste o valoare a unei variabile cookie este plasat n partea superioara a fisierului, fara caractere de tip spatiu alb care sa-l preceada. De asemenea, stabiliti valoarea variabilei cookie nainte de a executa o instructiune 'echo' sau o alta instructiune PHP care trimite browserului date de iesire. Pentru a crea o variabila cookie, folositi functia setcookie(), care are urmatoarea forma:

setcookie(numeCookie, valoare, expirare)

- Argumentul 'numeCookie' specifica numele variabilei cookie, iar argumentul 'valoare' specifica valoarea variabilei. - Valoarea variabilei cookie este automat transmisa "urlencode" si cand este primita e automat decodata. - Argumentul 'expirare' indica momentul expirarii variabilei cookie; dupa ora specificata, variabila cookie nu mai este accesibila. n general, este convenabil sa se specifice momentul expirarii folosind functia time(), care returneaza intervalul de timp (exprimat n secunde) scurs de la 1 ianuarie 1970. Puteti adauga o valoare de tip decalaj (offset), care specifica intervalul de timp pe durata caruia variabila cookie trebuie sa fie accesibila. Folosind aceasta functie se pot transmite mai multe cookie-uri succesiv;

protocoalele Web limiteaza insa la maximum 20 numarul cookie-urilor ce pot fi trimise aceluiasi utilizator. De exemplu, sa luam n considerare urmatoarea instructiune:

setcookie("fruct", "banana", time()+3600);

Aceasta instructiune creeaza o variabila cookie denumita 'fruct', care are valoarea 'banana'. Variabila cookie va fi disponibila timp de o ora (3600 secunde) de la crearea sa. Daca preferati, puteti specifica momentul expirarii folosind functia mktime(). Aceasta functie are urmatoarea forma:

mktime(ore, minute, secunde, luna, zi, an)

De exemplu, urmatoarea instructiune creeaza o variabila cookie care expira la o secunda dupa miezul noptii primei zile a anului 2009:

Setcookie("fruct", "banana", mktime(0, 0, 1, 1, 1, 2009));

3. Stergerea unei variabile cookie Deoarece o variabila cookie are o data de expirare, aceasta va fi stearsa automat la un oarecare interval de timp dupa crearea sa. Totusi, puteti sterge o variabila cookie imediat. Pentru aceasta, fixati momentul expirarii variabilei cookie la un moment de timp in trecut. De exemplu, pentru a sterge o variabila cookie denumita 'fruct', puteti folosi urmatoarea instructiune:

setcookie("fruct", "", time()-3600);

Aceasta instructiune stabileste timpul de expirare cu o ora (3600 de secunde) n urma. Remarcati ca valoarea variabilei cookie este exprimata sub forma unui sir vid (""); din moment ce variabila cookie nu va mai fi disponibila, valoarea sa nu mai are importanta. 4. Specificarea accesului la o variabila cookie si alte optiuni Functia setcookie() poate prelua maximum sase argumente. Iata formatul complet al functiei setcookie():

setcookie(nume, valoare, expirare, cale, domeniu, secure)

Argumentele 'nume', 'valoare' si 'expirare' au fost descrise n sectiunea precedenta. - Argumentul 'cale' va permite sa specificati calea URL asociata variabilei cookie. n mod prestabilit, variabila cookie este disponibila pentru scripturile din catalogul care contine scriptul n care a fost configurata variabila respectiva, precum si pentrul scripturile din sub-cataloagele aferente catalogului respectiv. n particular, scripturilor din cataloagele parinte ale catalogului care contine scriptul nu li se permite accesul prestabilit la variabila cookie. Pentru a pune variabila cookie la dispozitia scripturilor dintr-un anumit catalog

si cataloagele sale, specificati o valoare a argumentului 'cale'. De exemplu, pentru a pune variabila cookie la dispozitia ntregului arbore de cataloage, specificati " /" ca valoare a argumentului cale; pentru a face variabila cookie disponibila n catalogul "/test" si n sub-cataloagele sale, specificati "/test/" ca valoare a argumentului 'cale'. - Daca nu este specificat nici un argument 'domeniu', o variabila cookie este disponibila numai pentru scripturile din domeniul Web care a creat variabila respectiva. Argumentul 'domeniu' va permite sa specificati numele de domeniu asociat unei variabile cookie. n consecinta, variabila cookie va fi disponibila numai pentru siturile Web din cadrul domeniului specificat. De exemplu, sa presupunem ca un script din serverul Webhttp://www.subdomeniu.domeniu.com creeaza o variabila cookie. n mod prestabilit, variabila cookie este disponibila numai pentru gazda respectiva. Cu toate acestea, puteti face variabila cookie disponibila pe ntreg domeniul 'subdomeniu.domeniu.com', specificnd "subdomeniu.domeniu.com" ca valoare a argumentului 'domeniu'. - Argumentul 'secure' este o valoare ntreaga, care specifica daca variabila cookie trebuie trimisa prin intermediul unei conexiuni sigure (HTTPS). Specificati valoarea l pentru a mpiedica transmiterea variabilei cookie n cazul n care conexiunea nu este sigura; pentru a permite transmiterea variabilei cookie prin conexiuni HTTP obisnuite, specificati valoarea 0.

Lucrul cu fisiere (1)


Invatati sa obtineti atributele unui fisier Invatati despre privilegiile unui fisier si utilizarea acestora Invatati sa deschideti si sa inchideti fisiere

1. Obtinerea atributelor unui fisier Privilegiile asociate unui fisier sau unui catalog determina operatiile pe care le poate executa un utilizator cu fisierul sau catalogul respectiv. Pentru a adauga un fisier intr-un director, folosind PHP, trebuie sa aveti permisiunea de scriere in acel director, de asemenea, pentru a adauga date intr-un fisier, trebuie sa aveti permisiunea de scriere in fisierul respectiv. Aceste permisiuni sunt date (configurate) de administratorul sistemului respectiv. PHP furnizeaza numeroase functii care va permit sa obtineti informatii care descriu un fisier. Tabelul urmator rezuma cele mai cunoscute dintre aceste functii.

Functii PHP pentru obtinerea atributelor unui fisier Functie file_exists() fileatime() filectime() Descriere - Returneaza TRUE daca fisierul specificat exista, respectiv FALSE n caz contrar - Returneaza timpul de acces la fisier sub forma de amprenta de timp UNIX. - Returneaza timpul de modificare al i-nodului (structura de date care contine informatii despre fisiere UNIX - N. T.) sub forma de amprenta de timp UNIX.

filegroup() filemtime()

- Returneaza identificatorul numeric al grupului care detine fisierul - Returneaza momentul de timp al modificarii fisierului sub forma de amprenta de timp UNIX

fileowner() - Returneaza identificatorul numeric de utilizator al fisierului fileperms() - Returneaza permisiunile fisierului filesize() filetype() is_dir() is_file() is_readable() is_writable() - Returneaza dimensiunea fisierului, n octeti - Returneaza tipul fisierului, n speta "fifo", "char", "dir", "block", "link", "file" sau "unknown" - Returneaza TRUE daca directorul specificat exista; n caz contrar, returneaza FALSE - Returneaza TRUE daca fisierul specificat exista; n caz contrar, returneaza FALSE - Returneaza TRUE daca fisierul specificat exista si poate fi citit; n caz contrar, returneaza FALSE - Returneaza TRUE daca fisierul specificat exista si se poate scrie n acel fisier; n caz contrar, returneaza FALSE

Functiile fileowner() si filegroup() returneaza fiecare un identificator numeric; puteti converti identificatorul numeric ntr-un sir prin invocarea functiei posix_getpwuid() cu un identificator de utilizator, respectiv a functiei posix_getgrgid()cu un identificat de grup. Acestea returneaza informatii despre identificatorul precizat. Iata un exemplu in care puteti vedea, si intelege mai bine, cum sunt folosite functiile rezentate in tabelul anterior (fisierul 'test.txt' care va fi folosit de functii se afla in acelasi director cu scriptul php): <?php $filename = "test.txt";
$result = file_exists($filename); echo "<br /> file_exists(): $result"; $result = fileowner($filename); echo "<br /> fileowner(): $result"; $result = filegroup($filename); echo "<br /> filegroup(): $result"; $result = filetype($filename); echo "<br /> filetype(): $result"; $result = filesize($filename); echo "<br /> filesize(): $result"; $result = fileatime($filename); $result = date("m/d/Y H:i", $result); echo "<br /> fileatime(): $result"; $result = filectime($filename);

$result = date("m/d/Y H:i", $result); echo "<br /> filectime(): $result"; $result = filemtime($filename); $result = date("m/d/Y H:i", $result); echo "<br /> filemtime(): $result"; $result = fileperms($filename); $result = decoct($result); echo "<br /> fileperms(): $result"; $result = is_file($filename); echo "<br /> is_file(): $result"; $result = is_dir($filename); echo "<br /> is_dir(): $result"; $result = is_readable($filename); echo "<br /> is_readable(): $result"; $result = is_writable($filename); echo "<br /> is_writable(): $result"; ?>

Datele de iesire ale exemplului sunt urmatoarele file_exists(): 1 fileowner(): 0 filegroup(): 0 filetype(): file filesize(): 5 fileatime(): 08/28/2008 00:00 filectime(): 08/28/2008 10:49 filemtime(): 08/28/2008 11:32 fileperms(): 100666 is_file(): 1 is_dir(): is_readable(): 1 is_writable(): 1 2. Privilegii de fisier Privilegiile asociate unui fisier (sau director) determina operatiile pe care utilizatorii le pot efectua cu fisierul (sau directorul) respectiv. = Privilegiile sunt date sub forma a trei grupuri alcatuite din cte trei caractere fiecare; cu alte cuvinte, trei triade. Prima triada indica privilegiile acordate posesorului fisierului. Cea de-a doua triada indica privilegiile acordate membrilor grupului posesor al fisierului. Cea de-a treia triada indica privilegiile acordate altor utilizatori. Cele 3 caractere care alcatuiesc un grup sunt reprezentate, in sistemele UNIX, prin urmatoarele tri litere: 'r', 'w' si 'x'; acestea reprezinta:

r - fisierul poate fi citit w - se poate scrie n fisier x - continutul fisierului poate fi executat

Caracterele unei triade apar ntotdeauna n secventa 'rwx'. Daca o anumita litera este nlocuita de o cratima (-), privilegiul asociat nu este accesibil. De exemplu, sa examinam privilegiile specificate in urmatorul exemplu:

rwxr-xr--

Aceste caractere au urmatoarea semnificatie:


"rwx", posesorul fisierului poate citi, scrie sau executa fisierul "r-x", membrii grupului posesor al fisierului pot citi sau executa fisierul, dar nu pot scrie n fisier "r--", alti utilizatori pot citi fisierul, dar nu pot scrie n fisier sau executa continutul fisierului
Privilegiul 'x' este semnificativ numai pentru fisierele care includ un continut executabil, cum sunt fisierele binare executabile (.exe) sau anumite categorii de scripturi.

Posesorul unui fisier poate modifica privilegiile asociate fisierului emitnd comanda chmod (aceasta functioneaza in sistemele de operare UNIX). Aceasta comanda are doua forme. O forma va permite sa specificati privilegiile folosind cifre scrise n octal; cealalta va permite sa le specificati folosind litere. Pentru a specifica privilegiile folosind cifre n octal, calculati valoarea numerica a fiecarei triade. Pentru aceasta, nsumati numerele corespunzatoare fiecarui privilegiu disponibil din cadrul triadei. Numerele asociate privilegiilor sunt urmatoarele:

r-4 w-2 x-1 De exemplu, privilegiul "rwx" are valoarea 4 + 2 + 1 = 7. Similar, privilegiul "r-x" are valoarea 4 + l = 5, iar privilegiul "r--" are valoarea 4. Dupa ce ati calculat valoarea numerica a fiecarei triade, formati un numar din trei cifre scris n octal, care este alcatuit din valoarea numerica a privilegiilor utilizatorilor, valoarea numerica a privilegiilor membrilor grupului, si valoarea numerica a privilegiilor altor utilizatori. Astfel, privilegiile "rwxr-xr--" corespund valorii n octal 754. 3. Modificarea privilegiilor unui fisier Pentru a modifica privilegiile unui fisier, folositi functia chmod(), care are urmatoarea forma:

chmod(nume_fisier, mod)

Argumentul 'nume_fisier' specifica numele si calea de acces a fisierului ale carui privilegii urmeaza a fi modificate, iar argumentul 'mod' specifica privilegiile dorite, n general, se prefera exprimarea privilegiilor sub forma unui numar scris n octal. Pentru aceasta, prefixati valoarea folosind cifra 0. De exemplu, puteti atribui unui fisier "text.txt" privilegiile "rwxr-xr--" specificnd pentru 'mod' valoarea 0754, functia "chmod" va fi chmod("text.txt", 0754)

Pentru ca functia chmod() sa se execute cu succes, PHP trebuie sa ruleze sub contul utilizatorului posesor al fisierului. Functia returneaza TRUE n caz de reusita, respectiv FALSE n caz contrar. Pentru a modifica grupul posesor al unui fisier, invocari functia chgrp(), care are forma:

chgrp("nume_fifier", grup)

- Unde "grup" este un nume sau numar care desemneaza grupul respectiv.
Functiile chmod() si chgrp() nu functioneaza sub Microsoft Windows.

4. Deschiderea unui fisier Inainte de a putea citi sau scrie ntr-un fisier, trebuie sa deschideti fisierul folosind functia fopen().

fopen("nume_fisier", "mod")

- unde 'nume_fisier' specifica numele si calea spre fisierul care urmeaza a fi deschis, iar 'mod' indica tipul de acces dorit. Modurile de deschidere a unui fisier sunt urmatoarele:

r - Permite doar citirea fisierului r+ - Citire sau scriere de la inceputul fisierului w - Creaza fisierul daca nu exista si suprascrie datele existente w+ - Citire sau scriere; la scriere , creeaza fisierul daca nu exista si suprascrie datele existente a - Adaugare; Creaza fisierul daca nu exista si adauga datele noi la sfarsitul fisierului existent a+ - Citire sau scriere; la scriere, creaza fisierul daca nu exista si adauga datele noi la sfarsitul fisierului existent x - Doar scriere; Creaza fisierul daca nu exista si genereaza un averisment daca acesta exista x+ - Citire sau scriere; Creaza fisierul daca nu exista si genereaza un averisment daca acesta exista b - Deschide fisierul in mod binar Functia fopen() returneaza FALSE daca PHP nu a reusit sa deschida fisierul, n caz contrar, returneaza o valoare care contine un ntreg, numit "identificator de fisier", care se foloseste pentru identificarea unui fisier de catre functiile care executa operatii cu fisiere. De exemplu, instructiunea urmatoare deschide fisierul 'carte.txt' pentru citire:

$fh = fopen("carte.txt", "r");

Sub Microsoft Windows, fisierele ASCII si fisierele binare sunt tratate n mod diferit. Cnd deschideti un fisier binar sub Windows, specificati "b" ca al doilea caracter al modului; de exemplu, "rb" pentru citire, "wb" pentru scriere, "a+b" pentru citire si adaugare. Daca nu procedati astfel, citirile din fisier si alte operatii se vor ncheia prematur sau vor esua.

5. Verificarea finalizarii unei operatii cu un fisier Operatiile cu fisiere (inclusiv cele legate de deschiderea, citirea unui fisier si scrierea ntr-un fisier) pot esua dintr-o varietate de motive. Deci, este important sa verificati daca fiecare operatie s-a ncheiat cu succes. Iata o modalitate n care puteti proceda: <?php $fh = fopen("carte.txt", "rb"); if (!$fh) { echo "Nu a fost deschis fisierul carte.txt."; } ?> Functia fopen() returneaza FALSE daca nu reuseste sa deschida fisierul. In acest caz, scriptul executa instructiunea echocare afisaza un mesaj. O forma alternativa mai simpla foloseste operatorul OR (SAU): <?php ($fh = fopen("carte.txt", "rb")) OR die("Nu a fost deschis fisierul carte.txt."); ?> 6. Inchiderea unui fisier Un fisier deschis consuma resursele sistemului. Cnd un script a terminat de utilizat un fisier, scriptul trebuie sa nchida fisierul, elibernd aceste resurse. La sfrsitul unui script, PHP nchide n mod automat fisierele deschise. Totusi, la programare se recomanda sa nchideti fisierele mai rapid, ori de cte ori este posibil. Pentru a nchide un fisier, folositi functia fclose():

fclose(identificator_fisier)

- 'identificator_fisier' este identificatorul fisierului, returnat la deschiderea acestuia cu functia fopen() Iata un exemplu caracteristic de deschidere, utilizare si nchidere a unui fisier: <?php $fh = fopen("carte.txt", "rb"); if (!$fh) { echo "Nu a fost deschis fisierul carte.txt."; } // Aici se insereaza instructiunile care folosesc fisierul deschis fclose($fh); ?>
Functia fclose() returneaza valoarea TRUE daca fisierul a fost nchis cu succes. Testarea acestei valori este rareori necesara, deoarece nu se mai pot face prea multe dupa ce s-a ratat o ncercare de a nchide un fisier.

Lucrul cu fisiere (2)


nvatati sa cititi datele dintr-un fisier nvatati sa afisati continutul unui fisier nvatati sa scrieti date intr-un fisier

1. Citirea dintr-un fisier PHP furnizeaza o varietate de functii pentru citirea fisierelor. Una dintre acestea este fread(), care are urmatoarea forma: fread(identificator_fisier, lungime) Argumentul 'identificator_fisier' este valoarea returnata de functia fopen(), iar argumentul 'lungime' specifica numarul maxim de octeti care vor fi cititi. Octetii cititi din fisier sunt returnati sub forma de valoare de tip sir. Daca operatia de citire ntlneste sfrsitul fisierului, PHP va returna mai putin de lungime octeti data. Iata un exemplu de citire si de afisare a unui text dintr-un fisier, folosind functia fopen() (Fisierul "carte.txt" folosit ca test in exemplele de mai jos trebuie sa se afle in acelasi director in care este si scriptul php): <?php $fh = @fopen("carte.txt", "rb"); if (!$fh) { echo "Nu a fost deschis fisierul carte.txt."; } else { $s = fread($fh, 256); echo "<br /> Citeste: $s"; fclose($fh); } ?> Exemplul citeste maximum 256 de octeti din fisier daca fisierul a fost deschis. - Am folosit caracterul @ in fata functiei "fopen()" pentru a impedica afisarea erorilor de la server in cazul cand fisierul nu poate fi deschis. Este deja functia "if()" care verifica si afiseaza mesaj in caz de nedeschidere a fisierului. Pentru a citi un numar mai mare sau mai mic de octeti, modificati valoarea argumentului lungime al functiei fread().
PHP include o functie conexa, denumita fgetc(), care citeste un octet din fisierul specificat.

Pentru a citi si a afisa ntregul continut al fisierului, puteti folosi functia filesize() pentru a furniza valoarea argumentului lungime, astfel: <?php $nume = "carte.txt"; $fh = @fopen($nume, "rb"); if (!$fh) { echo "Nu a fost deschis fisierul carte.txt."; } else { $l = filesize($nume); $s = fread($fh, $l); echo "<br /> Citeste: $s"; fclose($fh); } ?> 2. Citirea unei linii de text Se obisnuieste frecvent citirea linie cu linie a unui text dintr-un fisier. Functia fgets() citeste o linie dintr-un fisier; functia are urmatoarea forma: fgets(identificator_fisier, lungime) - Argumentul 'identificator_fisier' este o valoare returnata de functia fopen();

aici, argumentul 'lungime' specifica numarul maxim de octeti dintr-o linie care vor fi cititi, minus o unitate, pentru a permite includerea caracterului de terminare a liniei (acesta poate fi omis si va citi toata linia). Octetii cititi din fisier sunt returnati ca valoare de tip sir. Iata un exemplu care prezinta modul de citire si de afisare a primilor 125 octeti din prima linii a unui fisier : <?php $nume = "carte.txt"; $fh = @fopen($nume, "rb"); if (!$fh) { echo "Nu a fost deschis fisierul carte.txt."; } else { $s = fgets($fh, 126); echo "<br /> Citeste: $s"; fclose($fh); } ?> - In exemplul de mai sus, daca prima linie din fisierul "carte.txt" are mai mult de 125 de caractere, va afisa doar primele 125, daca are mai putin de 125 de caractere, va afisa doar caracterele care sunt incluse in prima linie. 3. Citirea linie cu linie a unui ntreg fisier n general, dintr-un fisier trebuie citit mai mult dect prima linie a acestuia. Pentru aceasta, un script trebuie sa dispuna de o modalitate de a determina momentul cnd fisierul a fost citit n totalitate. Functia feof() are chiar acest scop, returnnd o valoare care arata daca s-a ajuns sau nu la sfrsitul fisierului. Functia are urmatoarea forma: feof(identificator_fisier) Argumentul 'identificator_fisier' este valoarea returnata de functia fopen(). Functia feof() returneaza TRUE daca fisierul specificat este la sfrsit; n caz contrar, returneaza FALSE. Iata cum se poate folosi functia feof() pentru a controla procesul de citire a unui ntreg fisier, linie cu linie: <?php $nume = "carte.txt"; $fh = @fopen($nume, "rb"); if (!$fh) { echo "Fisieru carte.txt nu a putut fi deschis"; } while (!feof($fh)) { $s = fgets($fh, 256); echo "<br /> Citeste : $s"; } fclose($fh); ?> - Instructiunea "while" asigura faptul ca functia fgets() este apelata n mod repetat, pna la citirea tuturor liniilor. O alta modalitate simpla de a citi linie cu linie un ntreg fisier consta n a folosi functia file(). Aceasta functie returneaza un tablou n care fiecare element contine o linie a fisierului specificat.

Iata un exemplu care foloseste functia file() pentru a citi si pentru a afisa continutul unui fisier: <?php $tablou = file("carte.txt"); foreach ($tablou as $s) { echo "<br /> Citeste : $s"; } ?>
Aceasta metoda nu este adecvata pentru fisiere de foarte mari dimensiuni, deoarece n tablou este ncarcat ntregul continut al fisierului, ceea ce poate necesita o cantitate de memorie superioara celei disponibile.

4. Afisarea continutului unui fisier PHP furnizeaza doua functii care faciliteaza afisarea continutului unui fisier. - Una dintre functii, fpassthru(), necesita un argument care specifica identificatorul fisierului care urmeaza sa fie afisat:

$fh = fopen("carte.txt", "rb"); fpassthru($fh); Dupa ce a afisat fisierul, functia l nchide automat. - Cealalta functie, readfile(), necesita numai numele sau calea fisierului:

readfile("carte.txt");

5. Navigarea printr-un fisier Fiecare fisier are un pointer asociat care indica pozitia octetului unde se va produce urmatoarea operatie. Puteti folosi functia rewind() pentru a readuce pointerul la nceputul fisierului. Functia are urmatoarea forma ('identificator_fisier' este identificatorul de fisier returnat de functia fopen()): rewind(identificator_fisier)
Nu puteti readuce pointerul unui fisier la nceputul propriu-zis al unui fisier daca fisierul a fost deschis pentru un acces de tip atasare, adica ntr-unul din modurile 'a' sau 'a+'.

Iata un exemplu care prezinta modul de utilizare a functiei rewind() pentru a afisa de doua ori continutul unui fisier: <?php $nume = "carte.txt"; $fh = @fopen($nume, "rb"); if (!$fh) { echo "Fisieru carte.txt nu a putut fi deschis"; } while (!feof($fh)) { $s = fgets($fh, 256); echo "<br /> Citeste : $s"; } // Deruleaza la inceputul fisierului si reia redarea acestuia rewind($fh); while (!feof($fh)) { $s = fgets($fh, 256);

echo "<br /> Citeste \$s : $s"; } fclose($fh); ?>

Daca se produce vreo eroare, functia rewind() returneaza zero. Desi functia rewind() este utila n caz de nevoie, necesitatea de a readuce un pointer de fisier la nceputul fisierului nu este chiar att de frecventa. Functia fseek() furnizeaza o mai mare flexibilitate, permitndu-va sa pozitionari pointerul de fisier astfel nct sa puteti citi sau scrie n orice punct al fisierului. Functia are doua forme, cea mai simpla fiind urmatoarea: fseek(identificator_fisier, offset) unde 'identificator_fisier' este identificatorul de fisier returnat de functia fopen(), iar 'offset' este pozitia dorita a pointerului de fisier, specificata n octeti, n raport cu nceputul fisierului. In caz de reusita, functia fseek() returneaza 0; n caz contrar, returneaza -l . O forma alternativa a functiei asigura un grad superior de flexibilitate, avand urmatoarea forma: fseek(identificator_fisier, offset, baza) unde 'identificator_fisier' si 'offset' au semnificatiile definite anterior, iar 'baza' ia una ; dintre urmatoarele valori:

SEEK_SET, care stabileste pozitia pointerului de fisier n raport cu nceputul fisierului SEEK_CUR, care stabileste pozitia pointerului de fisier n raport cu valoarea curenta a pointerului SEEK_END, care stabileste pozitia pointerului de fisier relativ la sfrsitul fisierului Valoarea argumentului 'offset' poate fi pozitiva, negativa sau zero. De exemplu, pentru a pozitiona pointerul cu 1000 de octeti nainte de sfrsitul fisierului, emiteti urmatorul apel de functie:

fseek($fh, -1000, SEEK_END)

Pentru a obtine valoarea curenta a pointerului de fisier, folositi functia ftell(), care are urmatoarea forma:

ftell(identificator_fisier)

Functia returneaza valoarea curenta a identificatorului de fisier, respectiv valoarea zero daca functia esueaza. 6. Scrierea ntr-un fisier Pentru a scrie intr-un fisier se foloseste functia fwrite(), aceasta are urmatoarea forma: fwrite(identificator_fisier, date); - Unde 'identificator_fisier' este identificatorul de fisier returnat de functia fopen(), iar 'date' este o valoare sir care determina datele care urmeaza a fi scrise. Daca executia functiei reuseste, returneaza numarul octetilor scrisi; n caz

contrar, returneaza valoarea l. Iata un exemplu care prezinta modul de scriere a datelor ntr-un fisier: <?php $nume = "carte.txt"; $fh = @fopen($nume, "ab"); if (!$fh) { echo "Nu a fost deschis fisierul carte.txt."; } else { $ok = fwrite($fh, "Acestea sunt datele adaugate \n"); echo "<br /> Rezultatul scris este: $ok"; fclose($fh); } ?> Acest script va avea urmatoarele date de iesire: Rezultatul scris este: 30 - Programul prezentat n exemplul anterior scrie n fisierul "carte.txt" o linie de text. Deoarece fisierul a fost deschis folosind modul "a", datele sunt atasate la fisier; cu alte cuvinte, datele sunt scrise la sfarsit, dupa toate datele existente n fisier. Observati ca a fost scris si un caracter de terminare a liniei ("\n"), astfel nct fisierul sa poata fi citit linie cu linie la un moment de timp ulterior. Daca lucrati cu un fisier text, n general e util sa includeti un caracter de terminare a liniei la sfrsitul fiecarei linii scrise n fisier. Programul din exemplu scrie n fisier o singura linie de text. Totusi, puteti scrie mai multe linii, daca doriti. Daca apelati functia fwrite() din interiorul unei bucle, aveti posibilitatea de a scrie mai multe linii. Dupa ce ati scris toate liniile de care aveti nevoie, nchideti fisierul prin apelarea functiei fclose(). PHP mai furnizeaza si o forma alternativa a functiei fwrite():

fwrite(identificator_fisier, date, lungime);

Aceasta forma include un al treilea argument, si anume "lungime", care va permite sa specificati numarul maxim de octeti care vor fi scrisi.
Argumentul "lungime" al functiei fwrite() trebuie utilizat atunci cnd se scrie n fisiere binare sub Microsoft Windows. Windows prefera secventa de terminare a liniei "\r\n". Atunci cnd scrieti programe PHP pentru sisteme Windows, este de preferat sa folositi secventa "\r\n" de terminare a liniei. - PHP dispune de o alta functie pentru scrierea fisierelor, fputs(). Totusi, n afara de nume, fputs() este similara cu functiafwrite().

Lucrul cu fisiere (3)


Invatati sa blocati si sa obtineti accesul exclusiv la un fisier Invatati sa copiati, sa redenumiti si sa stergeti un fisier Studiati un script PHP util pentru incarcarea de fisiere in server

1. Obtinerea accesului exclusiv la un fisier Web-ul ridica o problema speciala pentru dezvoltatorii de programe, deoarece mai multi utilizatori pot avea acces simultan la un singur script PHP. Uneori, accesul simultan poate avea ca rezultat date incorecte. Pentru a vedea cum se poate produce aceasta, sa luam n considerare urmatorul script, care reprezinta un contor pentru numarul de deschideri a unei pagini. <?php $contor = "ctr.txt"; $fh = @fopen($contor, "r+b"); if (!$fh) { echo "Nu a fost deschis fisierul ctr.txt."; } else { $s = fgets($fh, 7); $count = (int) $s; $count = $count + 1; rewind($fh); fwrite($fh, $count); echo "<br /> Nr. vizitari: $count"; fclose($fh); } ?> Remarcati functiile pe care le foloseste scriptul pentru a executa operatiile cu fisiere. Programul deschide fisierul "ctr.txt" pentru citire si scriere, preia datele din acesta, care sunt un numar intreg, mareste acel numar cu o unitate, intoarce pointerul la inceputul fisierului "rewind" dupa care rescrie noul numar, afiseaza numarul si inchide fisierul. Secventa de cod descrisa mai sus poate creea probleme in cazul in care, de exemplu doi utilizatori diferiti acceseaza acelasi fisier, in acelasi timp, cand contoarul este, de exemplu, la numarul 100. Amandoi vor incrementa numarul 100 cu o unitate si va rescrie in fisierul "ctr.txt" 101; in final, contoarul va arata 101, in loc de 102 cum ar fi trebuit (deoarece au fost 2 vizitatori). Pentru a evita astfel de conflicte PHP pune la dispozitia utilizatorilor o metoda prin care se poate bloca accesul temporar la un fisier. Pe durata blocarii, un alt utilizator nu va mai putea scrie/citi din acest fisier. De aceea durata blocarii trebuie sa fie limitata. Functia care realizeaza blocarea este flock(), care are urmatoarea forma:

flock(identificator_fisier, operatie)

- Unde "identificator_fisier" este identificatorul de fisier returnat de functia fopen(). Argumentul "operatie" este o constanta sau o expresie care poate avea urmatoarele valori:

LOCK_SH - Blocare partajata in scopuri de citire LOCK_EX - Blocare exclusiva in scopuri de scriere LOCK_NB - Blocare fara fixare LOCK_UN - Eliminarea blocarii Iata cum se foloseste procesul de blocare, vom folosi acelasi exemplu, contoarul de mai sus, de data aceasta imbunatatit.

<?php $contor = "ctr.txt"; $fh = @fopen($contor, "r+b"); if (!$fh) { echo "Nu a fost deschis fisierul ctr.txt."; } else { flock($fh, LOCK_EX); $s = fgets($fh, 7); $count = (int) $s; $count = $count + 1; rewind($fh); fwrite($fh, $count); flock($fh, LOCK_UN); echo "<br /> Nr. vizitari: $count" fclose($fh); } ?>

- De data aceasta scriptul blocheaza fisierul "ctr.txt" pe timpul citirii si scrierii acestuia, astfel nct accesul simultan sa nu cauzeze o numarare eronata. Blocare se face imediat dupa ce a fost deschis fisierul, cu "LOCK_EX", si se incheie imediat dupa rescrierea in fisier, prin deblocare acestuia "LOCK_UN". 2. Copierea unui fisier O functie care faciliteaza copierea fisierelor, este copy(). Functia copy() are urmatoarea forma: copy (sursa, destinatiea) Unde "sursa" este numele si calea fisierului care urmeaza a fi copiat, iar "destinatie" este numele sau calea copiei. Functia returneaza TRUE daca operatia de copiere reuseste; n caz contrar, returneaza FALSE. Iata un exemplu n care este prezentat modul de utilizare a functiei copy(): <?php $ok = copy("test.txt", "test.txt.bak"); if (!$ok) { echo "Copierea nu a reusit."; } ?> Exemplul creeaza o copie a fisierului "test.txt", cu numele "test.txt.bak", in acelasi director. Functia copy() va suprascrie fisierul destinatie, daca acesta exista. 3. Modificarea numelui unui fisier Functia care va permite sa modificati numele unui fisier este rename(), aceasta care are urmatoarea forma: rename(nume_vechi, nume_nou) Unde "nume_vechi" este numele si calea originala a fisierului, iar "nume_nou" este numele dorit. Functia returneaza TRUE daca operatia de modificare a numelui a reusit; n caz contrar, returneaza FALSE. Iata un exemplu de utilizare a functiei rename(): <?php $ok = rename("test.txt", "teste.dat");

if (!$ok) { echo "Modificarea numelui nu a reusit."; } ?>

- Exemplu modifica numele fisierului "test.txt" in "teste.dat". 4. Stergerea unui fisier Functia care va permite sa stergeti un fisier este unlink(), aceasta care are urmatoarea forma: unlink(nume_fisier) Unde "nume_fisier" este numele si calea fisierului care va fi sters. Functia returneaza TRUE daca operatia de stergere a reusit; n caz contrar, returneaza FALSE. Iata un exemplu de utilizare a functiei unlink(): <?php $ok = unlink("test.txt"); if (!$ok) { echo "Stergerea fisierului nu a reusit."; } ?> - Exemplu sterge fisierului "test.txt".
Retineti ca PHP trebuie sa aiba acces de scriere la catalogul n care se vor executa operatiile de copiere, redenumire sau stergere; n caz contrar, PHP nu va putea executa aceste operatii.

5. Incarcarea unui fisier in server Pentru incarcarea unui fisier in server, se folosesc formulare HTML impreuna cu un script PHP de incarcare care foloseste functia move_uploaded_file() pentru operatia de upload. Pentru a crea un formular de ncarcare, specificati ENCTYPE="multipart/form-data" n eticheta FORM si includeti un control de introducere a datelor cu atributul TYPE="FILE". Iata un exemplu de script PHP si formular HTML care incarca fisierele in server: <?php if(isset($_POST['submit'])) { $uploadpath = "upload/"; // Modifica aici directorul de upload $uploadpath = $uploadpath . basename( $_FILES['fisier']['name']); if(move_uploaded_file($_FILES['fisier']['tmp_name'], $uploadpath)) { echo"Fisier: ". basename( $_FILES['fisier']['name']). " a fost incarcat"; } else { echo "Eroare la urcarea fisierului pe server, mai incerca o data!"; } } ?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data"> Alege fisierul: <input type="file" name="fisier" /> <br /> <input type="submit" name='submit' value="Trimite" /> </form>

Cnd utilizatorul apasa pe butonul de "Trimite", scriptul PHP preia datele si va incarca fisierul dorit in server

Utilizarea cataloagelor (Directoare)


Invatati sa obtineti si sa modificati directorul de lucru curent Invatati sa manipulati caile de acces si privilegiile la un director Invatati sa cititi continutul unui director, sa-l redenumiti si sa creati noi directoare Cele mai importante functii pentru utilizarea cataloagelor va permit sa obtineti catalogul de lucru si sa lucrati cu acesta, sa manipulati cai de acces, sa cititi continutul unui director, sa vizualizati si sa modificati privilegiile unui director, precum si sa creati si sa stergeti cataloage. In acest context, numele "catalog" si "director" reprezinta acelasi lucru. 1. Obtinerea si modificarea directorului de lucru Functia getcwd() returneaza numele catalogului curent de lucru. Functia nu necesita argumente si poate fi utilizata astfel: $cdir = getcwd(); Pentru a schimba catalogul curent de lucru, puteti folosi functia chdir(), care are urmatoarea forma: chdir(nume_director) - Unde "nume_director" este calea sau numele catalogului de lucru dorit. Functia returneaza TRUE daca operatia reuseste; n caz contrar, returneaza FALSE. De exemplu, daca in directorul curent se afla alt director "temp", pentru a face din "temp" catalogul curent de lucru, folositi functia chdir() dupa cum urmeaza: <?php $ndir = chdir("temp/"); ?> 2. Manipularea cailor de acces PHP include numeroase functii utile pentru manipularea cailor de acces. Functia dirname() preia calea de acces la un fisier si returneaza toata calea, mai putin componenta finala a caii specificate, n cazul n care componenta finala este un fisier, functia va ajuta sa izolati numele fisierului de restul caii. De exemplu, daca se da calea "plomar/curs-php/lectii/lectia1.php", functia va returna "plomar/curs-php/lectii". Functia are urmatoarea forma: dirname(cale_fisier) Functia basename() executa operatia complementara, returnnd numai componenta finala a caii specificate. De exemplu, daca este data calea "plomar/curs-php/lectii/lectia1.php", functia "basename()" va returna "lectia1.php". Functia are urmatoarea forma: basename(cale_fisier) Daca doriti sa executati mai multe operatii cu o cale, functia pathinfo() va

poate fi de folos. Aceasta functie returneaza un tablou care include patru elemente (al patrule incepand de la versiunea PHP 5.2.0):

1. dirname - rezultatul invocarii functiei dirname() avnd ca argument calea respectiva 2. basename - rezultatul invocarii functiei basename() avnd ca argument calea respectiva 3. extension - extensia fisierului (daca exista) dat de rezultatului functiei basename() 4. filename - numele fisierului dat de rezultatului functiei basename(), dar fara extensie Iata un exemplu care prezinta modul de utilizare a functiei pathlnfo() : <?php $path_parts = pathinfo('plomar/curs-php/lectii/lectia1.php'); foreach ($path_parts as $num => $val) { echo "<br /> $num => $val"; } ?> Datele de iesire ale scriptului de mai sunt urmatoarele : dirname => plomar/curs-php/lectii basename => lectia1.php extension => php filename => lectia1 Un alt mod in care puteti utiliza si afla valorile returnate de functi pathinfo() este urmatorul: <?php $path_parts = pathinfo('plomar/curs-php/lectii/lectia1.php'); echo "<br />". $path_parts['dirname'], "\r\n"; echo "<br />". $path_parts['basename'], "\r\n"; echo "<br />". $path_parts['extension'], "\r\n"; echo "<br />". $path_parts['filename'], "\r\n"; ?> Acest exemplu va returna urmatoarele date de iesire : plomar/curs-php/lectii lectia1.php php lectia1 3. Vizualizarea si modificarea privilegiilor directoarelor Pentru a vizualiza privilegiile unui director, puteti folosi aceleasi functii utilizate pentru vizualizarea privilegiilor fisierelor, prezentate in Lectia 17 in tabelul "Functii PHP pentru obtinerea atributelor unui fisier". folosind ca argument numele sau calea directorului. Aceste functii va permit sa vizualizati o varietate de caracteristici ale directoarelor, inclusiv privilegiile de catalog, care sunt returnate de functia fileperms(). Pentru a modifica privilegiile unui director, folositi functia chmod() care a fost descrisa in Lectia 17 la sectiunea "Modificarea privilegiilor unui fisier". Utilizati aceasta functie exact asa cum ati folosi-o pentru a stabili privilegiile de fisier, folosind ca argument un director.

Pentru a putea atribui sau schimba privilegiile unui director sau fisier, modulul PHP instalat trebuie sa aiba drepturi de modificare a directoarelor /fisierelor specificate.

4. Citirea continutului unui director PHP furnizeaza trei functii care va permit sa cititi continutul unui catalog, ca si cum catalogul ar fi un fisier. Aceste functii sunt:

1. opendir() - deschide directorul pentru citire 2. readdir () - citeste o intrare dintr-un catalog 3. closedir() - nchide catalogul, elibernd resursele alocate de functia opendir() Rezultatul apelarii functiei readdir() este un sir care contine numele urmatorului fisier sau sub-director din catalogul deschis. Functia returneaza FALSE atunci cnd au fost citite toate intrarile din catalog. Iata un exemplu care prezinta modul de utilizare a acestor functii pentru citirea continutului unui catalog: <?php $dc = @opendir("home/plomar/curs-php"); if (!$dc) { echo "Directorul nu a putut fi deschis"; } else { while ($ok = readdir($dc)) { echo "<br /> $ok"; } closedir($dc); } ?> Datele de iesire ale exemplului pot fi similare cu cele prezentate mai jos : style imgs lectia scripts index.php - Sau puteti folosi functia scandir($dir). Aceasta preia intr-un Array numele tuturor directoarelor si fisierelor din directorul "$dir". In caz de nereusita returneaza False. 5. Crearea unui director Pentru a crea un director, utilizati functia mkdir(), care are urmatoarea forma: mkdir(nume_dir, mod) - Unde "nume_dir" este calea sau numele directorului care va fi creat, iar "mod" reprezinta privilegiile care trebuie acordate noului catalog. In mod normal, prima cifra a argumentului mod trebuie sa fie 0, astfel nct PHP sa-l perceapa ca pe o valoare scrisa n octal. Revizuiti Lectia 17 , sectiunea "Privilegii de fisier" Functia returneaza TRUE daca creeaza catalogul; n caz contrar, returneaza FALSE.

De exemplu, pentru a crea un catalog denumit "lucru" si pentru a-i atribui privilegiile "rwxr-x--x", utilizati functiamkdir() dupa cum urmeaza: <?php $cd = mkdir("lucru", 0751); if ($cd) echo "Directorul a fost creat"; else echo "Directorul nu a putut fi creat"; ?> Pentru a modifica numele unui director, puteti folosi functia rename(), care are urmatoarea forma: rename(nume_vechi, nume_nou) Unde "nume_vechi" este numele si calea originala a directorului, iar "nume_nou" este numele nou dorit.

Utilizarea de sesiuni PHP


Invatati sa creati sesiuni in PHP Invatati sa lucrati cu variabile din sesiuni si sa stergeti datele sesiunii 1. Despre sesiuni, crearea unei sesiuni PHP Sesiunea reprezinta o modalitate prin care PHP retine informatii de la o pagina la alta. Odata cu initializarea unei sesiuni, utilizatorul poate pastra anumite variabile chiar daca in continuare viziteaza si alte pagini ale site-ului. In principiu informatia se pastreaza pana la inchiderea browser-ului, sau pana cand utilizatorul distruge in mod intentionat sesiunea curenta. Lucrurile se desfasoara ca in felul urmator: in momentul cand un user s-a logat la site, PHP atribuie acestuia un identificator unic de sesiune : SID. Acest SID este inglobat intr-un coockie cu numele PHPSESSID si trimis apoi catre browserul utilizatorului. Daca browserul nu suporta cookie-uri sau acestea sunt dezactivate, atunci acest SID este adaugat la adresa URL. In acelasi timp se creeaza pe server un fisier cu numele SID. In continuare daca utilizatorul doreste sa stocheze anumite informatii, acestea vor fi practic scrise in acest fisier SID de pe server. Sesiunile au urmatoarele avantaje:

- Pot fi folosite chiar daca browserul utilizatorului nu suporta cookieuri sau daca acestea sunt dezactivate. - Permit stocarea unui volum mare de informatii, spre deosebire de cookie-uri care sunt limitate in aceasta privinta. - Sunt mai sigure in raport cu cookie-urile deoarece informatiile nu sunt transmise in mod repetat intre client si server. Initializarea unei sesiuni se face cu functia :

session_start()

Aceasta trebuie sa fie printre primele linii de cod dintr-un script PHP, deoarece apelul acestei functii trebuie facut inainte de trimiterii catre browser-ul Web a vreunui cod HTML sau chiar a unui spatiu vid. Daca folosim stocarea iesirii in buffer, instructiunea session_start() nu trebuie inserata neaparat la inceputul codului. Instructiunea session_start() nu este necesare daca in fisierul de configurare "php.ini", variabila "session.auto_start" are valoarea TRUE. Pentru a intelege mai bine modul de lucru cu sesiuni si functia session_start(), folosim un exemplu in care avem o pagina principala "a.php" unde cream o variabila cu numele "userName", atribuindu-i valoarea "MarPlo", pe care o stocam intr-o sesiune PHP, pagina contine o legatura catre o alta pagina "b.php", aceasta din urma va folosi functia session_start()pentru a prelua, prin sesiune, valoarea variabilei "user_name" din pagina "a.php", astfel putem folosi valoarea acestei variabile intr-un script din pagina "b.php". Continutul fisierului "a.php" este urmatorul: <?php //Fisierul a.php
session_start(); if(!isset($_SESSION['userName'])) $_SESSION['userName'] = "MarPlo"; ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> Aceasta este pagina "a.php" <?php echo "<br />Variabila de sesiune are valoarea: ". $_SESSION['userName']; ?> <br />Legatura <a href="b.php">spre pagina b.php</a> </body> </html>

Continutul fisierului "b.php" este urmatorul: <?php


//Fisierul b.php session_start(); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Pagina b.php</title> </head> <body> Aceasta este pagina b.php <?php echo "<br />Variabila de sesiune are valoarea: ". $_SESSION['userName']; ?>

</body> </html>

Observati ca atribuirea, respectiv citirea variabilelor se face folosind variabila super-globala : _SESSION. Deschizand prima pagina, "a.php", va fi afisat urmatorul rezultat Aceasta este pagina "a.php" Variabila de sesiune are valoarea: MarPlo Legatura spre pagina b.php Cand apasam click pe link-ul "spre pagina b.php", se va deschide aceasta pagina, afisand urmatorul continut: Aceasta este pagina "b.php" Variabila de sesiune are valoarea: MarPlo - In acest exemplu se observa ca pagina "b.php" detine informatii despre variabila de sesiune creata in pagina "a.php". 2. Manipularea variabilelor sesiunii. In anumite momente ar putea fi util sa aflam identificatorul sesiunii curente. Pentru aceasta folosim functiasession_id(), ca in exemplul urmator: <?php echo "<br /> Identificatorul sesiunii curente SID este:". session_id();
//Va afisa un rezultat asemanator cu: "Identificatorul sesiunii curente SID este:2846240682abf24a09f42664fc03bbf3" ?>

Functia session_id() accepta un parametru. Astfel putem seta un anumit SID pentru sesiunea curenta. In acest caz trebuie sa apelam functia session_id() inainte de functia : session_start(), ca in exemplul urmator: <?php session_id('123abc'); session_start(); echo "<br /> Identificatorul sesiunii curente SID = ". session_id();
//Va afisa rezultatul: "Identificatorul sesiunii curente SID = 123abc" ?>

Deoarece variabilele de sesiune pot fi citite de alti utilizatori neautorizati, nu este indicat sa pastram aici informatii esentiale cum sint parolele. Pentru a creea un minimum de securitate putem codifica aceste informatii, folosind functtile de codare oferite de PHP:

md5() sau crypt()

- Functia md5(sir_de_caractere) codifica sirul de caractere furnizat ca parametru si returneaza un sir de 32 charactere hexazecimale. Aceasta functie foloseste algoritmul de criptare: "RSA Data Security, Inc. MD5 Message-Digest Algorithm". Iata un exemplu de utilizare al acestei codificari: <?php $user = "MarPlo"; $codificat = md5($user); echo "<br /> user codificat = $codificat";

// Va afisa: "user codificat = 0a460e3d95526f05a0064154ad94a378" ?>

Consideram cazul in care avem o variabila de sesiune "$parola" care pastreaza o parola si dorim sa codificam si sa transmitem acrasta variabila astfel incat utilizatorii neautorizati sa nu o poata folosi. Pentru aceasta folosim functiamd5(), pentru a o cripta. Mai mult initializam o variabila globala cu numele "$secret", careia ii atribuim ca valoare un sir de caractere oarecare. In continuare, inainte de a introduce parola intr-o sesiune PHP, concatenam valorile "$secret" si "$parola" si criptam rezultatul. Astfel, chiar daca cineva reuseste sa decripteze variabila de sesiune, este putin probabil sa poata separa sirul "$secret" creat de noi. Este bine sa pastram acest fisier intr-un director pretejat, cum ar fi cu un nivel mai sus decat directorul pentru pagini de Web. Iata cum se prezinta exemplul prezentat mai sus. (consideram o variabila "$passtest" care verifica daca valoarea acesteia este egala cu parola): <?php $secret = 'abcgfd43599oopjhfdxcaqq30pmnvcx'; $parola = 'mypass'; $cod = md5($secret. $parola); session_start(); $_SESSION['parola'] = $cod;
// Consideram variabila "$passtest" pentru a testa daca valoarea acesteia este egala cu parola if (md5($secret. $passtest) == $_SESSION['parola']) echo "Parola acceptata"; else echo "Parola nu este valida"; ?>

Astfel, daca valoarea variabilei "$passtest", care poate fi obtinuta de exemplu dintr-un formular HTML, este identica cu parola pastrata de noi, va fi afisat mesajul "Parola acceptata". 3. Stergerea unei sesiuni Pentru a putea sterge o sesiune este necesar sa incepem scriptul PHP cu instructiunea: session_start(), ca intotdeauna cand folosim sesiuni. Pentru a sterge toate variabilele memorate in matricea $_SESSION folosim:

unset($_SESSION);

Pentru a sterge doar o variabila memorata in sesiune folosim :

unset($_SESSION['nume_variabila']);

Datele sesiunii sunt memorate in server in fisiere temporare. Pentru a sterge datele sesiunii din server folositi:

session_destroy()

Iata un exemplu care ilustreaza aceasta procedura:

<?php // Initializeaza datele sesiunii session_start(); // Sterge tabloul $_SESSION unset($_SESSION); // Sterge datele de sesiune din server session_destroy(); echo "<br /> Sesiunea curenta a fost inchisa"; ?>

Notiuni fundamentale despre bazele de date si SQL (1)


nvatati nvatati nvatati nvatati MySQL

modul in care este structurata o baza de date modul de proiectare a unei baze de date sa creati baze de date MySQL si tabele sa stergeti si sa modificati tabele dintr-o baza de date

Acesta lectie explica bazele de date relationale si modul de utilizare a acestora. Spre deosebire de fisiere, bazele de date prezinta multe avantaje, inclusiv o mai mare protectie a integritatii datelor si asigurarea partajarii datelor. In aceasta lectie va fi prezentat SQL, limbajul standard pentru crearea, accesul si manipularea bazelor de date relationale. Detaliile (cu precadere sintaxa SQL sunt cele referitoare la MySQL, cel mai popular limbaj de baze de date folosit cu PHP. 1. Structura unei baze de date relationale O baza de date relationale stocheaza datele n tabele, iar fiecare tabel stocheaza in coloane informatii despre un anumit tip de element. In continuare puteti vedea un tabel caracteristic dintr-o baza de date relationala care prezinta personalitati istorice ale Americii.

PersoanaID 001 002 003

Nume George Washington John Adams Thomas Jefferson

AnNastere 1732 1735 1743

Primul rnd al tabelului atribuie nume pentru fiecare coloana. Fiecare rnd al tabelului, altul dect primul rnd, descrie o singura personalitate. De exemplu, al doilea rnd descrie o personalitati pe nume George Washington. Fiecare coloana, descrie un anumit atribut al personalitatii De exemplu, a doua coloana contine numele personalitatilor, iar a treia coloana contine anii n care sau nascut acestia. Pentru a se putea face referire, mai usor, la un anumit rnd al tabelului, se obisnuieste ca fiecare tabel sa contina o coloana care identifica n mod unic fiecare rnd. Aceasta coloana se numeste "cheia primara" a tabelului. In exemplul prezentat, coloana numita "PersoanaID" serveste drept cheie primara. Daca nici o coloana nu contine o valoare unica pentru fiecare rnd, se pot combina valorile mai multor coloane pentru a crea o "cheie primara compusa".

O baza de date relationala se numeste astfel datorita capacitatii sale de a stabili relatii ntre date din mai multe tabele. Urmatorul exemplu prezinta doua tabele si o relatie ntre acestea.

PersoanaID 001 002 003

Nume George Washington John Adams Thomas Jefferson

AnNastere 1732 1735 1743

Meserie Arhitect General Filozof

PersoanaID 003 001 002

Al doilea tabel contine informatii despre meseriile caracteristice ale persoanelor prezentate in exemplul anterior. Mai precis, tabelul identifica persoana cu o anumita meserie. Numele meseriei serveste drept cheie primara a tabelului, care mai contine, n afara de aceasta, o singura coloana. Coloana respectiva stocheaza atributul "PersoanaID" din primul tabel, al persoanei care cunoaste meseria descrisa de un anumit rnd. De exemplu, angajatul cu numarul 003 este arhitect. Retineti ca "PersoanaID" este att cheia primara a tabelului original, dar si o coloana din noul tabel. Coloana "PersoanaID" a noului tabel se numeste "cheie externa"; desi nu este cheia primara a noului tabel, este cheia primara a unui alt tabel. Aplicatia software care gazduieste o baza de date se numeste "sistem de gestiune a bazelor de date" (SGBD). Exista multe sisteme de gestiune a bazelor de date, printre cele mai populare asemenea sisteme se numara: DB2 , Interbase , MySQL , Oracle , Postgresql , SQL Server , Sybase . MySQL este cel mai popular sistem de gestiune a bazelor de date destinat utilizarii cu PHP, n mare masura deoarece este gratuit. Totusi, prin intermediul PHP este posibil accesul la aproape orice SGBD modern. Bazele de date relationale nteleg SQL (Structured Query Language), un limbaj relativ simplu, folosit pentru solicitarea datelor. In ciuda simplitatii sale, SQL este un limbaj foarte puternic, care poate obtine accesul la date stocate n mai multe tabele, poate filtra datele dorite si poate sorta, rezuma si afisa rezultatele. n general, bazele de date relationale si stocheaza datele ntr-un singur fisier sau catalog. Aceasta caracteristica de organizare faciliteaza administrarea datelor, deoarece executarea copiei de siguranta, respectiv restaurarea unui singur fisier sau catalog se realizeaza mai usor. Sistemele de gestiune a bazelor de date relationale necesita mai multe cicluri de procesor pentru a satisface o cerere de date dect cele necesare pentru accesul la un fisier normal, dar ofera protectie sporita a datelor, iar pentru accesul la distanta usureaza traficul deoarece majoritatea operatiilor sunt efectuate de programul SQL, astfel singurele date transmise in retea ar fi rezultatul cerut. 2. Proiectarea unei baze de date Cand creati un tabel intr-o baza de date, este important sa tineti cont de "cheia primara" si sa va bazati pe aceasta. Coloanele dintr-un tabel trebuie sa se bazeze pe cheia primara n totalitatea sa. O alta operatie importanta este specificarea unui tip de date pentru fiecare coloana. Majoritatea bazelor de date relationale accepta urmatoarele tipuri de date generale:

Caracter

ntreg Zecimal Data si ora Binar

Tabelul urmator rezuma tipurile de date cele mai frecvent utilizate, acceptate de MySQL si de majoritatea bazelor de date relationale. MySQL accepta multe alte tipuri de date, dar acestea sunt cele mai folosite.

Principalele tipuri de date din MySQL Tip de date BLOB CHAR(m) DATE DECIMAL DECIMAL(m,d) DOUBLE DOUBLE (m, d) FLOAT(m,d) Descriere - Date binare arbitrare, cu o lungime maxima de 65535 octeti - Un sir de caractere de lungime fixa, cu un maxim de m caractere, unde m este mai mic dect 256. Pentru obtinerea lungimii dorite, se insereaza spatii finale - O data n format an-luna-zi; de exemplu 2008-10-15 - Un numar zecimal, reprezentat sub forma de sir cu "m" cifre, din care "d" se afla la dreapta punctului zecimal. Daca "m" si "d" sunt omise, n mod prestabilit se vor utiliza valorile 10 si 0 - Un numar cu virgula mobila, cu dubla precizie, avnd o latime de afisare egala cu "m" si un numar de "d" cifre dupa virgula. - Un numar cu virgula mobila, cu simpla precizie, avnd o latime de afisare egala cu "m" si un numar de "d" cifre dupa virgula

- Un ntreg pe 32 de biti. Daca se specifica atributul UNSIGNED, INTEGER domeniul de valori este cuprins ntre 0 si 4294967295; n caz contrar, INTEGER UNSIGNED domeniul este cuprins ntre valorile -2147483648 si 2147483647 NUMERIC NUMERIC (m, d) REAL REAL(m, d) - Similar cu DECIMAL - Similar cu DOUBLE

- Un ntreg pe 16 biti. Daca se specifica atributul UNSIGNED, domeniul SMALLINT de valori este cuprins ntre 0 si 65535; n caz contrar, domeniul este SMALLINT UNSIGNED cuprins ntre valorile 32768 si 32767 TIME TIMESTAMP TIMESTAMP(m) - Ora n format ora-minut-secunda; de exemplu, 08-20-00. O valoare de tip data si ora, n format an-luna-zi ora-minut-secunda; de exemplu, 197601-05 00:00:00. Aceasta reprezentare este similara celei returnate de functiile UNIX. Pt. stocare valoarea este transformata din timpul curent in UTC si transformata invers la solicitarea datei. - Un sir caracter de lungime variabila, cu un maximum de "m" caractere, unde m este mai mic dect 256 pentru versiuni MySQL anterioare 5.0.3, iar pt. cele mai noi limita este 65 535 bytes. Spatiile finale au fost eliminate

VARCHAR(m)

Iata cateva indicatii pentru selectarea tipurilor de date:

- Alegeti BLOB ca tip pentru datele pe care nu trebuie sa le manipulati si la care nu veti obtine acces prin intermediul limbajului SQL. - Alegeti un tip data sau ora adecvat pentru coloanele care contin date calendaristice sau ore. - Alegeti un tip numeric pentru coloanele folosite pentru numere sau n calcule. o - Pentru cantitati foarte mari sau foarte mici, alegeti DOUBLE ca tip de date. o - Pentru coloane care contin numere fara parte zecimala de dimensiuni medii, alegeti SMALLINT sau INTEGER ca tip de date. o - Pentru alte coloane care contin date numerice, alegeti DECIMAL ca tip de date. - Alegeti CHAR sau VARCHAR ca tip pentru celelalte coloane, chiar si pentru cele care contin cifre, cum ar fi un cod postal. 3. Crearea unei baze de date MySQL si a unui tabel Dupa atata teorie, sa trecem la lucruri mai practice. La nceput, o baza de date nu contine tabele. Pentru a crea o baza de date si apoi un tabel ntr-o baza de date, folositi un sub-limbaj SQL special, cunoscut sub numele de Data Definition Language (DDL). Puteti emite comenzi DDL si alte comenzi SQL prin intermediul unui interpretor SQL sau prin intermediul PHP. Pentru inceput va fi prezentat modul de emitere a comenzilor SQL folosind un interpretor SQL. In lectiile urmatoare va fi prezentat modul de emitere a comenzilor SQL utiliznd PHP. Dupa ce aveti instalat MySQL, deschideti iterpretorul "MySQL Command Line Client" (asemanator cu, "Command Promt") in care scrieti comenzile SQL (n general, SQL nu este sensibil la diferenta ntre majuscule si minuscule. Deci, puteti scrie comensile cum preferati, cu majuscule sau minuscule). Ca regula, dupa scrierea comenzilor, la sfarsit trebue sa fie caracterul "punct si virgula" (;) Pentru a crea o baza de date, folositi urmatoarea comanda:

CREATE DATABASE nume_db;

Unde "nume_db" este numele bazei de date care va fi creata. Inainte de a crea un tabel sau a lucra cu alte comenzi intr-o baza de date, trebuie sa intrati in baza de date existenta, acest lucru se face folosind comanda:

USE nume_db;

Unde "nume_db" este numele bazei de date. Cu aceeasi comanda "USE nume_db" se schimba si baza de date in care vrem sa lucram. Pentru a crea un tabel ntr-o baza de date, emiteti comanda "CREATE TABLE", care are urmatoarea forma:

CREATE TABLE tabel (coloana tip, coloana tip, );

Unde "tabel" este numele tabelului, "coloana" este numele unei coloane, "tip" este tipul datelor incluse n coloana, se poate specifica un numar nedefinit de coloane. De exemplu, comanda urmatoare creeaza un tabel numit "carte", care contine coloanele "carteid", "titlu" si "pret": CREATE TABLE carte (carteid CHAR(10), titlu VARCHAR(255), pret decimal(5,2)); - n afara tipului de date, intre paranteze, puteti specifica si alte atribute optionale ale unei coloane:

NOT NULL - Fiecare rnd trebuie sa contina o valoare a coloanei asociate; valorile nule nu sunt permise. DEFAULT valoare - Daca nu este data o valoare a coloanei asociate, se va presupune valoarea specificata. AUTO INCREMENT - MySQL va repartiza n mod automat un numar de serie ca valoare a coloanei asociate. PRIMARY KEY - Coloana asociata este cheia primara a tabelului care o contine. Iata un exemplu ceva mai complicat de creare a unui tabel, care foloseste unele din aceste atribute optionale: CREATE TABLE carte (carteid CHAR(10) PRIMARY KEY, titlu VARCHAR(255) NOT NULL, pret DECIMAL(5,2) DEFAULT 50.00); 4. Stergerea si modificarea unui tabel Stergerea unui tabel sau a unei coloane este un act irevocabil, datele fiind definitiv sterse. Pentru a sterge un tabel, scrieti urmatoarea comanda:

DROP TABLE tabel;

Unde "tabel" este numele tabelului care va fi sters. Dupa crearea unui tabel, l puteti modifica prin emiterea unei comenzi "ALTER TABLE", care are mai multe forme. Urmatoarea forma a comenzii va permite sa stergeti o coloana din tabel:

ALTER TABLE tabel DROP coloana;

Unde "tabel" este numele tabelului care va fi modificat, iar "coloana" este numele coloanei care va fi stearsa. O alta forma a comenzii va permite sa adaugati o noua coloana n tabel:

ALTER TABLE tabel ADD coloana tip [optiuni];

Unde "tabel" este numele tabelului care va fi modificat, "coloana" este numele coloanei care va fi adaugata, "tip" este tipul noii coloane, iar "[optiuni]" constituie toate optiunile dorite, precum PRIMARY KEY. De exemplu, pentru a adauga coloana "pretnou" la tabelul "carte", scrieti comanda:

ALTER TABLE carte ADD pretnou DECIMAL(5,2) DEFAULT 50.00;

Pentru a vedea toate bazele de date create in MySQL, folositi urmatoarea comanda:

SHOW DATABASES;

Pentru a vedea toate tabelele dintr-o baza de date din MySQL, folositi urmatoarea comanda:

SHOW TABLES;

Pentru a vedea toate coloanele dintr-un tabel, si atributele acestora, folositi urmatoarea comanda:

SHOW COLUMNS FROM tabel;

Notiuni fundamentale despre bazele de date si SQL (2)

Invatati date SQL Invatati Invatati Invatati

sa acordati si sa revocati privilegii de acces intr-o baza de sa accesati datele stocate intr-o baza de date SQL sa modificati datele si tabelul dintr-o baza de date sa sortati si sa grupati datele de iesire

1. Acordarea si revocarea privilegiilor de acces Cnd un utilizator ncearca sa obtina acces la o baza de date relationala, aplicatia care gazdueste baza de date (in cazul nostru MySQL) verifica daca utilizatorul are permisiunea de a executa operatia. Administratorul de sistem poate folosi comanda MySQL "GRANT" pentru a autoriza un utilizator sa obtina accesul la un tabel din baza de date. Comanda are urmatoarea forma:

GRANT ALL ON tabel TO utilizator IDENTIFIED BY parola;

Unde "tabel" este numele tabelului, "utilizator" este numele contului de utilizator, iar "parola" este parola pe care o va furniza utilizatorul pentru a-si proba identitatea. Alternativ, administratorul de sistem poate autoriza un utilizator sa obtina acces la orice tabel dintr-o baza de date specificata, folosind urmatoarea forma a comenzii "GRANT":

GRANT ALL ON baza_de_date.* TO utilizator IDENTIFIED BY parola; De exemplu, comanda urmatoare autorizeaza pe utilizatorul "Marius" sa obtina acces la toate tabelele din baza de date numita "testdb", ori de cte ori utilizatorul furnizeaza parola "mypassword": GRANT ALL ON testdb.* TO Marius IDENTIFIED BY mypassword;

Comanda "REVOKE" se poate folosi pentru retragerea privilegiilor acordate anterior, interzicerea accesului. Comanda are urmatoarele forme:

REVOKE ALL ON tabel FROM utilizator; REVOKE ALL ON baza_de_date.* FROM utilizator;

De exemplu, pentru a revoca toate privilegiile (din toate bazele de date) utilizatorului "tip_rau", scrieti comanda: REVOKE ALL ON *.* FROM tip_rau; Comanda "GRANT" are si o forma mai complexa pentru a autoriza accesul numai la anumite coloane specificate. Forma avansata a acestei comenzi este:

GRANT privilegiu (coloane) ON tabel TO utilizator IDENTIFIED BY 'parola; sau GRANT privilegiu (coloane) ON baza_de_date.* TO utilizator IDENTIFIED BY 'parola; - Unde "privilegiu" este privilegiul care urmeaza a fi extins, "coloane" sunt coloanele carora li se aplica privilegiul, iar "tabel", "baza_de_date", "utilizator" si "parola" au semnificatiile cunoscute. Sunt permise si forme similare ale comenzii REVOKE:

REVOKE privilegiu (coloane) ON tabel FROM utilizator; sau REVOKE privilegiu (coloane) ON baza_de_date.* FROM utilizator; ntre privilegiile posibile se numara urmatoarele:

INSERT - care permite adaugarea de date in coloana specificata SELECT - care permite accesul de citire la rndurile care contin coloana specificata UPDATE - care permite actualizarea rndurilor care contin coloana specificata De exemplu, pentru a permite unui utilizator sa obtina accesul la o coloana, fara a o modifica, puteti folosi o secventa de comenzi similara cu urmatoarea: REVOKE ALL ON carte FROM Marius; GRANT SELECT(carteid, titlu, pret), INSERT(carteid, titlu, pret), UPDATE(carteid, titlu, pret) ON carte TO php IDENTIFIED BY 'mypassword'; REVOKE INSERT(pret) ON carte FROM Marius; REVOKE UPDATE(pret) ON carte FROM Marius; - Prima comanda revoca toate privilegiile de la nivelul tabelului; n caz contrar, aceste privilegii le vor elimina pe cele situate la nivel de coloana. Pentru a vedea privilegiile acordate unui anumit utilizator, folositi urmatoarea comanda:

SHOW GRANTS FOR nume_utilizator;

Caracteristica privilegiilor furnizata de MySQL este mai sofisticata si furnizeaza mult mai multe optiuni. Pentru mai multe informatii, consultati manualul SQL de la adresa www.mysql.com 2. Accesul la datele dintr-o baza de date, interogarile SQL n afara de Data Definition Language, SQL include Data Manipulation Language (DML). DML va permite sa formati interogari, care obtin accesul la datele aflate ntr-o baza de date relationala si raporteaza aceste date. De asemenea, puteti folosi DML pentru a insera, actualiza si sterge rndurile dintrun tabel. Cea mai elementara forma de interogare este comanda "SELECT" simpla. Cea mai simpla interogare raporteaza toate coloanele din toate rndurile unui tabel. Interogarea are urmatoarea forma:

SELECT * FROM tabel;

- Unde "tabel" este numele tabelului la care se va obtine accesul. Aceasta comanda va afisa un tabel cu fiecare rnd pe o linie separata. Datele de iesire includ numele coloanelor si linii care separa coloanele. Daca doriti sa selectati numai anumite coloane sau sa raportati coloanele ntr-o anumita ordine, puteti folosi urmatoarea forma a comenzii "SELECT":

SELECT coloana1, coloana2 FROM tabel;

- Unde "tabel" este numele tabelului, iar "coloana1" si "coloana2" sunt coloanele la care se va obtine accesul si al caror continut va fi afisat. Puteti specifica mai multe coloane, separate prin virgula. Daca vreti sa fie selectate numai acele rnduri care satisfac un anumit criteriu, clauza "WHERE" va permite sa specificati o conditie; rndurile care nu satisfac conditia nu sunt raportate. De exemplu, iata o interogare care raporteaza un singur rnd: SELECT titlu, pret FROM carte WHERE carteid=1; Forma conditiilor folosite n sub-limbajul DML al limbajului SQL este similara cu aceea a conditiilor PHP. Puteti folosi oricare din urmatorii operatori relationali:

= <> != < > <= =>

Egalitate Inegalitate Inegalitate, diferit de Mai mic decat Mai mare decat Mai mic sau egal cu Mai mare sau egal cu

Puteti compara valoarea unei coloane cu aceea a altei coloane, respectiv valoarea unei coloane cu o valoare string. Valorile string SQL (sirurile) trebuie sa fie incluse ntre ghilimele simple, nu ntre ghilimelele duble.

Cnd unei coloane nu i-a fost repartizata nici o valoare, SQL i atribuie valoarea speciala NULL. De asemenea, programatorii pot atribui n mod explicit valoarea NULL unei coloane. Comparatiile obisnuite cu valori NULL, care folosesc operatorii de (in)egalitate, vor returna un rezultat fals. Totusi, puteti folosi operatorul special "<=>". care compara valorile tinnd cont de valoarea NULL. Daca folositi acest operator pentru a compara doua valori NULL, se obtine un rezultat adevarat.

SQL include si numerosi operatori de comparatie non-algebrici:

Operator Descriere x BETWEEN y AND z Adevarat, daca valoarea lui x este cuprinsa ntre valorile lui y si z x LIKE y Adevarat daca valoarea lui x este echivalenta cu modelul y x NOT LIKE y Adevarat daca valoarea lui x nu este echivalenta cu modelul y Adevarat daca valoarea lui x este un membru al listei y1, y2. Lista x IN (y1, y2) poate contine unul, doi sau mai multi membri Adevarat daca valoarea lui x nu este un membru al listei y1, y2. Lista x NOT IN (y1, y2) poate contine unul, doi sau mai multi membri x IS NULL Adevarat daca x are valoarea NULL x IS NOT NULL Adevarat daca x nu are valoarea NULL
Sub-limbajul folosit pentru specificarea modelelor asociate operatorului "LIKE" este diferit de cel folosit de PHP. Meta-caracterul "%" corespunde unui numar de zero sau mai multe caractere, iar meta-caracterul "_" corespunde unui singur caracter. Modelele, precum sirurile, sunt incluse ntre ghilimele simple. - De exemplu, modelul '%ar%' corespunde oricarui sir care contine sub-sirul 'ar', inclusiv siruri precum 'ar', 'arc' si 'un zar'. Pentru a plasa un caracter "%" sau "_" ntr-un sir test, folositi secventa "\%" sau "\_"; ca n PHP. Ca si PHP, sub-limbajul DML din SQL va permite sa formati expresii logice care combina expresiile relationale. Puteti folosi oricare din urmatorii operatori logici:

AND , && - SI, adevarat daca ambii operanzi sunt adevarati OR , || - SAU, adevarat daca un operand este adevarat NOT , ! - NU, adevarat daca operandul este fals

De exemplu, urmatoarea interogare raporteaza rndurile care au pretul de carte mai mare dect 11 sau al caror titlu include sub-sirul 'Curs': SELECT titlu, pret FROM carte WHERE pret>11 OR titlu LIKE %Curs%;
Pentru a compara o valoare cu o expresie regulata n MySQL, folositi urmatoarea forma: x REGEXP y, unde "x" este valoarea care va fi testata, iar "y" este o expresie regulata, delimitata prin ghilimele simple.

3. Modificarea datelor dintr-o baza de date Sub-limbajul SQL, Data Manipulation Language, include comenzi care va permit sa inserati rnduri noi ntr-un tabel, sa actualizati una sau mai multe coloane ale rndurilor existente, respectiv sa stergeri rnduri dintr-un tabel.

Pentru a insera un nou rnd ntr-un tabel, folositi comanda "INSERT", care are urmatoarea forma:

INSERT INTO tabel VALUES (valoare1, valoare2);

- Unde "tabel" este numele tabelului la care se va adauga rndul. - "valoare1" este valoarea pentru prima coloana din tabel, iar "valoare2" este valoarea celei de-a doua coloane din tabel. Se pot da mai mult sau mai putin de doua valori; numarul valorilor date ar trebui sa fie egal cu acela al coloanelor din tabel. O coloana poate primi si valoarea "NULL", cu exceptia situatiilor cnd definitia coloanei nu permite. O forma mai buna (si recomandata) a comenzii INSERT specifica numele coloanelor carora le sunt atribuite valorile:

INSERT INTO tabel (coloana1, coloana2) VALUES (valoare1, valoare2); Unde coloana denumita "coloana1" primeste valoarea "valoare1", iar coloana denumita "coloana2" primeste valoarea "valoare2". Pot fi specificate mai mult sau mai putin de doua coloane si valori. Numarul coloanelor specificate trebuie sa fie egal cu numarul valorilor specificate. Coloanele care nu sunt denumite n comanda "INSERT" si care nu au o valoare prestabilita (DEFAULT) primesc valoarea NULL, cu exceptia situatiilor cnd valoarea respectiva nu este permisa (n acest caz, comanda INSERT esueaza). Daca doriti sa adaugati mai multe randuri intr-un tabel, intr-o singura inserare, puteti folosi urmatoarea forma a comenzii INSERT:

INSERT INTO tabel (coloana1, coloana2) VALUES (valoare1, valoare2), (valoare3, valoare4), (valoare5, valoare6);

Pentru a modifica valoarea unui rnd sau mai multor rnduri existente ntr-un tabel, folositi o comanda "UPDATE", care are urmatoarea forma:

UPDATE tabel SET coloana1=valoare1, coloana2=valoare2 WHERE conditie;

- Unde "tabel" este numele tabelului ale carui rnduri urmeaza sa fie modificate, "coloana1" este numele primei coloane care urmeaza a fi modificata, "valoare1" este valoarea care va fi repartizata n "coloana1", "coloana2" este numele celei de-a doua coloane care urmeaza a fi modificata, "valoare2" este valoarea care va fi repartizata n "coloana2", iar "conditie" identifica rndul sau rndurile care urmeaza a fi actualizate, dupa o anumita conditie. Poate fi actualizat un numar mai mare sau mai mic de coloane. Daca se doreste ca toate randurile coloanei sa fie actualizate, clauza "WHERE" poate fi omisa. De exemplu, comanda urmatoare modifica din coloana "titlu" numele asociat cartii in "Curs2", in randul unde coloana "pret" are valoarea 5.

UPDATE carte SET titlu=Curs2 WHERE pret=5;

Pentru a sterge un rnd dintr-un tabel, folositi comanda "DELETE", care are urmatoarea forma:

DELETE FROM tabel WHERE conditie;

Daca se vrea a fi sterse toate rndurile tabelului, clauza WHERE poate fi omisa. De exemplu, comanda urmatoare sterge rndul din tabelul "carte" asociat titlului "Curs2": DELETE FROM carte WHERE titlu='Curs2'; 4. Sortarea si gruparea Deseori, este important ca datele sa fie raportate ntr-o anumita secventa. Puteti specifica ordinea de raportare a rezultatelor interogarii folosind clauza "ORDER BY", care are urmatoarea forma:

ORDER BY valoare

Daca se vor folosi mai multe cmpuri de sortare, acestea vor fi separate prin virgula. Daca doriti sa indicati o sortare descendenta, n locul uneia ascendente, specificati "DESC" dupa valoare. De exemplu, pentru a ordona toate cartile n functie de pret, de la cel mai mare la cel mai mic, respectiv dupa titlu pentru un pret egal, puteti folosi urmatoarea interogare: SELECT pret, titlu FROM carte ORDER BY pret DESC, titlu; Pentru a include numai titlurile care au un pret mai mare de 50, adaugati o clauza WHERE la comanda SELECT: SELECT pret, titlu FROM carte WHERE pret>50 ORDER BY pret DESC, titlu; SQL include functii care va permit sa raportati valori diferite, valori utile, precum un numar al rndurilor tabelului. Iata cele mai importante functii in acest sens:

Descriere - Numarul rndurilor din tabel - Numarul rndurilor din tabel care contin o valoare count(coloana) diferita de NULL n coloana specificata - Numarul valorilor distincte diferite de NULL care count(distinct coloana) apar n coloana specificata - Valoarea mijlocie (medie) a coloanei numerice avg(coloana) specificate min(coloana) - Valoarea minima din coloana specificata max(coloana) - Valoarea maxima din coloana specificata sum(coloana) - Suma valorilor din coloana specificata

Functie count(*)

De exemplu, interogarea urmatoare raporteaza numarul cartilor si pretul mediu al acestora: SELECT count(*), avg(pret) FROM carte; - Datele de iesire vor fi afisate pe o singura linie. Clauza SQL "AS" specifica un nume nou pentru o coloana sau expresie. Numele specificat este folosit ca titlu n rapoartele SQL. Clauza "AS" este utila n lucrul cu functiile din tabelul anterior, va ajuta sa identificati mai usor datele de iesire. De exemplu, interogarea precedenta poate fi rescrisa pentru a include o clauza "AS", astfel: SELECT count(*) AS Carte_Numar, avg(pret) AS Pret_Mediu FROM carte; O alta clauza utila este "GROUP BY", aceasta are urmatoarea forma:

GROUP BY coloana-sortare

- Unde "coloana-sortare" este numele sau valoarea unei coloane, specificata ntro clauza "ORDER BY", care trebuie sa urmeze dupa clauza "GROUP BY". De exemplu, avem un tabel "carte" cu 4 coloane (carteid, titlu, anul si pret), interogarea urmatoare raporteaza numarul cartilor si pretul mediu pentru fiecare an (anul) n parte: SELECT count(*), avg(pret) FROM carte GROUP BY anul ORDER BY anul; Pentru a include n datele de iesire numai grupurile selectate, specificati clauza "HAVING" imediat dupa clauza "GROUP BY". Clauza "HAVING" are urmatoarea forma:

HAVING conditie

De exemplu, pentru a include numai cartile al caror atribut "anul" are valoare mai mare dect 1980, srieti urmatoarea interogare: SELECT count(*), avg(pret) FROM carte GROUP BY anul HAVING anul>1980 ORDER BY anul; Mai jos sunt afisati operatorii matematici folositi in SQL:

* / | & >> << _

+ Adunare Scadere Inmultire Impartire SAU, la nivel de bit SI la nivel de bit Deplasare la dreapta Deplasare la stanga Complement la nivel de bit

Notiuni fundamentale despre bazele de date si SQL (3)

Invatati principalele expresii si functii folosite in MySQL

Invatati sa preluati datele, prin "unire", din mai multe tabele Invatati sa executati instructiuni MySQL scrise intr-un fisier extern

1. Expresii si functii SQL va permite sa formati expresii folosind valori din coloane, valori literale si functii. Ca si n PHP, puteti controla ordinea de evaluare a expresiilor SQL folosind paranteze pentru a delimita sub-expresiile care trebuie evaluate mai intai. Tabelele urmatoare rezuma functiile MySQL frecvent folosite

Functii matematice frecvent folosite n MySQL Functie Descriere abs(x) - Valoarea absoluta a lui x atan(x) - Arc tangenta lui x, unde x este dat n radiani - Arc tangenta lui y/x, unde semnele ambelor argumente sunt folosite atan2(y,x) pentru a determina cadranul cercului trigonometric ceiling(x) - Cel mai mic ntreg care nu este mai mic dect x cos(x) - Cosinusul lui x, unde x este exprimat n radiani exp(x) - Baza logaritmilor naturali (e) ridicata la puterea x floor(x) - Cel mai mare ntreg care nu este mai mare dect x log (x) - Logaritmul natural al lui x mod(x,y) - Restul mpartirii x/y power(x,y) - x la puterea y - Valoare aleatoare cu virgula, mai mare sau egala cu zero si mai rand(x) mica dect unu - Valoarea -1, 0 sau 1, dupa cum valoarea lui x este negativa, zero sign(x) sau pozitiva sin(x) - Sinusul lui x, unde x este dat n radiani sqrt(x) - Radacina patrata a lui x tan(x) - Tangenta lui x, unde x este dat n radiani \Functii sir frecvent folosite n MySQL Functie Descriere ascii(s) - Codul ASCII al octetului celui mai din stnga al sirului s char(n) - Caracter al carui cod ASCII este n concat(s1, s2) - Concatenarea sirurilor s1 si s2; cu alte cuvinte, s2 atasat la s1 lcase(s) - Sirul s, unde toate majusculele au fost transformate n minuscule left(s,n) - Primii n octeti ai sirului s, de la stnga la dreapta length(s) - Numarul octetilor din sirul s locate(s1, s2) - Pozitia primei aparitii a lui s1 n s2, respectiv zero daca s1 nu se

gaseste n s2 ltrim(s) - Sirul s, cu eliminarea spatiilor de nceput right(s,n) - Primii n octeti din sirul s, de la dreapta la stnga - Sirul s1, completat la dreapta cu sirul s2 pna cnd rezultatul are rpad(s1,n,s2) lungimea n rtrim(s) - Sirul s, cu spatiile finale eliminate space(n) - Un sir alcatuit din n spatii substring(s,m,n) - Sub-sir al lui s, care ncepe de la pozitia m si care are lungimea n trim(s) - Sub-sir al lui s, cu spatiile initiale si finale eliminate ucase(s) - Sirul s, cu toate minusculele convertite n majuscule Functii MySQL de data si ora frecvent utilizate Functie Descriere dayofmonth(d) - Ziua din luna a datei specificate (1-31) - Ziua din saptamna a datei specificate (1 =duminica, 2=luni,, dayofweek(d) 7=smbata) dayofyear(d) - Ziua din an a datei specificate (1-366) hour(t) - Partea orelor din momentul de timp mentionat (0-23) minute(t) - Partea minutelor din momentul de timp mentionat (0-59) month(d) - Luna datei specificate (1-12) now() - Data si ora curenta second(t) - Partea secundelor din momentul de timp mentionat (0-59) week(d) - Saptamna din an a datei specificate (0-53) year(d) - Partea anilor din momentul de timp mentionat (1000-9999) Functii specifice MySQL Functie Descriere database() - Returneaza numele bazei de date deschise get_lock(s,n) - Obtine o blocare a bazei de date - Returneaza o suma de control a sirului s, calculata dupa algoritmul md5(s) MD5 - Returneaza sirul s, criptat folosind algoritmul aplicat de MySQL password(s) parolei release_lock(s) - Anuleaza blocarea unei baze de date user() - Returneaza numele utilizatorului curent version() - Returneaza numarul versiunii MySQL

2. Uniri SQL va permite sa obtineti accesul la mai multe tabele ntr-o singura interogare, n general, aceasta operatie se executa pentru ca datele dintr-un tabel sa poata fi folosite cu date din alt tabel. De exemplu, sa presupunem ca baza de date este asemanatoare celei prezentate mai jos, unde avem doua tabele, primul numit "persoane" iar cel deal oilea numit "meserii", si o relatie cheie externa - cheie primara (persoanaid) asociaza cele doua tabelele.

persoanaid 001 002 003

nume George Washington John Adams Thomas Jefferson

AnNastere 1732 1735 1743

meserie Arhitect General Filozof

persoanaid 003 001 002

Sa examinam urmatoarea interogare: SELECT nume, meserie FROM persoane, meserii WHERE persoane.persoanaid=meserii.persoanaid; - Constructiile "persoane.persoanaid" si "meserii.persoanaid" se numesc "nume definite", prima se refera la coloana "persoanaid" din tabelul "persoane", iar a doua se refera la coloana "persoanaid" a tabelului "meserii". - Clauza WHERE asigura o echivalenta ntre valoarea cheii externe din tabelul "meserii" cu aceea a cheii primare din tabelul "persoane", (n absenta clauzei WHERE, se va stabili o corespondenta ntre fiecare rnd din tabelul cu meserii si fiecare rnd din tabelul cu persoane; un asemenea rezultat, numit "produs cartezian", contine n general multe rnduri - majoritatea nedorite - si ca atare trebuie evitat). - Rezultatul interogarii de mai sus este un raport care indica numele si meseria asociata fiecarui angajat prezentat n tabelul "meserii". O interogare ca aceasta, care combina date din mai multe tabele, se numeste "unire". Sunt posibile si uniri mai complexe, care implica trei sau mai multe tabele. Daca un rnd dat din tabelul principal (aici "persoane") nu are nici un rnd asociat n tabelul cu detalii (aici "meserii"), rndul respectiv din tabelul principal nu va aparea n datele de iesire ale unei uniri. In cazul acesta, pentru a determina aparitia acestei nregistrari din tabelul principal, se poate folosi o categorie speciala de unire, cunoscuta sub numele de "unire la stnga" sau "unire exterioara la stnga". Iata un exemplu: SELECT nume, meserie FROM persoane LEFT JOIN meserii ON persoane.persoanaid=meserii.persoanaid; Aceasta interogare va afisa toate persoanele, indiferent daca acestea au sau nu asociata o meserie. Persoanele fara o meserie au specificatia NULL n coloana corespunzatoare meseriei. 3. Executarea instructiunilor dintr-un fisier extern Comenzile MySQL pot fi scrise si intr-un fisier extern (editat de exemplu, in Windows, cu Notepad), acest fisier se numeste "script de shell". Scriptul din fisierul extern poate fi executat din fereastra de comanda MySQL (MySQL Command Line Client), utilizand comanda:

SOURCE nume_fisier

Unde "nume_fisier" este calea si numele fisierului in care se afla scriptul de shell. De exemplu, scriem urmatoarele comenzi intr-un fisier numit "lucru.txt" pe care-l salvam in directorul "C:/teste". CREATE DATABASE lucrudb; USE lucrudb; GRANT ALL ON lucrudb.* TO php IDENTIFIED BY 'mypass';
CREATE TABLE angajat ( angajatnr SMALLINT PRIMARY KEY, nume VARCHAR(50), ore SMALLINT, departament CHAR(16), salariu DECIMAL(8,2), data_angajare DATE); INSERT INTO angajat ( angajatnr, nume, ore, departament, salariu, data_angajare) VALUES ( 1, 'George Washinton', 40, 'Contabilitate', 500.00, '2007-10-04'), ( 2, 'John Adams', 35, 'Marketing', 1000.00, '2007-10-11'), ( 3, 'Thomas Jefferson washinton', 20, 'Vanzari', 1300.00, '2007-07-02');

- Pentru a executa acest script, scriem in fereastra de comanda MySQL: SOURCE C:/teste/lucru.txt MySQL va executa comenzile din script ca si cum acestea ar fi scrise direct in linia de comanda. Exemplul de mai sus va crea o baza de date noua, numita "lucrudb", va acorda utilizatorului "php" toate drepturile in utilizarea acestei baze de date, dupa care va crea tabelul "angajat", cu 6 coloane ("angajatnr", "nume", "ore", "departament", "salariu", "data_angajare") in care vor fi adaugate trei linii.

Utilizarea bazelor de date folosind PHP (1)

Invatati sa va conectati la serverul MySQL folosind functiile PHP

Invatati sa detectati erorile aparute in lucrul cu bazele de date si, cand este necesar, sa eliminati afisarea acestora Invatati sa creati baze de date si tabele folosind functii PHP Invatati sa adaugati date in tebel folosind PHP Faptul ca limbajul PHP a devenit atat de popular se datoreaza in mare masura faptului ca acesta contine suport de functii pentru lucrul cu bazele de date. 1. Conectarea la serverul MySQL Pentru a utiliza o baza de date MySQL, avem nevoie de o conexiune la serverul de baze de date. Aceasta conexiune va fi utilizata ca punct de access pentru comenzi mysql. Pentru a va conecta la un server MySQL, utilizati functia mysql_connect(), a carei sintaxa este urmatoarea: mysql_connect(nume_gazda, nume_utilizator, parola) Unde "nume_gazda" este numele gazdei, serverul pe care ruleaza serviciul MySQL, "nume_utilizator" este numele utilizatorului care se conecteaza la serverul MySQL, iar "parola" este parola MySQL asociata utilizatorului. In cazul in care serverul MySQL ruleaza pe calculatorul dv. personal, parametrul "nume gazda" este in general "localhost". In alte cazuri, daca serverul MySQL ruleaza pe un alt computer, va trebui sa specificati adresa computerului pe care ruleaza serverul MySQL. Functia returneaza FALSE n caz de esec; n caz contrar, returneaza o valoare denumita identificator de legatura, care serveste ca instrument de manipulare pentru accesul la serverul MySQL. Iata un exemplu de utilizare a functiei mysql_connect(): <?php $conn = mysql_connect( "localhost", "Marius", "mypass") or die("Unable to connect to MySQL"); print "Connected to MySQL <br />"; ?> In acest exemplu, serverul MySQL ruleaza pe "localhost" ca si modulul PHP, utilizatorul este "Marius" iar parola "mypass". Dupa executia acestui script, daca nu se reuseste conectarea la MySQL, va aparea mesajul "Unable to connect to MySQL", in caz de reusita, apare mesajul "Connected to MySQL"
n mod prestabilit, functia mysql_connect() se conecteaza la serviciul MySQL prin intermediul portului 3306, portul MySQL standard. Daca doriti sa obtineti accesul la un server MySQL care ruleaza pe un port non-standard, puteti atasa un caracter doua puncte si numarul portului dorit la argumentul care contine numele gazdei; de exemplu, "localhost:3308".

2. Incheierea conexiunii la serverul MySQL Pentru terminara unei conexiuni la serverul MySQL se foloseste instructiunea: mysql_close();. Aceasta functie inchide conexiunea curenta. Functia returneaza TRUE n caz de reusita; n caz contrar, returneaza FALSE. n general, nu este necesara invocarea functiei mysql_close(), deoarece PHP nchide automat conexiunile deschise cu bazele de date atunci cnd un script si ncheie executia.

Iata un exemplu de conectare la serverul MySQL si inchidere a conexiunii folosind functia mysql_close(): <?php $conn = mysql_connect( "localhost", "Marius", "mypass") or die("Unable to connect to MySQL"); // Aici adaugati datele necesare lucrului cu serverul MySQL
mysql_close(); ?>

3. Detectarea aparitiei erorilor Biblioteca MySQL din PHP furnizeaza doua functii de verificare a erorilor, si anume mysql_errno() si mysql_error(). Fiecare functie returneaza un rezultat care reflecta eroarea, daca aceasts exista. Nici una din cele doua functii nu necesita argumente. Functia mysql_errno() returneaza un cod numeric de eroare, n timp ce functia mysql_error() returneaza un sir care descrie eroarea. Daca nu s-a produs nici o eroare, codul numeric al erorii este zero si descrierea are ca valoare un sir vid. Informatiile de eroare sunt disponibile numai daca este activa o conexiune cu serverul MySQL. Prin urmare, intai trebuie sa se reuseasca conectarea la MySQL. Iata cum puteti folosi functiile respective pentru a verifica modul de operare a functiei mysql_select_db() (aceasta selecteaza baza de date pentru lucru): <?php $conn = mysql_connect( "localhost", "Marius", "mypass") or die("Unable to connect to MySQL");
print "Connected to MySQL<br />"; mysql_select_db("lucrudb"); if (mysql_error()) { echo "<br />". mysql_errno(). " : ". mysql_error(); } ?>

Daca se reuseste conexiunea la serverul MySQL si baza de date cu numele "lucrudb" este inexistenta, rezultatul afisat de exemplul de mai sus va fi urmatorul: Connected to MySQL 1049 : Unknown database 'lucrudb' 4. Eliminarea mesajelor de eroare si a avertismentelor nedorite Numeroase functii PHP pot produce erori sau mesaje de avertizare care i pot deruta pe utilizatorii siturilor Web sau le pot cauza neplaceri. PHP furnizeaza functia error_reporting(), care va permite sa eliminari mesajele nedorite. Functia are urmatoarea forma: error_reporting(mask) unde "mask" specifica tipul mesajelor care vor fi raportate. Daca specificati zero ca valoare a atributului "mask" (error_reporting(0)), nu va fi raportat nici un mesaj. Daca specificati "E_ALL" in loc de "mask" (error_reporting(E_ALL)), vor fi raportate toate mesajele.

Sau, o alta metoda pentru oprirea mesajelor de eroare, explicata in lectiile anterioare, este adaugand @ inaintea functiei. 4. Crearea si selectarea unei baze de date. O functie importanta in lucrul cu bazele de date este mysql_query(), care are urmatoarea forma: mysql_query("interogare") sau mysql_query("interogare", "id_con") - "interogare" este un sir ce contine comenzile SQL care urmeaza a fi executate (in PHP, comenzile SQL nu trebuie sa se ncheie cu un caracter punct si virgula). - "id_con" este identificatorul de conectare returnat de functia mysql_connect(), daca acesta este omis se foloseste ultima legatura deschisa cu aceasta functie. Functia mysql_query() returneaza TRUE daca serverul a reusit sa execute interogarea; n caz contrar, returneaza FALSE. - Important: pentru ca sa puteti lucra cu baze de date in PHP trebuie sa cunoasteti comenzile SQL necesare. Cele mai importante au fost prezentate in lectiile 22, 23 si 24 Pentru a crea o noua baza de date folosim comanda SQL "CREATE DATABASE numeBazaDeDate;", pe care o putem lansa de la o consola MySQL, sau o putem apela de la un script PHP prin intermediul functiei mysql_query(). Iata un exemplu prin care creem baza de date "lucrudb": <?php $conn = mysql_connect( "localhost", "Marius", "mypass") or die("Unable to connect to MySQL"); $createdb = mysql_query("CREATE DATABASE lucrudb"); if ($createdb) echo "Baza de date lucrudb a fost creata <br />"; else echo "<br />". mysql_errno(). " : ". mysql_error(); mysql_close(); ?> - Dupa executarea acestui script, daca totul este corect, va fi creata baza de date "lucrudb" si va fi afisat mesajul "Baza de date lucrudb a fost creata". Dupa ce programul a obtinut o conexiune cu serverul MySQL, inainte de a lucra cu tabelele dintr-o baza de date MySQL, programul trebuie sa selecteze baza de date respectiva. Pentru aceasta, folositi functia mysql_select_db(), care are urmatoarea forma:

mysql_select_db(baza_de_date)

Unde "baza_de_date" este numele bazei de date la care urmeaza a se obtine acces. Functia returneaza TRUE daca poate obtine accesul la baza de date, respectiv FALSE n caz contrar. Iata un exemplu de selectare a bazei de date "lucrudb": <?php $conn = mysql_connect( "localhost", "Marius", "mypass") or die("Unable to connect to MySQL"); $selectdb = mysql_select_db('lucrudb'); if ($selectdb) echo "Baza de date lucrudb a fost selectata <br />";

else echo "<br />". mysql_errno(). " : ". mysql_error(); mysql_close(); ?>

5. Crearea tabelelor Dupa conectare si selectarea bazei de date putem crea tabele in cadrul bazei de date selectate. Pentru aceasta folosim limbajul SQL CREATE TABLE numeTabel (coloana1, coloana2, ...); impreuna cu functia mysql_query(). In exemplul urmator cream tabelul cu numele "carti" care contine urmatoarele campuri:

Nume camp id nume autor gen data_intrare pret

Tip Identificator unic, Not Null, cheie primara Char(30) Char(25) Char(10) Date Decimal(12,2)

In stanga, la "Nume Camp", sunt trecute coloanele tabelului, iar in dreapta tipul acestora, coloana cu nume "id" fiind cheia primara. De asemenea, folosim indicatorul "AUTO_INCREMENT" pentru a preciza faptul ca MySQL va repartiza o valoare secventiala unica n coloana care serveste drept cheie primara a tabelului. Iata si scriptul PHP pentru creacrea tabelului: <?php $conn = mysql_connect("localhost", "Marius", "mypass") or die("Unable to connect to MySQL"); $selectdb = mysql_select_db('lucrudb'); if (!$selectdb) echo "Baza de date lucrudb nu a putut fi selectata deoarece : ". mysql_errno(). " : ". mysql_error(); $sql = "CREATE TABLE `carti` (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, nume varchar(30) NOT NULL, autor varchar(25) , gen varchar(10) NOT NULL, data_intrare date, pret decimal(12,2))"; if (mysql_query($sql, $conn)) echo "Tabelul carti a fost creat <br />"; else echo "Tabelul carti nu a putut fi creat deoarece : ". mysql_errno(). " : ". mysql_error(); mysql_close(); ?> In exemplul de mai sus, variabila "$sql" contine comanda SQL pentru crearea acestui tabel. Instructiunea mysql_query($sql, $conn), executa aceasta comanda si in cazul in care rezultatul este TRUE se trimite la iesire sirul: "Tabelul carti a fost creat". In cazul in care instructiunea SQL nu a putut fi executata, functiamysql_query($sql) intoarce valoarea FALSE, afisand eroarea din cauza careia tabelul nu a putut fi creat.

6. Adaugarea de date in tabel Dupa ce aveti tabelul creat in baza de date MySQL puteti adauga date in el, pentru aceasta se foloseste functiamysql_query("interogare") unde "interogare" este urmatoarea comanda: INSERT INTO `nume_tabel` (coloana1, coloana2, ...) VALUES ('date1', 'date2', ...) - unde `nume_tabel` este numele tabelului in care se adauga datele - "coloana1, coloana2, ..." sunt numele coloanelor in care se doreste adaugarea datelor - "date1, date2, ..." sunt datele care vor fi adaugate, tinandu-se cont de ordinea si numarul lor cu cea a coloanelor Iata un exemplu, in care se foloseste tabelul "carti" creat mai sus <?php $conn = mysql_connect("localhost", "Marius", "mypass") or die("Unable to connect to MySQL"); $selectdb = mysql_select_db('lucrudb'); if (!$selectdb) echo "Baza de date lucrudb nu a putut fi selectata deoarece : ". mysql_errno(). " : ". mysql_error();
$sql = "INSERT INTO `carti` (nume, autor, gen, data_intrare, pret) VALUES ('Glossa', 'Mihai Eminescu', 'poezie', '19-05-2009', '8')"; if (mysql_query($sql, $conn)) echo 'Datele au fost adaugate'; else echo "Datele nu au fost adaugate deoarece : ". mysql_errno(). " : ". mysql_error(); mysql_close(); ?>

- In acest exemplu, datele "'Glossa', 'Mihai Eminescu', 'poezie', '19-05-2009', '8'" vor fi adaugate in coloanele "nume, autor, gen, data_intrare, pret" in aceeasi ordine in care sunt scrise si datele si coloanele. - Daca au fost adaugate cu succes, apare mesajul "Datele au fost adaugate", in caz contrar apare mesajul de eroare. Daca doriti sa adaugati mai multe linii in tabel, printr-o singura interogare, puteti folosi urmatorul model <?php // Aici adaugati comenzile pt. conectare si selectarea bazei de date
$sql = "INSERT INTO `nume_tabel` (coloana1, coloana2, coloana3) VALUES ('date1', 'date2', 'date3'), ('valoare1', 'valoare2', 'valoare3'), ('text1', 'text2', 'text3')"; if (mysql_query($sql)) echo 'Datele au fost adaugate'; else echo "Datele nu au fost adaugate deoarece : ". mysql_errno(). " : ". mysql_error(); mysql_close(); ?> Observati sintaxa de scriere corecta a interogarilor MySQL in PHP, numele tabelului se scrie intre caracterele ( ` ` ) si valorile intre ghilimele simple ( ' ' )

Utilizarea bazelor de date folosind PHP (2)


Part. 2 - Adaugarea datelor in siguranta in MySQL

Invatati sa verificati rezultatul interogarilor care nu returneaza randuri de tabel Invatati sa prelucrati rezultatele intergarilor SELECT Invatati sa afisati randuri si coloane din tabel 1. Verificarea interogarilor care nu returneaza rnduri de tabel Din punctul de vedere al limbajului PHP, exista doua categorii de interogari SQL, ambele fiind emise folosind functiamysql_query().

Interogarile SELECT, care returneaza rnduri ale unui tabel Interogarile UPDATE, INSERT si DELETE, care nu returneaza rnduri ale unui tabel Pentru a verifica daca o interogare UPDATE, INSERT sau DELETE a avut efectul dorit, puteti folosi functiamysql_affected_rows(), care returneaza numarul rndurilor afectate de interogarea cea mai recenta. O alta functie utila este mysql_insert_id(). Cand introduceti un rand intr-un tabel a carui cheie primara este de tipul AUTO_INCREMENT, functia mysql_insert_id()determina valoarea cheii primare atribuite de MySQL. Functia returneaza valoarea zero daca interogarea precedenta nu a generat o valoare AUTO_INCREMENT. Ca atare, functia trebuie apelata la putin timp dupa interogarea care a inserat rndul in tabel, astfel nct o alta interogare ulterioara sa nu modifice rezultatul. Iata un exemplu de utilizare a functiilor mysql_affected_rows() si mysql_insert_id() impreuna cu iterogarea INSERT (care adauga randuri in tabel). Folosim baza de date "lucrudb" si tabelul "carti", create in Lectia 25 <?php $conn = mysql_connect("localhost", "Marius", "mypass") or die("Unable to connect to MySQL"); $selectdb = mysql_select_db('lucrudb'); if (!$selectdb) echo "Baza de date lucrudb nu a putut fi selectata deoarece : ". mysql_errno(). " : ". mysql_error(); $sql = "INSERT INTO `carti` (nume, autor, gen, data_intrare, pret) VALUE ('Carte2', 'Autor2', 'Educativ', '2008-9-16', 11.00)"; if (mysql_query($sql)) echo "Datele au fost adaugate in tabelul carti <br />"; else echo "Datele nu au fost adaugate in tabelul carti deoarece : ". mysql_errno(). " : ". mysql_error(); $nranduri = mysql_affected_rows(); $id = mysql_insert_id(); if ($nranduri == -1) {

echo "INSERT nu a putut sa adauge datele"; } else echo "Au fost adaugate $nranduri randuri, cheia primara = $id" ; mysql_close(); ?>

Dupa ce s-a facut conectarea la serverul MySQL si s-a reusit selectarea bazei de date, variabila "$sql" contine comanda SQL pentru introducerea unui nou rand in tabelul "carti", prin intermediul functiei mysql_query($sql) se introduce datele in baza de date, variabila "$nranduri" preia de la functia mysql_affected_rows() numarul de randuri afectate (aici introduse) iar variabila "$id" va avea (prin "mysql_insert_id()") valoarea cheii primare atribuite de MySQL. Daca nu apare nici o eroare, rezultatul afisat de acest script este urmatorul: Datele au fost adaugate in tabelul carti Au fost adaugate 1 randuri, chea primara = 2 Functia mysql_insert_id() poate returna un rezultat incorect pentru coloanele MySQL de tipul BIGINT [BIGINT este un tip de valoare care suporta numere cu 20 de cifre, folosit pentru campurile integer (spre deosebire de MEDIUMINT care suporta numere de la 0 la 16.777.215 (3 bytes) sau INT care suporta numerele de la 0 la 4.294.967.295 (4 bytes)]. Dupa efectuarea unei interogari INSERT, In locul functiei mysql_insert_id() se poate folosi functia LAST_INSERT_ID(), aceasta returneaza valoarea atribuita de MySQL unei coloane AUTO_INCREMENT, indiferent de tipul coloanei. Mai mult, apelurile ulterioare in script la functii MySQL nu afecteaza rezultatul returnat de LAST_INSERT_ID(), care este afectat numai de operatiile INSERT n care sunt implicate coloane AUTO_INCREMENT. Totusi, spre deosebire de "mysql_insert_id()", LAST_INSERT_ID() necesita o interogare suplimentara la MySQL. Iata un exemplu care prezinta modul de obtinere a valorii LAST INSERT ID(): <?php $sql = "INSERT INTO `carti` (nume, autor, gen, data_intrare, pret) VALUE ('Carte3', 'Autor3', 'Gen3', '2008-9-16', 8.30)"; $insert = mysql_query($sql); if (!$insert) { echo "<br /> Cmanda INSERT a esuat: ". mysql_errno(). " : ". mysql_error(). "<br />"; } $interogare = "SELECT LAST_INSERT_ID() FROM `carti`"; $rezultat = mysql_query($interogare); if (mysql_errno()) { echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />"; } $rand = mysql_fetch_row($rezultat); echo "<br /> Ultimul ID repartizat: $rand[0]"; mysql_close(); ?> Dupa executarea acestui script, daca nu apare vreo eroare, rezultatul afisat va fi de genul: Ultimul ID repartizat: 3

Functia last_insert_id() returneaza rezultatul corect numai dupa ce a fost efectuata o comanda INSERT. Functia mysql_affected_rows() numara numai rndurile efectiv modificate de catre o interogare UPDATE. Rndurile n cazul carora vechea si noua valoare din coloana sunt identice nu se numara printre rndurile afectate. De asemenea, o interogare DELETE care nu contine o clauza WHERE va determina functia mysql_affected_rows() sa returneze valoarea zero, indiferent de numarul rndurilor sterse din tabel. O modalitate simpla de a determina daca stergerea tuturor rndurilor unui tabel a reusit consta n a emite o interogare care returneaza numarul rndurilor existente n tabel. De exemplu: <?php $sql = "SELECT COUNT(*) FROM `carti`"; $result = mysql_query($sql); $nr = mysql_fetch_row($result); echo $nr[0]; ?> Daca interogarea returneaza valoarea zero, demonstreaza stergerea tuturor rndurilor din tabel. 2. Prelucrarea rezultatelor interogarilor SELECT Interogarile SELEC returneaza ca rezultate rnduri de tabel. Rndurile unui tabel sunt incluse ntr-o structura de date numita "set de rezultate". Prelucrarea setului de rezultate returnat de o interogare SELECT implica parcurgerea rndurilor setului de rezultate. O modalitate de parcurgere a rndurilor unui set de rezultate este prin utilizarea unei instructiuni "WHILE".

1. Intai se verifica daca numarul de randuri returnat este 0 folosind functia mysql_num_rows(), transferndu-i ca argument valoarea returnata de functia mysql_query() 2. Daca numarul de randuri este 0 inseamna ca interogarea SELECT nu a returnat nici un rand din tabel, 3. Daca numarul de randuri este diferit de 0, se executa o instructiune WHILE impreuna cu una din functiile: o mysql_fetch_assoc() (sau mysql_fetch_array() cu parametru "MYSQL_ASSOC"). - sunt similare, adauga datele intr-o matrice asociativa unde pentru fiecare element avem chei cu numele coloanelor iar valoarile lor sunt datele din randul respectiv. o mysql_fetch_row(). - adauga datele intr-o matrice asociativa unde pentru fiecare element avem chei cu numere consecutive (incepand de la 0) care reprezinta ordinea coloanelor iar valoarile lor sunt datele din randul respectiv o mysql_fetch_object(). - aduce rezultatele randului sub forma de obiect cu perechile $rand->coloana 4. Pentru a prelucra coloanele stocate n matrice, depinde de functia folosita. - pentru mysql_fetch_assoc() (sau mysql_fetch_array()) puteti

folosi o sintaxa de genul $rand['coloana'] - pentru mysql_fetch_row() puteti folosi o instructiune "foreach", prin care parcurgeti datele din fiecare element a matricei - pentru mysql_fetch_object() puteti folosi o sintaxa de genul $rand->'coloana' - Aceste functii returneaza FALSE daca nu mai exista rnduri n setul de rezultate Ca sa intelegeti mai bine, voi arata cate un exemplu cu fiecare in parte (voi folosi acelasi tabel, "carti"). Studiati-le cu atentie si exersati-le singuri. Nu s-au mai introdus in aceste exemple instructiunile pentru conectarea la serverul MySQL si pentru selectarea bazei de date, le adaugati dumneavoastra. De exemplu, daca doriti sa aflati toate datele din anumite coloane puteti folosi functia mysql_fetch_assoc() astfel: <?php $interogare = "SELECT `nume`, `autor` FROM `carti`"; $rezultat = mysql_query($interogare); if (mysql_errno()) { echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />"; } if (mysql_num_rows($rezultat) == 0) { echo '0 rezultate'; } else { while ($rand = mysql_fetch_assoc($rezultat)) { echo '<br />'. $rand['nume']. ' - '. $rand['autor']; } } ?> - Variabila "$rand" devine o matrice ale carei chei sunt numele coloanelor iar valorile lor sunt datele coloanelor respective din randul curent; instructiunea WHILE parcurge fiecare rand. Iata acest exemplu, dar cu functia mysql_fetch_array(). In plus, in interogare SQL voi adauga numele coloanelor prin variabile, ca sa vedeti cum se lucreaza si cu variabile. <?php // Variabilele cu numele coloanelor $col1 = 'nume'; $col2 = 'autor';
// Interogarea SQL folosind si variabile $interogare = "SELECT `$col1`, `$col2` FROM `carti`"; $rezultat = mysql_query($interogare); if (mysql_errno()) { echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />"; } if (mysql_num_rows($rezultat) == 0) { echo '0 rezultate'; } else { while ($rand = mysql_fetch_array($rezultat, MYSQL_ASSOC)) { echo '<br />'. $rand['nume']. ' - '. $rand['autor'];

} } ?> Cel de-al doilea argument al functiei mysql_fetch_array() este optional. Totusi, daca nu specificati MYSQL_ASSOC ca valoare a argumentului, PHP returneaza un tablou in care valoarea cheilor vor fi numerele si numele coloanelor.

- Comform datelor adaugate in tabelul "carti", aceste doua exemple vor afisa urmatorul rezultat Glossa - Mihai Eminescu Carte2 - Autor2 Carte3 - Autor3 Daca doriti sa afisati toate datele din fiecare coloana de pe fiecare rand al tabelului, puteti folosi functiamysql_fetch_row() astfel: <?php $interogare = "SELECT * FROM `carti`"; $rezultat = mysql_query($interogare); if (mysql_errno()) { echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />"; } if (mysql_num_rows($rezultat) == 0) { echo '0 rezultate'; } else { while ($rand = mysql_fetch_row($rezultat)) { foreach ($rand as $coloana) { echo "| $coloana |"; } echo "<br />"; } } ?> - Exemplul de mai sus v-a afisa urmatorul rezultat, in functie de datele din tabel: | 1 || Glossa || Mihai Eminescu || poezie || 0000-00-00 || 8.00 | | 2 || Carte2 || Autor2 || Educativ || 2008-09-16 || 11.00 | | 3 || Carte3 || Autor3 || Gen3 || 2008-09-16 || 8.30 | Daca doriti sa obtineti acces la valoarea unei anumite coloane, puteti face referire la elementul din tablou folosind o cheie a tabloului. De exemplu, daca rezultatul functiei mysql_fetch_row() este stocat n variabila "$rand", puteti obtine acces la prima coloana folosind sintaxa "$rand[0]", la a doua coloana folosind sintaxa "$rand[1]" etc. Iata un exemplu in care este utilizata functia mysql_fetch_object(), iar in interogarea SQL este adaugata si o conditie WHERE si o variabila "$nr". <?php $nr = 3; $interogare = "SELECT `nume`, `autor` FROM `carti` WHERE `id`<'$nr'"; $rezultat = mysql_query($interogare); if (mysql_errno()) { echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />"; } if (mysql_num_rows($rezultat) == 0) { echo '0 rezultate'; }

else { while ($rand = mysql_fetch_object($rezultat)) { echo '<br />'. $rand->nume. ' - '. $rand->autor; } } ?>

- Testati singuri pentru a vedea rezultatul.


Precizare: - Comform sintaxei MySQL cu PHP, numele tabelelor si coloanelor se scriu intre caracterele ` ` (semnul din stanga tastei 1), desi functioneaza si fara, asa e corect, comform standardului, si e necesar in cazul numelor de tabele /coloane formate din mai multe cuvinte. - Variabilele, cum e aici $nr se scriu intre ghilimele simple ' '

Lucrul cu baze de date MySQL, seturi de rezultate


Part. 2 - Explorarea Bazelor de Date MySQL

Invatati sa obtineti date privind: numarul coloanelor, numele si lungimea coloanelor dintr-un tabel MySQL Invatati sa obtineti informatii privind indicatorii MySQL asociati coloanelor si tipul fiecarei coloane Invatati sa aflati numele tabelului care contine o anumita coloana si sa parcurgeti non-secvential randurile unui tabel MySQL Biblioteca de functii MySQL a limbajului PHP include functii care va permit sa obtineti informatii despre un set de rezultate, inclusiv:

Numarul coloanelor din setul de rezultate Numele fiecarei coloane Lungimea fiecarei coloane Indicatorii MySQL asociati coloanei Tipul MySQL al fiecarei coloane Numele tabelului MySQL care contine coloana

1. Obtinerea numarului coloanelor dintr-un tabel MySQL Pentru a obtine numarul coloanelor dintr-un set de rezultate, utilizati functia

mysql_num_fields()

Aceasta foloseste ca argument valoarea returnata de functia mysql_query(). Iata un exemplu in care functia mysql_num_fields() determina numarul coloanelor dintr-o interogare care selecteaza toate coloanele folosind specificatorul SQL pentru toate cmpurile "*", astfel puteti afla numarul de coloane dintr-un tabel: <?php $sql = "SELECT * FROM `nume_tabel`"; $rezultat = mysql_query($sql);

if (mysql_errno()) { echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />"; } $nr_campuri = mysql_num_fields($rezultat); echo "<br /> Numar campuri: $nr_campuri"; mysql_close(); ?>

2. Obtinerea numelui unei coloane Pentru a obtine numele unei coloane dintr-un tabel MySQL, folositi functia

mysql_field_name()

Aceasta returneaza numele coloanei din setul de rezultate. Functia preia doua argumente: valoarea returnata de functiamysql_query() si indexul coloanei care va fi descrisa. Indexul asociat cu prima coloana este 0, indexul asociat celei de-a doua coloane este l etc. Iata un exemplu care determina numele primei coloane dintr-un tabel MySQL: <?php $sql = "SELECT * FROM `nume_tabel`"; $rezultat = mysql_query($sql); if (mysql_errno()) { echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />"; } $nume = mysql_field_name($rezultat, 0); echo "<br /> Coloana 1 : $nume"; mysql_close(); ?> 3. Obtinerea lungimii unei coloane Pentru a obtine lungimea unei coloane dintr-un tabel MySQL, folositi functia

mysql_field_len()

Aceasta returneaza lungimea maxima a coloanei din setul de rezultate. Functia preia doua argumente: valoarea returnata de functia mysql_query() si indexul coloanei care va fi descrisa. Indexul asociat cu prima coloana este 0, indexul asociat celei de-a doua coloane este l etc. Iata un exemplu care determina lungimea maxima a coloanei doi dintr-un tabel MySQL: <?php $sql = "SELECT * FROM `nume_tabel`"; $rezultat = mysql_query($sql); if (mysql_errno()) { echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />"; } $lungime = mysql_field_len($rezultat, 1); echo "<br /> Lungime Coloana 2 - $lungime"; mysql_close(); ?>

4. Obtinerea indicatorilor MySQL asociati unei coloane Pentru a obtine indicatorii SQL asociati unei coloane dintr-un tabel MySQL, folositi functia

mysql_field_flags()

Aceasta preia doua argumente: valoarea returnata de functia mysql_query() si indexul coloanei care va fi descrisa. Indexul asociat cu prima coloana este 0, indexul asociat celei de-a doua coloane este l etc. Functia mysql_field_flags() raporteaza urmatorii indicatori:

AUTO_INCREMENT BINARY BLOB ENUM MULTIPLE_KEY NOT_NULL PRIMARY_KEY TIMESTAMP UNIQUE_KEY UNSIGNED ZEROFILL

- Daca la o coloana sunt asociati mai multi indicatori, fiecare indicator este separat de vecinii sai prin intermediul unui singur spatiu. Iata un exemplu care determina indicatorii asociati primei coloane dintr-un tabel MySQL: <?php $sql = "SELECT * FROM `nume_tabel`"; $rezultat = mysql_query($sql); if (mysql_errno()) { echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />"; } $indicatori = mysql_field_flags($rezultat, 0); echo "<br /> Indicatorii Coloanei 1 : $indicatori"; mysql_close(); ?> 5. Obtinerea tipului MySQL al unei coloane Pentru a obtine tipul MySQL al unei coloane dintr-un tabel MySQL, folositi functia

mysql_field_type()

Aceasta preia doua argumente: valoarea returnata de functia mysql_query() si indexul coloanei care va fi descrisa. Indexul asociat cu prima coloana este 0, indexul asociat celei de-a doua coloane este l etc. Principalele tipuri MySQL returnate de functia mysql_field_type() sunt prezentate in Lectia 22 , in tabelul "Principalele tipuri de date din MySQL". Iata un exemplu care determina tipul primei coloane dintr-un tabel MySQL:

<?php $sql = "SELECT * FROM `nume_tabel`"; $rezultat = mysql_query($sql); if (mysql_errno()) { echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />"; } $tip = mysql_field_type($rezultat, 0); echo "<br /> Tip Coloana 1 : $tip"; mysql_close(); ?>

6. Determinarea tabelului MySQL asociat unei coloane Pentru a determina tabelul MySQL (daca exista) asociat unei anumite coloane, folositi functia

mysql_field_table()

Aceasta preia doua argumente: valoarea returnata de functia mysql_query() si indexul coloanei care va fi descrisa. Indexul asociat cu prima coloana este 0, indexul asociat celei de-a doua coloane este l etc. n cazul n care coloana contine o valoare calculata sau daca respectiva coloana nu este asociata n alt mod cu un tabel MySQL, functia returneaza un sir vid. Iata un exemplu care determina tabelul asociat primei coloane din setul de rezutate: <?php $sql = "SELECT * FROM `nume_tabel`"; $rezultat = mysql_query($sql); if (mysql_errno()) { echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />"; } $tabel = mysql_field_table($rezultat, 0); echo "<br /> Nume tabel : $tabel"; mysql_close(); ?> 7. Obtinerea structurii complete a setului de rezultate Daca doriti obtinerea mai multor caracteristici ale setului de rezultate, o functie utila poate fi:

mysql_fetch_field()

Aceasta functie returneaza un obiect ale carui proprietati contin o varietate de informatii cu privire la coloana unui tabel MySQL. Proprietatile sunt urmatoarele:

blob - are valoarea 1 n cazul n care coloana este de tip BLOB max_length - lungimea maxima a coloanei; multiple_key - are valoarea 1 n cazul n care coloana este o cheie non-unica name - numele coloanei not_null - are valoarea 1 n cazul n care coloana nu poate contine valoarea NULL numeric - are valoarea 1 n cazul n care coloana este numerica

primary_key - are valoarea 1 n cazul n care coloana este o cheie primara table - numele tabelului MySQL caruia i apartine coloana type - tipul MySQL al coloanei unique_key - are valoarea 1 n cazul n care coloana este o cheie unica unsigned - are valoarea 1 n cazul n care coloana este de tip UNSIGNED zerofill - are valoarea 1 n cazul n care coloana este completata cu zerouri functia mysql_fetch_field() preia doua argumente: valoarea returnata de functia mysql_query() si indexul coloanei care va fi descrisa. Indexul asociat primei coloane este 0, indexul asociat celei de-a doua coloane este l etc. Iata un exemplu care prezinta modul de obtinere si descriere a structurii complete a setului de rezultate pentru prima coloana dintr-un tabel MySQL: <?php $sql = "SELECT * FROM `nume_tabel`"; $rezultat = mysql_query($sql); if (mysql_errno()) { echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />"; } $info = mysql_fetch_field($rezultat, 0); echo "<br /> Coloana 1: "; echo "<PRE> blob: $info->blob max_length: $info->max_length multiple_key: $info->multiple_key name: $info->name not_null: $info->not_null numeric: $info->numeric primary_key: $info->primary_key table: $info->table type: $info->type unique_key: $info->unique_key unsigned: $info->unsigned zerofill: $info->zerofill </PRE>"; mysql_close(); ?> Pentru a obtine aceste proprietati pentru toate coloanele din tabel, folositi o instructiune "for", dupa exemplul de mai jos, care parcurge fiecare coloana, folosind ca limita a numarului de coloane valoarea returnata de functiamysql_num_fields() <?php $sql = "SELECT * FROM `nume_tabel`"; $rezultat = mysql_query($sql); if (mysql_errno()) { echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />"; } $nr_campuri = mysql_num_fields($rezultat); for ($i=0; $i<$nr_campuri; $i++) { echo "<br /> Coloana $i: "; $info = mysql_fetch_field($rezultat);

if ($info) { echo "<PRE> blob: $info->blob max_length: $info->max_length multiple_key: $info->multiple_key name: $info->name not_null: $info->not_null numeric: $info->numeric primary_key: $info->primary_key table: $info->table type: $info->type unique_key: $info->unique_key unsigned: $info->unsigned zerofill: $info->zerofill </PRE>"; } else { echo "Necunoscut"; } } mysql_close(); ?>

8. Accesul non-secvential la coloanele unui set de rezultate Functiile mysql_fetch_row() si mysql_fetch_array() returneaza, n general, rndurile dintr-un set de rezultate n mod secvential, incepand de la primul rand al tabelului. Totusi, functia mysql_data_seek() permite obtinerea accesului la rndurile unui set de rezultate ntr-o maniera non-secventiala, . Functia are forma:

mysql_data_seek(rezultat, numar_rand)

Unde "rezultat" este valoarea returnata de functia mysql_query(), iar "numar_rand" este indexul rndului la care doriti sa obtineti accesul. Primul rnd al tabelului este numerotat cu 0, al doilea cu 1 etc. Functia returneaza TRUE daca executia reuseste, respectiv FALSE n caz contrar. Apoi, o invocare ulterioara a functiei mysql_fetch_row() sau a functiei mysql_fetch_array() va returna rndul din pozitia specificata in functia mysql_data_seek(). Studiati urmatorul exemplu, care obtine accesul la al treilea rnd al setului de rezultate returnat de o interogare anterioara: <?php $sql = "SELECT * FROM `nume_tabel`"; $rezultat = mysql_query($sql); if (mysql_errno()) { echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />"; } if (!mysql_data_seek($rezultat, 2)) { echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />"; } else { $rand = mysql_fetch_array($rezultat, MYSQL_ASSOC); foreach ($rand as $coloana) {

echo "| $coloana |"; } mysql_close(); ?> }

- Acest exemplu afiseaza datele din randul trei pentru fiecare coloana a tabelului MySQL.

Optiuni pentru utilizarea caracterelor speciale


Invatati rolul optiunilor "magic_quotes" Invatati sa convertiti caracterele speciale prin schimbarea semnificatiei acestora utilizand functii PHP Invatati sa convertiti caracterele speciale specifice HTML si cele din sirurile folosite pentru adrese URL 1. Ghilimelele magice Apar situatii cand dorim sa introducem ghilimele in interiorul unui textintr-o baza de date, dar SQL nu permite nglobarea unor ghilimele simple n interiorul valorii unui sir. Probleme similare pot aparea la introducerea unui text ce contine caractere speciale precum: \ + * ? ^ ( $ ), si care sunt trimise la un script PHP. PHP include functii si facilitati pentru rezolvarea acestor situatii. Fisierul de initializare PHP ("php.ini") contine optiuni de configurare care determina modul n care PHP controleaza datele provenite de la o sursa externa, cum sunt un formular HTML, un fisier text sau o baza de date. Optiunea magic_quotes_gpc specifica modul n care PHP manipuleaza operatiile HTTP: GET si POST, precum si operatiile dintre PHP si MySQL sau cele cu variabile cookie. Daca optiunea este activata (ON), PHP prefixeaza automat ghilimelele simple, ghilimelele duble, caracterele backslash si caracterele nule (caracterele a caror valoare ASCII este 0) care apar ntr-o variabila HTTP, cu un caracter backslash (\). Optiunea magic_quotes_runtime specifica modul n care PHP manipuleaza datele de origine externa. Daca aceasta optiune este activata, PHP ignora automat ghilimelele simple si duble care apar n datele externe, inclusiv datele din formularele HTML, din fisiere si baze de date. Daca este activata optiunea magic_quotes_sybase, aceasta modifica efectul optiunilor magic_quotes_gpc simagic_quotes_runtime, astfel nct un caracter de tip ghilimele simple sa fie prefixat cu un alt caracter de tip ghilimele simple, nu cu un backslas. Dar, n general, accesul la aceste comenzi din fisierul "php.ini" il are administratorul de sistem iar utilizatorii obisnuiti nu trebuie sa aiba posibilitatea de a aduce modificari n fisier. Astfel, pot fi folosite functii PHP care sa seteze aceste optiuni pe durata scriptului respectiv. Functiile get_magic_quotes_gpc() si get_magic_quotes_runtime() returnea za fiecare valoarea optiunii PHP corespunzatoare setate in fisierul "php.ini". Mai mult, puteti folosi functia set_magic_quotes_runtime() pentru a specifica valoarea optiunii magic_quotes_runtime pentru restul duratei scriptului PHP curent.

De exemplu, pentru a dezactiva optiunea magic_quotes_runtime, invocati functia

set_magic_quotes_runtime(0);

Alternativ, pentru a activa aceasta optiune intr-un script, folositi functia

set_magic_quotes_runtime(1);

2. Conversia caracterelor speciale si anularea acesteia PHP poate converti ghilimelele simple si duble dintr-un sir, folosind functia addslashes(). Daca PHP nu este configurat astfel nct sa converteasca aceste caractere din sir n mod automat, atunci trebuie sa executati manual aceasta modificare. Pur si simplu utilizati functia addslashes(), transferndu-i ca argument sirul text. Aceasta adauga caracterul backslash "\" pentru conversia caracterelor de tip ghilimele simple, ghilimele duble, backslash si caractere nule
Aceasta conversie nu trebuie confundata cu o alta, si anume conversia de tip, care foloseste caracterul backslash (\). Conversia mentionata n acest capitol consta din modificarea semnificatiei anumitor caractere, pentru a preveni o interpretare eronata a acestora de catre programele specializate, precum MySQL. Din acest motiv, toate conversiile mentionate n acest capitol fac referire la modificarea semnificatiei unor caractere, nu la conversiile de tip.

De exemplu, pentru a converti continutul sirului "$text" si a plasa rezultatul n variabila "$modificat", invocati functia dupa cum urmeaza:

$modificat = addslashes($text);

Functia stripslashes() executa operatia complementara de anulare a conversiei, elimina caracterele backslash inserate. Pentru a anula conversia sirului "$modificat" si a plasa rezultatul n variabila "$nemodificat", utilizati functia dupa cum urmeaza:

$nemodificat = stripslashes($modificat)

O alta functi utila pentru conversia caracterelor speciale este quotemeta(), aceasta va insera un backslash nainte de fiecare aparitie a urmatoarelor caractere: . \ + * ? [ ^ ] ( $ ). Ca si addslashes(), functia quotemeta() se foloseste in mod similar, prelund ca argument sirul text. 3. Conversia textelor HTML Cnd lucrati cu texte HTML, conversia executata de functia addslashes() nu este suficienta, deoarece HTML este sensibil si la alte caractere speciale dect cele convertite de functia addslashes(). In schimb puteti folosi functia htmlspecialchars(). Aceasta converteste caracterele la care HTML este sensibil. Functie este utila cand se doreste ca un anumit sir sa nu contina marcaje HTML, ceea ce poate fi

important in modul de operare a unei aplicatii, cum ar fi un tabel HTML. Functia are urmatoarea forma:

htmlspecialchars("text" [,stil_ghilimele])

Unde "text" specifica sirul care contine textul ce urmeaza a fi convertit, iar argumentul optional "stil_ghilimele" specifica modul de conversie a ghilimelelor simple, respectiv duble. Valorile permise ale optiunii "stil_ghilimele" sunt:

ENT_COMPAT - precizeaza ca trebuie convertite numai ghilimelele duble ENT_QUOTES - precizeaza ca trebuie convertite ambele tipuri de ghilimele ENT_NOQUOTES - precizeaza ca nu trebuie convertit nici un tip de ghilimele De exemplu, pentru a converti toate caracterele HTML speciale, inclusiv ambele tipuri de ghilimele, din sirul "$texthtml", utilizati functia dupa cum urmeaza:

$conversie = htmlspecialchars($texthtml);

Functia htmlspecialchars() executa urmatoarele conversii:

Caracter & (ampersand)

Rezultatul conversiei

&amp; &quot; (numait cnd este specificat opiunea ENT_COMPAT sau "(ghilimele duble) ENT_QUOTES) '(ghilimele simple) &#39; (numai cnd este specificat opiunea ENT_QUOTES) < (mai mic dect) &lt; > (mai mare dect) &gt;
O functie PHP conexa, htmlentities(), converteste toate caracterele cu echivalente n entitati HTML. Este acceptat setul de caractere ISO-8859-1 Si o alta functie utila pentru conversia textelor HTML este functia n12br(). Aceasta insereaza tag-ul <br /> anterior fiecarui caracter de tip linie noua care se gaseste in argumentul sau.

4. Conversia pentru adresele URL Cnd doriti sa codificati in PHP date ca parte a unei adrese URL, puteti folosi functia urlencode(). Aceasta functie nlocuieste fiecare caracter non-alfanumeric (cu exceptia spatiilor) cu un simbol al procentului (%), urmat de doua cifre hexazecimale care contin valoarea ASCII a caracterului. Spatiile sunt codificate sub forma de simboluri ale adunarii (+). O functie conexa, n speta rawurlencode(), executa o conversie similara; cu deosebirea ca nlocuieste spatiile cu %20, conform RFC 1738, standardul Internet pentru codificarea adreselor URL. Functiile urldecode() si rawurldecode() executa operatii complementare. Aceste functii sunt utile la crearea adreselor URL care includ perechi 'numevaloare'.

De exemplu, sa presupunem ca avem un script PHP care trebuie sa creeze o pagina HTML ce contine o hiperlegatura spre adresa URL a unui motor de cautare. Termenul de cautare trebuie transmis n forma codificata URL, pentru ca serverul Web si browserul sa nu se "impiedice" de caracterele speciale. Pentru a codifica datele pentru o adresa URL, puteti folosi o metoda ca in exemplul urmator:

echo <a href="www.sitecautare.com?cuvantcheie='. urlencode($text). '">; Ca sa intelegeti mai bine aceste moduri de conversie, puteti studia amanuntit exemplul urmator: <?php
// Variabila $a contine textul ca va fi convertit $a = "abc 123 ' <br /> / < & > ( % ) * , $ . # ^ ! [ \ ] { @ } : ; = ?"; $b = addslashes($a); $c = stripslashes($b); $d = quotemeta($a); $e = htmlentities($a); $f = urlencode($a); echo '<br /> Conversie addslashes() = '. $b; echo '<br /> Anulare conversie addslashes() = '. $c; echo '<br /> Conversie quotemeta($a) = '. $d; echo '<br /> Conversie caractere HTML = '. $e; echo '<br /> Conversie pt. adrese URL = '. $f; ?>

Datele de iesire ale exemplului sunt urmatoarele: Conversie addslashes() = abc 123 \' / < & > ( % ) * , $ . # ^ ! [ \\ ] { @ } : ; = ? Anulare conversie addslashes() = abc 123 ' / < & > ( % ) * , $ . # ^ ! [ \ ] { @ } : ; = ? Conversie quotemeta($a) = abc 123 ' / < & > \( % \) \* , \$ \. # \^ ! \[ \\ \] { @ } : ; = \? Conversie caractere HTML = abc 123 ' <br /> / < & > ( % ) * , $ . # ^ ! [ \ ] { @ } : ; =? Conversie pt. adrese URL = abc+123+%27+%3Cbr+%2F%3E+%2F+%3C+%26+ %3E+%28+%25+%29+ %2A+%2C+%24+.+%23+%5E+%21+%5B+%5C+%5D+%7B+%40+%7D+%3A+ %3B+%3D+%3F

Utilizarea claselor si a obiectelor (1)


Invatati bazele si principiul programarii orientate spre obiecte Invatati sa definiti si sa instantati o clasa Invatati sa definiti o metoda constructor si sa folositi mostenirea

O abordare importanta a activitatii de programare, care a devenit populara n anii '90, este orientarea spre obiecte. Orientarea spre obiecte a fost creata ca o modalitate de organizare a unor

programe de simulare complexe. Cu toate acestea, progresul interfetelor grafice cu utilizatorul din perioada anilor '90 a dus la descoperirea ca metodele orientate spre obiecte faciliteaza scrierea programelor interactive. Principiul de baza al programarii orientate spre obiecte (POD) l reprezinta incapsularea datelor. Un program care nu este orientat spre obiecte este organizat ca un set de functii si un set de variabile globale utilizate de acele functii. Orice functie poate opera folosind orice variabila globala,. Un program orientat spre obiecte combina functii si variabile ntr-o unitate, cunoscuta sub numele de "clasa". Un program orientat spre obiecte caracteristic este alcatuit din mai multe clase. Programele orientate spre obiecte pot fi mai usor de nteles dect programele care nu sunt orientate spre obiecte, deoarece interactiunile ntre clasele unui program orientat spre obiecte sunt relativ reduse ca numar. Astfel, un programator poate studia si ntelege un program orientat spre obiecte abordnd fiecare clasa n parte, nu toate clasele deodata. Pe langa modatitatea de programare structurata, invatata pana acum, PHP va permite sa creati si sa folositi clasele, obiectele, respectiv proprietatile si metodele asociate acestora. Aceasta lectie prezinta conceptele orientarii spre obiecte ntr-un mod general si va invata sa folositi caracteristicile orientate spre obiecte ale limbajului PHP. 1. Clasele O clasa este de fapt o structura care contine variabile (membrii) si functii (metode), Metodele sunt operatiile pe care membrii clasei le pot efectua. Membrii si metodele declarate intr-o clasa apartin clasei respective si se acceseaza specificand numele clasei. O clasa poate include o metoda speciala, numita "metoda constructor" sau "constructor". Aceasta este o functiei din clasa care are acelasi nume cu denumirea clasei.
Diferenta ntre clasa si obiect este importanta. Daca o clasa poate fi asimilata unui tip de date, un obiect poate fi echivalat cu o variabila sau cu o valoare avand un anumit tip de date. Practic, o clasa este o "fabrica" de obiecte, care produce obiecte cu aceeasi structura, avand proprietati si metode identice.

- Pe langa incapsularea datelor, o alta caracteristica importanta al POD este mostenirea Mostenirea consta in aceea ca putem declara anumite clase ca fiind derivate din alte clase de baza. In cele mai multe situatii clasa derivata (numita si clasa copil) extinde, primeste functionalitatile clasei de baza (numita si clasa parinte). In acest fel se reduce foarte mult cantitatea de cod necesara. 2. Alcatuirea si instantierea unei clase Definirea unei clase incepe cu un cuvantul cheie "class". Variabilele sau membrii clasei se specifica folosind cuvantul "var". Functiile sau metodele unei clase se declara specificand cuvantul "function" . Structura general de alcatuire a unei clase este urmatoarea:

class nume_claca { var membru1; var membru2; .................

function nume_functie(); { function metoda1(); function metoda2(); ................. }

Pentru a intelege mai bine modalitatea de definire a unei clase n PHP, consideram urmatorul exemplu in care alcatuim o clasa simpla denumita "ContBanca": <?php
// Definirea clasei class ContBanca { var $sold = 0; // Membru clasei

// Definirea primei metode a clasei function c_depozit($suma) { $this->sold = $this->sold + $suma; } // Definirea celei dea doua metode a clasei function obtine_sold() { return $this->sold; } } ?>

- Clasa "ContBanca" are un singr membru, "$sold" si doua metode: "c_depozit()" si "obtine_sold()". - Membru (variabila) "$sold" este definita de o instructiune "var". Clasa "ContBanca" atribuie variabilei "$sold" valoarea initiala zero ( Nu este necesara atribuirea unei valori initiale unei proprietati, dar astfel programele devin mai simple si mai usor de citit). - Cele doua metodele (functii) sunt definite folosind cuvntul cheie "function". (Diferenta dintre metode si functii este legata de amplasarea acestora, pentru a se face deosebirea; metodele sunt definite n interiorul claselor, n timp ce functiile sunt definite n exteriorul acestora). Un aspect interesant al metodelor consta n modalitatea n care acestea obtin accesul la variabila, folosend sintaxa "$this->" (aceasta are o semnificatie similara cu a pronumelui posesiv din limba romna (al meu)). Cnd o metoda face o referire de forma "$this->sold", se considera ca face trimitere la membru "$sold" a obiectului curent, aici efectul este similar cu acela al expresiei "sold-ul mea". Instantierea unei clase se face prin operatorul "new", avand urmatoarea forma generala:

$nume_variabila = new nume_clasa();

Variabila "$nume_variabila" contine o referinta la clasa "nume_clasa". In continuare se apeleaza metodele clasei respective, asta se face prin operatorul de referinta "->" ca mai jos:

$nume_variabila->Metoda1();

Variabila apeleaza metoda cu numele "Medoda1()", care apartine clasei "nume_clasa". Stergerea instantelor unei clase se face simplu prin apelarea functiei:

unset($nume_variabila)

Dupa aceasta stergere, orice apel de genul "$nume_variabila->Metoda1();" va fi semnalat ca eroare. Iata un exemplu concret de Instantiere in care folosim clasa "ContBanca", definita mai sus. <?php // Definirea clasei
class ContBanca { var $sold = 0; // Membru clasei

// Definirea primei metode a clasei function c_depozit($suma) { $this->sold = $this->sold + $suma; } // Definirea celei dea doua metode a clasei function obtine_sold() { return $this->sold; }

// Instantierea clasei (setarea obiectului) $cont = new ContBanca(); // Apelarea metodelor din obiectul setat $cont->c_depozit(90); echo "<br /> Soldul este : ". $cont->obtine_sold(); ?>

- Prima instructiune, dupa crearea clasei, seteaza (instantiaza) un obiect "ContBanca" folosind operatorul "new" si stocheaza referinta la acest obiect n variabila "$cont", care va fi utilizata ulterior pentru a obtine acces la metodele obiectului. - A doua instructiune foloseste variabila "$cont", (care face referire la obiectul "ContBanca" creat de prima instructiune). Operatorul "->" arata ca PHP trebuie sa apeleze metoda "c_depozit()" asupra obiectului desemnat de variabila "$cont". Astfel, prin a doua instructiune se va executa metoda "c_depozit()", careia ii este transmis argumentul 90. Dupa cum este definita, metoda "c_depozit", aceasta incrementeaza valoarea membrului "$sold" cu valoarea argumentului din paranteze, "$suma" (adica aici 90). - Cea de-a treia instructiune invoca metoda "obtine_sold()", care returneaza valoarea membrului "$sold". Instructiunea afiseaza valoarea returnata prin intermediul unei instructiuni "echo", afisand "Soldul este : 90".

3. Definirea unei metode constructor Metoda constructor este o functie din interiorul clasei care are aceeasi denumire cu numele clasei. Pentru ca o clasa sa fie eficienta, ar trebui sa aibe mai multi membri. De exemplu, clasa "ContBanca", pe langa membrul "$sold", ar necesita membrii care sa defineasca numele si id-ul posesorului. Iata o noua versiune a clasei, care include trei membri si o metoda constructor: <?php // Definirea clasei
class ContBanca { // Membri clasei var $cont_id; var $nume_posesor; var $sold = 0; // Definirea metodei constructor function ContBanca($id, $nume, $suma) { $this->cont_id = $id; $this->nume_posesor = $nume; $this->sold = $suma; } // Definirea celei dea doua metode a clasei function c_depozit($suma) { $this->sold = $this->sold + $suma; return $this->sold; }

} ?>

- Constructorul este "function ContBanca()", asa cum se observa, are acelasi nume ca al clasei. Deosebirea fata de ceilalti membri este ca la invocarea operatorului "new", pentru setarea obiectului, PHP va apela automat si aceasta functie din clasa. Argumentele constructorului sunt folosite pentru a stabili valorile initiale ale membrilor noului obiect, "$id", "$nume" si "$suma". Iata cum s-ar putea folosi noua clasa, adaugam codul de mai jos dupa datele de definire a clasei, pe care nu le mai repetam: <?php // Aici sunt adaugate datele pentru definirea clasei
// Setarea (instantierea) obiectului "ContBanca" $cont = new ContBanca(8, "Plo Mar", 100); echo "<br /> Contul $cont->cont_id apartine lui $cont->nume_posesor"; // Apelarea celei dea doua metode $cont->c_depozit(90); echo "<br /> Soldul este $cont->sold"; ?>

- Instructiunea "$cont = new ContBanca(8, "Plo Mar", 100);" obtine accesul la membrii obiectului n mod direct, prin "constructorul" care are acelasi nume cu al clasei, transferandu-le valorile "8", "Plo Mar" si "100" - Datele de iesire ale acestui exemplu sunt urmatoarele:

Contul 8 apartine lui Plo Mar Soldul este 190

4. Utilizarea mostenirii Asa cum s-a explicat la inceput, un avantaj al programarii orientate spre obiecte este facilitatea cunoscuta sub numele de mostenire. Pentru a intelege cum functioneaza, iata un exemplu care prezinta modul de derivare a unei clase "ContCurent" din clasa de baza "ContBancar", definita anterior si pe care o salvam intr-un fisier extern "contbanca.php": <?php include("contbanca.php"); // Include clasa parinte (sau poate fi scrisa aici)
// Definirea clasei copil class ContCurent extends ContBanca { var $cec_nr; // Membru clasei copil // Metoda constructor a clasei copil function ContCurent($id, $nume, $suma, $cecnr) { $this->cont_id = $id; $this->nume_posesor = $nume; $this->sold = $suma; $this->cec_nr = $cecnr; } // A doua metoda a clasei copil function primire_cec($cecnr, $suma) { $this->sold = $this->sold - $suma; } // A treia metoda a clasei copil function obtine_sold() { return $this->sold; } } ?>

- Exemplul foloseste o instructiune "include" pentru a obtine accesul la definitia clasei "ContBanca". (sau puteti scrie direct aceasta clasa in locul "include"). - Cuvntul cheie "extends" stabileste identitatea clasei "ContCurent" ca fiind derivata (copil) a clasei "ContBanca". - Clasa derivata defineste un membru, "$cec_nr", de asemenea, defineste un constructor si alte doua metode, "primire_cec()" si "obtine_sold()". Important este faptul ca aceasta clasa mai include si membrii definiti n clasa de baza (parinte): "$cont_id", "$nume_posesor" si "$sold", in plus va mosteni si metoda "c_depozit()". Constructorul clasei copil atribuie valori membrilor mosteniti, dar si membrilor noi definiti n clasa copil. Clasa derivata (copil) se foloseste ca orice clasa. Dupa ce adaugam datele de definire a claselor parinte si copil prezentate mai sus, creem un obiect "ContCurent" care face referire la aceasta clasa copil, ca in exempll urmator. <?php // Aici sunt adaugate datele pentru clasa parinte si clasa derivata (copil)
// Setarea (instantierea) obiectului "ContCurent"

$cont = new ContCurent(8, "Plo Mar", 100, 11); $cont->primire_cec(11, 150); // Apeleaza metoda creata in clasa copil $cont->c_depozit(250); // Apeleaza metoda mostenita echo "<br /> Soldul este". $cont->obtine_sold(); ?>

- Observati ca metoda "c_depozit()", care este definita n clasa de baza, este invocata ca si cum ar fi fost definita n clasa derivata; metodele mostenite se apeleaza la fel ca cele create in clasa copil. - Dupa ce veti include in acelasi fisier php clasa parinte, clasa copil si instantierea de mai sus, rezultatul afisat dupa executia acestui fisier va fi: Soldul este 200". Testati si dv. aceste exemple.

Utilizarea claselor si a obiectelor (2)


Invatati sa redefiniti metodele inadecvate Invatati sa folositi metode care au fost anulate Invatati sa lucrati cu tablouri de obiecte

1. Redefinirea metodelor Uneori, o clasa parinte include o metoda care nu este adecvata pentru o clasa copil. In loc de a defini noua clasa fara referire la o clasa de baza, puteti anula metoda inadecvata adaugand o metoda cu acelasi nume in clasa copil (derivata). Astfel la instantiere va fi folosita metoda, cu acelasi nume, din clasa derivata. De exemplu, sa consideram urmatoarea clasa: <?php class ContBanca2 { var $cont_id; var $nume_posesor; var $sold = 1;
function ContBanca2($id, $nume, $suma) { $this->cont_id = $id; $this->nume_posesor = $nume; $this->sold = $suma; } function inchide_cont() { $suma = $this->sold; $this->sold = 1; return $this->sold; } } ?>

Sa presupunem ca dorim sa derivam din aceasta o clasa copil care reprezinta un nou tip de cont bancar, cu dobnda. La nchiderea contului, programul trebuie sa calculeze dobnda pe care sa o adauge la soldul curent si sa returneze suma acumulata. Iata cum putem proceda, definim clasa derivata astfe:

<?php class ContEco extends ContBanca2 { function inchide_cont($zile, $rata) { $suma = $this->sold * $rata * ($zile / 365); $suma = $suma + $this->sold; $this->sold = 1; return $suma; } } ?>

- In cadrul clasei derivate (copil) este definita o metoda numita "inchide_cont()". O metoda cu acelasi nume exista si n clasa de baza (clasa parinte), dar are o alta definitie. Astfel, in clasa copil nu va mai fi mostenita metoda cu acelasi nume, ci o va folosi pe cea proprie. In continuare creem un obiect "ContEco" si apelam metoda "inchide_cont()" astfel: <?php // Aici sunt adaugate datele pentru definirea clasei de baza, ContBanca2 // Aici sunt adaugate datele pentru definirea clasei derivate, ContEco
$cont = new ContEco(8, "Didi", 100); echo "<br /> Didi primeste ". $cont->inchide_cont(22, 0.8); // Va fi afisat sirul: ?> "Didi primeste 104.82191780822"

- Este invocata metoda "inchide_cont" definita de clasa copil, nu cea definita n clasa parinte. Astfel, metoda definita n clasa parinte a fost anulata (redefinita) de catre metoda, cu acelasi nume, definita n clasa copil. 2. Invocarea unei metode redefinite Daca ncercati sa invocati o metoda anulata (redefinita), probabil ca veti obtine o eroare. Daca in exemplul anterior, am fi scris instructiunea: "echo "<br /> Didi primeste ". $cont->inchide_cont();", fara cele doua argumente (22, 0.8), incercand astfel sa facem referire la metoda anulata "inchide_cont()", am primi mesaje de eroare:

Warning: Missing argument 1 for ContEco::inchide_cont(), Warning: Missing argument 2 for ContEco::inchide_cont(),

Cu toate acestea, este posibila invocarea metodei redefinite. Prin specificarea in clasa copil a numelui clasei parinte, urmat de o pereche de caractere doua puncte (::) si metoda redefinita. Astfel se poate indica programului PHP sa foloseasca metoda, cu acelasi nume, definita n clasa parinte, nu metoda definita n clasa copil.
Invocarea unei metode redefinite este un procedeu mai complicat, pentru incepatori este mai bine a fi evitat deoarece poate complica intelegerea scriptului.

Iata cum ar arata clasa derivata utilizand acest procedeu: <?php class ContEco extends ContBanca2 { function inchide_cont($zile, $rata) {

$suma = ContBanca2::inchide_cont(); $suma = $suma + $suma * $rata * ($zile / 365); return $suma; } } ?>

3. Tablouri cu obiecte Tablourile (numite si matrice) reprezinta o modalitate convenabila pentru lucrul cu mai multe valori. Valorile stocate n tablouri pot face referire la obiecte exact asa cum procedeaza n cazul numerelor sau al sirurilor. Un tablou care face referire la obiecte se numeste "tablou cu obiecte". Pentru a intelege modul de utilizare a unui tablou cu obiecte, sa examinam urmatoarea clasa "ContBanca" si doua clase copil ale acesteia: <?php // Clasa parinte class ContBanca { var $cont_id; var $nume_posesor; var $sold; var $tip_cont;
function ContBanca($id, $nume, $suma, $tip) { $this->cont_id = $id; $this->nume_posesor = $nume; $this->sold = $suma; $this->tip_cont = $tip; } function dump() { return "Cont = ". $this->cont_id. " posesor = ". $this->nume_posesor. " sold = ". $this->sold. " tip = ". $this->tip_cont; }

// Incepe codul pt. prima clasa copil class ContCurent extends ContBanca { function ContCurent ($id, $nume, $suma) { ContBanca::ContBanca($id, $nume, $suma, "curent"); } } // Incepe codul pt. a doua clasa copil class ContEco extends ContBanca { function ContEco ($id, $nume, $suma) { ContBanca::ContBanca($id, $nume, $suma, "economii"); } } ?>

- Remarcati faptul ca metodele constructor ale celor doua clase copil fac referire la constructorul clasei parinte (folosind perechea "::"), reutiliznd n mod eficient caracteristica furnizata de clasa parinte, reducand astfel codul programului.

Acum, creem instante ale claselor copil si stocam referintele la aceste instante ntr-un tablou: <?php $cont[0] = new ContCurent(11, "Plo Mar", 100); $cont[1] = new ContEco(12, "Didi", 140); ?> Dupa ce referintele au fost stocate n tablou, pot fi accesate n mai multe moduri, (vedeti lectiile despre lucrul cu tablouri: Lectia 9 si Lectia 10 ). De exemplu, dupa ce am definit clasele si am stocat instantele in tabloul "$cont[]" de mai sus, adaugam urmatorul cod: <?php // Aici adaugam datele pt. definirea claselor // Aici adaugam codul pentru stocarea instantelor in tablou
foreach ($cont as $contul) { echo "<br /> ". $contul->dump(); } ?>

- Apelam metoda "dump()" deoarece aceasta este inclusa in clasa parinte, deci mostenita de clasele copil, si are ca rol returnarea datelor. - Tabloul este simplu de parcurs, prin invocarea metodei "dump()", care doar afiseaza membrii claselor unui obiect "ContBancar" sau ale unui obiect din una din clasele sale copil. Exemplul va afisa urmatorul rezultat: Cont = 11 posesor = Plo Mar sold = 100 tip = curent Cont = 12 posesor = Didi sold = 140 tip = economii - Primul rand reprezinta datele returnate din "$cont[0]" care face referire la obiectul clasei copil "ContCurent" - Al doilea rand reprezinta datele returnate din "$cont[1]" care face referire la obiectul clasei copil "ContEco" Studiati cu atentie aceste exemple si exersatile (adaugand si alte valori) pana le intelegeti.

Trimitere date la o adresa de e-mail

Invatati sa trimiteti mesaje si date dintr-un formular la o casuta de e-mail.

Este util sa avem pe o pagina din site un formular prin care vizitatorii sa poata trimite mesaje la o adresa de e-mail. Am putea lasa pe pagina doar adresa de e-mail la care vizitatorii sa ne poata contacta, dar aceasta metoda (comoda pt. webmaster) nu este indicata. In primul rand din cauza programelor bot care circula pe net si colecteaza adresele de e-mail de pe site-uri pentru ca mai tarziu sa transmita mail-uri spam. In al doilea rand este mai simplu si mai rapid pentru vizitator sa trimita mesajul direct de pe site. In cadrul acestei lectii este explicat un mod simplu de utilizare a limbajului PHP pentru a expedia la o adresa de e-mail date sub forma de text, preluate de la

un formular HTML. Pentru a putea expedia datele la adresa de mail, scripturile PHP trebuie sa fie capabile de a obtine accesul la serviciile SMTP (Simple Mail Transfer Protocol). Daca folositi serviciile oferite de un "web hosting", majoritatea au implementate aceste functii. Daca folositi propriul sistem pentru gazduirea site-ului, sau pentru teste, este nevoie sa aveti instalat si un server SMTP, acesta preia datele prelucrate de modulul PHP si le trimite la adresa de e-mail. Expedierea mesajelor de e-mail Configuratia PHP standard accepta 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, prin intermediul Internetului. Mesajele de e-mail sunt alcatuite din doua parti: o serie de antete de mesaj si un corp.

- Antetele de mesaj indica adresa destinatarului si subiectul mailului, precum si alte informatii. - Corpul contine mesajul in sine. Pentru a trimite datele la o adresa de e-mail, se foloseste functia mail(), care preia 3 argumente principale, avand urmatoarea forma:

mail($to, $subject, $message)

Unde, in ordinea argumentelor:

- primul argument, aici variabila "$to", va contine adresa de e-mail a destinatarului (unde va fi trimis mesajul) - al doilea argument, aici variabila "$subject", va contine subiect-ul mail-ului - al treilea argument, aici variabila "$message" va contine mesajul Functia "mail()" poate contine si alte adrese de e-mail optionale, astfel un al patrulea argument poate fi "From", care indica adresa de e-mail a expeditorului (cel care trimite mesajul). Functia ar avea astfel urmatoarea forma:

mail($to, $subject, $message, $from )

- Variabila "$from" trebuie sa contina in sir cuvantul "From: " inaintea adresei de e-mail, adica asa: $from="From: adresa@de.mail"; - Daca argumentul "$from" nu este specificat, serverul va transmite automat aceasta adresa (in functie de cum este configurat). Astfel, cand primim mail-ul, pe langa subiect vom avea adresa expeditorului, si daca nu este specificata, putem vedea ceva de genul "nobody@localhost.ro" Datele pentru aceste argumente, in special al treilea (aici "$message"), pot fi preluate dintr-un formular HTML, folosind functia "$_POST".

Functia "mail()" returneaza TRUE daca mail-ul a fost acceptat pentru expediere, in caz contrar returneaza FALSE. Iata un script PHP simplu care va trimite mesaje la o adresa de e-mail: <?php // Verifica daca au fost trimise datele de la formular if (isset($_POST['email']) && isset($_POST['mesaj'])) { $to = 'adresa_ta@de.mail'; // Adresa unde va fi trimis mesajul $subiect = 'Mesaj de pe site'; $mesaj = $_POST['mesaj']; $from = 'From: '. $_POST['email'];
// PHP trimite datele la serverul de e-mail if (mail($to, $subiect, $mesaj, $from)) { echo 'Mesajul a fost trimis cu succes.'; } else { echo 'Eroare, mesajul nu a putut fi expediat.'; } } ?>

- Intai se verifica (cu isset()) daca au fost trimise date de la formularul HTML. Fara aceasta verificare, s-ar expedia mesaje de e-mail ori de cate ori cineva (intentionat) acceseaza direct fisierul php cu scriptul. - Variabilele "$mesaj" si "$from" preiau datele adaugate de vizitator in campurile unui formular HTML care au atributele 'name="mesaj"' si 'name="email"'. Daca functia "mail()" este executata cu succes, va apare mesajul "Mesajul a fost trimis cu succes.", in caz contrar va afisa "Eroare, mesajul nu a putut fi expediat.". Un model de cod HTML pentru crearea formularului care trimite datele la scriptul php de mai sus este urmatoru: <h3>Trimiteti mesaj</h3> <form name="form" method="post" action="nume_script.php"> <label>E-mail : </label> <input type="text" name="email" size="20" /> <br /> <label>Scrie mesajul : </label> <br /> <textarea name="mesaj" cols="35" rows="6"></textarea> <br /> <input type="submit" value="Trimite" /> </form> - "nume_script.php" este calea si numele fisierului in care se afla scriptul php de mai sus. In browser va apare: Trimiteti mesaj
E-mail : Scrie mesajul :

La sectiunea Mailer gasiti un "mailer" mai complet.

- In Partea 2 invatati cum sa trimiteti mail-uri cu PHP care pot cotine tag-uri HTML si cod CSS.

Part. 2

Creare imagini cu PHP


Invatati sa creati si sa afisati imagini cu PHP Invatati sa afisati mai multe imagini generate de PHP in aceeasi pagina

Pe langa crearea de cod de tip text (HTML, XML, ...), PHP poate fi folosit si pentru crearea si manipularea de imagini cu diferite formate (GIF, PNG, JPEG, WBMP si XPM). PHP are implemetat cateva functii pentru lucru cu informatii legate de imagini, cum ar fi lungimea, latimea sau extensia imaginii. Pentru crearea de noi imagini sau manipularea celor existente este necesar sa aveti instalat in PHP o librarii GD cu functii pentru imagini. Pentru mai multe informatii despre cerinte si instalare librarie GD, vizitati GD library. - Daca folositi WampServer sau Xampp, acestea au deja incluse librarii GD. Puteti afla informatii despre libraria GD instalata folosind functia gd_info(), aceasta returneaza o matrice cu informatii despre libraria GD inclusa. Exemplu: <?php var_dump(gd_info()); ?> 1. Crearea imaginilor Pentru crearea unei imagini cu PHP sunt esentiali urmatorii pasi:

- Definirea identificatorului de imagine si suprafata de baza a imaginii. - Stabilirea culorilor fundalului, formei sau a textului din imagine. - Trimiterea datelor de iesire cu imaginea creata. - Eliberarea memoriei asociata creeri imaginii. Cam asta e, pe scurt, partea teoretica, acum sa trecem la practica, voi prezenta pas cu pas un script PHP simplu care va afisa in browser o imagine PNG formata dintr-un dreptunghi cu fundal albastru si in interior un text. Scriptul este urmatorul: <?php $text = 'Textul din imagine';
// setare dimensiuni suprafetei de baza $height = 40; $width = 170; // definirea imaginii $im = imagecreate($width, $height); // setare culori $fundal = imagecolorallocate($im, 10, 10, 250); $text_color = imagecolorallocate($im, 255, 255, 255);

// finalizarea imaginii imagefill($im, 0, 0, $fundal); imagestring($im, 4, 10, 15, $text, $text_color); // trimiterea datelor de iesire header('Content-type: image/png'); imagepng($im); // curatarea memoriei imagedestroy($im); ?>

- Acest script va afisa urmatorul rezultat

Sa studiem acest script - Pentru inceput am setat variabila "$text" ce contine textul care va fi adaugat in imagine, si variabilele "$height" si "$width" care reprezinta dimensiunile imaginii. - In continuare avem "$im = imagecreate($width, $height)", functia imagecreate() returneaza un identificator de imagine ce creaza suprafata de baza a imaginii, prelund ca argumente dimensiunile acesteia (in pixeli).

- Ca alternativa se poate folosi o imagine deja existenta, peste care sa adaugati testul, pentru aceasta se foloseste functia imagecreatefrompng("nume.png") (sau "imagecreatefromjpeg()", "imagecreatefromgif()"; in functie de tipul imaginii), exemplu: $im = imagecreatefrompng("img.png") - Urmatorul pas este definirea culorii pentru fundal si pentru text, pentru aceasta se foloseste functiaimagecolorallocate(), aceasta returneaza un identificator de culoare care va fi folosit pentru accesarea culorii si preia 4 argumente: primul argument este identificatorul de imagine creat cu "imagecreate()" (in script este in variabila "$im"), urmatoarele trei argumente reprezinta valorile RGB (Red, Green, Blue) pentru stabilirea culorii. - Pentru adaugarea culorii de fundal se foloseste functia imagefill(), care preia 4 argumente (in script avem "imagefill($im, 0, 0, $fundal);"), argumentele sunt:

- identificatorul de imagine - urmatoarele doua argumente definesc coordonatele X si Y de start pentru umplerea culorii (0, 0) - ultimul argument reprezinta identificatorul de culoare folosit (aici cel din variabila $fundal) - Pentru adaugarea textului in cadrul imaginii se foloseste functia imagestring(), aceasta preia 6 argumente:

1. - identificatorul de imagine

2. - tipul fondului folosit, care poate fi un numar intre 1 si 5, reprezentand fonturi prestabilite o - ca alternativa se poate folosi functia imageloadfont(), pentru includerea de alte fonturi 3. - al treilea argument reprezinta distanta, in pixeli, fata de marginea din stanga a imaginii 4. - al patrulea argument reprezinta distanta, in pixeli, fata de marginea de sus a imaginii 5. - al cincilea argument reprezinta sirul introdus 6. - ultimul argument este culoarea textului - Urmatotul pas este trimiterea datelor de iesire pentru afisarea in browser.

- Pentru aceasta intai scriptul spune browser-ului ca trimite o imagine si nu test sau HTML, se face acest lucru folosind functia header() cu tipul MIME al imaginii "header('Content-type: image/png')". Daca doriti ca imaginea sa fie de tip JPEG (sau GIF) inlocuiti "png" cu "jpeg" (sau "gif"), astfel 'Content-type: image/jpeg'. - dupa ce s-au trimis datele pentru "header", se trimit datele imaginii utilizand functia imagepng() (sau "imagejpeg()", "imagegif(); in functie de tipul imaginii") care preia ca argument identificatorul de imagine (in script avem "imagepng($im)") o Ca alternativa, imaginea poate fi scrisa intr-un fisier, in loc sa fie afisata in browser o salvati pe server, pentru aceasta se adauga un al doilea parametru la "imagepng()" reprezentand numele fisierului, exemplu "imagepng($im, "img.png")" si nu se mai scrie functia "header()". (trebuie sa aveti permisiuni de scriere pe server) - In final s-a folosit functia imagedestroy() (care foloseste ca argument identificatorul de imagine) pentru eliberarea resurselor de memorie folosite la crearea imaginii. 2. Utilizarea imaginilor create cu PHP Deoarece un header poate fi trimis numai o data pentru o pagina, si asta este singura cale de a spune browser-ului ca sunt trimise date de imagine, poate deveni mai dificil cand se doreste crearea si afisarea mai multor imagini cu PHP. In acest caz: a) Puteti folosi scriptul pentru a salva imaginea pe server (dupa cum a fost explicat mai sus) si apoi folositi etichete <img> pentru afisarea imaginii - Exemplu: <?php $text = 'Textul din imagine';
// setare dimensiuni $height = 50; $width = 170; $im = imagecreate($width, $height); // setare culori

$fundal = imagecolorallocate($im, 10, 10, 250); $text_color = imagecolorallocate($im, 255, 255, 255); // finalizarea imaginii imagestring($im, 4, 10, 15, $text, $text_color); // salvarea imaginii pe server imagepng($im, "img.png"); // curatarea memoriei imagedestroy($im); ?> <img src="img.png" alt="Afisare 1" /> --- <img src="img.png" alt="Afisare 2" />

- Acest script va afisa urmatorul rezultat

---

b) O alta metoda este scrierea intr-un fisier php extern a scriptului care genereaza si afiseaza imaginea, apoi apelati scriptul PHP in atributul src, ca in exemplul urmator: <img src="script_img.php" alt="Afisare 1" /> --- <img src="script_img.php" alt="Afisare 2" /> - Unde "script_img.php" este fisierul PHP care genereaza si afiseaza imaginea - In urmatoarea lectie, Lectia 33, sunt prezentate mai multe functii utile in lucrul cu imagini generate de PHP.

Functii utile pentru lucrul cu imagini

Invatati si exersati diferite functii pentru crearea si manipularea imaginilor Invatati sa copiati si sa redimensionati suprafete din imagini

In aceasta lectie sunt prezentate, cu exemple, cateva functii utile pentru lucrul cu imagini generate de PHP. 1. Functia imageline() - Aceasta functie deseneaza o linie in cadrul imaginii, sintaxa generala este urmatoarea:

imageline("identificator_im", "x1", "y1", "x2", "y2", "id_culoare") Unde

- "identificator_im" reprezinta identificatorul de imagine returnat de o functie pentru crearea imaginii, cum e "imagecreate", "imagecreatetruecolor" sau "imagecreatefrompng" (pt. imagine PNG) - "x1" si "y1" reprezinta coordonatele de start (x, y) pentru punctul de incepere a liniei (in pixeli, in raport cu marginea din stanga si de sus) - "x2" si "y2" reprezinta coordonatele de final (x, y) pentru punctul de terminare a liniei (in pixeli, in raport cu marginea din stanga si de sus) - "id_culoare" reprezinta identificatorul de culoare folosit pentru culoarea liniei (returnat de functia "imagecolorallocate") Iata un exemplu: <?php // setare dimensiuni $height = 40; $width = 170; // definirea cadrului de baza a imaginii $im = imagecreate($width, $height);
// setare culori $fundal = imagecolorallocate($im, 10, 10, 250); $line_color = imagecolorallocate($im, 200, 220, 8); // crearea imaginii imagefill($im, 0, 0, $fundal); imageline($im, 50, 10, 120, 10, $line_color); imageline($im, 40, 20, 130, 20, $line_color); // trimiterea datelor de iesire header('Content-type: image/jpeg'); imagejpeg($im); // curatarea memoriei imagedestroy($im); ?>

// prima linie // a doua linie

- Comentariile necesare sunt deja in codul scriptului. - Functia "imageline()", folosita de 2 ori, va crea doua linii dupa coordonatele dintre paranteze. - Rezultatul accestui script este imaginea de mai jos

2. Functia imagearc() - Aceasta functie deseneaza un arc de cerc centrat pe anumite coordonate date. Sintaxa generala este urmatoarea:

imagearc("identificator_im", "x1", "y1", "width", "height", "start", "end", "id_culoare") Unde

- "identificator_im" reprezinta identificatorul de imagine returnat de o functie pentru crearea imaginii, cum e "imagecreate", "imagecreatetruecolor" sau "imagecreatefrompng" (pt. imagine PNG) - "x1" si "y1" reprezinta coordonatele de start (x, y) pentru centrul arcului de cerc (in pixeli, in raport cu marginea din stanga si de sus) - "width" si "height" reprezinta lungimea, respectiv inaltimea, arcului de cerc. - "start" reprezinta unghiul de inceput al arcului de cerc, in grade - "end" reprezinta unghiul de sfarsit al arcului de cerc, in grade. 0o este localizat la pozitia orei 3, arcul de cerc fiind desenat in sensul acelor ceasornicului. - "id_culoare" reprezinta identificatorul de culoare folosit pentru culoarea liniei arcului de cerc (returnat de functia "imagecolorallocate") Iata un exemplu: <?php // setare dimensiuni $height = 100; $width = 100; // definirea imaginii $im = imagecreate($width, $height);
// setare culori $fundal = imagecolorallocate($im, 10, 10, 250); $cerc_color = imagecolorallocate($im, 220, 220, 8); $arc_color = imagecolorallocate($im, 250, 2, 2); // crearea imaginii imagefill($im, 0, 0, $fundal); imagearc($im, 30, 25, 20, 20, 0, 360, $cerc_color); imagearc($im, 70, 25, 20, 20, 0, 360, $cerc_color); imagearc($im, 50, 44, 70, 70, 25, 150, $arc_color); // trimiterea datelor de iesire header('Content-type: image/jpeg'); imagejpeg($im); // curatarea memoriei imagedestroy($im); ?>

// primul cerc // al doilea cerc // ultimul arc de cerc

- Comentariile necesare sunt deja in codul scriptului. - Functia "imagearc()", folosita de 3 ori, va crea arce de cerc dupa coordonatele dintre paranteze. (Testati singuri scriptul, modificand valorile argumentelor) - Rezultatul accestui script este imaginea de mai jos

- Observati ca pot fi create cercuri complete sau arce de cerc, in functie de valoarea in grade a argumentului sapte ("end").

- Pentru a desena un arc de cerc (sau cerc) cu suprafata colorata, nu doar linia de margine, folositi functia "imagefilledarc()". 3. Functia getimagesize() - Aceasta functie returneaza o matrice cu mai multe elemente ce contin date despre tipul si dimensiunile imagini. Mai importante sunt primele 2 elemente din matrice (index 0 si 1) care reprezinta lungimea, respectiv inaltimea imaginii; si al patrulea element (index 3) care este un sir cu dimensiunile imaginii. Iata un exemplu: <?php $img = 'imagini/image.png'; // calea catre fisierul cu imaginea $size = getimagesize($img); echo "$size[0] - $size[1] <br /> $size[3]"; ?> - "getimagesize()" preia ca argument imaginea si stocheaza datele (matricea) in variabila "$size". - acest script va afisa un rezultat similar cu cel de mai jos (depinde de imaginea folosita) 270 - 100 width="270" height="100" 4. Functia imagecopy() - Aceasta functie copie o portiune dintr-o imagine data. Sintaxa generala este urmatoarea:

imagecopy("identificator_im2", "identificator_im1", "x2", "y2", "x1", "y1", "width", "height") Unde

- "identificator_im2" reprezinta identificatorul celei dea doua imagini, rezultata prin suprafata copiata - "identificator_im1" reprezinta identificatorul primei imagini (sursa), din care va fi copiata portiunea - "x2" si "y2" reprezinta coordonatele de start (x, y) din cadrul celei dea doua imagini, punctul de unde va incepe adaugarea imaginii rezultata prin suprafata copiata - "x1" si "y1" reprezinta coordonatele de start (x, y) din prima imagine, de unde va incepe copierea (in pixeli, in raport cu marginea din stanga si de sus) - "width" si "height" reprezinta lungimea, respectiv inaltimea, suprafetei copiate. Iata un exemplu:

- Avem initial aceasta

imagine - In continuare urmatorul script va copia si afisa o portiune din imagine


<?php // preluarea imaginii sursa $im1 = imagecreatefrompng('imgs/marplo.png'); // definirea identificatorului si a cadrului pt. imaginea 2 // care va rezulta cu suprafata copiata $im2 = imagecreatetruecolor(170, 50); // Copierea suprafetei imagecopy($im2, $im1, 10, 0, 30, 10, 170, 50); // datele de iesire header('Content-Type: image/png'); imagepng($im2); // eliberarea memoriei imagedestroy($im2); imagedestroy($im1); ?>

- "imagecopy()" va copia o suprafata din prima imagine, reprezentata prin "$im1" si o va incadra in cea dea doua imagine, reprezentata prin "$im2" (conform coordonatelor date). - Acest script va returna urmatorul rezultat:

5. Functia imagecopyresized() - Aceasta functie copie si redimensioneaza o portiune dintr-o imagine data. Sintaxa generala este urmatoarea:

imagecopyresized("identificator_im2", "identificator_im1", "x2", "y2", "x1", "y1", "width2", "height2", "width1", "height1") Unde

- "identificator_im2" reprezinta identificatorul celei dea doua imagini, rezultata cu suprafata copiata si redimensionata - "identificator_im1" reprezinta identificatorul primei imagini (sursa), din care va fi copiata portiunea

- "x2" si "y2" reprezinta coordonatele de start (x, y) din cadrul celei dea doua imagini, punctul de unde va incepe adaugarea imaginii rezultata prin suprafata copiata si redimensionata - "x1" si "y1" reprezinta coordonatele de start (x, y) din prima imagine, de unde va incepe copierea suprafetei (in pixeli, in raport cu marginea din stanga si de sus) - "width2" si "height2" reprezinta lungimea, respectiv inaltimea, suprafetei rezultata dupa redimensionare. - "width1" si "height1" reprezinta lungimea, respectiv inaltimea, suprafetei copiate. Iata un exemplu:

- Avem initial aceasta

imagine - In continuare urmatorul script va copia, redimensiona si afisa o portiune din imagine
<?php // preluarea imaginii sursa $im1 = imagecreatefrompng('imgs/marplo.png'); // definirea identificatorului si a cadrului pt. imaginea 2 // care va rezulta cu suprafata copiata si redimensionata $im2 = imagecreatetruecolor(80, 20); // Copierea si redimensionarea suprafetei imagecopyresized($im2, $im1, 0, 0, 10, 10, 80, 20, 170, 50); // datele de iesire header('Content-Type: image/png'); imagepng($im2); // eliberarea memoriei imagedestroy($im2); imagedestroy($im1); ?>

- "imagecopyresized()" va copia o suprafata din prima imagine =, reprezentata prin "$im1" si o va redimensiona si incadra in cea dea doua imagine, reprezentata prin "$im2" (conform coordonatelor date). - Acest script va returna urmatorul rezultat: - Pentru copierea si redimensionarea imaginii cu "resambling", puteti folosi functia imagecopyresampled().
O lista completa cu functiile care pot fi folosite pentru lucrul cu imagini in PHP gasiti aici Functii pentru imagini

Creare PDF cu PHP


Part. 2

In aceasta lectie veti invata cum sa creati documente PDF cu PHP

Pe langa date de tip text sau imagini, cu PHP puteti crea si documente in format PDF (care pot fi citite cu Adobe Acrobat Reader), utile in special cand se doreste scoaterea la imprimanta a paginilor. Pentru crearea documentelor de tip PDF pot fi utilizate functii care folosesc libraria PDFlib. Pentru a folosi functiile specifice acestei librarii trebuie sa aveti PDFlib instalat si activat in modulul PHP. Incepand cu versiunea PHP 5 si PDFlib 6 functiile acesteia sunt apelate ca metodele unei clase. Pe langa faptul ca unele sisteme nu au instalata sau activata aceasta librarie de functii, trebuie sa tineti cont la scrierea programului si de versiunile PHP si PDFlib pe care le folositi, acest lucru poate fi mai dificil pentru incepatori. Totusi, daca sunteti interesati gasiti documentatia pentru crearea documentelor PDF cu PDFlib la pagina creare PDF cu PHP si PDFlib. O alta modalitate mai simpla de a crea documente PDF cu PHP este folosirea unei clase numite FDPF. Avantajul este ca aceasta clasa nu necesita instalarea PDFlib si este gratuita. Aveti nevoie doar de fisierul PHP care contine clasa FPDF si un director cu fonturile pe care le puteti folosi in documentul PDF, acestea le puteti descarca de aici Download Clasa FPDF sau de pe site-ul oficial www.fpdf.org. Documentatia si tutorialele in limba engleza le puteti descarca si de aici -> Documentatie Clasa FPDF. Aceasta lectie are doua parti, in prima parte, aici, voi explica lucrile de baza (pentru incepatori) in crearea documente PDF folosind class FPDF, iar in partea a doua sunt prezentate cateva metode mai avansate. 1. Primul document PDF Primul pas e sa copiati pe server fisierul PHP cu clasa FPDF si directorul cu fonturile, apoi in fisierul dv. php includeti aceasta clasa dupa care urmeaza datele necesare creari documentului PDF. Aceste date trebuie sa fie in principal urmatoarele:

1. Se creaza obiectul ce va reprezenta documentul PDF. Pentru aceasta se foloseste expresia new FPDF(), aceasta poate prelua 3 argumente, exemplu: new FPDF('P','mm','A4'); primul argument defineste orientarea paginii (P - Portrait sau L - Landscape), al doilea argument e pentru unitatea de masura (mm - milimetri, cm - centimetri, pt - point), iar ultimul argument este pt. formatul paginii (A3, A4, A5, Letter). Daca nu sunt specificate argumente, documentul va avea valorile implicite: Portrait, milimetri, A4. 2. Se adauga elemente ce definesc fontul, grafica, textul, imagini si altele. Pentru aceasta se folosesc metodele (functiile) clasei FPDF.

- Aici, inainte de a adauga text, apelati metoda pentru initializarea paginii, functiaAddPage(), si metoda pentru definirea fontului SetFont(). 3. La urma se trimit datele de iesire cu metoda Output(), aceasta poate prelua 2 argumente, avand forma generala. Output('file', 'action') - unde 'file' este numele documentului PDF creat, exemplu 'doc.pdf' - iar 'action' poate fi unul din literele: 'I', 'D', 'F' sau 'S' care reprezinta actiunea ce se va efectua - I trimite fisierul pdf sa fie afisat in browser - D deschide optiunea de download a documentului PDF - F salveaza fisierul pdf pe server, cu numele (si calea) adaugat in primul atribut - S returneaza documentul ca string (sir), numele este ignorat. Daca metoda Output() este apelata fara atribute, documentul PDF va fi afisat direct in browser. Pentru ca documentul PDF creat sa poata fi vizualizat de browser sau descarcat, browser-ul clientului trebuie sa aibe instalat plug-in-ul pentru Adobe Reader. Cand continutul pe care doriti sa-l afisati in pagina PDF depsaseste inaltimea acesteia, se va genera automat o pagina noua. Iata un exemplu simplu in care este creata o pagina PDF si in ea un text. <?php include('fpdf.php'); $pdf=new FPDF(); $pdf->AddPage(); $pdf->SetFont('Arial','',16); $pdf->Text(25,40,'Prima pagina PDF.'); $pdf->Output(); ?> - Dupa includerea fisierului cu clasa FPDF 'fpdf.php' am definit obiectul FPDF() stocat in variabila "$pdf", cu aceasta se va apela metodele clasei. - Odata obiectul creat, am initializat crearea paginii cu "$pdf->AddPage()", apoi am setat fontul apeland metoda specifica "$pdf->SetFont('Arial','B',16)" - primul argument este numele fontului, al doilea este pentru stil (B-bold, I-italic, Uunderline, null-normal). - In continuare am apelat metoda Text() pentru crearea textului, aceasta preia 3 argumente: primul argument reprezinta distanta X fata de marginea din stanga (aici 25), al doilea argument reprezinta distanta Y fata de marginea de sus (aici 40) si ultimul este textul care va apare in pagina PDF. - Dupa ce am definit toate aceste elemente, apelam metoda Output(), fara atribute, care trimite datele de iesire pentru afisarea documentului PDF. - Daca doriti salvarea acestuia pe server, apelati aceasta metoda astfel $pdf>Output('fisier.pdf', 'F'); (in acest caz, PHP trebuie sa aibe permisiuni de creare fisiere pe server). Daca doriti ca utilizatorului sa-i apara optiunea de download, apelati aceasta metoda asa: $pdf->Output('fisier.pdf', 'D'); (fisierul nu va fi salvat si pe server). - Puteti vedea rezultatele acestui exemplu aici -> Demo 1.

In documentatia FPDF gasiti metodele pe care aceasta clasa le poate folosi, rolul lor si argumentele pe care le preia fiecare. 2. Adaugarea unei celule cu text Pe langa text simplu, puteti adauga si celule (cadre) in care sa fie adaugat textul. Aceste celule le puteti crea cu metoda Cell(); sunt similare cu DIV-ul din HTML, le putem defini suprafata, fondul, bordura sau alinierea datelor. Iata un exemplu care va crea o pagina PDF in care avem o celula cu un text centrat in ea. <?php include('fpdf.php'); $pdf=new FPDF(); $pdf->AddPage(); $pdf->SetFont('Arial','',16); $pdf->Cell(36,10,'Text in celula.',1,1,'C'); $pdf->Output(); ?> - Ca si in primul exemplu, dupa ce am inclus fisierul cu clasa FPDF am definit obiectul de lucru si am setat initializarea paginii si fontul. - Functia cell() defineste cadrul celulei si textul din ea, aceasta preia mai multe argumente:

- primele doua reprezinta lungimea si inaltimea celulei - urmatorul argument este textul afisat in celula - celelalte argumente sunt pentru bordura, pozitia pointer-ului in pagina in raport cu celula si alinierea textului din ea - in afara de acestea, functia cell() mai poate prelua 2 argumente: pentru fundal (true) si pentru link. - La urma am apelat metoda Output() care trimite datele de iesire pentru afisare. Rezultatul acestui exemplu il puteti vedea aici -> Demo 2. 3. Linie noua, culori si fond In urmatorul exemplu puteti vedea cum sa adaugati o linie noua in pagina, sa setati o culoare pentru text si pt. fondul unei celule si sa definiti culoarea si grosimea bordurii celulei. Pentru a adauga o linie noua intr-o pagina PDF construita cu clasa FPDF se apeleaza metoda Ln(), aceasta poate prelua un argument numeric ce reprezinta inaltimea noii linii. Pentru definirea unei culori pentru text se foloseste metoda SetTextColor(), aceasta preia 3 argumente numerice cu valoarea intre 0 si 255 reprezentand culorile RGB (Red, Green, Blue). Similar, pentru culoarea de fundal (background) se foloseste metoda SetFillColor() cu cele 3 argumente reprezentand culorile RGB, iar pentru culoarea bordurii se foloseste metoda SetDrawColor(). Grosimea liniei se poate defini cu metoda SetLineWidth(nr), unde "nr" e un numar ce reprezinta grosimea in unitatea de masura data, de obicei milimetri. Daca aceasta metoda nu e specificata, grosimea liniei este 0.2 mm. Iata un exemplu care va crea o pagina PDF cu 2 linii de text (a doua cu text albastru) si o alta linie in care avem o celula cu fond galben, bordura definita si text verde.

<?php include('fpdf.php');

// Include clasa FPDF

// Creaza documentul de lucru $pdf=new FPDF(); $pdf->AddPage(); // Initializeaza pagina $pdf->SetFont('Arial','',16); $pdf->Text(20,10,"Prima linie"); // Adauga prima linie de text $pdf->SetTextColor(1,1,250); // Seteaza culoarea pentru textul care va apare in continuare $pdf->Text(20,16,"Alta linie de text"); // Adauga o alta linie cu text albastru $pdf->ln(10); // Adauga rand nou cu inaltimea 10 mm $pdf->SetDrawColor(0,10,220); // Seteaza o culoare pt. bordura celulei $pdf->SetLineWidth(0.5); // Defineste grosimea bordurii la jumatate de milimetru $pdf->SetFillColor(255,255,10); //Seteaza culoarea pt. background din celula urmatoare $pdf->SetTextColor(0,220,0); // Schimba culoarea pentru urmatorul text $pdf->Cell(115,10,'A treia linie de text in celula, dupa linie noua',1,1,'C',true); // Celula cu background $pdf->Output(); ?> // Trimite datele de iesire la browser

- Ca sa intelegeti rolul fiecarei linii de cod, cititi comentariile asociate. Pentru a vedea rezultatul acestui script click aici -> Demo 3. - Ca sa observati mai bine rolul liniei noi "Ln()", cand testati scriptul, stergeti aceasta linie de cod. 4. Paragraf, Linie, Imagine si Link Paragraf In exemplele de sus ati vazut cum puteti adauga text (pe o linie) folosind metoda "Text()", totusi, aceasta metoda este utila in cazul sirurilor mai mici, pe o singura linie, dar sunt situatii cand trebuie sa adaugati in pagina PDF un continut de text mai mare si care are mai multe linii. In acest caz folositi metoda write(), aceasta permite adaugarea de continut text cu mai multe linii (formate cu "\n") sau cand testul ajunge la marginea din dreapta trece automat pe o noua linie. Sintaxa generala a acestei metode este: Write(h, continut_text, url) - unde "h" este inalimea fiecarei linii din paragraf, "continut_text" este textul adaugat, iar "url" (optional) este o adresa URL care poate fi deschisa cand se da click pe continut_text. Linie Clasa FPDF are si o metoda pe care o puteti folosi pentru trasarea de linii in pagina, aceasta este metoda line() si are urmatoarea sintaxa: Line(x1, y1, x2, y2) - unde "x1" si "y1" sunt coordonatele X si Y pentru punctul de inceput a liniei, iar "x2" si "y2" sunt coordonatele X si Y pentru punctul de sfarsit a liniei Imagine Pe langa date de tip text sau linii, in pagiina PDF puteti adauga cu FPDF si imagini JPEG, PNG sau GIF; pentru aceasta se foloseste metoda Image() care

are urmatoarea sintaxa: Image(src, x, y, w, h, tip, url) - unde "src" este adresa imaginii, aceasta este singura strict necesara, restul sunt optionale. - "x" si "y" sunt coordonatele X si Y pentru coltul din stanga-sus de unde incepe afisarea imaginii, daca nu sunt specificate se folosesc coordonatele curente. - "w" si "h" reprezinta dimensiunile (lungime, inaltime) in care va fi afisata imaginea in pagina, daca nu sunt specificate se folosesc dimensiunile imaginii. - "tip" este tipul imaginii (JPG, JPEG, PNG sau GIF), daca nu e adaugat se preia din extensia acesteia, iar "url" este o adresa URL care poate fi deschisa la click pe imaginea respectiva. Link Sunt mai multe metode, simple sau mai complexe, de a adauga un link in pagina PDF. Aici veti vedea doua metode simple, pentru ceva mai complicat studiati tutorialul din documentatia FPDF. Cea mai simpla metoda e sa scrieti direct adresa URL in continutul textului (vedeti in exemplul de jos), in pagina va apare adresa asa cum ati scris-o iar cand se da click pe ea deschide acea adresa. O alta metoda pe care o puteti folosi e sa adaugati adresa in atributul URL a uneia din metodele: Cell(), Write() sau Image(). Codul din urmatorul exemplu va afisa o pagina PDF in care este un continut text pe mai multe linii care are si o adresa URL, urmat de un link intr-o celula, doua linii si o imagine. <?php include('fpdf.php'); // Include clasa FPDF
// Creaza documentul de lucru $pdf=new FPDF(); // Initializeaza pagina si defineste fontul textului $pdf->AddPage(); $pdf->SetFont('Arial','',15); // Sirul ce contine textul cu mai multe linii, care va fi adaugat in metoda Write() $sir ="Text adaugat cu metoda Write() \r\n Linie noua din cadrul aceluiasi sir, \r\n O alta linie care contine si un link www.marplo.net/php-mysql"; $pdf->Write(5, $sir); // Paragraf cu inaltimea liniei de 5 mm $pdf->SetTextColor(1,1,250); // Seteaza culoarea pentru textul care va apare in continuare $pdf->Ln(10); // Linie noua cu inaltimea 20mm $pdf->SetFont('Arial','I',13); // Modifica stilul si dimensunea textului, pt. evidentiere link $pdf->Cell(23,5,'Link Jocuri','B',1,'C',false,'http://www.marplo.net/jocuri'); // Celula cu link si bordura jos pt. evidentierea acestuia $pdf->Ln(); $pdf->Image('marplo.jpg'); // Linie noua // Adauga o imagine in pagina // Seteaza culoarea pt. linie // Defineste grosimea liniei

// Adaugarea liniilor $pdf->SetDrawColor(90,100,200); $pdf->SetLineWidth(1);

$pdf->line(80,70,100,45); $pdf->line(100,45,120,70); $pdf->Output(); ?>

// Deseneaza prima linie // Deseneaza a doua linie // Trimite datele de iesire la browser

- Studiati codul si comentariile din script ca sa intelegeti modul de lucru. Pentru a vedea rezultatul acestui script click aici -> Demo 4.
Atentie, cand doriti sa adaugati in metode atribute care, in ordine, sunt dupa altele optionale pe care nu doriti sa le folositi, trebuie totusi sa le adaugati si pe acestea (cu valoare nula "" sau false). De exempu, in scriptul de mai sus am vrut sa adaug o adresa URL in metoda "Cell()", care este ultimul atribut, inaintea acestuia fiind atributul pt. background. Desi nu am folosit o culoare pt. background, am adaugat acest atribut ca "false" ca sa fie respectata ordinea atributelor recunoscute de clasa.

In partea a doua a acestei lectii veti invata cum sa adaugati elemente mai avansate in documentul PDF, cum sunt: Header, nr. pagini, tabele sau contint realizat prin recunoasterea unor tag-uri HTML

Utilizare FTP cu PHP


Invatati sa va conectati la server prin FTP folosind PHP Invatati sa transferati fisiere prin FTP cu PHP Functii utile pentru utilizare FTP cu PHP

FTP (File Transfer Protocol) este un protocol standard care realizeaza o conexiune client-server pentru transfer si manipulare de fisiere prin Internet. Cu ajutorul FTP puteti adauga si copia fisiere (si directoare) de pe server sau sa le schimbati permisiunile CHMOD. PHP are functii speciale pentru conectarea la server si lucrul cu FTP. 1. Conectarea la server Pentru conectarea la server prin FTP sunt necesare 3 date importante: adresa serverului (a domeniului), numele de utilizator si parola de conectare prin FTP. La inceput se deschide o conexiune cu serverul, folosind functia ftp_connect(), aceasta preia ca argument necesar numele serverului, care de obicei are forma "ftp.server" ("server" poate fi numele domeniului sau adresa IP a acestuia). Daca deschiderea conexiunii s-a efectuat, functia va returna un ID a conexiunii, in caz contrar returneaza FALSE. Dupa deschiderea conexiunii se face autentificarea pe server, pentru aceasta se foloseste functia ftp_login() care are urmatoarea sintaxa: ftp_login(conn_id, nume_user, parola) - unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()" - "nume_user" este numele de utilizator pentru conectare la FTP, iar "parola" este parola utilizatorului. Pentru inchiderea conectarii se foloseste functia ftp_close(), aceasta preia ca argument id-ul conexiunii.

Iata un exemplu de conectare prin FTP la server-ul unui site:


<?php // Datele pt. conectare la server $ftp_server = 'ftp.un_site.net'; 'ftp.marplo.net' $ftp_user = 'utilizator'; $ftp_pass = 'parola'; // Seteaza Id-ul conexiunii $conn_id = ftp_connect($ftp_server); // Executa autentificarea pe server $login_result = ftp_login($conn_id, $ftp_user, $ftp_pass); // Verifica daca s-a reusit sau nu conectarea la server if ((!$conn_id) || (!$login_result)) { echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul $ftp_user a iesuat."; exit; } else { echo "Conectare reusita la serverul $ftp_server, pentru utilizatorul $ftp_user"; } // Inchide conexiunea ftp_close($conn_id); ?> // Poate fi de exemplu

- Daca s-a efectuat cu succes conectarea si autentificarea pe server, va afisa mesajul de confirmare, in caz contrar apare mesajul de eroare. - La urma, "ftp_close($conn_id);" inchide conexiunea si elibereaza memoria alocata. Conectarea la server folosind codul de mai sus este primul pas, dupa aceasta puteti folosi functiile PHP specifice FTP pentru a efectua diferite operatii, cum sunt: preluarea continutului directoarelor, incarcarea sau descarcarea de fisiere, crearea de noi directoare sau modificarea permisiunilor CHMOD. 2. Preluarea continutului directoarelor Pentru a prelua continutul unui director (numele fisierelor si directoarelor din el) se foloseste functia ftp_nlist(conn_id, director) - unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()" - "director" este numele directorului a carui continut va fi preluat Aceasta functie returneaza o matrice secventiala a carei elemente sunt numele fiecarui director si fisier din catalogul cautat. Mai jos este un exemplu practic. <?php // Datele pt. conectare la server $ftp_server = 'ftp.domeniu_site'; // Poate fi de exemplu 'ftp.marplo.net' $ftp_user = 'utilizator';

$ftp_pass = 'parola'; // Seteaza Id-ul conexiunii $conn_id = ftp_connect($ftp_server); // Executa conectarea $login_result = ftp_login($conn_id, $ftp_user, $ftp_pass); // Verifica daca s-a reusit sau nu conectarea la server if ((!$conn_id) || (!$login_result)) { echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul $ftp_user a iesuat."; exit; } else { // Obtine continutul directorului (numele de fisiere si directoare din el) $continut = ftp_nlist($conn_id, "."); // Parcurge matricea si afiseaza numele directoarelor si fisierelor returnate for ($i=0; $i<count($continut); $i++) { echo '<br>'.$continut[$i]; } } // Inchide conexiunea ftp_close($conn_id); ?>

- Dupa setarea conexiunii si autentificarea pe server, daca conectarea a reusit este apelata functia "ftp_nlist()", care va stoca in variabila "$continut" matricea cu numele cataloagelor si fisierelor din directorul radacina (precizat de argumentul "."). Daca doriti obtinerea datelor din alt director, de exemplu "www", puteti apela functia asa: ftp_nlist($conn_id, '/www'). - Pentru afisarea (sau preluarea) numelui fiecarui fisier si director returnat se parcurge matricea "$continut". Rezultatul afisat de acest script va fi ceva similar cu cel de jos: cgi-bin private public_html statistics www 3. Incarcare fisier pe server Pentru incarcarea (upload) unui fisier pe server prin FTP cu PHP se foloseste functia ftp_put(), aceasta returneaza TRUE daca incarcarea s-a efectuat cu succes, in caz contrar returneaza FALSE. Are urmatoarea sintaxa: ftp_put(conn_id, destinatie, fisier, tip_transfer) - unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()" - "destinatie" este directorul (si numele fisierului) pe server unde va fi incarcat fisierul - "fisier" este numele fisierului care va fi copiat - "tip_transfer" reprezinta modul incarcarii pe server, acesta poate lua

valoarea FTP_ASCII sau FTP_BINARY Iata un exemplu in care se copie un fisier de pe calculatorul client pe server, in directorul 'www': <?php // Datele pt. conectare la server $ftp_server = 'ftp.domeniu_site'; $ftp_user = 'utilizator'; $ftp_pass = 'parola';
// Seteaza Id-ul conexiunii $conn_id = ftp_connect($ftp_server); // Executa conectarea $login_result = ftp_login($conn_id, $ftp_user, $ftp_pass); // Verifica daca s-a reusit sau nu conectarea la server if ((!$conn_id) || (!$login_result)) { echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul $ftp_user a iesuat."; exit; } else { // Datele cu numele fisierului, sursa unde se afla si directorul unde va fi incarcat pe server $fisier = 'test.txt'; $sursa = 'c:/wamp/www/site/'. $fisier; $destinatie = '/www/'. $fisier; // Apeleaza functia "ftp_put()" pt. efectuarea transferului // Afiseaza mesaj de reusita sau nu if (ftp_put($conn_id, $destinatie, $sursa, FTP_BINARY)) echo "Fisierul $fisier a fost incarcat pe server"; else echo "Eroare, fisierul $fisier nu a putut fi incarcat pe server"; } // Inchide conexiunea ftp_close($conn_id); ?>

- Daca datele pentru conectare sunt corecte si PHP are permisiuni de transfer prin FTP, fisierul "test.txt" (aflat pe calculatorul client in directorul "c:/wamp/www/site/") va fi copiat pe server, in directorul "www/". - Fisierul va fi incarcat cu acelasi nume, daca doriti sa fie transferat pe server cu alt nume, modificati la "$destinatie". 4. Copiere fisier de pe server Pentru copierea (download) unui fisier de pe server pe calculatorul client se foloseste functia ftp_get(), aceasta returneaza TRUE daca transferul s-a efectuat cu succes, in caz contrar returneaza FALSE. Are urmatoarea sintaxa: ftp_get(conn_id, client, fisier, tip_transfer) - unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()" - "client" este locatia de pe calculatorul client unde va fi copiat fisierul - "fisier" este numele fisierului (si locatia) de pe server unde acesta se gaseste - "tip_transfer" reprezinta modul incarcarii pe server, acesta poate lua

valoarea FTP_ASCII sau FTP_BINARY Iata un exemplu in care se descarca prin FTP un fisier de pe server pe calculatorul client: <?php // Datele pt. conectare la server $ftp_server = 'ftp.domeniu_site'; $ftp_user = 'utilizator'; $ftp_pass = 'parola';
// Seteaza Id-ul conexiunii $conn_id = ftp_connect($ftp_server); // Executa conectarea $login_result = ftp_login($conn_id, $ftp_user, $ftp_pass); // Verifica daca s-a reusit sau nu conectarea la server if ((!$conn_id) || (!$login_result)) { echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul $ftp_user a iesuat."; exit; } else { // Datele cu numele fisierului, sursa unde se afla si directorul unde va fi copiat $fisier = 'test.txt'; $server = '/www/'. $fisier; $client = 'c:/download/'. $fisier; // Apeleaza functia "ftp_get()" pt. efectuarea transferului // Afiseaza mesaj de reusita sau nu if (ftp_get($conn_id, $client, $server, FTP_BINARY)) echo "Fisierul $fisier a fost descarcat"; else echo "Eroare, fisierul $fisier nu a putut fi descarcat"; } // Inchide conexiunea ftp_close($conn_id); ?>

- Daca datele pentru conectare sunt corecte si PHP are permisiuni de transfer prin FTP, fisierul "test.txt" (aflat pe server in directorul "www/") va fi copiat pe calculatorul client, in directorul "c:/download/". - Fisierul va fi copiatat cu acelasi nume, daca doriti sa fie descarcat pe calculator cu alt nume, modificati la "$client". Daca in directorul unde va fi copiat se mai afla un fisier cu acelasi nume, acesta va fi inlocuit cu cel descarcat de pe server. 5. Creare director pe server Inainte de a crea un director nou prin FTP, setati directorul curent de lucru care reprezinta locatia unde doriti sa fie creat noul catalog. Pentru aceasta se foloseste functia ftp_chdir(conn_id, director); "conn_id" este id-ul conexiunii iar "director" este numele directorului care va fi setat pentru lucru. Pentru crearea unui director pe server prin FTP se foloseste functia ftp_mkdir(), in caz de succes returneaza numele noului director creat,

iar in caz contrar returneaza FALSE. Are urmatoarea sintaxa: ftp_mkdir(conn_id, nume_dir) - unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()" - "nume_dir" este numele noului director Iata un exemplu in care se creaza un director "test" pe server, in "www/":
<?php // Datele pt. conectare la server $ftp_server = 'ftp.domeniu_site'; $ftp_user = 'utilizator'; $ftp_pass = 'parola'; // Seteaza Id-ul conexiunii $conn_id = ftp_connect($ftp_server); // Executa conectarea $login_result = ftp_login($conn_id, $ftp_user, $ftp_pass); // Verifica daca s-a reusit sau nu conectarea la server if ((!$conn_id) || (!$login_result)) { echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul $ftp_user a iesuat."; exit; } else { $dir = 'un_director'; // Numele noului director // Daca e setat directorul de lucru "www/" if(ftp_chdir($conn_id, '/www/')) { // Apeleaza functia "ftp_mkdir()" pt. crearea directorului // Afiseaza mesaj de reusita sau nu if (ftp_mkdir($conn_id, $dir)) echo "Directorul $dir a fost creat"; else echo "Eroare, directorul $dir nu a putut fi creat"; }

// Inchide conexiunea ftp_close($conn_id); ?>

- Daca datele pentru conectare sunt corecte si directorul curent de lucru (www/) este setat cu succes iar PHP are permisiuni de scriere pe server, in catalogul "www/" va fi creat directorul "un_director". Pentru stergerea unui director se foloseste functia ftp_rmdir(conn_id, del_dir), unde "conn_id" este id-ul conexiunii iar "del_dir" este numele directorului care va fi sters. 6. Transferarea unei portiuni de fisier pe server Pe langa transferul unui fisier complet, PHP ofera si functii pentru transferul unei anumite parti din continutul unui fisier. O functie care face acest lucru este ftp_fput(), aceasta incarca pe server continut dintr-un fisier deschis cu "fopen()", returneaza TRUE in caz de succes, iar in caz contrar returneaza FALSE. Are urmatoarea sintaxa: ftp_fput(conn_id, destinatie, pointer_fisier, tip_transfer)

- unde "conn_id" este id-ul conexiunii returnat de "ftp_connect()" - "destinatie" este directorul de pe server unde va fi incarcat fisierul - "pointer_fisier" reprezinta identificatorul (pointer-ul) de fisier deschis cu "fopen()". Retine continutul de la acest pointer pana la sfarsitul fisierului. - "tip_transfer" reprezinta modul incarcarii pe server, acesta poate lua valoarea FTP_ASCII sau FTP_BINARY Iata un exemplu in care este preluata o parte din continutul unui fisier si transferata intr-un fisier pe server: <?php $fisier = "test.txt"; // Fisierul care va fi deschis pt. citire
// Daca fisierul a fost deschis pt. citire if ($fp = fopen($fisier, rb)) { fseek($fp, 40); // Seteaza pozitia pointer-ului in fisier // Datele pt. conectare la server $ftp_server = 'ftp.domeniu_site'; $ftp_user = 'utilizator'; $ftp_pass = 'parola'; // Seteaza Id-ul conexiunii $conn_id = ftp_connect($ftp_server); // Executa conectarea $login_result = ftp_login($conn_id, $ftp_user, $ftp_pass); // Verifica daca s-a reusit sau nu conectarea la server if ((!$conn_id) || (!$login_result)) { echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul $ftp_user a iesuat."; exit; } else { $destinatie = '/www/test2.txt'; // Directorul destinatie si numele fisierului // Transfera continutul intr-un fisier nou pe server // Afiseaza mesaj de reusita sau nu if (ftp_fput($conn_id, $destinatie, $fp, FTP_BINARY)) echo 'Continutul a fost transferat'; else echo 'Eroare, continutul nu a putut fi transferat'; } // Inchide conexiunea ftp_close($conn_id); // Elibereaza memoria ocupata de deschiderea fisierului fclose($fp); } ?>

- Daca fisierul "test.txt" a fost deschis pentru citire, functia "fseek($fp, 40)" muta pointer-ul la pozitia 40, astfel va fi retinut continutul din fisier care incepa de la caracterul 41 pana la sfarsit (primul caracter are pozitia 0).

- In continuare, daca s-a efectuat cu succes conexiunea si autentificarea prin FTP, se transfera continutul in fisierul "test2.txt" din directorul "www" de pe server (daca fisierul "test2.txt" exista deja pe server, continutul lui va fi inlocuit cu cel transferat). In cazul in care doriti sa transferati intreg continutul unui fisier deschis cu "fopen()", nu este necesara utilizarea funtiei "fseek()". Aceasta metoda este utila cand doriti sa adaugati un sir sau continut, de exemplu preluat dintr-un form, pe server prin FTP. Adaugati sirul intr-un fisier temporar pe care apoi il deschideti cu "fopen()" si transferati continutul cu "ftp_fput()". Pentru stergerea unui fisier se foloseste functia ftp_delete(conn_id, 'cale/fisier'), unde "conn_id" este id-ul conexiunii iar "cale/fisier" este calea si numele fisierului care va fi sters. 7. Alte functii utile pentru FTP Pe langa functiile prezentate in exemplele de mai sus, PHP are si alte functii utile pentru lucrul cu fisiere si directoare prin FTP. Iata cateva din acestea:

ftp_cdup(conn_id) - Schimba ca director curent de lucru directorul parinte ftp_chmod(conn_id, octal_CHMOD, fisier) - Seteaza permisiunile CHMOD a unui fisier prin FTP ftp_mdtm(conn_id, fisier) - returneaza timpul, in format Unix, cand a fost ultima data modificat un fisier ftp_pwd(conn_id) - Returneaza numele directorului curent de lucru ftp_rename(conn_id, nume_actual, nume_nou) - Modifica numele unui director sau fisier ftp_size(conn_id, fisier) - Returneaza marimea fisierului specificat, in bytes (unele servere nu suporta aceasta functie)

O lista completa cu functiile PHP pentru FTP gasiti la adresa din urmatorul link Functii PHP pentru FTP

Creare site cu PHP, fara baza de date

In aceasta lectie este prezentat si explicat modul de creare a unui site simplu, de la zero, folosind PHP, si fara a utiliza baza de date. Datele despre paginile site-ului sunt stocate intr-o matrice iar continutul acestora, doar ce se schimba de la o pagina la alta, se va afla in fisiere. Obiectul acestui tutorial este codul PHP si logica acestuia pentru crearea unui site simplu de prezentare, designul HTML, CSS nu este finalizat pentru aspect grafic.

Ca sa intelegeti si sa aplicati tutorialul din aceasta lectie, trebuie sa aveti cunostinte generale despre HTML, CSS si PHP. 1. Structura site-ului Site-ul va contine:

un fisier principal "index.php", un alt fisier PHP, denumit "admin.php" in care e stocata matricea cu paginile site-ului, continand datele acestora: nume, titlu, descriere si cuvinte cheie, un fisier pentru stilurile CSS, denumit "grafic.css", in care e definit designul paginilor, un director "pagini" in care sunt adaugate fisierele pentru continutul specific fiecarei pagini. Fisierul principal este "index.php", in acesta este scris:

- La inceput, codul PHP cu includerea fisierului "admin.php" si scriptul PHP care prelucreaza datele pentru generarea paginilor. - Dupa scriptul PHP este adaugat codul HTML: sectiunea HEAD cu meta-tag-urile si in BODY template-ul (sau layout-ul) site-ului. - Template-ul este format din trei zone principale: top, corp si subsol. Corpul este impartit in doua zone:meniu (pozitionat in stanga) si context. In afara de ce apare in context, tot restul codului HTML este creat si generat in "index.php" si va apare in toate paginile. 2. Crearea codului din "index.php" Fisierul "index.php" va avea doua parti principale: - Prima parte, la inceput, unde scriem codul PHP cu includerea matricei pentru datele paginilor si scriptul care le prelucreaza si genereaza datele pt. meta-tags si codul HTML pentru meniu, cu link-urile in functie de paginile adaugate in matrice. Aceste date vor fi pastrate in variabile. - A doua parte este codul HTML cu sectiunea HEAD si strucura generala a template-ului. In acest cod se includ, cu "echo", variabile PHP generate de script: pentru meta-tags si meniu; in locatia lor. Ca exemplu, voi crea un model de site simplu de prezentare, cu urmatoarele pagini: 'Despre mine', 'Favorite', 'Poze' siContact. La Poze va fi 3 submeniuri: Familie, Prieteni si Natura. In continuare iata codul complet pentru fiecare fisier, explicatiile necesare le gasiti in documentatia adaugata. De asemenea, puteti descarca arhiva cu fisierele acestui exemplu de aici -> Creare Site.

- Fisierul admin.php
<?php // Datele initiale pt. HEAD ale pagini "index" $titlu = 'Titlul paginii index'; $desc = 'Descrierea pentru pagina index';

$keys = 'cuvnte, cheie, pagina, index'; /*** Matricea cu datele despre paginile adaugate in site, care apar in "context" ***/ // Este formata din numele paginilor ca si cheie principala // Fiecare contine un array cu: Titlul paginii, Descriere si Cuvintecheie (pt. sectiunea HEAD) // Sau pt. submeniuri, cu alte array imbricate, ce contin datele de mai sus (cum e la 'poze') $pags['despre_mine'] = array( 'titl'=>'Titlul paginii Despre Mine', 'desc'=>'Descrierea paginii Despre Mine', 'keys'=>'cuvinte, cheie, despre, mine' ); $pags['favorite'] = array( 'titl'=>'Titlul paginii Favorite', 'desc'=>'Descrierea paginii Favorite', 'keys'=>'cuvinte, cheie, favorite' ); $pags['poze'] = array( 'familie'=>array( 'titl'=>'Titlul pt. pagina Poze Familie', 'desc'=>'Descriere pt. pagina Poze Familie', 'keys'=>'cuvinte, cheie, poze, familie' ), 'prieteni'=>array( 'titl'=>'Titlul pt. pagina Poze Prieteni', 'desc'=>'Descriere pt. pagina Poze Prieteni', 'keys'=>'cuvinte, cheie, poze, prieteni' ), 'natura'=>array( 'titl'=>'Titlul pt. pagina Poze Natura', 'desc'=>'Descriere pt. pagina Poze Natura', 'keys'=>'cuvinte, cheie, poze, natura' ) ); $pags['contact'] = array( 'titl'=>'Titlul paginii Contact', 'desc'=>'Descrierea paginii Contact', 'keys'=>'cuvinte, cheie, contact' ); // Daca doriti sa adaugati alte meniuri sau submeniuri pt. alte pagini de site // Adaugati in continuare, comform modelului de mai sus // De asemenea, trebuie sa adaugati in dir. "pagini" fisierul ce contine contextul afisat de acel meniu ?>

- Fisierul index.php
<?php // Exemplu creare site cu PHP, de la http://www.marplo.net ini_set('display_errors',1);

error_reporting(E_ALL); // Include fisierul "admin.php", in care e matricea cu datele fiecarei pagini include('admin.php'); /*** Crearea variabilei ce contine codul HTML pt. meniu, cu paginile din matrice ***/ $meniu = '<ul><li><a href="index.php" title="Pagina principala">Pagina principala</a></li>'; // Initializeaza variabila pt. meniu // Parcurge matricea cu foreach() si adauga un link in <li> pt. fiecare pagina // Verifica daca sunt submeniuri si creaza codul HTML pt. ele foreach($pags as $kei=>$pagini) { // Daca elementul are cheia 'titl', e considerat cu link direct, fara submeniu if (isset($pags[$kei]['titl'])) { // Daca e meniu direct // Creaza link-ul, codificat urlencode() si prima litera din nume majuscula cu ucfirst() $link = '<a href="index.php?id='. urlencode($kei).'" title="'. $pagini['titl']. '">'. str_replace('_', ' ', ucfirst($kei)). '</a>'; // Adauga link-ul in meniu $meniu .= '<li>'. $link. "</li>\r\n"; } else { // Altfel e considerat cu submeniu $meniu .= '<li class="smeniu"><a href="#"><span>'. str_replace('_', ' ', ucfirst($kei)). '</a></span><ul>'; // Parcurge submeniul foreach($pagini as $kei2=>$pagini2) { // Creaza link-ul, codificat urlencode() si prima litera din nume majuscula cu ucfirst() $link = '<a href="index.php?id='. urlencode($kei). '&amp;sm='. urlencode($kei2).'" title="'. $pagini2['titl']. '">'. str_replace('_', ' ', ucfirst($kei2)). '</a>'; // Creaza submeniul cu link-ul si numele $meniu .= '<li>'. $link. "</li>\r\n"; } $meniu .= '</ul></li>'; // Inchide codul HTML pt. submeniu } } $meniu .= '</ul>'; // Inchide codul HTML pt. tot meniul /*** Prelucrarea datelor primite prin GET ***/ // Verifica daca sunt primite date prin GET si daca acestea se afla in matrice // Creaza variabilele pt. meta-tags si continutul ce va fi inclus if (isset($_GET['id']) && isset($pags[urldecode(trim($_GET['id']))])) { $pg = urldecode(trim($_GET['id'])); // Numele paginii, decodificat URL, care va fi inclusa pt. continut $obj = $pags[$pg]; // Obiectul cu datele despre pagina

// Daca e accesata pagina din submeniu if (isset($_GET['sm']) && isset($obj[urldecode(trim($_GET['sm']))])) { $pg = urldecode(trim($_GET['sm'])); // Numele paginii, decodificat URL, care va fi inclusa pt. continut $obj = $obj[$pg]; } // Seteaza variabilele cu datele pt. sectiunea HEAD $titlu = $obj['titl']; $desc = $obj['desc']; $keys = $obj['keys']; } // In continuare, codul HTML in care se adauga variabilele necesare generate de PHP ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title><?php echo $titlu; ?></title> <meta name="description" content="<?php echo $desc; ?>" /> <meta name="keywords" content="<?php echo $keys; ?>" /> <meta name="robots" content="index, follow" /> <link href="grafic.css" rel="stylesheet" type="text/css" /> </head> <body> <!-- Start Top pagina --> <div id="top"> <h1>Sectiunea din top-ul paginii</h1> <h2>Va apare in toate paginile site-ului</h2> </div> <!-- Start Corp pagina --> <div id="corp"> <!-- Start Meniu --> <div id="meniu"> <h4>Meniu</h4> <?php echo $meniu; ?> </div> <!-- Start Context --> <div id="context"> <?php // Daca e setata o valoare pt. variabila $pg, // Variabila devinita cand e accesat un link din meniu if (isset($pg)) { // Include fisierul in care e continutul include('pagini/'.$pg.'.php'); } else { // Daca nu e apelat vreun link din meniu // Afiseaza continutul dorit pt. pagina "index" // Il puteti afisa cu 'echo' sau sa includeti din alt fisier extern echo '<h3>Continut initial pentru pagina index</h3>

<h3>Creati cu "echo" tag-urile HTML sau includeti continut din alt fisier extern,<br /> cu include("fisier.php") sau readfile("fisier.html")</h3>'; } ?> </div> </div> <!-- Start Subsol pagina --> <div id="subsol"> <h4>Continutul din subsolul paginii</h4> <h4>Va apare in toate paginile site-ului</h4> </div> </body> </html>

- Fisierul grafic.css
body { margin:0px auto; width:1000px; background-color:#e8e8fe; text-align:center; } /* Grafica pentru sectiunea Top */ #top { margin:2px auto; position:relative; border:1px solid #ceceda; background-color:#dedeee; } /* Grafica pentru sectiunea Corp */ #corp { position:relative; margin:2px auto; width:100%; border:1px solid #eeeefe; background-color:#ededfe; text-align:left; } /* Grafica pentru Meniu */ #meniu { float:left; position:relative; width:250px; margin:2px auto; border:1px solid #dafedf; background-color:#deefee; padding-left:5px; } #meniu ul { margin:0px;

} #meniu ul li { display:block; position:relative; margin:0px; width:235px; border:1px solid silver; padding:2px 0px 2px 5px; } #meniu ul li a { display:block; margin:0px; width:100%; border:1px solid #daccfe; } #meniu ul li a:hover { background-color:#ebede0; } #meniu .smeniu ul { display:none; position:absolute; top:0px; } #meniu li span { overflow:hidden; } #meniu .smeniu:hover ul { display:block; left:190px; z-index:12; } /* Grafica pentru Context */ #context { min-height:200px; margin:0px 1px 1px 260px; padding:3px 5px; } /* Grafica pentru sectiunea Subsol */ #subsol { clear:both; position:relative; margin:2px auto; border:1px solid #ceced8; background-color:#ebede0; z-index:10; }

background-color:#cceede; list-style:none; padding:0px 0px 1px 5px;

- Pe langa aceste fisiere, creati un director "pagini" in care adaugati fisierele ce au continutul specific pentru fiecare link din meniu, si care apare in zona "context".

- Codul generat de "index.php" este ordonat si valid XHTML. - Observati ca template-ul, codul HTML din HEAD si BODY e simplu, foloseste cateva variabile standard, generate de script-ul PHP, in rest, structura acestuia poate fi oricand modificata usor, pentru toate paginile; trebuie doar sa se tina cont de adaugarea variabilelor pentru meta-tags, meniu si codul PHP din zona "context" care include continutul paginii accesate. In HEAD puteti adauga si alte stiluri CSS sau script-uri JavaScript. - Cand doriti sa adaugati pagini noi in site, sa le stergeti sau sa modificati numele lor, lucrati in fisierul "admin.php". Acolo sunt stocate, in matricea "$pags[]", elementele ce contin datele necesare afisarii fiecarei pagini. Pentru orice pagina noua, adaugati un element pt. matrice, ($pags['nume']) dupa modelul celor deja existente, apoi in directorul "pagini" adaugati un fisier cu acelasi 'nume' si care sa contina doar continutul care sa fie afisat in sectiunea "context".

Important
- Numele fisierelor pe care le adaugati in directorul "pagini" (pt. continut din context) trebuie sa fie acelasi cu numele cheii din elementul matricei "$pags[]" pentru pagina respectiva. - Numele din Meniu care va contine subdomeniu trebuie sa fie diferit de cheile: titl, desc si keys. - Ordinea afisarii numelor in meniu este aceeasi cu cea a elementelor din matrice. 3. Cosmetizarea link-urilor Daca doriti sa "cosmetizati" link-urile paginilor, generate in meniul din exemplul de sus, sa le faceti "user friendly", puteti folosi mod-rewrite. Pentru aceasta, adaugati intr-un fisier ".htaccess" (care sa se afle in acelasi loc unde e si "index.php") urmatorul cod: Options +FollowSymLinks RewriteEngine On
#RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([a-zA-Z_]+).html$ index.php?id=$1 [NC,L] RewriteRule ^([a-zA-Z_]+)-([a-zA-Z_]+).html$ index.php?id=$1&sm=$2 [NC,L]

- Link-urile vor avea forma "nume_pagina.html", - iar pentru cele cu submeniu vor avea forma "meniu-nume_pagina.html". In script-ul PHP din "index.php", unde este generat codul pentru meniu, trebuie efectuate urmatoarele doua modificari: In loc de $link = '<a href="index.php?id='. urlencode($kei).'" title="'. $pagini['titl']. '">'. str_replace('_', ' ', ucfirst($kei)). '</a>'; Scrieti $link = '<a href="'. urlencode($kei).'.html" title="'. $pagini['titl']. '">'. str_replace('_', ' ', ucfirst($kei)). '</a>'; Iar pentru submeniuri, inlocuiti $link = '<a href="index.php?id='. urlencode($kei). '&amp;sm='. urlencode($kei2).'" title="'. $pagini2['titl']. '">'. str_replace('_', ' ', ucfirst($kei2)). '</a>'; Cu

$link = '<a href="'. urlencode($kei). '-'. urlencode($kei2).'.html" title="'. $pagini2['titl']. '">'. str_replace('_', ' ', ucfirst($kei2)). '</a>';

Sau puteti descarca versiunea cu mod-rewrite a acestui exemplu de aici -> Creare Site 2.
Daca studiati codul HTML al paginilor, generat de PHP, veti intelege mai bine rolul datelor din matrice si ce face scriptul PHP. Codul paginii poate fi vazut, daca folositi Mozilla Firefox, din meniul View -> Page Source.

Creare site cu PHP si MySQL - CMS


Part. 2 -- Part. 3 In aceasta lectie puteti invata cum sa creati un site de la zero, care foloseste si baza de date MySQL. Trebuie sa aveti cel putin cunostintele de baza despre PHP, MySQL, HTML si CSS. Datele despre numele paginilor, titlu, cuvinte cheie si descriere vor fi stocate intr-un tabel dintr-o baza de date MySQL, iar continutul fiecarei pagini va fi salvat in fisiere intr-un director pe server. Toate aceste date vor putea fi adaugate sau stere dintr-o pagina de administrare. Acest sistem de script pentru site se mai numeste si CMS, acronim de la Content Management System, o colectie de proceduri prin care continutul, paginile site-ului, pot fi adaugate, sterse si modificate automat dintr-o pagina de administrare. Exemplul din aceast tutorial este un fel de CMS mai simplu, care da posibilitatea de a adauga in site: categorii, meniuri si continut, precum si stergerea lor din pagina de Admin. Pentru a nu complica prea mult scriptul si necesitatea explicatiilor, nu am adaugat si o procedura de modificare. Ideea fiind sa puteti invata esentialul in modul de creare a unui site cu PHP si MySQL. Continutul paginilor il puteti apoi modifica din fisierele in care a fost salvat. Accentul este pus pe partea de programare, grafica site-ului pentru modelul prezentat aici o face fiecare. Sistemul permite usor crearea si folosirea unui template HTML Daca doriti sa invatati cum sa creati un script de site CMS, va sfatuiesc sa cititi cu atentie acest tutorial si sa scrieti personal scriptul din fiecare fisier, dupa codul prezentat in continuare pentru fiecare. Daca doar vreti sa folositi acest model pentru a-l adapta si dezvolta, descarcati arhiva cu tot scriptul si studiati documentatia din el. - Scriptul complet il puteti descarca de aici -> Creare site - CMS. In fisierele scriptului gasiti explicatiile necesare intelegeri fiecarei linii de cod si la ce sunt folosite. In acest tutorial este explicat in mare structura si logica scriptului. 1. Structura site-ului Inainte de a incepe crearea unui site, trebuie stabilita structura acestuia, care consta din 3 elemente principale (daca folosim si baza de date):

- structura tabelului (tabelelor) din baza de date. - structura fisierelor si directoarelor pe server. - structura paginii (paginilor) siteului, layout-ul. Luam pe fiecare in parte. Pentru exemplu de site, relativ simplu, din aceasa lectie, este folosit un singur tabel MySQL, care are urmatoarele coloane: - id - o coloana de tip INTEGER AUTO_INCREMENT, care va avea un 'id' (numar) unic pentru fiecare pagina adaugata. - meniu - unde e inregistrat numele meniurilor principale (categoria careia apartine pagina). - pagina - pentru numele care-l are fisierul ce contine contextul paginii respective. - titlu - in care e stocat titlul ce va fi adaugat in sectiunea HEAD, folosit si pt. formarea numelui si URL-ul paginii - descriere - pentru descrierea din meta-tag "description". - cuv_key - pentru cuvintele cheie care vor fi adaugate la fiecare pagina in meta-tag "keywords". - data - pentru inregistrarea datei (in format UNIX) la care sunt adaugate paginile. La structura de pe server sunt folosite 5 fisiere principale si un director pentru stocarea fisierelor unde va fi salvat continutul fiecarei pagini (vor fi prezentate fiecare mai tarziu). Structura paginii (layout-ul) este creata in "index.php", cu o configuratie impartita in 3 zone principale: - Top - unde sunt afisate meniurile principale din site, - Corp - zona in care sunt afisate: intr-o parte link-urile paginilor din categoria respectiva, si in rest continutul acestora - Subsol - pentru ce vrem sa apara in partea de jos a site-ului. Aceasta e pe scurt structura site-ului, in continuare creem pe rand fiecare din aceste elemente. 2. Crearea tabelului MySQL Partea mai simpla, dar esentiala si foarte importanta la un site care foloseste baze de date e proiectarea si scrierea codului pentru crearea tabelelor in baza de date. Pentru acest proiect, care e simplu in ceea ce priveste structura MySQL, am folosit un singur tabel, cu numele "pagini" ce are coloanele prezentate mai sus. In directorul radacina al site-ului (www sau httpdocs) creem un fisier php (aici numit "creaza_tabel.php") in care se scrie codul PHP de mai jos, pentru tabelul MySQL (explicatiile necesare sunt in documentatia din cod).

- Fisierul creaza_tabel.php
<?php // Seteaza utilizarea formatului UTF-8 header("Content-type: text/html; charset=utf-8"); // Include fisierul pt. conectare-selectare baza de date include("admin.php");

// Creaza tabelul pagini, cu coloanele necesare si utilizabil cu formatul UTF-8 $sql = "CREATE TABLE `pagini` (id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, meniu varchar(25), pagina varchar(110), titlu varchar(75), descriere varchar(250), cuv_key varchar(200), data int(10)) CHARACTER SET utf8 COLLATE utf8_general_ci"; // Se verifica executia funtiei pentru transmiterea codului SQL if (mysql_query($sql, $conn)) echo '<br /><br /><br /><center><h4>Tabelul pagini a fost creat</h4></center><br />'; else echo '<br /><br /><br /><center><h4>Tabelul pagini nu a putut fi creat deoarece - '. mysql_error(). '</h4></center>'; mysql_close(); ?> // Incheie conexiunea la mysql

3. Datele administratorului, conectarea la MySQL si functii de filtrare Pentru a lucra cu MySQL din PHP, trebuie sa scriem datele pentru conectarea scriptului la baza de date. Deoarece aceste date trebuie folosite in toate paginile care preiau sau transmit valori la MySQL, le scriem intr-un fisier php separat, aici numit "admin.php", pe care-l vom include (cu include()) unde este necesar. In acest script de tip CMS vom avea nevoie de inca 2 fisiere principale: unul pentru partea de administrare (adaugare, stergere pagini) si altul pentru afisarea continutului. Ambele vor lucra cu baza de date si numele meniurilor. Pentru a nu crea de mai multe ori aceeasi functie in fisiere diferite, folosim "admin.php", pe care oricum il includem in celelalte fisiere din script, si scriem in el si alte date sau functii generale, precum cele de filtrare, pe care va trebui sa le folosim in fisiere separate. Astfel, codul comun folosit in scripturile din ele il vom scrie cat mai simplu, o singura data, in "admin.php", unde in total adaugam: - datele pentru conectarea si selectarea bazei de date, numele si parola pentru accesul la functiile paginii de admin (prezentata in partea a doua a tutorialului), o functie pentru selectarea meniurilor principale din tabelul MySQL, deoarece numele meniurilor vor fi necesare atat in fisierul care afiseaza paginile din site cat si in cel de administrare, o functie pentru filtrarea datelor care lucreaza cu MySQL si alta care va fi folosita pentru definirea numelor paginilor din site, utilizate si in crearea link-urilor. Codul PHP ce trebui scris in "admin.php" e urmatorul.

- Fisierul admin.php
<?php // De la http://www.marplo.net/php-mysql/ // Datele pt. autentuificare Administrator // Necesare in pagina pt. adaugare si stergere pagini in site $admin = 'admin'; $pass = 'pass'; // Numele directorrului unde sunt incarcate paginile $dir = 'pagini';

// Seteaza extensia folosita pt. fisierele in care sunt salvate contextul paginilor $ext = '.htm'; // Modificati datele pt. conectare la baza de date $host = "localhost"; $utilizator = "root"; $parola = "parola"; $numebd = "nume_bd"; // Conectarea la baza de date $conn = mysql_connect($host, $utilizator, $parola); if (!$conn) { echo 'Conectare nereusita la MySQL'; exit; } // Selectarea bazei de date if (!mysql_select_db($numebd, $conn)) { echo 'Baza de date nu a putut fi selectata deoarece : '. mysql_errno(). ' : '. mysql_error(); exit; } // Setarea conexiunii pt. utilizare format UTF-8 $sql = "SET NAMES 'utf8'"; mysql_query($sql, $conn); /*** Functii necesare ***/ // Functia pt. filtrarea variabilelor folosite in lucru cu MySQL function filtr_sql($var) { // Se verifica daca "magic_quotes_gpc()" este setat ON // Daca e ON, se aplica stripslashes() variabilei $var, pentru a nu se adauga de 2 ori "\" if(get_magic_quotes_gpc()) { $var = stripslashes($var); } // Aplica functia de filtrare $var = mysql_real_escape_string($var); return $var; } // Functia care preia din MySQL meniurile principale ale site-ului function get_meniu() { // Selecteaza coloanele in care numele meniului e acelasi cu numele paginii // Apoi adauga numele meniurilor intr-o variabila tip array $q = "SELECT `meniu` FROM `pagini` WHERE `meniu`=`pagina`"; $result = mysql_query($q) or trigger_error(E_USER_ERROR); if (mysql_num_rows($result) == 0) { $menu = false; } else { while ($rand = mysql_fetch_assoc($result)) {

// Elimina caracterele "\" care au fost adaugate de "mysql_real_escape_string()" $menu[] = stripslashes($rand['meniu']); } } return $menu; } // Functia pt filtrarea sirurilor folosite la numele meniurilor sau paginilor // Utilizate la crearea numelor fisierelor si a link-urilor function filtrare($sir) { // Inspirat de la www.tutoriale.far-php.ro // Se converteste numele in litere mici si se scot spatiile de la inceput si sfarsit $sir = trim(strtolower($sir)); // Un array cu lista caracterelor care se inlocuiesc $lista_car = array( '&#259;' => 'a', '&icirc;' => 'i', '&acirc;' => 'a', '&#351;' => 's', '&#355;' => 't', '&#258;' => 'a', '&Icirc;' => 'i', '&Acirc;' => 'a', '&#350;' => 's', '&#354;' => 't', '' => 'a', '' => 'a', '' => 'e', '' => 'i', '' => 'i', 'n' => 'n', '' => 'o', 's' => 's', '?' => 't', '' => 'u', '-' => '_', ' _ ' => '_', ' _' => '_', '_ ' => '_', ' ' => '_' ); // Se inlocuiesc caracterele de mai sus, parcurgand fiecare element din matrice foreach ($lista_car as $litera=>$inlocuire) $sir = str_replace($litera, $inlocuire, $sir); // Pastreaza in sir doar caracterele din expresia regulata (adica litere, cifre si _) $sir = preg_replace('/([^A-Za-z0-9_])/', "", $sir); // Se returneaza gata aranjat return $sir;

} ?>

4. Protejarea fisierului Deoarece in "admin.php" sunt datele importante pentru conectare la baza de date si autentificare administrator, este indicat sa asiguram o protetie sporita acestui fisier. Pentru aceasta folosim .htaccess ca sa blocam accesul extern la el. Deschideti un editor simplu de text si scrieti in el codul de ma jos, apoi salvati-l in format ASCII cu denumirea .htaccess, fara alta extensie, in acelasi loc unde e si "admin.php". # Blocheaza accesul extern la admin.php <files admin.php> order allow,deny deny from all </files> Sau o alta metoda ar fi sa mutati fisierul "admin.php" intr-un director de pe server, care nu poate fi accesat din browser. In acest caz trebuie sa modificati si calea de includere a lui. - In partea a doua a acestui tutorial gasiti explicatii despre fisierul de administrare si management date, prin care se va putea adauga si sterge paginile site-ului. - In partea a treia sunt prezentate fisierele "index.php" si "grafic.css"

Creare site cu PHP si MySQL - CMS Part. 1 -- Part. 2

Part. 3

Aici, in a treia parte din acest tutorial sunt prezentate fisierele "index.php" si "grafic.css". index.php - e fisierul care afiseaza continutul site-ului. In partea de sus a paginilor sunt afisate categoriile, meniurile principale din site. Iar in corpul paginii: in partea stanga e un meniu in care sunt afisate link-urile paginilor corespunzatoare fiecarei categorii si in centru se afiseaza continutul celei accesate. Acest fisier trebuie creat in directorul root al site-ului (www sau httpdocs). In el sunt 2 categorii distincte de cod: scriptul PHP si codul HTML cu layout-ul siteului. Scriptul PHP include la inceput fisierul "admin.php", dupa care sunt definite variabilele cu datele initiale care vor fi incluse in codul HTML, pentru meniuri, nume pagina, titlul, descrierea si cuvintele cheie, apoi, in functie de pagina apelata, aceste date sunt modificate cu cele care apartin paginii respective, si care sunt preluate din MySQL. O alta treaba pe care trebuie sa o faca scriptul din acest fisier este crearea linkurilor pentru meniuri si pagini. Adauga numele paginilor preluate din tabelul MySQL intr-o matrice, apoi parcurge aceasta matrice si formeaza cate un link cu fiecare nume, avand adresa URL de forma "index.php?p=nume_pagina". Astfel, ca sa stie ce pagina sa fie afisata cand e accesat un link, scriptul verifica

valoarea variabilei $_GET['p'], care e numele paginii si care a fost folosit atat in tabelul MySQL cat si la fisierul in care e salvat continutul iei. Ultima operatie din acest script e definirea meniului cu principalele categorii, care sunt afisate in top-ul paginii. Pentru aceasta se foloseste functia "get_meniu()" din "admin.php", datele returnate de aceasta fiind o matrice cu numele categoriilor. Se parcurge aceasta matrice si fiecare nume e adaugat in cod HTML. Dupa scriptul PHP urmeaza codul HTML cu template-ul site-ului. Acesta preia variabilele setate in script, pentru titlu, descriere, cuvinte cheie, meniu principal, paginile din meniul curent si numele fisierului in care e continutul ce trebuie afisat. Aceste variabile au nume fixe, oricare ar fi pagina accesata, si datele din ele pot fi afisate cu instructiunea "echo", astfel, puteti modifica oricand template-ul site-ului si sa schimbati locul afisarii acestor elemente dupa cum doriti. Veti observa ca scriptul complet din acest tutorial nu are si o grafica definita (doar superficial), asta o face fiecare dupa cum vrea, obiectul acestei lectii fiind partea de programare PHP. Iata si codul complet din "index.php"

- Fisierul index.php
<?php // Exemplu creare site cu PHP, de la http://www.marplo.net // Seteaza optiunea de a afisa orice eroare care apare in executia scriptului ini_set('display_errors',1); error_reporting(E_ALL); // Include fisierul cu datele pt. conectare la MySQL include('admin.php'); // Creaza variabilele folosite in template-ul paginii $meniuri_html = ''; $pagini_html = ''; $titlu = 'Titlu pt. pagina principala, index'; $desc = 'Descriere pt. pagina principala, index'; $cuv_key = 'Cuvinte, cheie, pagina, principala, index'; // Daca sunt primite date prin $_GET, cu indice 'p' if (isset($_GET['p'])) { // Adauga valoarea intr-o variabila, eliminand spatii exterioare cu trim() // si decodand-o cu urldecode() deoarece acel sir din adresa URL este adaugat cu urlencode() $pag = urldecode(trim($_GET['p'])); // Preia din sir, cu explode(), primul cuvant (cuvinte) dinainte de '-', cu indice [0] // deoarece acesta e numele meniului (categoriei), necesar pt. Selectarea din MySQL a paginilor din meniu $sir = explode('-', $pag); $meniu = $sir[0]; // Deoarece la adaugarea in tabele, datele au fost filtrate cu functia filtr_sql(), creata in admin

// Aplica acelasi filtru si variabilelor $pag si $meniu, necesare pt. Select in tabel $pag = filtr_sql($pag); $meniu = filtr_sql($meniu); // Selecteaza din MySQL paginile care apartin categoriei, meniului transmis in adresa URL $sql = "SELECT * FROM `pagini` WHERE meniu='$meniu'"; $result = mysql_query($sql) or trigger_error(E_USER_ERROR); if (mysql_num_rows($result) == 0) { echo '0 rezultate'; } else { while ($rand = mysql_fetch_assoc($result)) { // Preia numele si titlul pagiilor care sunt in meniul accesat // unde numele din coloana pt. pagini e diferit de numele meniului if ($rand['pagina']!=$meniu) { // Elimina caracterele "\" care au fost adaugate de "mysql_real_escape_string()" $pg_titlu[] = stripslashes($rand['titlu']); $pg_nume[] = stripslashes($rand['pagina']); } // Preia numele paginii apelate, titlu, descriere, cuvinte cheie si data // unde randul din tabel are datele paginii accesate if ($rand['pagina']==$pag) { $titlu = stripslashes($rand['titlu']); $desc = stripslashes($rand['descriere']); $cuv_key = stripslashes($rand['cuv_key']); $pagina = stripslashes($rand['pagina']); $data = stripslashes($rand['data']); } } } } $meniuri = get_meniu(); // Apeleaza functia din admin.php pt. obtinerea meniurilor (categoriile) din Top // Creaza codul HTML cu meniurile $meniuri_html = '<ul><li><a href="index.php" title="Pagina Principala">Pagina Principala</a> &nbsp; </li>'; // Daca matricea cu meniurile contine cel putin un meniu adaugat if (count($meniuri)>0 && !empty($meniuri[0])) { for($i=0; $i<count($meniuri); $i++) { // Cu ucfirst() face prima litera din meniu sa fie Majuscula // Cu str_replace inlocuieste '_' din numele meniului cu spatiu $n_meniu = ucfirst(str_replace('_', ' ', $meniuri[$i])); $meniuri_html .= '<li><a href="index.php?p='.$meniuri[$i].'" title="'.$n_meniu.'">'.$n_meniu.'</a></li>'; } } $meniuri_html .= '</ul>'; // Inchide codul HTML pt. aceste meniuri

// Creaza codul HTML cu paginile din categoria curenta, daca acestea exista, pt. meniul din stanga if (isset($pg_nume)) { $pagini_html = '<ul id="pagini">'; for($i=0; $i<count($pg_nume); $i++) { $pagini_html .= '<li><a href="index.php?p='.$pg_nume[$i].'" title="'.$pg_titlu[$i].'">'.ucfirst($pg_titlu[$i]).'</a></li>'; } $pagini_html .= '</ul>'; } // Seteaza utilizarea formatului UTF-8 in pagina header("Content-type: text/html; charset=utf-8"); // In continuare, codul HTML in care se adauga si variabilele necesare generate de PHP ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title><?php echo $titlu; ?></title> <meta name="description" content="<?php echo $desc; ?>" /> <meta name="keywords" content="<?php echo $cuv_key; ?>" /> <meta name="robots" content="index, follow" /> <link href="grafic.css" rel="stylesheet" type="text/css" /> </head> <body> <!-- Start Top pagina --> <div id="top"> <h1>Sectiunea din top-ul paginii</h1> <div id="meniu"> <?php echo $meniuri_html; ?> </div> </div> <!-- Start Corp pagina --> <div id="corp"> <!-- Start Meniul cu paginile --> <div id="meniu_p"> <h4>Pagini</h4> <?php echo $pagini_html; ?> </div> <!-- Start Context --> <div id="context"> <?php // Daca e setata o valoare pt. variabila $pagina, // Variabila definita prin Selectul din MySQL, si contine numele paginii, pt. adresa ei if (isset($pagina)) { // Afisaza data la care a fost creata psgina, preluata din MySQL echo '<em>'.date('j-F-Y ', $data).'</em><br />'; // Include fisierul in care e continutul readfile('pagini/'.$pagina.$ext); }

else { // Daca nu e apelat vreun link din meniu sau poagini // Afiseaza continutul dorit pt. pagina "index" // Il puteti crea cu 'echo' ori sa-l includeti din alt fisier extern echo '<h3>Continut initial pentru pagina index</h3> <h3>Creati cu "echo" tag-urile HTML sau includeti continut din alt fisier extern,<br /> cu include("fisier.php") sau readfile("fisier.html")</h3>'; } ?> </div> </div> <!-- Start Subsol pagina --> <div id="subsol"> <a href="add_del.php" title="Admin"><em><b>Admin</b></em></a> <h4>Continutul din subsolul paginii</h4> <h4>Va apare in toate paginile site-ului</h4> </div> </body> </html>

Ultimul fisier din acest script gen CMS este cel care se ocupa de grafica site-ului. L-am denumit "grafic.css" si contine doar cateva coduri CSS pentru o structura de baza a cadrelor din pagina. Acest fisier este apelat in sectiunea HEAD a codului HTML din "index.php".

- Fisierul grafic.css
body { margin:0px auto; width:1000px; background-color:#e8e8fe; text-align:center; } /* Grafica pentru sectiunea Top */ #top { margin:2px auto; position:relative; border:1px solid #ceceda; background-color:#dedeee; } /* Grafica pentru sectiunea Corp */ #corp { position:relative; margin:2px auto; width:100%; border:1px solid #eeeefe; background-color:#ededfe; text-align:left; }

/* Grafica pentru Meniu principal */ #meniu { position:relative; margin:2px auto; border:1px solid #dafedf; background-color:#deefee; padding-left:5px; } #meniu ul { margin:0px; background-color:#cceede; list-style:none; padding:0px 0px 1px 5px; } #meniu ul li { display:inline; margin:1px 3px; border:1px solid silver; padding:3px; } #meniu ul li a { margin:0px; border:1px solid #daccfe; } #meniu ul li a:hover { background-color:#ebede0; } /* Grafica pentru meniul din stanga */ #meniu_p { float:left; position:relative; width:240px; border:1px solid green; padding:2px } /* Grafica pentru Context */ #context { min-height:200px; margin:0px 1px 1px 260px; padding:3px 5px; } /* Grafica pentru sectiunea Subsol */ #subsol { clear:both; position:relative; margin:2px auto; border:1px solid #ceced8; background-color:#ebede0; z-index:10; }

- Arhiva cu scriptul complet o puteti descarca de aici -> Creare site - CMS. Site-ul creat cu acest script poate folosi si afisa caracterele in format UTF-8, iar codul HTML generat este valid XHTML. Cateva date suplimentare despre modul de utilizare gasiti in fisierul "Citeste.html".

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