Sunteți pe pagina 1din 52

Invata PHP cu punctsivirgula.

ro
Pregatirea calculatorului pentru lucrul cu PHP
Inainte ca paginile care contin cod PHP sa poata fi vizualizate, este nevoie sa instalati interpretorul PHP. Acesta actioneaza ca o componenta a serverului web care este invocata de ori cate ori o pagina PHP este intalnita. Aceasta componenta proceseaza pagina si apoi o transmite inapoi la web-server, ajungand in final in browserele utilizatorilor. Acest proces este prezentat in imaginea din dreapta de mai jos

Deservirea unei pagini statice, fara interventia interpretorului PHP

Deservirea unei pagini dinamice, modificata de PHP in momentul request-ului

Static si dinamic
Din imaginile de mai sus, se observa ca atunci cand nu exista un interpretor PHP, paginile sunt transmise direct catre utilizatori asa cum sunt salvate pe disc, fara modificari. Pentru a actualiza continutul acestora, este nevoie de interventie directa asupra lor si salvarea modificarilor pe server. Aceste pagini sunt denumite "pagini statice". Spre exemplu, presupunand ca avem o pagina statica ce afiseaza membrii unei comunitati, la fiecare inscriere a unei noi persoane, pagina ar trebui modificata manual de catre cineva cu acces la serverul web. Lucrurile se complica daca acea lista este personalizata, cu trimiteri catre alte informatii (cum ar fi detalii de contact pentru fiecare, etc) sau cu un design intortocheat. Toate aceste probleme pot fi rezolvate cu ajutorul PHP. Folosind o secventa de cod PHP am putea prelua lista de membri dintr-o baza de date, eliminand problema actualizarii - nu va mai fi nevoie sa se modifice pagina odata cu fiecare membru nou, scriptul PHP va afisa in mod automat noile persoane adaugate in baza de date. Este rezolvata si problema linkurilor personalizate, sau a designului - toate elementele specifice unei persoane pot fi generate in mod automat. Aceste pagini sunt, asadar, modificate de catre PHP la momentul accesarii lor de catre utilizatori. In functie de parametrii primiti si de secventa de cod definita de programator, aceasi pagina poate avea continut diferit. Aceasta proprietate este denumita dinamism, iar o astfel de pagina este considerata pagina dinamica.

Instalarea interpretorului PHP


Pentru ca fisierele ce contin cod PHP sa poata fi interpretate, devenind astfel dinamice, serverul web trebuie configurat pentru "comunicarea" cu modulul PHP. Pentru inceput, cea mai simpla modalitate de a avea totul pregatit pentru a lucra cu PHP este un pachet "All in one". Voi descrie pe scurt pasii necesari instalarii programului EasyPHP, o aplicatie care include serverul web Apache, interpretorul PHP, sistemul de gestiune a bazelor de date MySQL si aplicatia de administrare a bazelor de date phpMyAdmin. Nota: trebuie sa dezinstalati Apache, PHP sau MySQL de pe calculator (daca le aveti deja) inainte de a instala EasyPHP. 1. Descarcati EasyPHP. Mergeti la http://www.easyphp.org/ -> Download EasyPHP ( sau direct la http://garr.dl.sourceforge.net/sourceforge/quickeasyphp/EasyPHP-3.0setup.exe ) 2. Instalati EasyPHP (e bine sa se pastreze configurarile implicite). 3. Porniti programul EasyPHP (de cele mai multe ori va porni automat) Nota: la avertizarile de la Windows XP/Vista trebuie sa se aleaga "Allow" sau "Unblock" altfel este posibil ca serverul web sa nu functioneze. 4. In fereastra de EasyPHP apasati F8 (sau Click-Dreapta pe iconita EasyPHP de langa ceas - in Systray - si alegeti Explore). Se va deschide un folder, care reprezinta locatia de unde vor fi luate fisierele cand sunt afisate in browser (de obicei C:\Program Files\EasyPHP 3.0\www). Nota: in Windows Vista este nevoie sa deschideti manual acest folder (F8 nu pare sa functioneze). Aceasta locatie poarta numele de Document Root si aici trebuie puse toate fisierele .php pe care le scrieti. 5. Salvati un fisier de test in locatia de mai sus. Dati-i un nume sugestiv, gen test.php. Editati fisierul astfel incat sa contina urmatoarea secventa:
<?php print "Salut, ai reusit! Iata primul tau script PHP"; ?>

6. Intr-un browser (Firefox, Internet Explorer, Opera, Safari, etc) mergeti la http://localhost/. Va fi afisata o pagina cu linkuri catre fisierele/folderelor din Document Root care pot fi accesate. Faceti click pe test.php. O alta modalitate de a accesa un fisier este sa mergeti direct la http://localhost/[cale]/[nume].php, de exemplu http://localhost/test.php. 7. Accesand http://localhost/test.php ar trebui sa fie afisata o pagina alba cu mesajul de mai sus.

Retineti! Toate fisierele PHP pe care le scrieti (inclusiv cele de test preluate de pe acest site) *trebuie* salvate in folderul Document Root (locatia implicita este C:\Program Files\EasyPHP 3.0\www). Webserver-ul local instalat de EasyPHP va cauta fisierele doar in aceasta locatie. Daca fisierele sunt salvate in alta parte ele nu vor mai putea fi accesate in browser.

De ce imi trebuie un server web?


Instaland EasyPHP, calculatorul personal devine un server web (local, ce-i drept accesibil doar de catre tine). Practic PC-ul se comporta ca un site ce are adresa http://localhost/ (sau http://127.0.0.1/). Este foarte important ca fisierele PHP sa fie accesate prin intermediul serverului web, deoarece acesta recunoaste scripturile PHP si invoca automat interpretorul PHP. Fara aceasta intermediere oferita de web-server, scripturile PHP nu ar fi procesate ci trimise asa cum sunt la browser. De exemplu, avem un fisier care contine doar urmatorul cod: (atentie la semnul ! in afara tagurilor)
<?php print "Salut"; ?> !

Sa presupunem ca fisierul se numeste salut.php. - Daca il accesam in browser folosind adresa "http://localhost/salut.php" (prin intermediul serverului web local) atunci interpretorul PHP este invocat, scriptul este executat iar rezultatul procesarii afisat de browser va fi "Salut!". - Daca accesam fisierul direct de pe disc, scriind in browser calea lui "file:///C:/Program Files/EasyPHP 3.0/www/salut.php" se va afisa (in cel mai fericit caz) doar "!". Asta pentru ca interpretorul PHP nu este invocat, iar fisierul este transmis ca atare, cu tagurile de PHP (care sunt ignorate de browser).

PHP si programarea server-side


Pe scurt, ce este PHP? Ca idee generala, PHP reprezinta un limbaj ce permite modificarea paginilor web inainte ca acestea sa fie transmise de server catre browserele utilizatorilor. PHP poate insera text intr-ul fisier HTML deja definit, poate defini un fisier HTML de la zero, poate sa afiseze o imagine sau sa redirectioneze utilizatorul catre alta pagina. In cadrul acestui proces, PHP poate consulta baze de date, fisiere externe sau orice alta resursa, poate trimite email-uri sau executa comenzi ale sistemului de operare. Modul in care PHP modifica/defineste o pagina ce va fi afisata de browser este prin instructiunile scrise de programator si delimitate de etichetele <?php ?>. Astfel, orice se afla intre aceste tag-uri va fi executat de interpretorul PHP si inlocuit cu rezultatul executiei. Ce este in afara lor ramane neschimbat si este transmis catre browser. Spre exemplu, avem o pagina ca mai jos.
<html> <body> Azi e <?php print date( 'd.m.Y' ); ?> </body> </html>

Rezultatul va fi o pagina HTML ce va contine cuvintele "Azi e" si rezultatul codului PHP (in cazul acesta - data curenta). Codul HTML final, transmis de server in urma procesarii PHP este urmatorul:
<html> <body>

Azi e 16.04.2009 </body> </html>

Codul PHP nu trebuie sa fie neaparat intercalat in pagina HTML. Secventa de mai jos produce o pagina similara celei de mai sus (in acest caz PHP produce o pagina HTML de la zero).
<?php print '<html><body>'; print 'Azi e' . date( 'd.m.Y' ); print '</body></html>'; ?>

Nota: interpretorul PHP nu este instalat implicit pe orice calculator. Pentru ca toate exemplele de pe site sa functioneze, trebuie sa instalati (manual) un interpretor. Vedeti sectiunea "Inainte de a incepe" pentru detalii.

Ce afiseaza PHP?
Rezultatul unui script PHP este de obicei text simplu care, de cele mai multe ori, este interpretat ca fiind cod HTML. Cu alte cuvinte, in majoritatea cazurilor PHP returneaza o pagina ce va fi afisata in browser. La inceput, acest lucru poate genera confuzii, intrucat sursa HTML este diferita de ceea ce se afiseaza efectiv in browser. Spre exemplu, fie urmatoarea secventa de cod:
<?php print "Salut"; print "Acesta este un script simplu"; ?>

Probabil v-ati astepta ca rezultatul sa fie un text afisat pe 2 linii. Salvand aceasta secventa intr-un fisier PHP si accesandu-l prin intermediul unui web-server, veti observa ca rezultatul este urmatorul:
SalutAcesta este un script simplu

Desi este confuz, rezultatul este corect. Codul PHP afiseaza doar caracterele care i-au fost indicate. Sfarsitul de linie reprezinta un caracter separat, ne-printabil, dar care controleaza cum apare textul pe ecran. In cazul nostru, nu s-a transmis acest caracter (numit si new-line) si prin urmare PHP nu l-a afisat. Sa rescriem exemplul de mai sus pentru a se afisa si caracterul "sfarsit de linie"
<?php print "Salut";

print "\n"; # se afiseaza caracterul "new-line" care determina trecerea la un rand nou # randul nou va fi afisat in textul trimis catre browser print "Acesta este un script simplu"; ?>

Verificand iar in browser veti constata ca nu s-a schimbat nimic. La prima vedere. In realitate rezultatul este afisat pe 2 linii, in textul trimis de PHP catre browser. Intrucat pagina este interpretata ca fiind HTML, browserul ignora caracterele new-line. Pentru verificare vizualizati sursa paginii (meniul View din browser -> view source). Pentru a ajunge la efectele dorite (acelea de a afisa un text pe 2 linii) trebuie folosit urmatoarea secventa:
<?php print "Salut"; print "\n"; # acum se afiseaza caracterul care determina trecerea la un rand nou # randul nou va fi afisat in textul primit de browser (vizibil in sursa HTML) print "<br>" # se afiseaza tagul BR ce va fi interpretat de browser ca 'linie noua' # linia noua va fi afisata in pagina finala HTML dupa ce este interpretata de # browser si nu are nici o legatura cu \n print "Acesta este un script simplu"; ?>

Sursa paginii arata in felul urmator:


Salut <br>Acesta este un script simplu

In browser nu apare tagul BR, intrucat acesta este interpretat ca sfarsit de linie. Caracterul "new-line" afisat de noi (in print "\n") este ignorat oricum. Rezutatul:
Salut Acesta este un script simplu

Nota:Este foarte important sa se inteleaga diferenta dintre ceea ce se returneaza in urma executiei unui script PHP si ceea ce se afiseaza propriu-zis in browser. Pe scurt, PHP printeaza cod HTML care este afisat diferit de browsere. De asemenea, trebuie inteles faptul ca functia print nu afiseaza textul pe mai multe linii daca nu se specifica acest lucru in mod express. Spre exemplu fie urmatoare secventa de cod:
<?php print "1"; print "2"; print "3"; ?>

Rezultatul va fi
123

S-a afisat doar ce s-a indicat, 3 caractere, pe o singura linie, fara spatii. Un alt lucru important de retinut este faptul ca odata printat, un text nu mai poate fi "sters". Nu exista "undo" pentru un print. Se poate captura intregul continut ce se

transmite la finalul executiei, dar nu se poate altera textul afisat de o instructiune print anume. Intelegand aceste aspecte va va fi mai usor in lucrul cu PHP si in modul in care verificati rezultatele scripturilor voastre.

Taguri PHP, instructiuni, punct si virgula


Codul PHP trebuie inclus in fisierele ce vor fi deservite utilizatorilor finali si trebuie delimitat de restul continutului prin tagul de inceput <?php si tagul de sfarsit ?>. Practic tot ce se afla in interiorul acestor etichete va fi interpretat ca fiind cod-sursa PHP (cod ce va fi executat de interpretorul PHP). Textul din afara celor 2 taguri este lasat neschimbat, fiind ulterior interpretat de browser. Se pot folosi si alte etichete in functie de configuratia serverului web, dar acestea nu sunt recomandate.
<?php /* forma recomandata */ ?> <script language="php"> /* forma disponibila oricand, putin folosita */ </script> <? /* taguri scurte, acceptarea lor de catre web-server depinde de configurare */ ?> <% /* taguri in stilul asp, acceptarea lor de catre web-server depinde de configurare */ %>

Codul PHP este format din instructiuni - comenzi date catre interpretor, in urma carora se executa ceva. Asa cum s-a mai spus, PHP este folosit in principal pentru a genera cod HTML, asa ca de cele mai multe ori instructiunile folosite sunt cele de afisare. In aplicatii mai complexe se pot insa folosi si instructiuni de conectare la bazele de date, de citire/scriere/manipulare fisiere, intructiuni de trimitere email-uri si altele. Instructiunile se pot grupa in blocuri delimitate de acolade { }. Aceste blocuri, numite si "instructiuni complexe" se comporta ca si cum ar fi o singura instructiune (vezi mai jos exemple de blocuri). Toate instructiunile (in afara de blocuri) trebuie sa fie terminate cu punct si virgula ( ; ). Lipsa acestuia genereaza o eroare.

Intructiuni uzuale

echo, print, printf


In multe din scripturile scrise de incepatori (si nu numai) continutul rezultat in urma executiei este un text (care poate fi sau nu cod HTML). Pentru a obtine acest text, secventele de cod trebuie sa contina instructiuni explicite care sa "spuna" intrepretorului ce anume trebuie afisat. Instructiunile de afisare sunt print, echo si printf. Exista si alte modalitati dar aceste 3 instructiuni sunt cele mai uzuale si usor de folosit. Diferente intre ele exista (vezi http://www.faqts.com/knowledge_base/view.phtml/aid/1/fid/40), dar ca idee generala print si echo fac acelasi lucru si poate fi folosita oricare dintre ele. printf este folosita mai rar datorita sintaxei oarecum greoaie.
<?php # cele 2 instructiuni de mai jos sunt echivalente print "Text"; echo "Text"; # o instructiune echo poate primi mai multi parametrii echo "Afisez", " un text din ", 4, " bucati"; # o singura intstructiune print poate primi doar unul print "Afisez"; print " un text din "; print 4; print " bucati"; # printf este folosita pentru a formata continutul, la fel ca in C/C+ + printf( "Am %4.2f lei", 102.1234 ); // afiseaza Am 102.12 lei ?>

Instructiuni de atribuire
Alte instructiuni, la fel de uzuale ca cele de afisare, sunt cele de atribuire. Acestea sunt explicate mai pe larg in sectiunea "Variabile. Constante".

Instructiunea if
In afara de aceste 2 categorii, la fel de des intalnita este instructiunea if. Aceasta se numeste instructiunea de test si este folosita pentru a executa o secventa de cod in functie de valoarea de adevar a unei conditii. Exista mai multe forme, prezentate mai jos:
if( conditie ) instructiune 1;

Aceasta forma permite executarea unei instructiuni numai daca este indeplinita o conditie. Conditia poate fi orice expresie de genul "2 < 3", "variabila $a este definita", s.a. tradusa in limbajul PHP. Instructiunea poate fi simpla (o singura instructiune) sau un bloc (mai multe instructiuni delimitate de acolade). Regula este ca atunci cand este nevoie sa se execute mai mult

de o instructiune, trebuie creat un bloc (trebuie folosite acoladele). Exemplu:


<?php if( 2 < 4 ) print "2 e mai mic decat 4"; if( 3 > 1 ) { print "3 e mai mare ca 1 \n"; print "<br />"; } ?>

Atentie! Daca nu se foloseste un bloc in cadrul instructiunii if, atunci doar prima instructiune dintre cele existente se executa in urma evaluarii conditiei, pe cand celelalte se vor executa intotdeauna, indiferent de rezultatul verificarii. De exemplu:
<?php echo "Este 3 mai mic decat 2? <br />"; if( 3 < 2 ) print "3 < 2"; print "3 este mai mic decat 2"; ?>

Codul de mai sus va afisa:


Este 3 mai mic decat 2? <br /> 3 este mai mic decat 2

Pentru ca nu am inclus cele 2 instructiuni print intr-un bloc, a doua instructiune s-a executat indiferent de valoarea de adevar a conditiei. Codul corect (din punct de vedere logic) ar fi urmatorul, care contine un bloc de instructiuni:
<?php echo "Este 3 mai mic decat 2? <br />"; if( 3 < 2 ) { print "3 < 2"; print "3 este mai mic decat 2"; } ?>

Instructiunea if - else
De multe ori este nevoie sa se specifice o instructiune ce trebuie executata daca nu este indeplinita conditia. In acest caz se foloseste if - else.
if( conditie ) instructiune 1; else instructiune 2;

Aceasta forma permite executarea unei instructiuni atunci cand se indeplineste conditia sau executarea alteia diferite in caz contrar. Aceleasi observatii ca si mai sus se aplica.

Siruri de caractere
In majoritatea scripturilor PHP se lucreaza cu bucati de text denumite siruri de caractere sau string-uri. PHP prezinta particularitati in modul in care sunt folosite stringurile, particularitati ce sunt prezentate in exemplele de mai jos. Nota: sirurile de caractere reprezinta expresii (entitati ce au/returneaza o valoare). Asadar, un string poate fi folosit, pe langa, afisare, in atribuiri, la verificari, etc. In exemplele ce urmeaza s-a optat pentru afisarea sirurilor.

<?php print "Salut, straine!"; // sir simplu print 'Salut din nou!'; // sir simplu, delimitat de apostrof ?>

Nota: in acest exemplu nu este nici o diferenta intre modul de afisare a sirurilor delimitate prin ghilimele si cele delimitate prin apostrof. Cu toate astea, PHP trateaza in mod diferit aceste caractere. Mai multe explicatii si exemple sunt prezentate in pagina "Variabile.Constante".
<?php print "Ma numesc \"Alex\"!"; // sir ce contine ghilimele, se foloseste \" print 'Porecla ta e Kelu\' ?'; // sir delimitat de ghilimele simple ce contine un apostrof print "Text afisat pe 3 linii: \n linia 2 si \n linia3" // atentie, textul e afisat pe 2 linii in sursa HTML cu ajutorul \n print "Am castigat \$30 :D"; // caracterul dolar are un statut aparte // pentru a afisa semnul $ asa cum este se foloseste \$ print "Text cu \\backslash\\."; // caracterul \ (numit escape char) poate fi afisat intr-un // text daca este dublat; daca e folosit doar un \ PHP ar trata textul diferit: print "Text fara \backslash\- \nu se afiseaza corec\t."; print <<<TXT Text pe mai multe linii. Delimitatorii pot avea orice nume: TXT, START, etc, cu urmatoarele conditii - ambii delimitatori trebuie sa aiba acelasi nume - inainte de primul delimitator se foloseste <<< - delimitatorul de inceput nu trebuie sa fie urmat de spatiu sau alt caracter - delimitatorul de final sa fie la inceputul liniei (fara spatii inainte) - dupa delimitatorul final se pune punct si virgula ; TXT; // concatenarea (legarea) sirurilor print 'Sir1' . " legat de " . 'Sir2'; // Sir1 legat de Sir2 ?>

Comentarii
Comentariile sunt portiuni de cod care nu se executa. Sunt folosite de programatori de regula pentru a da diverse explicatii despre logica aplicatiei, variabile si altele. Comentariile nu afecteaza executia unui script si pot fi sterse din cod fara nici un efect.
<?php // acesta este un comentariu. intreaga linie nu va fi luata in considerare # la fel ca mai sus - print "hello" - nu se executa /* comentariu cu delimitator de inceput si sfarsit */ print /* partea asta e ignorata */ "Salut!"; /* afiseaza Salut!

*/ ?>

Nota: comentariile /* */ nu pot fi imbricate (unele in altele). Exemplul urmator nu este un cod valid.
<?php /* comentariu /* altul */ inapoi la primul */ ?>

Este un lucru foarte util sa folositi comentarii in cod pentru a explica modul de rezolvare a problemei abordate, sau pentru a da detalii despre operatiile efectuate. Acestea va vor ajuta mai tarziu daca veti vrea sa modificati codul scris, sau vor oferi altor persoane informatii (valoroase) despre cum ati gandit codul respectiv.

Terminarea executiei
<?php exit( "Script terminat" ); die( "Script terminat" ); print "Acesta linie nu se afiseaza niciodata"; ?> Nota: instructiunile die si exit sunt echivalente.

Variabile in PHP
Ce sunt variabilele?
Variabilele sunt elemente ce au o anumita valoare la un moment dat. Valoare unei variabile se poate schimba de-a lungul executiei unui script. Lucrul cu variabile in PHP este foarte usor. Nu trebuie specificat un tip pentru ele (de genul "variabila text", "variabila numerica") ci acesta este determinat in mod automat. Variabilele sunt diferentiate de celelalte elemente ale limbajului prin caracterul $. Astfel, o variabila are forma "$nume". Numele variabilei poate fi orice identificator valid (un text ce contine doar litere, cifre si underscore _, fara spatii sau alte caractere; un identificator nu poate incepe cu o cifra).

Declararea variabilelor
In PHP declararea variabilelor se realizeaza in acelasi timp cu initializarea lor (cu atribuirea unei valori de inceput). Atribuirea unei valori se realizeaza cu ajutorul instructiunii de atribuire ce are forma <nume variabila> = <valoare>;
// variabile numerice $variabila = 1; $numar = 0; // variabile text (stringuri) $text = "Salut"; $text2 = 'Ce faci?'; // variabile logice (boolean) $stiuPHP = true; $uitRepede = false; // vector $vectorGol = array(); $vectorS = array( 10,11,12,13 ); // vector simplu // vector asociativ $vector = array( 'luni' => 'Monday', 'marti' => 'Tuesday', 'miercuri' => 'Wednesday' ); // definirea unei noi componente a unui vector asociativ $vector[ 'joi' ] = 'Thursday'; // vector $vectorS2 0 1 2 3 ); simplu definit ca asociativ, echivalentul lui $vectorS = array( => 10, => 11, => 12, => 13

Nota: un vector asociativ se diferentiaza de unul normal prin faptul ca are chei alfanumerice (cuvinte). Atentie: PHP face distinctie intre literele mari si mici. Astfel, cele 3 variabile de mai jos sunt TOTAL diferite:
$variabila = "negru"; $vaRiabila = "alb"; $Variabila = 1;

Atribuirea de valori
Se realizeaza la fel ca si declararea prin intermediul instructiunii de atribuire.
# atribuirea unei valori anume $variabila = 2;

# copierea valorii de la o alta variabila $text = $variabila; # copierea valorii functioneaza si in cazul vectorilor # in urma copierii cei 2 vectori vor fi identici $vectorS = $vectorS2; # toate componentele lui $vectorS2 sunt copiate in $vectorS # in cazul vectorilor se pot atribui valori separat fiecarei componente $vectorS[ 0 ] = 100; $vectorS[ 3 ] = 10; $vector[ 'luni' ] = 'Lundi'; $vector[ 'joi' ] = 'Jeudi';

Stergerea variabilelor
De obicei nu e nevoie ca variabilele sa fie sterse dupa ce au fost folosite. Totusi, lucrul aceste se poate face in urmatoarele moduri:
unset( $variabila ); $variabila = null;

Afisarea variabilelor
Afisarea se realizeaza utilizand oricare din instructiunile de afisare:
$variabila = "Text"; print $variabila; echo $variabila;

Ponturi de PHP

Diferenta dintre ghilimele simple si duble la declararea variabilelor Ghilimelele duble permite compilatorului sa "citeasca" variabilele ce apar in interiorul textului.
$today = date( 'd-m-Y' ); $text1 = "Azi e $today"; print $text1; // Azi e 17-07-2008

Astfel, textul cuprins intre ghilimele duble este procesat inainte de afisare: variabilele sunt cautate iar valoarea lor este afisata in locul numelui. In cazul apostrofului, textul este afisat neschimbat, iar variabilele nu sunt interpretate.
$today = date( 'd-m-Y' ); $text2 = 'Azi e $today';

print $text2; // Azi e $today

Verificarea daca o variabila e definita Se pot folosi 2 functii: isset si empty .


// definim o variabila, cealalta definire nu se executa $var = 0; // $var2 = 1; var_dump( isset($var) ); // bool(true) var_dump( isset($var2) ); // bool(false) var_dump( empty($var1) ); // bool(true), pentru ca 0 este considerat nul var_dump( empty($var2) ); // bool(true)

Atentie, isset verifica daca variabila a fost definita, pe cand empty verifica daca a fost definita si daca are o valoare considerata vida. O variabila este vida daca are urmatoarele valori:
o o o o o o

"" (text de lungime 0) 0 (cifra 0) "0" (textul "0") null false array() (vector gol)

Nota: pentru valorile de mai sus, empty returneaza false

Operatorul {} Pot exista situatii cand anumite variabile trebuie procesate mai inainte decat altele, sau mai inainte de procesarea intregii instructiuni. De exemplu:
$salut = array( 'dimineata' => 'Buna dimineata', 'pranz' => 'Buna ziua', 'seara' => 'Noapte buna' ); print "$salut[ 'pranz' ], vizitatorule"; // eroare

Modul in care am scris variabila ($salut[ 'pranz' ]) este corect. Doar ca PHP-ul nu "stie" sa vada variabila noastra ca pe un element din vector, sa-i ia valoarea si apoi sa afiseze tot textul. Pentru a rezolva aceasta problema folosim acoladele:
print "{$salut[ 'pranz' ]}, vizitatorule"; // "Buna ziua, vizitatorule"

In acest caz spunem compilatorului sa interpreteze mai intai ce este intre acolade (elementul $salut[ 'pranz' ] din vector) si apoi sa afiseze tot textul. Ori de cate ori e nevoie ca o variabila sa fie interpretata cu prioritate, ea trebuie pusa intre acolade.

Dublu-dolar ($$nume)
$obiect = 'masina'; $masina = "Chevrolet"; $avion = "Boeing"; $tren = "TGV"; print $$obiect; // Chevrolet

Pentru a intelege ce se intampla, trebuie mentionat ca ultima linie poate fi scrisa astfel:
print ${$obiect}; // Chevrolet

In virtutea explicatiei de mai sus a operatorului {}, putem vedea usor ca PHP mai intai extrage valoarea variabilei $obiect ( care este: "masina" ) si apoi afiseaza variabila $masina (care are valoarea "Chevrolet".

Constante
Constantele sunt entitati care nu isi schimba valoarea pe parcursul executiei. Sunt utile pentru a recunoaste usor valorile folosite in cod. De exemplu, e mai usor de inteles urmatorul cod, cand se foloseste o constanta decat daca s-ar folosi cifra 5
define( 'ZILE_LUCRATOARE', 5); $zile = array( 'luni', 'marti', 'miercuri', 'joi', 'vineri', 'sambata', 'duminica' ); print 'Zilele lucratoare sunt: '; for( $i = 0; $i < ZILE_LUCRATOARE; $i++ ) { print $zile[ $i ] . ' '; }

Asadar constantele de definesc folosind define:


define( 'NUME', "Flo" ); define( 'VARSTA', 10 ); define( "ADEVARAT", true );

Este recomandat ca numele constantelor sa fie scris cu majuscule (pentru a fi mai usor identificate) desi nu este obligatoriu. Atunci cand se folosesc, se specifica doar numele, fara ghilimele sau $:
print "Ma numesc " . NUME; print " si am " . VARSTA . " ani";

Pentru a verifica daca o constanta este definita, se foloseste functia defined

if( defined( 'NUME' ) ) { print "Ma numesc " . NUME; } if ( !defined( 'VARSTA' ) ) { define( 'VARSTA' , 2 ); } print " Am " . VARSTA . " ani";

Superglobals, variabile speciale


PHP dispune de cateva variabile "built-in". Acestea sunt pre-populate de PHP in momentul executiei, deci nu trebuie definite sau initializate. Sunt disponibile in orice portiune a codului si in orice script PHP si pot fi folosite fara sa fie nevoie de alte pregatiri. Anumite variabile (ca de exemplu $_POST) au valori doar in anumite situatii (spre exemplu, doar atunci cand sunt folosite formulare). Mai jos sunt descrise pe scurt aceste variabile, cu mentiunea ca in lectiile urmatoare vor fi folosite in exemple din care veti intelege (usor) rostul lor.

$_GET Vector asociativ ce contine parametrii transmisi prin URL. De exemplu, daca pagina noastra PHP se numeste test.php, un URL de genul
http://localhost/test.php?nume=Alex&varsta=12&ocupatie=elev

ar popula variabila $_GET cu urmatoarele valori:


print_r( $_GET ); /* afiseaza: Array ( [nume] => Alex [varsta] => 12 [ocupatie] => elev ) */

Nota: numele parametrilor au rol de cheie in vectorul $_GET. Vectorul $_GET este de asemenea populat la folosirea formularelor GET.

$_POST Similar cu $_GET, doar ca parametrii sunt transmisi prin formulare (forms) vezi lectia "Transmiterea prin formulare (POST)" pentru detalii $_REQUEST Inglobeaza atat $_GET cat si $_POST. $_SESSION Folosita pentru a defini date ce sunt disponibile atata timp cat utilizatorul acceseaza site-ul, indiferent de paginile vizualizate. In mod normal o variabila este definita doar cand un utilizator cere o pagina. La finalul executiei scriptului, valorile variabilelor se pierd (inclusiv variabile $_GET, $_POST, etc). Daca sunt puse in vectorul $_SESSION, valorile pot persista si dupa terminarea executiei scripturilor. $_SERVER Furnizeaza informatii despre server, pagina ceruta si utilizatorul care acceseaza pagina.
print_r( $_SERVER ); /* afiseaza ceva asemanator cu ce e mai jos: Array ( [HTTP_COOKIE] => [HTTP_REFERER] => http://php.punctsivirgula.ro/ [HTTP_USER_AGENT] => Mozilla/5.0 (Windows;) Gecko/2008102920 Firefox/3.0.4 [HTTP_HOST] => php.punctsivirgula.ro [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 [HTTP_ACCEPT_LANGUAGE] => ro-ro [HTTP_ACCEPT_CHARSET] => UTF-8,* [HTTP_KEEP_ALIVE] => 300 [HTTP_CONNECTION] => Keep-Alive [SERVER_NAME] => php.punctsivirgula.ro [SERVER_ADMIN] => alexandru @ punctsivirgula . ro [SCRIPT_FILENAME] => /index.php [REMOTE_PORT] => 0 [GATEWAY_INTERFACE] => CGI/1.1 [SERVER_PROTOCOL] => HTTP/1.1 [REQUEST_METHOD] => GET [QUERY_STRING] => [REQUEST_URI] => /arrays/ [SCRIPT_NAME] => /index.php [PHP_SELF] => /index.php [REQUEST_TIME] => 1000000000 [argv] => Array () [argc] => 0 ) */

$_ENV Afiseaza informatii despre mediul curent in care este instalat si ruleaza interpretorul PHP, despre scriptul curent, etc

$_COOKIES Folosita pentru a vedea elementele de tip Cookies de la site-ul/pagina curenta, disponibile pe calculatorul utilizatorilor. $_FILES Folosita la incarcarea fisierelor pe server (file uploads) - vezi lectia "File upload" pentru mai multe detalii

Desi toate aceste variabile au si nume alternative, este recomandat sa se foloseasca in forma in care au fost prezentate mai sus.

Constante magice
Limbajul PHP dispune de o serie de "constante magice" care au valori diferite in functie de anumiti momentul si codul in care sunt folosite. Denumirea de 'constanta' este improprie, pentru ca, asa cum stiti deja, o constanta nu-si poate schimba valoarea. Nici 'variabile' nu pot fi numite deoarece nu au nevoie de declarare sau initializare, asa ca s-a recurs la un compromis: denumirea 'constante magice' (magic constants). Cele mai uzuale sunt __LINE__, __FILE__, __FUNCTION__ si __CLASS__. Mai noile __DIR__, __METHOD__ si __NAMESPACE__ sunt mai rar folosite datorita faptului ca au nevoie de o versiune mai noua a interpretorului PHP (cel putin versiunea 5.0 sau chiar 5.3) Mai jos sunt explicate aceste constante.

LINE Returneaza linia curenta a scriptului PHP.


<?php # afiseaza numarul liniei pe care este scrisa instructiunea echo echo __LINE__; // 150 ?>

FILE Contine calea completa catre scriptul PHP care se executa. Daca este folosita intr-un fisier inclus atunci numele acestui fisier este returnat.
<?php echo __FILE__; // numescript.php ?>

FUNCTION Returneaza numele functie din interiorul careia se foloseste constanta.


<?php # declar o functie care contine o constanta magica function spuneNumele() {

echo __FUNCTION__; } # apelez functia care va afisa valoarea constantei spuneNumele(); // va afisa: spuneNumele ?>

CLASS Returneaza numele clasei curente. DIR Contine numele directorului in case este salvat scriptul curent. Aceasta constanta este echivalenta cu dirname(__FILE__). METHOD Contine numele metodei de clasa din care se foloseste constanta. Se poate folosi numai cu clase. NAMESPACE Contine numele spatiului de lucru curent (name-space).

Operatori de comparare
$a == $b // egal $a === $b // identic (aceeasi valoare si acelasi tip) $a != $b // diferit $a <> $b // diferit $a !== $b // ne-identic $a < $b // strict mai mic $a <= $b // mai mic sau egal $a > $b // strict mai mare $a >= $b // mai mare sau egal

Exemple:

<?php $a = 4; # initializam $a cu numarul 4 $b = "4"; # initializam $b cu string-ul "4" if( $a == 4 ) print "\$a este 4"; else print "\$a nu este 4"; if( $a == $b ) print "Sunt egale"; else print "Nu sunt egale"; # va afisa "$a este 4" # va afisa "Sunt egale"

if( $a === $b ) print "Sunt identice"; # va afisa "Nu sunt identice" else print "Nu sunt identice"; # Nota: deoarece $a este numar iar $b string, ele nu sunt identice if( $a > 4 ) print "\$a este mai mare decat 4"; ?>

Atentie! Daca se compara un string (text) cu un numar, stringul este convertit la un numar. Exemplu:
"text" == 0 // echivalent 0 == 0, evalueaza la true

Daca se compara 2 stringuri ce contin numere, acestea sunt mai intai convertite la numerele pe care le reprezinta si apoi are loc comparatia. Astfel, 2 texte care sunt diferite ar putea fi considerate egale. Exemplu:
"1" == "01" // echivalent 1 == 1, evalueaza la true "1" == "1e0" // echivalent 1 == 1, evalueaza la true

Nota: "01" si "1e0" sunt notatii matematice diferite pentru numarul 1. Diferenta intre operatorii == si = Operatorul == este diferit de operatorul de atribuire = si nu trebuie confundati. Dubluegal (==) este folosit pentru comparare iar egal simplu (=) - pentru atribuirea de valori unei variabile.
# $a = 5 este o atribuire. print $a = 5; // 5 # instructiunea print afiseaza rezultatul atribuirii ( rezultatul unei atribuiri este # intotdeauna egal cu valoarea atribuita # $a == 1 este o verificare. Instructiunea afiseaza rezultatul verificarii. print $a == 1; // false

In timp ce atribuirile se pot folosi atat de sine statator ($a = 1;), cat si ca expresii in cadrul instructiunilor (print $a = 1; return $a = 1;) operatorii == sau === sunt folositi doar in cadrul instructiunilor.
# corect $a = 10; # atribuire de sine statatoare print $a = 10; # atribuire + afisarea rezultatului atribuirii # incorect - nu genereaza erori dar aceasta constructie este inutila. $a == 1; # nu se face nimic cu rezultatul comparatiei # corect print $a == 1; # se afiseaza rezultatul comparatiei print $a === '1'; # se afiseaza rezultatul comparatiei exacte if( $a == 1 ) echo 'egal'; # se face o verificare

Operatorul ternar
PHP ofera un operator care are 3 termeni. Sintaxa lui este urmatoarea:
(conditie ? adevarat : fals )

De remarcat ca adevarat, fals si conditie nu sunt instructiuni ci expresii (variabile, constante, stringuri, etc) iar operatorul returneaza o valoare si nu o variabila.
print ( 1 == 2 ? 'egal' : 'ne-egal' ); // afiseaza ne-egal

Operatori de incrementare/decrementare
Incrementare inseamna cresterea valorii, de obicei cu o unitate, iar decrementarea este operatia inversa. PHP ofera (ca si C/C++) posibilitatea ca incrementarea/decrementarea sa se faca printr-un operator, fara sa fie nevoie de o instructiune separata. Spre exemplu:
$a = 1; // pentru a-l creste pe $a cu o unitate, normal am scrie: $a = $a + 1; // folosind operatorul de incrementare scriem: $a++; // sau ++$a; // pentru a afisa noua valoare, putem aplica operatorul direct din instructiunea print: print ++$a;

Dupa cum se poate observa, putem scrie $a++ si ++$a. Diferenta este ca atunci cand ++ apare inainte de variabila, PHP face mai intai incrementarea si apoi returneaza noua valoare. Cand ++ apare dupa, se returneaza valoarea actuala (ne-incrementata) si apoi se creste cu o unitate. Exemplu:
$a = 1; print $a++; // afiseaza 1 - mai intai se afiseaza valoarea curenta, dupa care $a devine 2; print $a; // afiseaza 2 - $a are valoarea 2 dupa incrementare; $a = 1 print ++$a; // afiseaza 2 - mai intai $a creste cu o unitate, apoi este afisata noua valoare print $a; // afiseaza 2 - $a are valoarea 2;

Nota: aceleasi observatii (legate de pozitie) se aplica si pentru operatorul de decrementare.


$a = 2; print $a--; // afiseaza 2 - mai intai se afiseaza valoarea curenta, dupa care $a devine 1; print $a; // afiseaza 1 - $a are valoarea 1 dupa decrementare; $a = 2 print --$a; // afiseaza 1 - mai intai $a scade cu o unitate, apoi este afisata noua valoare print $a; // afiseaza 1 - $a are valoarea 1;

Operatori de atribuire
$a = 1; // atribuire simpla $a $a $a $a += -= *= /= 4; 1; 2; 3; // // // // echivalent echivalent echivalent echivalent cu cu cu cu $a $a $a $a = = = = $a $a $a $a + * / 4; $a are valoarea 5 acum 1; 2; 3;

$a %= 2; // echivalent cu $a = $a % 2; restul impartirii lui $a la 2 $a = &$b; /* $a este o referinta la $b, adica ambele variabile fac referire la aceeasi entitate; daca $a se schimba, se va schimba si $b. Altfel spus, $a este un alias pentru $b */ $s = "Salut"; // atribuire simpla $s .= " straine!"; // echivalent $s = $s . " straine!";

Operatori pentru siruri de caractere


In aceasta categorie sunt inclusi 2 operatori ".=" (operator de atribuire prin concatenare - vezi mai sus) si "." Punctul (.) este operatorul de concatenare (legare) stringuri.
print "Text1" . " legat de " . "Text2"; // afiseaza Text1 legat de Text2 $a = "Eu am"; print $a . " mere"; // afiseaza Eu am mere;

Operatori de control al erorilor @


Operatorul @ este folosit pentru a suprima erorile sau avertismentele produse de PHP.
// $nedefinit = 1; - nu se executa, variabila nu e definita print $nedefinit; // Notice: Undefined variable: nedefinit in file.php on line 120 @print $nedefinit; // nu va genera nici un avertisment / notificare include( "inexistent.php" ); // Warning: include(nedefinit) failed to open... @include( "inexistent.php" ); // nu afiseaza nici un avertisment

Operatii cu variabile. Structuri repetitive


O structura repetitiva este o secventa de cod ce permite realizarea repetata a aceleiasi operatii de un anumit numar de ori. O structura repetitiva este definita de 2 elemente: operatia care este executata si conditia de oprire a executiei. In unele cazuri se cunoaste si numarul de executii. Iata cateva aplicatii care implementeaza anumite tipuri de structuri in PHP:

Aplicatie: sa se defineasca un vector cu x elemente, fiecare element avand valoarea "test<numar>". De genul: "test1", "test2", etc.
$vector = array(); $x = 10; # operatia: definirea si initializarea unui element al vectorului # conditia de oprire: s-au efectuat $x repetari # nota: in acest caz cunoastem numarul de repetari, dat de variabila $x // intrucat cunoastem cate elemente trebuie definite, folosim structura "for" for( $i = 1; $i <= $x; $i++) { # in general, intre paranteze se specifica o expresie de initializare $i = 1 # conditia de oprire $i <= $x si o expresie de iterare $i++ # in limbaj natural, intructiunea se traduce prin "plecand de la $i = 1, # executa operatia si creste-l pe $i cu o unitate, atat timp cat $i <= $x

$vector[ $i ] = "test$i"; # aceasta este operatia } print_r( $vector ); /*afiseaza: Array ( [1] => test1 [2] => test2 [3] => test3 [4] => test4 [5] => test5 [6] => test6 [7] => test7 [8] => test8 [9] => test9 [10] => test10 ) */

Se se afiseze un element de tip select cu valori de la 1 la 100


$end = 100; # operatia: afisarea unui element de tip <option> # conditia de oprire: s-au efectuat $end repetari # nota: ca zi in cazul anterior se cunoaste numarul de repetari print "<select>"; for( $i = 1; $i <= $end; $i++ ) { print "<option value=\"$i\">$i</option>\n"; } print "</select>";

Rezultatul codului de mai sus este urmatorul:

Se da un vector definit. Sa se parcurga vectorul pana cand se intalneste valoarea 0


$vector = array( 3, 4, 5, 1, 2, 9, 76, 42, 2, 9, 6, 0, 4, 1, 10 ); # operatia: se verifica daca elementul curent al vectorului este 0 # conditia de oprire: elementul curent este 0 sau s-a ajuns la finalul vectorului # nota: desi putem afla numarul de elemente al vectorului, in functie de care # putem hotari numarul maxim de repetari, se va folosi o alta sctructura repetitiva $gasit = false; $pozitie = 0; // plecam de la primul element // parcurgem vectorul pana cand ajungem la final sau gasim valoarea 0 while( !$gasit ) {

este 0

// verific daca elementul curent (initial primul element) if( $vector[ $pozitie ] == 0 ) { $gasit = true; print "Am gasit 0 pe pozitia $pozitie"; }

// trec la pozitia urmatoare pentru verificare $pozitie++; // spre deosebire de "for" incrementarea trebuie realizata explicit // verific daca am ajuns la sfarsitul verctorului if( $pozitie == count( $vector ) ) { $gasit = true; // ca sa nu mai repete print "Nu am gasit 0 in vectorul asta"; }

# in limbaj natural, instructiunea while se poate transpune in "cat timp # conditia este indeplinita executa operatiunea" /* afiseaza Am gasit 0 pe pozitia 11 */

Exemplul de mai sus este dat pentru a intelege cand si de ce se foloseste 'while'. Toata verificarea se poate face mult mai rapid folosind o functie oferita de limbaj: array_search.
// alternativa $vector = array( 3, 4, 5, 1, 2, 9, 76, 42, 2, 9, 6, 0, 4, 1, 10 ); $pozitie = array_search(0, $vector ); if( $pozitie === false ) print "Nu am gasit 0 in vectorul asta"; else print "Am gasit 0 pe pozitia $pozitie";

O alta structura repetitiva este "do... while". Diferenta este ca verificarea de face la final, dupa ce se executa cel putin o data secventa de cod. O traducere in cuvintele noastre ar fi: "executa secventa si cat timp conditia este adevarata, repet-o". Exemplul de mai sus, rescris ar arata asa:

$vector = array( 3, 4, 5, 1, 2, 9, 76, 42, 2, 9, 6, 0, 4, 1, 10 ); # operatia: se verifica daca elementul curent al vectorului este 0 # conditia de oprire: elementul curent este 0 sau s-a ajuns la finalul vectorului # nota: desi putem afla numarul de elemente al vectorului, in functie de care # putem hotari numarul maxim de repetari, se va folosi o alta sctructura repetitiva $pozitie = 0; // plecam de la primul element // parcurgem vectorul pana cand ajungem la final sau gasim valoarea 0 do { // presupun mai intai ca elementul e gasit $gasit = true;

// verific daca elementul curent (initial primul element) este diferit de 0 // cu alte cuvinte, deocamdata nu am gasit ce caut, deci merg mai departe if( $vector[ $pozitie ] != 0 ) { $gasit = false; // trec la pozitia urmatoare pentru verificare $pozitie++; } } while ( !$gasit && $pozitie < count( $vector ) ); if( $gasit ) print "Am gasit 0 pe pozitia $pozitie"; else print "Nu am gasit 0 in vectorul asta"; /* afiseaza Am gasit 0 pe pozitia 11 */

Iterarea
PHP ofera o structura repetitiva foarte puternica si des folosita: foreach. Aceasta permite iterarea prin toate elementele unui vector. Pot fi folositi si vectori simpli si asociativi. Spre deosebire de celelalte instructiuni, pentru foreach nu trebuie specificata explicit o conditie de oprire, fiind de datoria interpretorului PHP sa opreasca iterarea atunci cand s-a ajuns la finalul vectorului.
$vector = array( 3, 4, 5, 1, 2, 9, 76, 42, 2, 9, 6, 0, 4, 1, 10 ); # operatia: afisarea elementului curent al vectorului # conditia de oprire: s-a ajuns la finalul vectorului (implicita) foreach( $vector as $element) { print "$element "; } // afiseaza: 3 4 5 1 2 9 76 42 2 9 6 0 4 1 10 // vector asociativ $zile = array( 'luni' => 'Mo', 'marti' => 'Tu', 'miercuri' => 'We', 'joi' => 'Th', 'vineri' => 'Fr', 'sambata' => 'Sa', 'duminica' => 'Su' ); foreach( $zile as $zi) { print "$zi "; } // afiseaza Mo Tu We Th Fr Sa Su

foreach( $zile as $rom => $eng) { print "$eng inseamna $rom <br />"; } /* Mo Tu We Th Fr Sa Su */ afiseaza inseamna inseamna inseamna inseamna inseamna inseamna inseamna luni marti miercuri joi vineri sambata duminica

Aplicatii - Structuri repetitive


Mai jos sunt prezentate cateva aplicatii legate de structurile repetitive. Sunt mai degraba portiuni de cod, care nu vor face decat sa va ajute sa va obisnuiti cu particularitatile limbajului PHP. Comentariile sunt binevenite.

Cum afisez o lista de limbi sau de tari?


<?php # va trebui sa avem lista de limbi/tari definita intr-un vector. $countries = array( 'Romania', 'France', 'Bulgaria', 'United Kingdom' ); # preiau lungimea listei $n = count( $countries ); # avand lungimea, folosesc o structura for pentru a afisa lista echo '<ul>'; for( $i = 0; $i < $n; $i++ ) { echo '<li>', $countries[ $i ], '</li>'; # echo poate primi mai multi parametrii } echo '</ul>'; ?>

Rezultat:
Romania France Bulgaria United Kingdom

Cum afisez un select-box cu toate tarile?


<?php # din nou, ne trebuie o lista de tari. Cel mai uzual pastram doar codul tarii, iar numele # il afisam doar. Astfel, optiunile vor avea ca "value" codul tarii iar ca "text" - numele. $countries = array( 'AF'=>'Afghanistan', 'AL'=>'Albania', 'DZ'=>'Algeria', 'AS'=>'American Samoa', 'AD'=>'Andorra', 'AO'=>'Angola', 'AI'=>'Anguilla', 'AQ'=>'Antarctica', 'AG'=>'Antigua And Barbuda', 'AR'=>'Argentina', 'AM'=>'Armenia', /* ... */ 'WS'=>'Western Samoa', 'YE'=>'Yemen', 'YU'=>'Yugoslavia', 'ZM'=>'Zambia', 'ZW'=>'Zimbabwe' ); # avand un array asociativ, este mai dificil sa-i accesam elementele, asa ca nu vom # mai folosi for. Vom folosi in schimb un iterator echo '<select name="tara">', "\n"; # afisez pe alt rand pentru a aseza in pagina sursa HTML foreach( $countries as $code => $name ) { echo '<option value="', $code, '">', $name, '</option>', "\n"; } echo "</select>\n"; ?>

Rezultat:

Cum preiau primul email valid introdus de un utiliator?


<?php # presupunem ca exista mai multe textbox-uri intr-un formular, numite email[] $emails = $_POST[ 'email' ]; # pentru mai multe detalii despre $_POST vedeti lectia "Formulare" # pentru teste se poate folosi: $emails = array( '123', 'zzz', 'test@site', 'test@test.com', 'aaa' ); # folosesc o variabila ce actioneaza ca un flag/switch $gasit = false; # preiau nr de email-uri $n = count( $emails ); # plec de la primul email-uri $i = 0; while( $gasit == false && $i < $n ) { # verific fiecare email, pe rand if( strpos( $emails[ $i ], '@' ) !== false && strpos( $emails[ $i ], '.' ) !== false ) { # un email valid trebuie sa contina @ si un punct $gasit = true; echo 'Am gasit un email valid: ', $emails[ $i ], '<br />'; } $i++; # cresc pe $i } # daca s-a ajuns la sfarsitul sirului de email-uri si $gasit este tot false # inseamna ca nu exista nici un element valid if( !$gasit ) echo 'N-am gasit nici un email valid!<br />'; ?>

Rezultat:
Am gasit un email valid: test@test.com

Nota: se putea folosi si structura repetitiva for pentru ca se cunosteau dinainte numarul de pasi ce trebuiau efectuati. In schimb, folosind aceasta implementare, atunci cand se gaseste un email valid se opreste executia (se iese din bucla while), asadar codul ar putea fi mai performant decat in cazul folosirii for.

Spre exemplu, daca avem un vector cu 15 elemente, iar pe pozitia a doua se afla un email valid, atunci executia se termina dupa 2 pasi: la primul pas se verifica primul element care nu este valid, iar la al doilea, gasindu-se un email valid se iese din ciclul while (din cauza ca $gasit nu mai este false).

Operatii cu vectori

Operatiile clasice de cautare, sortare, inserare, etc se pot realiza foarte usor cu ajutorul functiilor specializate, fara sa fie necesara parcurgerea manuala a vectorilor. Iata cateva exemple.
$vector = array( 1, 2, 3, 4, 5, 6 ); $vectAs = array( 'unu' => 'one', 'doi' => 'two', 'trei' => 3 ); // lungimea unui vector (numarul de elemente) print count( $vector ); // 6 // se gaseste o valoare in vector? print in_array( 3, $vector ); // true // exista o anumita cheie in vector? print array_key_exists( 'trei', $vectAs ); // true // returneaza toate cheile din vector: print_r( array_keys( $vectAs ) ); // Array ( [0] => unu [1] => doi [2] => trei ) // returneaza toate valorile din vector: print_r( array_values( $vectAs ) ); // Array ( [0] => one [1] => two [2] => 3 ) // returneaza o parte din vector print_r( array_slice( $vector, 3 ) ); // 4, 5, 6 print_r( array_slice( $vector, 3, 2 ) ); // 4, 5 print_r( array_slice( $vector, -5, 3 ) ); // 2, 3, 4 // foloseste cheile unui vector ca variabile: extract( $vectAs ); print $unu; // one print $doi; // two print $trei; // 3 // sorteaza un vector sort( $vector ); // 1, 2, 3, 4, 5, 6 rsort( $vector ); // 6, 5, 4, 3, 2, 1 asort( $vectAs ); // sorteaza valorile si mentine asocierea cheilor // adauga o valoare la sfarsitul unui vector

$vector[] = 7; array_push( $vector, 8 ); # nota: cele 2 instructiuni de mai sus sunt echivalente // modifica un anumit element din vector $vectAs[ 'trei' ] = 'three';

Aplicatie: Sa se afiseze tipul browserului folosit de utilizator Depanare


// afisarea unui 'dump' al vectorului - o lista cu toate elementele. //De obicei se foloseste la depanare: print_r( $vectAs ); /* afiseaza Array ( [unu] => one [doi] => two [trei] => 3 ) */ // se afiseaza la fel ca mai sus o lista cu elementele vectorului, doar // ca se specifica si tipul fiecaruia. var_dump( $vectAs ); /* afiseaza array(3) { ["unu"]=> string(3) "one" ["doi"]=> string(3) "two" ["trei"]=> int(3) } */

Operatii cu siruri de caractere


Lungimea
$s = "acesta este un text"; $sir = "stiu PHP stiu HTML stiu CSS"; # ce lungime are sirul? (numarul de caractere) print strlen( $s ); // 19

Cautarea unei secvente

# verific daca un cuvant sau text (in cazul de fata cuvantul 'PHP') apare in # sirul exprimat prin variabila $sir if( strstr( $sir, 'PHP' ) !== false ) print 'gasit'; else print "nu am gasit"; # pentru a nu tine cont de litere mari/mici se foloseste stristr if( stristr( $sir, 'phP' ) !== false ) print 'gasit';

Afisarea unui subsir

# afisez o sectiune print substr( $sir, print substr( $sir, print substr( $sir, print substr( $sir,

din sir 0, 4); // stiu 5 ); // PHP stiu HTML stiu CSS 5, -3 ); // PHP stiu HTML stiu -3 ); // CSS

# returnez doar un caracter din string print $sir{5}; // P print $sir{ strlen($sir)-1 }; // S

Transformarea sirului
# inlocuirea unor secvente print str_replace( "stiu", "invat", $sir); // invat PHP invat HTML invat CSS # schimb tipul literelor (mari, mici) print strtoupper( $s ); // ACESTA ESTE UN TEXT print strtolower( $sir ); // stiu php stiu html stiu css print ucfirst( $s ); // Acesta este un text print ucwords( $s ); // Acesta Este Un Text # sterg spatiile de la inceput si sfarsit: trim, ltrim, rtrim print trim(' ok '); // ok # caractere "enter" transformate in <br /> print nl2br( "acesta e afisat pe \n 2 linii" ); // acesta e afisat pe <br /> 2 linii

Impartirea sirului
# impart sirul dupa un caracter (sau regex)

$output1 = /* Array ( [0] => [1] => [2] => [3] => ) */

split( " ", $s ); // impart dupa spatiu acesta este un text

# impart sirul dupa un cuvant (sau un alt sir) - nu regex sau caracter $output2 = explode( "stiu ", $sir ); // impart dupa stiu<spatiu> /* Array ( [0] => PHP [1] => HTML [2] => CSS ) */ # operatia inversa impartirii unui sir: $a = implode( 'invat ', $output2 ); // invat PHP invat HTML invat CSS $b = join( ' ', $output1 ); // acesta este un text

Nota: implode si join sunt echivalente (nu exista nici o diferenta intre ele), pe cand explode si split sunt diferite. Interpretarea sirului
# parsez un Query String $str = "first=value&arr[]=foo+bar&arr[]=baz"; parse_str($str); print $first; // value print $arr[0]; // foo bar print $arr[1]; // baz parse_str($str, $output); print $output['first']; // value print $output['arr'][0]; // foo bar print $output['arr'][1]; // baz

Masuri de siguranta

print addslashes( "Baiatu' ia vino-ncoa'!" ); # Baiatu\' ia vinoncoa\'! # functia inversa este stripslashes(); print htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES); # afiseaza &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt; # functia inversa este htmlspecialchars_decode() print strip_tags( "<p>E <b>bold</b></p>" ); // E bold print strip_tags( "<p>E <b>bold</b></p>", '<b>' ); // E <b>bold</b>

Operatii comune cu indicatori de timp


// data curenta print date( 'd.m.Y H.i.s' ); // 16.04.2009 18.21.49 // data in format Unix (UNIX timestamp) print time(); // 1239895309 // alegerea unui fus orar date_default_timezone_set( 'Europe/Bucharest' ); // parsarea unei date print strtotime("now"); print strtotime('1st January 2004'); //1072915200

Sa se determine durata de executie a unui script PHP


$start = microtime(true); # la inceputul codului PHP /* ... codul PHP cu diverse operatii ... */ # la final se face diferenta si se afiseaza $end = microtime(true); print "Durata de executie (secunde): " . ( number_format($time_end $time_start, 6) ); // Durata de executie (secunde): 0.007908

Sa se determine ce zi si ora va fi peste 480 ore


Pentru a efectua usor operatii cu zile si ore, se va folosi formatul de data Unix (UNIX timestamp), returnat de functia time(). Practic, data este afisata ca numarul de secunde scurs de la 1 ianuarie 1970, ora 00:00. Avand aceasta noua perspectiva (de a privi datele ca un numar de secunde), operatiile cu date (de genul 'cat va fi peste 2 zile', 'ce ora a fost acum xxx minute', etc) devin extrem de simple luand forma unor simple scaderi si adunari de secunde.
// cerinta este: "cat va fi ora peste 480 de ore, adica peste (480 * 60 *60) secunde $acum = time(); $maiTarziu = 480 /*ore*/ * 60 /*minute*/ * 60 /*secunde*/; print "Data ceruta este: " . date( 'd.m.Y H.i.s', $acum + $maiTarziu ); // Data ceruta este: : 06.05.2009 18.21.49

Sa se afiseze un mesaj de salut in functie de ora curenta a serverului


$t = localtime( time(), true ); // returneaza un vector cu elementele datei si orei locale $h = $t[ 'tm_hour' ]; // iau doar ora if( $h >= 7 && $h <= 11 ) print "Buna dimineata!"; elseif( $h > 11 && $h < 18 ) print "Buna ziua!"; elseif( $h >= 18 && $h < 22 ) print "Buna seara!"; elseif( $h >= 22 ) print "Noapte buna!"; else print "Ce? Esti treaz(a) la ora asta?"; // Buna seara!

Sa se afiseze luna curenta si toate cele 12 luni in limba romana 0


Nota: aceasta secventa de cod depinde de configurarile serverului pe care este executata. Limba romana trebuie instalata pe server pentru a avea rezultatele scontate.
setlocale( LC_TIME , 'ROM_ROM' ); // afiseaza numele celor 12 luni for( $m = 1; $m <= 12; $m++ ) { print strftime( "%B", mktime( 0,0,0, $m, 1, 2008 ) ) . "\n"; } // afiseaza luna curenta print 'Luna curenta este: ' . strftime( "%B", time() );

Rezultatul (este posibil sa nu fie in limba romana!):


January February March April May June July August September October November December Luna curenta este: April

Functii in PHP
Functiile sunt blocuri de cod PHP (secvente de cod) bine delimitate si identificate printr-un nume, ce executa un set de operatii. Functiile pot fi executate de mai multe ori in cadrul unui script prin simpla apelare a numelui lor. Exista functii predefinite, specifice limbajului PHP (cum ar fi print, empty, etc) ce poti fi folosite in orice moment, fara a fi nevoie de vreo actiune speciala; si exista functii definite de utilizator, scrise practic de programatori. Pentru ca acestea sa poata fi folosite este nevoie sa fie declarate (si implementate). Exemplu de functie definita de utilizator:
<?php # functiile se declara folosind cuvantul cheie "function" urmat de numele functiei # numele functiei trebuie sa fie orice identificator valid (adica sa inceapa cu # litere sau cu caracterul _ ) si sa nu contina caractere speciale sau spatiu # dupa numele functiei se pun paranteze rotunde # corpul functiei (implementarea) trebuie incadrata in acolade function afisLuna() { $luni = array( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); echo '<select>'; for( $i = 0; $i < 12; $i++ ) { # intrucat se cunosc nr de pasi, se foloseste structura repetitiva for echo "<option>{$luni[ $i ]}</option>\n"; } echo '</select>'; } # mai jos vom folosi functia pentru a afisa un drop-down cu lunile anului: echo 'Luna inceperii activitatii: '; afisLuna(); echo '<br /><br />Luna terminarii activitatii: '; afisLuna(); ?>

Rezultatul codului PHP este reprezentat mai jos:


Luna inceperii activitatii:

Luna terminarii activitatii:

Am scris, asadar, o singura data codul care afiseaza lunile anului si l-am apelat de cate ori am avut nevoie. Apelarea functiei se face prin specificarea numelui urmat de paranteze. Intre paranteze se pot specifica parametrii, dupa cum vom vedea mai jos. Alternativ, o functie definita de utilizator se poate apela folosind instructiunea
call_user_func # vom rescrie ultima parte a codului echo 'Luna inceperii activitatii: '; call_user_func( 'afisLuna' ); echo '<br /><br />Luna terminarii activitatii: '; call_user_func( 'afisLuna' );

Instructiunea call_user_func este utila atunci cand numele functiei este furnizat de o variabila, cu ajutorul caruia se poate apela dinamic o functie. Exemplu:
<?php # definesc 2 functii diferite function unu() { print 'Azi suntem in intai!<br />'; } function alta() { print 'Azi e o zi obisnuita<br />'; } # declar o variabila care sa aiba ca valoare numele functiei $functie = 'unu'; # variabile $functie poate sa se schimbe in functie de diferite conditii # in cazul nostru, daca ziua curenta e prima zi din luna, valoarea va fi 'unu' if( date( 'd' ) == 1 ) $functie = 'unu'; else $functie = 'alta'; # la final apelez dinamic functia data de variabila # codul nu stie exact care functie va fi - el doar executa ce-i transmite variabila # eventual pot face niste validari: # - function_exists verifica daca functia transmisa a fost definita # - is_callable verifica daca variabila transmisa poate fi apelata ca functie if( function_exists( $functie ) && is_callable( $functie ) ) { call_user_func( $functie ); } else { echo "Nu pot apela functia $functie"; } // Rezultat (live): Azi e o zi obisnuita?>

Foarte important de stiut este faptul ca variabilele definite in afara functiilor nu sunt disponibile in interiorul lor. Astfel, codul de mai jos nu va functiona asa cum ne asteptam:
<?php # declar o variabila $a = "Afara e frumos"; # definesc o functie function afisMesaj() { echo $a; } # apelez functia afisMesaj(); // nu va afisa nimic!! ?>

Functia nu va afisa mesajul, asa cum v-ati fi gandit la prima vedere. Asta pentru ca ce este definit in afara functiei nu este recunoscut in interior. In mod similar, variabilele definite in interiorul unei functii se pierd si NU sunt disponibile in afara acesteia. Exista totusi o modalitate prin care variabilele definite in afara unei functii sa fie 'aduse' in interiorul ei: folosind intructiunea global.
<?php # declar o variabila $a = "Afara e frumos"; # definesc o functie function afisMesaj() { global $a; # ii spun interpretorului PHP ca vreau sa folosesc o variabila din afara functiei echo $a; } # apelez functia afisMesaj(); // va afisa Afara e frumos ?>

Daca e nevoie sa se foloseasca mai multe variabile globale in cadrul unei functii, acestea se pot specifica toate intr-o singura instructiune global:
global $a, $b, $Vector;

De ce sunt folosite functiile?


Printre avantajele folosirii functiilor, se numara:

reutilizarea codului Spre exemplu, daca este nevoie sa se execute aceeasi secventa de cod in mai multe parti ale unui programm sau script, pentru a nu se rescrie codul de fiecare data, se defineste o functie care este apelata de mai multe ori, asa cum am facut in primul exemplu de mai sus modularizare Odata cu aparitia functiilor (a subprogramelor, in general) s-a introdus si conceptul de modularizare care presupune impartirea (spargerea) problemei ce trebuie rezolvata in probleme mai mici. Fiecare modul problema mai mica reprezinta un subprogram, implementat intr-o functie care contribuie la rezultatul final. Spre exemplu, avem o operatie (relativ) complexa: afisarea inbox-ului unui utilizator. Aceasta problema poate fi impartita in parti mai mici/simple. Pentru fiecare parte s-ar defini cate o functie in loc sa se scrie un singur script foarte mare, iar la final codul va arata cam in felul urmator:
preluareDateAutentificare(); verificareDate(); preluareMesajeInbox(); afisareInbox();

mentinerea usoara a codului si intelegerea mai usoara a logicii aplicatiei sau a scriptului Acestea sunt urmari imediate ale primelor 2 puncte. Daca scriptul este structurat, impartit in bucati mai mici, in care aceleasi secvente de cod nu se repeta atunci va fi mai usor si de inteles si de modificat sau intretinut.

Valori returnate. Parmetrii


De multe ori este nevoie ca o functie sa returneze o valoare. Majoritatea functiilor predefinite fac lucrul asta; spre exemplu empty returneaza TRUE sau FALSE in functie de starea si continutul unei variabile transmise ca parametru. Si functiile definite de utilizator pot returna o valoare, cu ajutorul instructiunii return. Exemplu:
<?php function formatareData() { $rezultat = date( 'd-m-Y' ); return $rezultat; } # rezultatul returnat de functie poate fi folosit in diferite moduri: $azi = formatareData(); // atribuirea rezultatului print formatareData(); // afisarea rezultatului formatareData(); // rezultatul nu este folosit - daca functia nu printeaza ceva

// atunci apelul nu are nici un efect vizibil ?>

De asemenea, functiile pot primi date ce pot fi folosite in interiorul lor pentru diverse prelucrari. Aceste date de intrare sunt transmise sub forma de parametrii. Pentru ca o functie sa poata primi parametrii, aceasta trebuie sa ii declare intre parantezele rounde, ca in exemplul de mai jos
<?php # functia este declarata sa primeasca 2 parametrii ce vor fi prelucrati # functia returneaza si o valoare, in functie de datele de intrare function minim($a, $b) { if( $a < $b ) return $a; else return $b; } # la apelul functiei, este obligatoriu sa se transmita 2 parametrii # parametrii pot fi orice expresie (variabile, constante, rezultatul altor functii, etc) print minim( 3, 4 ); // parametrii sunt 2 valori numerice $x = 1; $y = 4; print minim( $x, $y ); // parametrii sunt 2 variabile $x = 4; $a = 3; $b = 5; print minim( $x, minim( $a, $b ) ); // parametrii primului apel sunt: variabila $x // si rezultatul unui alt apel cu 2 parametrii diferiti ?>

Nota: intrucat functia minim() returneaza o valoare, ea poate fi folosita ca si cum ar fi un numar normal. De aceea apelul de mai sus este valid. Alte exemple valide sunt mai jos:
<?php $a = 1 + minim( 4, 3 ); if( minim( $a, 4 ) > 5 ) { echo "If-ul este True"; } else { echo "If-ul este False"; } ?>

O facilitate avansata oferita de limbajul PHP este folosirea valorilor predefinite pentru parametrii functiilor. Aceasta permite ca o functie sa nu fie apelata cu toti parametrii ei, urmand ca pentru valorile care lipsesc sa fie folosite valorile predefinite. Functia minim() definita mai sus poate fi rescrisa in felul urmator:
<?php function minim($a = 1, $b = 2) {

if( $a < $b ) return $a; else return $b; } ?>

Declararea functiei de mai sus se traduce in felul urmator: daca functia minim() nu este apelata cu toti parametrii, atunci foloseste valoarea 1 pt $a si valoarea 2 pt $b in calculele din interiorul functiei. In acest caz, functia se poate apela in felul urmator:
<?php echo minim(); // echivalent cu echo minim(1,2); echo minim(7); // echivalent cu echo minim(7,2); echo minim(7,8); // apel normal cu toti parametrii ?>

Facilitati avansate referitoare la functii


Pe langa functionalitatile standard, explicate mai sus, limbajul PHP dispune de alte caracteristici mai avansate. Astfel, pot fi definite functii ce pot primi oricati parametrii este nevoie, pot fi apelate functii la un interval de timp, pot fi executate functii de fiecare data la terminarea executiei unui script PHP, etc. Acestea nu sunt insa lucruri folosite de zi cu zi, asa ca prezentarea lor depaseste scopul acestui site. Nu trebuie sa le invatati acum, ci doar sa stiti ca exista. Mai jos amintite sunt cateva din functiile avansate ce pot fi folosite:

- alternativa pentru apelul simplu al unei functii definite de utilizator; numele functiei poate fi stocat intr-o variabila, programatorul putand astfel apela functii diferite in situatii diferite call_user_func_array - la fel ca ma sus, doar ca este folosita atunci cand functia ce trebuie apelata are mai mult de un parametru function_exists - folosita pentru a verifica daca o functie este definita create_function - folosita pentru a defini o functie 'on the fly', atunci cand codul PHP se executa register_shutdown_function - folosita pentru a specifica o functie care sa se execute la finalul executiei codului PHP func_num_args, func_get_args, func_get_arg - functii ajutatoare folosite in cazul functiilor apelate cu un numar variabil de parametrii
call_user_func

Formulare
Formularele sunt elementele prin intermediul carora utilizatorii trimit date catre server. Formularele sunt intalnite in orice aplicatie web, cele mai uzuale sunt paginile de login, contact sau inregistrare. Un formular trebuie sa aiba specificate 2 atribute: "action" si "method". Action reprezinta calea catre fisierul ce va prelucra requestul clientului (de regula un fisier PHP). Acest atribut poate fi gol, specificand ca prelucrarile vor fi facute de acelasi script ce afiseaza formularul (fisierul curent). Method specifica metoda de acces. Formularele sunt strans legate de conceptul de "Metoda de acces" (Request Method). De fapt, in functie de modul in care se face cerinta catre server se clasifica si formularele: formulare GET si POST.

Request Methods: GET, POST si altele


Metodele de acces reprezinta modul in care cerintele pentru o pagina web si alte informatii aferente sunt transmise de la browser la serverul web. Exista 8 metode definite, in schimb doar 2 dintre ele sunt cel mai des folosite in dezvoltarea paginilor web. Mai multe detalii pot fi citite pe pagina de Wikipedia.

GET Este cea mai uzuala metoda, folosita implicit de browsere pentru a trimite cereri catre servere. Aceasta metoda a fost proiectata pentru a transmite pagina de la server la client, desi se pot transmite mici bucati de informatii si in sens invers (de la client la server) odata cu cererea pentru o pagina. Aceste informatii aditionale (date introduse de utilizatori) sunt adaugate la finalul URL-ului sub forma "?parametru=valoare". Asadar GET este standardul pentru a "cere" informatii de la server (in engleza "get data"). Prin urmare toate scrierea unui URL in bara de adrese a browserului sau accesarea unui link sunt request-uri de tip GET. POST Opus metodei GET, POST este folosita pentru a transmite informatii catre server (in engleza "post data"). Spre deosebire de GET care permite doar o cantitate limitata de date sa fie transmisa de la client (browser) la serverul web, POST dispune de limite mai generoase, fiind standardul de transmitere a datelor. Astfel, upload-ul unui fisier pe server, salvarea unui post pe blog, etc toate sunt requesturi de tip POST. Pentru a face un request POST este necesara folosirea unui formular.

Formulare GET
Acest tip de formulare permite utilizatorilor sa transmita informatii aditionale atunci cand cer o pagina web. Actiunea unui formular GET poate fi usor reporodusa specificand URL-ul si parametrii direct in browser (vezi aplicatia de mai jos).

Datele transmise de utilizatori la un request de tip GET sunt disponibile pentru prelucrare in PHP folosind variabila globala $_GET. Fiecare parametru al requestului reprezinta o componenta a variabilei $_GET.

Aplicatie: sa se preia numele utilizatorului (printr-un formular) si sa se afiseze pe pagina.


Intr-o prima faza fisierul va cuprinde formularul:
<form id="afiseaza" action="" method="get"> Nume: <input type="text" name="numele" /> <input type="submit" value="Trimite" /> </form>

Acesta da utilizatorilor posibilitatea sa scrie numele in caseta afisata si sa apese pe butonul "Trimite". Urmatorul pas este definirea codului care va prelua numele si-l va afisa. Secventa de cod PHP se scrie in acelasi fisier ca si codul HTML de mai sus. Daca s-ar pune intr-un fisier separat, atunci atributul action al etichetei form ar trebui sa specifice numele acelui fisier.
<?php if( isset( $_GET[ 'numele' ] ) && !empty( $_GET[ 'numele' ] ) ) { print "Salut, {$_GET[ 'numele' ]}!"; } ?>

Formularul, asa cum apare in browser, este disponibil mai jos:


Nume:

Se observa ca atunci cand se foloseste metoda GET, toate elementele formularului (care au specificat un nume!) apar in URL-ul paginii urmatoare sub forma
pagina.php?element1=valoare1&element2=valoare2

Astfel, acelasi efect ca si folosirea formularului s-ar obtine daca s-ar accesa direct pagina cu parametrul
numele=ceva (click pentru test)

Asta confirma faptul ca toate requesturile pe care le facem in mod obisnuit catre un server web sunt de tip GET (de exemplu cand accesam direct in browser www.google.ro, sau cand facem click pe un link - toate sunt cerinte GET catre server) si ca sunt echivalente cu folosirea unui formular GET. Asadar, fie ca folosim un formular cu metoda GET, fie ca scriem direct in bara de adrese a browserului, rezultatul este acelasi: un request de tip GET ai carui parametrii ce sunt accesibili in PHP prin vectorul asociativ $_GET. Dezavantajele metodei GET

sunt: cantitatea mica de date ce pot fi transmise (de obicei parametrii au valori mici, de cateva caractere) si restrictiile ce se impun valorilor parametrilor (acestia trebuie sa formeze, impreuna cu numele serverului si calea ceruta, un URL valid).

Formulare de tip POST


Un alt tip de request folosit in practica este POST. Acesta permite transferul unei cantitati mult mai mari de date (de ordinul gigaoctetilor), in timp de metoda GET este limitata la cativa octeti. Astfel, prin POST se pot transfera fisiere catre web-servere si se pot transmite texte foarte lungi, fara a ne face griji de formatul datelor transmise (care pot contine caractere speciale, pot fi in format binar). Datele transmise de utilizator sunt disponibile in PHP prin intermediul variabilei globale $_POST. Astfel, daca formularul contine 2 campuri numite "numele" si "textfl" (ca in aplicatia urmatoare), variabila $_POST va avea doua componente ce pot fi accesate prin $_POST[ 'numele'] si $_POST[ 'textfl' ].

Aplicatie: sa se preia numele utilizatorului (printr-un formular) si un text foarte lung. Sa se afiseze pe pagina numele si lungimea textului.
Continutul fisierului PHP este redat mai jos
<form id="afiseaza2" action="" method="post"> Nume: <input type="text" name="numele" /> <br /> Text foarte lung: <textarea name="textfl" rows="3" cols="20"></textarea> <br /> <input type="submit" value="Trimite" /> </form> <?php # mai intai verificam daca a fost trimis formularul if( isset( $_POST ) && !empty( $_POST )) { # da, a fost trimis; verificam fiecare componenta if( isset( $_POST[ 'numele' ] ) && !empty( $_POST[ 'numele' ] ) ) { print "Salut, {$_POST[ 'numele' ]}!<br />"; } if( isset( $_POST[ 'textfl' ] ) && !empty( $_POST[ 'textfl' ] ) ) { print "Ai trimis " . strlen( $_POST[ 'textfl' ] ) . " caractere"; } } ?>

Formularul, asa cum apare in browser, este disponibil mai jos:


Nume: Text foarte lung:

Se observa ca elementele formularului (numele si textfl) nu mai sunt transmise in URL, ci printr-un alt mecanism. Daca pagina este re-afisata (cu Refresh/F5) browserul va afisa o notificare, cerand confirmarea ca datele sa fie retrimise. Acest lucru confirma, totodata, ca pagina a fost afisata in urma unui request de tip POST.

Aplicatie: sa se incarce (copieze) un fisier de pe calculatorul personal pe server


Formularul folosit pentru upload este unul special, avand un parametru obligatoriu (enc-type) si metoda POST. Important de verificat, pentru ca functionalitatea de upload sa fie activata:

directiva file_uploads din php.ini trebuie sa fie 'on' directiva upload_tmp_dir din php.ini trebuie sa se refera la o cale existenta pe server si cu permisiuni suficiente pentru ca web-serverul sa poata crea fisiere directivele upload_max_filesize si post_max_size din php.ini specifica marimea maxima a fisierului si respectiv a datelor ce pot fi transmise prin intermediul formularului; este recomandat ca aceste valori sa fie revizuite

atributul enctype="multipart/form-data" NU TREBUIE omis, altfel uploadul nu va functiona

Formularul trebuie sa contina un input de tip FILE, ca in exemplul de mai jos.


<!-- Encoding type, specificat de atributul enctype, TREBUIE specificat ca mai jos --> <form enctype="multipart/form-data" action="upload.php" method="POST"> Incarca un fisier: <input name="fisier" type="file" /> <input type="submit" value="Trimite fisier" /> </form>

Nota asupra mecanismului de upload:


web serverul copiaza fisierul transmis de utilizator intr-o locatie temporara (specificata de directiva upload_tmp_dir) interpretorul PHP este invocat, avand variabila $_FILES populata cu informatii despre upload Programatorul este responsabil cu prelucrarea fisierului incarcat pe server (mutare intr-o alta locatie, citire, copiere, etc), prelucrare ce se face cu ajutorul functiilor puse la dispozitie de PHP. Daca fisierul incarcat nu este mutat (sau redenumit) din locatia temporara, acesta va fi sters automat la terminarea executiei scriptului (la finalul requestului, mai exact).

Fisierul PHP (upload.php) ce va prelucra uploadul contiune urmatoarea secventa de cod (include si validare).
<?php # se verifica daca fisierul incarcat a depasit dimensiunea maxima acceptata # daca acest lucru se intampla, variabilele $_POST si $_FILES se golesc automat if( empty( $_POST ) && empty( $_FILES ) ) { # a fost facut un POST sau nu? if( isset( $_SERVER['CONTENT_LENGTH'] ) ) { # atunci cand se trimit date prin post variabila $_SERVER['CONTENT_LENGTH'] # contine valoarea dimensiunii datelor $POST_MAX_SIZE = ini_get('post_max_size'); if( !empty( $POST_MAX_SIZE ) ) { # determin limita maxima (care poate fi in KB, MB sau GB $mul = substr($POST_MAX_SIZE, -1); $mul = ($mul == 'M' ? 1048576 :( $mul == 'K' ? 1024 :($mul == 'G' ? 1073741824 : 1))); if ( $_SERVER['CONTENT_LENGTH'] > $mul*(int) $POST_MAX_SIZE && $POST_MAX_SIZE ) { print "Fisier prea mare! Ati depasit limita maxima permisa"; } } else { print "Eroare nespecificata (probabil fisierul este prea mare)";

} } else { # nu s-a facut inca submit la fisier, afisez un mesaj print "Apasati pe 'Trimite fisier' pentru a face upload!"; } } else { # $_POST si $_FILES sunt setate; verific alte erori ce pot sa apara if( $_FILES['fisier']['error'] > 0 ) { print "A intervenit o eroare (#{$_FILES['fisier'] ['error']})"; } else { # fisierul uploadat va fi pus in subfolderul 'upload' (care trebuie sa # existe deja in aceeasi locatie ca si fisierul upload.php $uploaddir = dirname( __FILE__ ). DIRECTORY_SEPARATOR . 'upload' . DIRECTORY_SEPARATOR; $uploadfile = $uploaddir . basename($_FILES['fisier'] ['name']); if (move_uploaded_file($_FILES['fisier']['tmp_name'], $uploadfile)) { print "Fisier incarcat cu succes!"; } else { print "Nu s-a putut incarca fisierul"; }

} } ?>

Aplicatie: sa se incarce mai multe fisiere pe server in acelasi timp


Formularul contine mai multe elemente de tip INPUT FILE, denumite sub forma unui vector (array):
<form action="" method="post" enctype="multipart/form-data"> <p>Fisiere: <input type="file" name="pictures[]" /> <input type="file" name="pictures[]" /> <input type="file" name="pictures[]" /> <input type="submit" value="Incarca" /> </p> </form>

Codul PHP pentru prelucrarea uploadului trebuie scris in acelasi fisier ca si formularul (Nota: acesta este o in varianta cu validari minimale)
<?php # pentru fiecare fisier incarcat, fac o verificare dupa status code

if( !empty( $_FILES ) ) foreach ($_FILES["pictures"]["error"] as $key => $error) { if ($error > 0) { # echivalent cu ( $_FILES["pictures"] ["error"][$key] > 0 ) print "Eroare cu fisierul {$_FILES["pictures"] ["tmp_name"][$key]}!"; } else { $tmp_name = $_FILES["pictures"]["tmp_name"][$key]; $name = $_FILES["pictures"]["name"][$key]; # mut fisierul din locatia temporara in directorul curent (acelasi # director in care se afla scriptul PHP) move_uploaded_file($tmp_name, "$name"); } } ?>

Headere
Headerele sunt bucati mici de informatie care circula de la browser la server (si invers) oferind detalii necesare desfasurarii procesului de preluare a paginilor. Headerele transmise de browser includ tipul browserului, limba preferata, paginile acceptate, cookie-urile existente, etc. Headerele transmise de server cuprind informatii despre tipul pagini ce sa va afisa, marimea ei, daca este disponibila sau nu, etc. PHP ofera posibilitatea modificarii unora dintre aceste informatii (cele venite de la server, se intelege). Pentru acest lucru este folosita functia header.
# trimiterea unui semnal (Not-Found, Status OK, etc) header( 'HTTP/1.0 404 Not Found' ); // spune browserului sa afiseze un mesaj de eroare header( 'HTTP/1.0 200 OK' ); // anunta ca pagina exista si va fi trimisa catre browser # redirectionare - "spune" browserului sa "mearga" la alta adresa header( 'Location: http://www.punctsivirgula.ro/' );

# specificarea tipului paginii ce se va afisa header( 'Content-type: application/pdf' ); // modifica tipul paginii ce va fi afisata header( 'Content-type: text/css' );

Aplicatie: Sa se redirectioneze un utilizator la o anumita pagina


<?php # daca este definit un site, fac redirectarea if( isset( $_GET[ 'site' ] ) ) { # folosesc instructiunea de selectie multiple switch( $_GET[ 'site' ] ) { case 'home': header( 'Location: /'); break; # break este necesar dupa fiecare 'ramura' a lui switch case 'search': header( 'Location: http://www.google.ro' ); break; default: # daca nici una din conditiile de mai sus nu a fost indeplinita header( 'Location: http://www.punctsivirgula.ro' ); } exit; # dupa header() trebuie oprita executia scriptului } ?> <a href="page.php?site=home">home</a> <a href="page.php?site=search">home</a> <a href="page.php?site=bla">other</a>

Important! Inainte de folosirea instructiunii header() nu trebuie sa fie afisat nimic (cu print, echo, sau scriind cod HTML). Se intampla adesea ca si un spatiu ramas la sfarsitul unui fisier inclus cu include sau require sa opreasca functia de la a functiona corect. De exemplu, urmatoarele secvente de cod nu sunt valide:
<?php print "Nu mai pot trimite headere"; header( "Location: http://www.google.ro" ); exit; ?> <html> <body> <?php header( "Location: /" ); exit; ?>

Aplicatie: Sa se creeze o pagina care ofera spre download un document PDF, in loc sa-l deschida in browser
Probabil ca multi dintre voi ati observat ca browserele afiseaza documentele PDF sau imaginile direct in cadrul ferestrei, iar pentru a le descarca trebuie ales in mod explicit optiunea de Save din meniul browserului. Acest comportament poate fi schimbat prin headere. Daca serverul web i-ar "spune" browserului ca ceea ce se va transmite trebuie

downloadat si nu afisat atunci problema ar fi rezolvata. Sa creem asadar fisierul download.php


<?php # pagina download.php va primi ca parametru numele fisierului # forma unui link va fi urmatoarea: download.php?file=document.pdf if( isset( $_GET[ 'file' ] ) ) { # curat calea fisierului pentru a elimina riscurile de atacuri $_GET[ 'file' ] = preg_replace( '/\.\.\//', '', $_GET[ 'file' ] ); # daca a fost trimis un fisier verific daca exista if( !is_file( $_GET[ 'file' ] ) ) { # daca fisierul nu exista, trimit un semnal corespunzator header( "HTTP/1.0 404 Not Found" ); # timit un mesaj de eroare print "<html><title>Document inexistent</head> <body><h1>Documentul nu a fost gasit.</h1>Parametrul <tt>file</tt> trebuie sa specifice un fisier existent in folderul curent. Incercati din nou.</body></html>"; exit; # opresc executia aici } # daca s-a ajuns aici, inseamna ca fisierul exista # preiau extensia pentru a-i determina tipul $type = strrchr($_GET[ 'file' ], '.' ); # preiau textul de la ultimul punct la final # $type va fi acum ceva de genul ".pdf" if( strlen( $type ) ) $type = substr( $type, 1 ); # elimin punctul # in functie de tip, trimit browserului un anumit ContentType # este necesar pentru ca browserul sa stie ce tip de fisier va fi descarcat switch( $type ) { case 'pdf': header( 'Content-type: application/pdf' ); // fisierul va fi PDF break; # break este necesar dupa fiecare 'ramura' a lui switch case 'gif': header( 'Content-type: image/gif' ); break; case 'jpg': # daca nu specific un break se va executa instructiunea de la urmatoarea # ramura 'case'. # Cu alte cuvinte pentru 'jpg' si 'jpeg' este aceeasi instructiune case 'jpeg':

header( 'Content-type: image/jpeg' ); break; case 'html': # fisierul HTML va fi oferit spre download in loc sa fie afisat header( 'Content-type: text/html' ); break; case 'php': header( 'Content-type: application/x-httpd-php' ); break; /* aici pot fi definite oricate conditii */ default: # daca nici una din conditiile de mai sus nu a fost indeplinita # afisez ca text header( 'Content-type: text/plain' ); } # trimitem headerul prin care "fortam" download-ul. Partea "filename" din textul # de mai jos specifica numele sub care va fi propus spre download fisierul header("Content-Disposition: attachment; filename=\"download. $type\""); # trimit continutul fisierului de descarcat readfile( '.'.DIRECTORY_SEPARATOR.'resurse'.DIRECTORY_SEPARATOR.$_GET[ 'file' ] ); # alternativ de poate folosi // echo file_get_contents( './resurse/' . $_GET[ 'file' ] ); # nota: se pot specifica doar fisiere din folderul 'resurse', orice incercare de # a accessa alte fisiere este blocata } else { # nu a fost transmis parametrul file, fac redirect la pagina principala header( "Location: /" ); } exit; /* intrerup executia, desi nu e necesar in aceasta situatie fiind deja la sfarsitul scriptului */ ?>

Puteti testa "in actiune" acest cod urmand urmatoarele link-uri:


Imagine jpeg - link direct Imagine jpeg - link de download Document PDF - link direct Document PDF - link de download

Descarcati fisierul PHP si incercati-l pe serverul vostru.

Cookies
Cookies reprezinta portiuni de informatii (stocate sub forma de fisiere de mici dimensiuni) ce se afla pe calculatorul utilizatorului si care sunt create si folosite de catre browser in comunicarea cu serverul web. De obicei cookie-urile sunt folosite pentru a

identifica utilizatorii sau a pastra urma vizitelor pe un site. Cookie-urile pot fi sterse cu usurinta de catre utilizator, sau pot fi blocate de catre browser, deci folosirea lor trebuie facuta cu grija si doar in cazuri de necesitate. Un cookie poate contine o cantitate limitata de informatie iar durata de viata poate fi limitata (la un anumit numar de zile, la inchiderea sesiunii de lucru, etc) sau nelimitata (pana la stergerea lor). PHP dispune de 2 functii prin care se pot crea cookie-uri: setcookie si setrawcookie. Cookie-urile create pe calculatorul utilizatorului pentru un site sunt transmise de catre browser inapoi la server si sunt disponibile in variabila globala $_COOKIE.

http://php.punctsivirgula.ro/

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