Dezv - Aplicatii Web Cu PHP Si Smarty Dumitrescu
Dezv - Aplicatii Web Cu PHP Si Smarty Dumitrescu
Dezv - Aplicatii Web Cu PHP Si Smarty Dumitrescu
ANUL III
2012-2013
Prerechizite
Programare Orientata pe Obiect
1.
2.
3.
4.
5.
Baze de date
1.
2.
3.
4.
5.
Ce este o baza de date? Dati exemple ce baze de date ati utilizat sau cunaosteti.
O baza de date relationala este o baza de date ce respecta modelul relational dezvoltat de Dr. E.F. Codd.
Enumerati cateva caracteristici ale modelului.
Componentele de baza ale unei baze de date relationale sunt tabelele si relatiile. Enumerati cateva
caracteristici ale lor si dati exemple de relatii din viata reala.
Exist trei probleme care pot ap rea n tabelele f normalizare din bazele de date rela ionale: anomalia de
inserare, de stergere, de actualizare. Enumerati avantajele normalizarii unei baze de date relationare.
Pentru inserarea datelor intr-o tabela din MySQL ce instructiune ati folosi? Dati un exemplu din viata reala.
Vizualizarea datelor din tabel se face utilizand comanda SELECT. Care este sintaxa ei?
CUPRINS:
Introducere
Bibliografie
Raspunsuri
Introducere
Ini ial, PHP a fost acronimul de la Personal Home Page, dar a fost modificat pentru a se alinia
conversiei de nume a sistemului de operare GNU1 i acum reprezint acronimul pentru PHP
Hypertext Preprocessor.
Pentru a ntelege la ce i de ce folosim limbajul PHP vom da n continuare cteva dintre
principalele sale caracteristici:
este un limbaj de script, adic un limbaj de programare ce permite controlul uneia sau
mai multor aplica ii software, i este folosit pentru crearea aplica iilor web dinamice.
Spre exemplu, codul surs PHP poate fi inclus n cod HTML2 sau poate fi cod gazd
pentru cod HTML;
este un limbaj server-side, adic opera iile cerute de client se execut pe un server. n
cazul PHP-ului, server-ul, cunoscut i sub numele de web server, reprezint un
program software ce ruleaz pe un calculator ce poate fi accesat de c tre calculatorul
client. Opera iile se execut server-side pentru c pe calculatorul client nu exist
resursele necesare execut rii acestora;
pentru a rula o aplica ie PHP avem nevoie a adar de un server web pe care avem
instalat interpretorul PHP, reprezentat de CGI3 sau un modul de server, precum i de
un navigator web instalat pe calculatorul client. Codul surs PHP este interpretat de
server-ul web, care genereaz cod HTML, cod ce va fi vizualizat de client prin
intermediul navigatorului;
include n nucleul de baz libr rii open source, adic colec ii de func ii a c ror
implementare poate fi modificat i redistribuit ;
este free software, adic utilizarea sa este gratuit ;
are module predefinite pentru accesul FTP4 al server-elor, pentru accesul la servere de
baze de date, amd;
poate fi folosit pe aproape toate sistemele de operare, incluznd Linux, multe variante
de Unix, Microsoft Windows, Mac OS X sau RISC OS;
Obiectivele cursului
Cursul intitulat Fundamentele dezvoltarii aplicatiilor WEB cu PHP ncepe prin a
descrie modul de func ionare a limbajului PHP, apoi trece la detalierea modului de
creare si de nc rcare a programelor PHP.
Cele cinci module ale cursului abordeaz n mod controlat o prezentare gradat a
conceptelor folosite n activitatea de programare i a elementelor specifice
limbajului PHP. Fiecare modul con ine elemente destinate a remprosp ta memoria
i n elegerea cititorului.
La sfr itul acestui curs, studentul va fi capabil s :
opereze cu no iuni precum: administrarea proceselor, gestiunea memoriei
1
Cerin e preliminare.
Studen ii trebuie s posede cuno tin e, deprinderi, abilit i ob inute n cadrul
cursurilor de Baze de date si Programare Orientata pe Obiecte.
Resurse.
Sisteme de calcul pe care s fie instalate:
un sistem de operare din familia Windows ;
Eclipse
Server PHP
MySQL
Structura cursului
Volumul este structurat n cinci module, care sunt formate din unit i de nv are.
La rndul s u, fiecare unitate de nv are cuprinde: obiective, aspecte teoretice
privind tematica unit ii de nv are respective, exemple, teste de evaluare precum
i probleme propuse spre discu ie i rezolvare.
Primul modul cuprinde doua unitati de nv are, in care am eviden iat cteva din
caracteristicile limbajului PHP. Am discutat despre diverse tipuri de variabile,
tipuri de date n PHP, despre c iva din cei mai importan i operatori i posibilitatea
de a i combina pentru a ob ine expresii. Am studiat apoi structurile de control i
modul n care ele sunt folosite n scripturile PHP pentru crearea paginilor flexibile
i dinamice, am discutat despre func ii, despre cum s le apel m, cum s le
declar m i cum s le definim. prin care cititorul este introdus n problematica
sistemelor de operare.
Al doilea modul continua cu elemente mai avansate: lucrul cu formulare, variabile
superglobale, cookie-uri i sesiuni.
Am f cut apoi un alt pas important n crearea paginilor web dinamice in al treilea
modul i anume organizarea fi ierelor surs astfel nct s permit solu ii flexibile
de navigare i validare. Am studiat modul n care PHP poate interac iona cu fi iere
externe aplica iei.
Evaluarea va cuprinde att verificarea nsu irii cuno tiin elor teoretice prezentate,
ct i utilizarea practic a sistemelor de operare.
M1.U1.1.
Obiectivele unit ii de nv are
Aceast unitate de nv are i propune ca obiectiv principal o introducere a
studen ilor n problematica scriptului PHP. La sfr itul acestei unit i de nv are
studen ii vor fi capabili s :
scrie cod HTML si PHP in acelasi document
sa creeze, incarce si ruleze un script PHP
sa utilizeze comentarii in PHP
M1.U1.2.
Primul script PHP
Pentru nceput cre m o aplica ie simpl ce va afi a textul: hello world! ntr-un browser
web.
a cum am anun at deja n Introducere, editarea este f cut n Eclipse. Pa ii care trebuie
urma i pentru aceasta sunt:
1. Deschiderea unui workspace. Recomand m ca workspace-ul s fie creat n directorul
htdocs (htdocs este spa iul de pe server-ul Apache n care se g sesc aplica iile PHP),
din pachetul xampp (xampp este chiar numele directorului n care a fost instalat
pachetul). n plus, pentru a evita intersectarea cu alte aplica ii deja existente
recomand m i crearea unui subdirector cu numele aplica iei curente. Noi am numit
acest director carte. (Recomand m, de asemenea, ca numele directorului s
foloseasc exclusiv acele caractere ASCII acceptate n adresele URL. Numele
directorului va apare n adresa web a paginilor aplica iei).
2. Crearea unui proiect. n Eclipse alegem din meniul File->New->PHP Project (acest
director este un subdirector al directorului aplica iei, carte, i trebuie s aib un nume
supus acelora i reguli ca i cel al aplica iei). Vom numi acest proiect exemplul21.
3. Crearea fi ierului surs . n Eclipse alegem File->New->PHP File. Denumim acest
fi ier, ex.php, innd cont de regula de nume anterior recomandat . Extensia pentru
fi ierele surs PHP este .php. Extensia este foarte important pentru c i transmite
server-ului faptul c acest fi ier con ine cod PHP i trebuie interpretat ca atare.
Edit m, n continuare, fi ierul:
<?php
echo "hello world!";
?>
4. nc rcarea i rularea aplica iei. Odat editarea ncheiat fi ierul trebuie nc rcat pe
server. Simpla salvare a fi ierului, datorit spa iului de lucru corect creat anterior,
determin nc rcarea acestuia pe server. n cazul Eclipse-ului nc rcarea pe server se
face automat, la rulare. La prima rulare ns n Eclipse, trebuie s cre m o configura ie
specific aplica iei curente. Apoi, simpla ac ionare a op iunii Run->Run As->PHP Web
Page determin rularea aplica iei pe baza configura iei anterior stabilite. Fereastra de
configurare se ob ine din Run->Run configurations i n cazul aplica iei noastre
trebuie sa aib urm torul con inut:
5. Dup rulare, con inutul fi ierului, transformat n cod HTML, va fi afi at n browser.
Eclipse permite setarea tipului de browser. Aceasta poate fi facut din Window->Web
browser. Pagina va fi deschis cu browser-ul curent. n cazul aplica iei noastre
adresa URL va fi: http://localhost/carte/exemplul21/ex.php. localhost,
care desemneaz faptul c serverul se afl pe calculatorul curent. Uneori n locul
cuvntului rezervat localhost putem folosi adresa 127.0.0.1. Dac serverul se afl
pe un alt calculator, n loc de localhost vom introduce adresa IP1 a acestuia.
a dup cum am observat n algoritmul de editare prezentat anterior, codul PHP a fost
delimitat de dou marcatoare, unul de nceput i unul de sfrsit. n mod predefinit acestea sunt
<?php respectiv ?>. Avem ns la dispozi ie mai multe posibilit i de marcare a codului PHP.
Unele sunt date n Exemplul 1.
Exemplul 1. Moduri de marcare a codului PHP
<?php
echo "hello world!";
?>
------------------------<SCRIPT LANGUAGE="php">
1
IP Internet Protocol
Primele dou sunt predefinite i unanim acceptate. Din cauza sintaxei greoaie,
cea de-a doua este mai rar ntrebuin at . Ce-a de-a treia nu este ntotdeauna
acceptat . Ea poate fi activat sau nu din fi ierul php.ini. Exist i o a patra
variant , folosind tag-uri ASP, dar aceasta nu este recomandat , mai mult, ea
trebuie explicit activat n php.ini.
n Exemplul 1 am folosit func ia echo, ce determin afi area n browser, sub forma
unui ir de caractere, a parametrilor s i.
O instruc iune PHP se termin de obicei cu caracterul ; (punct i virgul ). Excep iile de la
aceast regul vor fi discutate n capitolele urm toare. n cele mai multe cazuri dac omitem
; interpretorul va returna o eroare.
M1.U1.3.
HTML i PHP n acela i document
Pentru c att HTML ct i PHP sunt limbaje de script, putem include cod PHP n cod HTML
i invers. n oricare dintre cazuri fi ierul va trebui sa aib extensia .php.
n primul caz includerea se face prin intermediul marcatorilor nainte aminti i (Exemplul 2).
Cazul invers, al includerii codului HTML ntr-un bloc PHP, va fi descris n capitolele
urm toare.
Exemplul 2. Cod PHP inclus ntr-un script HTML
<html>
<head>
<title>
Exemplul 2: Cod PHP inclus intr-un script HTML
</title>
</head>
<body>
<b>
<?php
echo "hello world!";
?>
</b>
</body>
</html>
Rezultatul este un text formatat, prin ngro area literelor. Dac n browser am vizualiza codul
surs al paginii, atunci ceea ce am ob ine ar fi cod pur HTML.
ntr-un fi ier putem serializa oricte blocuri de cod PHP avnd cod HTML intercalat.
Pe lng acest mod de alocare, ncepnd cu PHP4, avem i alocarea variabilelor prin referin .
Aceasta nseamn c noua variabil refer (indic ) aceea i adres ca i variabila original .
6
M1.U1.6.
Tipuri de date
PHP folose te, n mod curent, urm toarele categorii de tipuri de date. Tipurile din categorii nu
reprezint cuvinte cheie PHP:
Tipuri scalare reprezentate de:
boolean
integer
float
string
Tipuri compuse
array
object
Tip generic
NULL.
Tipul boolean
O variabil de tip boolean poate avea doar dou valori, reprezentate de cuvinte rezervate PHP:
TRUE respectiv FALSE. n plus, ca i n limbajul C, orice valoare 0, ir vid sau NULL nseamn
FALSE, iar orice alt valoare nseamn TRUE.
Tipul integer
Variabilele de tip integer sunt numere ntregi reprezentate, n general, pe patru octe i.
Lungimea reprezent rii, i de aici i domeniul de valori, este dependent ns de platform . Ea
poate fi aflat prin valoarea variabilei predefinite PHP_INT_SIZE. Valorile asociate tipului
integer pot fi zecimale(succesiune de cifre de la 0 la 9, eventual semn), hexazecimale
(precedate de 0x i succesiune de cifre de la 0 la 9 i literele a, A, b, B, c, C, d, D, e, E, f, F,
eventual semn) sau octale(precedate de 0 i succesiune de cifre de la 0 la 7, eventual semn).
Exemplul 10.
$var =
$var =
$var =
$var =
zecimal
negativ
in format octal
in format hexazecimal
Tipul float
Desemneaz numerele reale reprezentate n virgul mobil , care pot fi specificate folosind
oricare dintre sintaxele urm toare:
Exemplul 11.
Variabile de tip float
$var = 1.23;
$var = 1.2e3; //formatul stiintific
$var = -7E-10;
Tipul string
Tipul string reprezint iruri de caractere ASCII. Aceasta nseamn doar 256 de caractere
posibil a fi reprezentate. Pn n prezent, n variantele stabile, PHP nu are suport pentru
caractere Unicode.
Exist mai multe moduri de reprezentare extern a valorii variabilelor de tip string, dar numai
2 sunt folosite n mod uzual:
reprezentarea cu ghilimele simple: $var = 'Acesta este un string';
reprezentarea cu ghilimele duble: $var = "Acesta este un string";
Observatia 2. n cazul primei modalit i de reprezentare pentru afi area caracterului apostrof, n cadrul
textului, acesta trebuie precedat de caracterul backslash (\'). La fel se procedeaz pentru afi area caracterului
backslash (\\). Folosirea oric ror alte secven e escape determin i afi area caracterului backslash.
Exemplul 12.
Variabile de tip string reprezentate ntre apostrofuri
$var = 'Andrei a raspuns: "Acu\'!" ';
//Va afisa: Andrei a raspuns: "Acu'!"
Secven
escape
\n
Interpretare
Una dintre opera iile frecvent utilizate cu string-uri este concatenarea. Aceasta se realizeaz
prin intermediul operatorului punct (Exemplul 14). Despre alte opera ii pe string-uri vom
discuta n capitolele urm toare.
Exemplul 14.
Concatenarea a dou string-uri
/* Atribuirea unei valori de tip string. */
$str = "Acesta este un string";
/* concatenarea a doua string-uri. */
$str = $str . " cu ceva mai mult text";
Tipul array
n general, acest tip de date este cunoscut sub numele de tip tablou sau ir i reprezint o
structur ordonat cu una sau mai multe dimensiuni.
n PHP datele con inute ntr-un array pot fi de tipuri diferite. Logica unei astfel de structuri n
PHP este c fiec rui element i se asociaz o cheie i o valoare. Astfel, aceast structur aduce
o anumit generalitate fa de un tablou clasic i metode de acces diferit la date. Prin acest tip
putem defini stive, cozi, liste, colec ii, hash-uri, matrici sau vectori.
PHP ofer mai multe posibilit i de a construi o variabil de tip array:
- Sintaxa cu paranteze drepte:
$nume_array[cheie] = valoare;
unde: cheie poate fi de tip string, integer nenegativ sau poate lipsi;
valoare o valoare de orice tip de dat .
Exemplul 15.
Atribuirea de valori unui array
$a[0] = "abc"; //elementul de indice
valoarea abc
$a[1] = "def"; //elementul de indice
valoarea def
$b["sir"] = 13;//elementul de cheie
valoarea 13
$a[] = "hello";//elementul de indice
valoarea hello
din
primeste
din
primeste
ir din b primeste
2
din
primeste
de
indice
din
primeste
a cum reiese din Exemplul 15 lipsa explicit a cheii determin crearea unui nou
element, n ir, de indice egal cu ultimul indice + 1 sau de indice 0 dac nu a existat
vreunul creat deja. Astfel, n cazul lui b nu exist un indice explicit a a c a fost creat
primul, de valoare 0.
Sintaxa folosind func ia predefinit array():
$nume_array = array (cheie => valoare, ...);
Referirea la o variabil de tip tablou se face prin numele tabloului, iar la un element din tablou
prin nume i cheia sau indicele cuprinse de paranteze drepte.
Referitor la tablouri exist multe func ii i operatori care s le modifice i controleze starea
(vezi paragraful dedicat operatorilor sau capitolele urm toare).
Tipul object
O variabil de tip object se ob ine prin crearea unei instan e a unei clase (vezi capitolul
dedicat claselor i obiectelor).
Tipul NULL
Are o singur valoare i anume NULL. O variabil de tip NULL reprezint o variabil f
o valoare.
Sintaxa de atribuire a acestei valori unei variabile este urm toarea:
$a = NULL;
10
nici
M1.U1.7.
Operatori i expresii
Operatorii sunt simboluri care fac posibil folosirea uneia sau a mai multor valori pentru a
crea o nou valoare. O valoare care este operat de c tre un operator se nume te operand.
O expresie este orice combina ie valid de func ii, valori i operatori cu scopul de a ob ine o
nou valoare.
Principalii operatori ai limbajului PHP vor fi analiza i n continuare.
Operatori de atribuire
Pn acum am folosit operatorul de atribuire pentru ini ializarea variabilelor. Sintaxa de baz
pentru atribuire este:
11
$variab = expresie;
Modul de execu ie este urm torul: se evalueaz expresia iar valoarea este atribuit variabilei
din membrul stng.
Pe lnga acesta exist
(Exemplul 17).
Exemplul 17.
Utilizarea operatorilor de atribuire compu i
$a = 3;
$a += 5; // seteaza $a cu valoarea 8, ca si cum am fi scris
:
// $a = $a + 5;
$b = "Hello ";
$b .= "world!"; // seteaza $b cu valoarea "Hello world!"
// echivalent cu $b = $b . "world!";
Operatori aritmetici
Operatorii aritmetici sunt folosi i n expresii aritmetice. n Tabelul 2 este prezentat lista
acestor operatori.
Nume
operator
adunare
sc dere
semn
nmultire
mpartire
modulo
Operator
+
-
Observa ii
Operator binar
Operator unar
Rezultatul este ntreg doar dac ambii operanzi sunt ntregi
sau convertibili la ntregi, iar rezultatul este f rest
Restul este returnat indiferent dac operanzii sunt float (se
face conversia la integer). Restul este negativ doar dac
operandul stng este negativ iar cel drept pozitiv.
Tabelul 2: Operatori aritmetici
Operatori pe bi i
Operanzii sunt, n general, numere ntregi, iar utilizarea lor este pentru cre terea vitezei de
execu ie a evalu rii.
Operator Exemplu
Nume operator
&
$a & $b
i, pe bi i
|
$a | $b
sau, pe bi i
^
$a ^ $b
sau exclusiv, pe bi i
~
~ $a
negare
<<
$a << $b shiftare stnga
>>
$a >> $b shiftare dreapta
Tabelul 3: Operatori pe bi i
Operatori de comparare
Operator
Nume
operator
Observa ii
==
egal
12
===
identic
!=
<>
diferit
!==
neidentic
<
mai mic
>
mai mare
<=
mai mic
egal
sau
>=
Operatori de incrementare/decrementare
Operator
++
--
Nume operator
Observa ii
n func ie de momentul n care se face incrementarea avem
incrementare
pre-incrementare (++$a) i post-incrementare ($a++)
n func ie de momentul n care se face decrementarea avem
decrementare
pre-decrementare (--$a) i post-decrementare ($a--)
Tabelul 5: Operatori de incrementare/decrementare
Pentru a n elege diferen ele care exist ntre pre i post vom da urm torul exemplu.
Exemplul 18.
Utilizarea operatorilor de atribuire compu i
$a=1;
$b=2;
$c=$a++ + ++$b;
n Exemplul 18 dup executarea ultimei instruc iuni, $a va avea valoarea 2, $b va avea valoarea
3 iar $c valoarea 4 (ca suma dintre 1 i 3, $a a fost mai nti evaluat i apoi incrementat).
Operatori logici
Operator
and
&&
or
||
xor
!
Nume
operator
i
sau
Observa ii
Diferen a ntre cei doi operatori const
Tabelul 3)
Diferen a intre cei doi operatori const
Tabelul 3)
sau exclusiv
nega ie
Tabelul 6: Operatori logici
13
n prioritate (vezi
n prioritate (vezi
@$a=3/0;
Observa ii
==
egal
===
identic
!=
<>
diferit
!==
neidentic
reuniune
Operator
Exemplul 20.
Utilizarea operatorului de reuniune pentru array-uri
$a=array(1=>"unu",2=>"doi","index"=>"trei");
$b=array(2=>"sase","index"=>9,8);
$a+=$b;
ceea ce determin conversia c tre tipul indicat ntre paranteze. PHP permite urm toarele
conversii explicite:
14
M1.U1.8.
Preceden a i asociativitatea operatorilor
Prin preceden n elegem ordinea de evaluare a opera iilor n cadrul unei expresii, expresie ce
nu con ine paranteze, dar are operatori de diferite tipuri.
Prin asociativitate n elegem ordinea de evaluare a opera iilor ntr-o expresie ce nu con ine
paranteze, dar are operatori de acela i tip.
Operator
Asociativitate
clone new
non-asociativ
[]
stnga-dreapta
++ -non-asociativ
~ - (tip) @
non-asociativ
instanceof
non-asociativ
!
dreapta-st nga
* / %
stnga-dreapta
+ - .
stnga-dreapta
<< >>
stnga-dreapta
< <= > >= <>
non-asociativ
== != === !==
non-asociativ
&
stnga-dreapta
^
stnga-dreapta
|
stnga-dreapta
&&
stnga-dreapta
||
stnga-dreapta
?:
stnga-dreapta
= += -= *= /= .= %= &= |= ^= <<= >>= dreapta-stnga
and
stnga-dreapta
xor
stnga-dreapta
or
stnga-dreapta
Tabelul 8: Ordinea descrescatoare a priorit ii i asociativitatea operatorilor
M1.U1.9.
Constante
Constantele sunt identificate printr-un nume i au o singur valoare. Numele este un
identificator (care nu va fi precedat de semnul $), dar exprim adresa unei zone de memorie
nemodificabil . Odat valoarea constantei stabilit , aceasta nu mai poate fi modificat . Prin
conven ie, numele constantelor se scriu cu majuscule.
Definirea unei constante se poate face utiliznd func ia define() (Exemplul 21).
Observatia 4. Definirea unei constante cu define(nume, valoare)
define("CONSTANTA", "o constanta");
echo CONSTANTA; // Afiseaza: "o constanta"
Constantele pot avea valori doar de tipul: boolean, integer, float sau string.
15
Domeniul de vizibilitate al unei constante este ntregul fi ier n care a fost definit .
nlocui i zona punctat cu termenii corespunz tori.
1. In limbajul PHP variabilele sunt reprezentate prin semnul urmat de
numele variabilei.
Numele variabilei este , adica conteaza daca numele este scris cu
litere mari sau mici. Intotdeuna .. variabilelor trebuie sa inceapa cu o
. sau o liniuta de subliniere (_) si poate fi urmat de litere sau cifre.
2. este o operatie care inlocuieste o valoare cu o alta. Pe de alta
parte, egalitatea este o relatie intre doua valori. Cand doua valori sunt
., acestea raman pentru totdeauna. Totusi, puteti .. o valoare
unei variabile si ulterior puteti atribui aceleiasi variabile o alta.. . Cu
alte cuvinte, egalitatea este. ; atribuirea nu este.
3. Pentru a va ajuta sa efectuati calcule si prelucrari ale datelor, PHP
include o diversitate de . si functii utile. Cand combinati valorile
literale si variabilele cu . si functii, construiti ceea ce este cunoscut
sub numele de ..
Operatorii sunt . specifice care realizeaza o actiune specifica in
cadrul unei expresii.
.. actioneaza asupra variabilelor prezente in expresie.
M1.U1.1.
Test de evaluare a cuno tin elor
Marca i varianta corect .
1.Care sintaxa de mai jos reprezinta o sintaxa e delimitator PHP?:
a) <% %>
c) <? ?>
b) <?php?>
c) $count =+1
d) incr $count;
16
d) Boolean
c) Delimitate prin identificatorul <<<
d) Toate de mai sus
c) operatia bitwise
d) diviziune.
c) mamafiu
d) error
c) James Gosling
d) Guido Van Rossum
c) 23ron
d) 23
17
Modul de execu ie este urm torul: mai nti, instruc iunea if evalueaz expresie, ce este
scris ntre paranteze. Dac aceasta are valoarea TRUE, se execut blocul de cod imediat
urm tor. Altfel, se va executa blocul de cod urm tor lui else. Este posibil ca else nu existe
i atunci, n cazul n care valoarea expresie este FALSE, se va trece la urm toarea instruc iune
din secven a curent de program, f a se mai executa ceva din if.
Exemplul 1. Instructiunea if - else
<html>
<head>
<title>
Exemplul 1
</title>
</head>
<body>
<?php
$stare= "trist";
if ( $stare == "vesel" ){
echo "Uraaa, sunt vesel!";
}
else{
echo "Nu sunt vesel, ci $stare";
}
?>
</body>
</html>
Folosim operatorul de comparatie == (dublu egal) pentru a compara con inutul variabilei
$stare cu textul vesel. Dac se potrivesc, atunci textul: Uraaa, sunt vesel! va fi afi at
n browser. Dac schimb m valoarea variabilei $stare="trist" i rul m scriptul, atunci
primul bloc de cod va fi s rit i se va executa cel de-al doilea, cel din clauza else, iar textul
Nu sunt vesel, ci trist va ap rea scris n browser.
Observatia 2. n cazul n care pe ramura else a unui if este imediat un nou if, iar
marcajul de bloc este format din perechi de dou puncte, atunci trebuie inut cont de regula
potrivit c reia elseif trebuie s fie un singur cuvnt (token). Dac marcajul de bloc este
dat de o pereche de acolade, atunci aceast regul este op ional .
unde:
expresie poate fi orice expresie ce returneaz o valoare integer, float, boolean sau
string;
rezultat1, rezultat2 reprezint expresii de oricare dintre tipurile anun ate
anterior, dar compatibile cu expresie, i nu neap rat de valori distincte;
case este cuvnt rezervat PHP, ce precede fiecare dintre selec iile instruc iunii. Mai
multe case-uri pot fi urmate de o singur secven de cod, dar trebuie desp ite de
caracterul : (dou puncte);
default este cuvnt rezervat PHP, ce indic o secven ce urmeaz a fi executat
atunci cnd niciunul dintre case-urile anterioare nu a fost selectat. default este
op ional;
break este cuvnt rezervat PHP i reprezint
sec iunea dedicat acestei instruc iuni).
Modul de execu ie al instruc iunii este urm torul: se evalueaz expresie, i se execut
secven a de cod corespunz toare primului case care are valoarea egal , dar i secven ele
urm toare, corespunz toare celorlalte case-uri, pn la primul break ntlnit sau pn la
sfr itul instruc iunii. Dac nici o valoare corespunz toare vreunui case nu este egal cu
valoarea expresie i default exist , atunci se execut secven a de cod corespunz toare lui
default.
Exemplul 2. Instruc iunea switch
n contextul dat mai sus n browser se va afi a mediu. Dac n Exemplul 2 instruc iunea break
ar lipsi i am p stra valorea variabilei $numar, atunci n browser s-ar afi a mediu mare
nepotrivit.
ncheiem acest paragraf cu dou instruc iuni frecvent utilizate n secven ele neliniare, numite
i instruc iuni de salt.
Instruc iunea break
Este folosit pentru ntreruperea execu iei instruc iunilor for, foreach, while, do-while sau
switch.
unde, numar este op ional, dar n cazul n care este prezent va indica num rul de instruc iuni
ncuibate, dintre cele amintite, care vor fi ntrerupte de break.
Instruc iunea continue
Este folosit pentru salt la urm toarea repeti ie, dac aceasta mai exist , ntr-o instruc iune
repetitiv .
Modul de execu ie este urm torul: se evalueaz expresie. Att timp ct aceasta are valoarea
TRUE se execut blocul de cod. n interiorul acestui bloc se efectuez , de obicei, schimb ri
care influen eaz evaluarea expresiei; altfel, ciclul poate continua la infinit.
Exemplul 3. Instructiunea while
<html>
<head>
<title>
Exemplul 3
</title>
</head>
<body>
<?php
$indicator = 1;
while ( $indicator <= 12 ){
echo "$indicator * 2 = ".($indicator*2)."<br>";
$indicator++;
}
?>
</body>
</html>
n Exemplul 3 ini ializ m cu valoarea 1 variabila $indicator. Instruc iunea while testeaz , mai
nti, dac valoarea variabilei este mai mic sau egal cu 12. Dac este adev rat, atunci se
execut blocul de cod prin care se afi eaz un mesaj i se incrementeaz valoarea variabilei
$indicator. Incrementarea valorii variabilei $indicator este foarte important pentru c ea
este implicat n condi ia ce testeaz abandonarea ciclului. Blocul de cod se va executa att
timp ct condi ia este ndeplinit , adic valoarea variabilei $indicator este mai mic sau
egal cu 12.
Instruc iunea do-while
Este cunoscut sub numele de instruc iune repetitiv cu test final. Principala deosebire fa de
instruc iunea repetitiv cu test ini ial este c blocul de cod din corpul instruc iunii se execut
car o dat . Sintaxa general este:
do{
// cod care se execut
}
while(expresie);
Modul de execu ie este urm torul: se execut blocul de cod, se evalueaz expresie i ct
timp valoarea este TRUE se execut blocul de cod.
n Exemplul 4 variabila $numar se ini ializeaz cu 1. Scriptul apoi va afi a: Executia nr.:
1, dup care valoarea variabilei $numar va fi incrementat . Instruc iunea do-while va evalua
condi ia, adic dac valoarea variabilei $numar este mai mare ca 1 i mai mic ca 10. Cum
condi ia este ndeplinit , se va reveni la execu ia blocului de cod. Procesul se continu pn
cnd valoarea variabilei $numar va fi 10. n acest moment expresia logic va avea valoarea
FALSE i execu ia ciclului va fi ntrerupt .
Instruc iunea for
Poate fi asem nat cu o instruc iune repetitiv cu test ini ial. Totu i, instruc iunea for este o
reuniune de mai multe instruc iuni. Sintaxa general este:
for(expr1; expr2; expr3){
// cod care se execut
}
unde:
expr1 reprezint o succesiune de instruc iuni, separate prin virgul , care se execut o
singur dat i unde, de regul , se fac ini ializ ri;
expr2 este o expresie logic care determin continuarea ciclului;
expr3 este o succesiune de instruc iuni, separate prin virgul , n care, de regul , se
execut opera ii la sfr itul fiec rei itera ii, dup terminarea blocului de cod din
interiorul instruc iunii i naintea evalu rii expr2.
Toate cele 3 expresii pot s lipseasc . Obligatorii sunt doar cele dou ; (punct i virgul ). n
cazul n care expr2 lipse te, valoarea sa este considerat tot timpul TRUE. n acest caz, ie irea
din ciclu trebuie f cut altfel, spre exemplu prin instruc iunea break. i blocul de cod poate
lipsi. n acest caz instruc iunea for trebuie urmat de ;.
Rezultatele Exemplelor 3 i 5 sunt la fel. Se observ ns c instruc iunea for are un cod mai
compact.
Cnd compilatorul ajunge la instruc iunea for, variabila $i este ini ializat , iar apoi expresia
logic este evaluat . Dac valoarea ei este TRUE, atunci blocul de cod este executat. Apoi
valoarea variabilei $i este incrementat i expresia logic este evaluat din nou. Acest proces
continu pn cnd rezultatul expresiei logice este FALSE.
Exemplul 6. Folosirea instruc iunii break ntr-o instruc iune for
<html>
<head>
<title>Exemplul 6</title>
</head>
<body>
<?php
for ($i =10 ; $i >= 0; $i-- ){
if ( $i <= 0 )
break;
$rezultat = 4000/$i;
echo "4000 impartit la $i este...
$rezultat<br>";
}
?>
</body>
</html>
Exemplul 6 ini ializeaz variabila $i cu 10. Expresia logic verific dac valoarea variabilei $i
este mai mic sau egal cu 0. n cadrul blocului de cod num rul 4000 este mp it la $i i se
afi eaz rezultatul n browser. Variabila $i este apoi decrementat i se refac verific rile. La
ultimul pas, atunci cnd $i este 0, avem mp rtire la zero. Prin ad ugarea instruc iunii break
unde:
$variab_array numele unei variabile ce con ine un array;
as cuvnt rezervat PHP;
$cheie numele unei variabile n care se va depune valoarea cheii elementului curent,
variabil ce are domeniul de vizibilitate n interiorul instruc iunii foreach;
$valoare numele unei variabile n care se va depune valoarea elementului curent,
variabil ce are domeniul de vizibilitate n interiorul instruc iunii foreach.
Modul de lucru este urm torul: se creaz o copie a irului de parcurs, pe aceast copie se
pozi ioneaz indicatorul care parcurge irul de pe prima pozi ie, se trece valoarea cheii n
variabila $cheie i a elementului curent n variabila $valoare, se execut blocul de cod. Se
procedeaz asem tor, prin parcurgere consecutiv , a fiec rui element din ir pn la ultima
pozi ie.
Exemplul 7. : Folosirea instruc iunii foreach
<html>
<head>
<title>Exemplul 7</title>
</head>
<body>
<?php
$a=array(2,"unu"=>6,7,"indice"=>10);
foreach($a as $b => $c){
echo "elementul cu cheia: $b are valoarea
$c<br>";
}
?>
</body>
</html>
unde:
nume_functie reprezint
obligatorii.
Dac func ia returneaz un rezultat atunci apelul func iei poate fi operand ntro expresie compatibil cu tipul returnat de func ie.
Observatia 7.
PHP con ine o bibliotec vast de func ii predefinite. Exemplific m apelul a dou
dintre ele, folosite pentru lucrul cu variabile array: unset() i count().
Func ia predefinit unset() permite eliminarea unor elemente dintr-un array.
Argumentul acestei func ii indic elementul ce urmeaz a fi eliminat.
Func ia predefinit count() va returna num rul de elemente ale irului argument.
<html>
<head>
<title>Exemplul 8</title>
</head>
<body>
<?php
$a=array(2,3);
unset($a[1]);
echo count($a);
?>
</body>
</html>
n Exemplul 8 cre m variabila irul $a ce are dou elemente de valoare 2 respectiv 3. Apelul
func iei unset() determin eliminarea elementului al doilea din ir, de index 1, iar prin apelul
func iei count() func ia echo va afi a num rul de elemente din ir, adic 1.
M1.U2.7. Definirea unei func ii
n momentul n care definim o func ie i facem cunoscute numele, lista parametrilor formali i
codul surs care va prelua controlul execu iei programului n momentul apelului. Pentru a
defini o func ie folosim urm toarea sintax general :
10
function nume_functie(lista_parametri_formali){
// codul func iei
}
unde:
function este cuvnt rezervat PHP i precede orice definire sau declarare de func ie;
nume_functie este un identificator, cu urm toarele remarci:
o PHP nu permite supranc rcarea numelui func iilor;
o Domeniul de vizibilitate al numelui unei func ii este global;
lista_parametri_formali reprezint o list de variabile, separate prin virgul , ce
vor primi valori n momentul apelului. Lista poate fi vid , dar parantezele rotunde sunt
obligatorii(Exemplul 9). Asupra parametrilor formali, n PHP, putem face urm toarele
aprecieri:
o Transmiterea parametrilor unei func ii se face n mod predefinit prin valoare,
adic orice modificare a valorilor parametrilor produs n interiorul func iei nu
este recunoscut dup revenirea la programul apelant. PHP permite pentru
eliminarea acestui neajuns folosirea parametrilor referin , ceea ce nseamn c
fiecare dintre parametri referin vor fi preceda i de operatorul de referen iere,
&. Apelul nu face deosebire ntre parametri referin
i parametri valoare
(Exemplul 10);
o PHP permite atribuirea predefinit a valorilor parametrilor formali. Astfel,
dac n momentul apelului omitem atribuirea unei valori pentru un parametru
ce are o valoare predefinit , atunci valoarea acestuia va fi cea din defini ia
func iei. Trebuie remarcat c parametrii cu valori predefinite trebuie
pozitiona i grupat n lista parametrilor formali, n partea final a acesteia
(Exemplul 11);
codul functiei con ine orice secven valid de instruc iuni. Printre acestea se poate
afla i instruc iunea return. Aceasta determin ntreruperea execut rii func iei,
n scriptul din Exemplul 9 definim func ia helloWorld() care nu necesit nici un argument, iar
n blocul s u de cod afi m textul HELLO WORLD!. n momentul apelului textul va fi
vizualizat n browser.
11
12
n Exemplul 11, la primul apel al func iei afiseaza() va fi considerat valoarea implicit a
parametrului i anume salut. La cel de-al doilea apel, pentru c se specific o valoare, va fi
luat n considerare aceasta.
Dac dorim ca n cazul unor argumente cu valori predefinite s nu fie luate n
considerare, la execu ia func iei, valorile predefinite, atunci vom atribui la apel valoarea
NULL acelor argumente.
Observatia 8.
// va afisa valoarea 16
Dup cum se observ , n Exemplul 12, valoarea returnat de instruc iunea return este ob inut
n urma evalu rii unei expresii.
Observatia 10. PHP permite apelul unei func ii n timpul definirii sale (func ii recursive) sau
definirea unei func ii n interiorul altei func ii (Exemplul 12).
13
14
Observatia 11. PHP de ine mai multe variabile superglobale. Printre ele: $_SERVER, $_GET,
15
ne reamintim...
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) ce pot 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).
Foarte important de stiut este faptul ca variabilele definite in afara functiilor nu
sunt disponibile in interiorul lor. In mod similar, variabilele definite in interiorul
unei functii se pierd si NU sunt disponibile in afara acesteia.
d) break
2.Care instructiune trebuie folosita daca dorim sa se execute o bucata de cod atata timp cat o
conditie este indeplinita?
a) foreach
c) do-while
16
b) if-else-if
18
19
</form>
unde:
atributul method precizeaz metoda utilizat de browser pentru expedierea datelor i
poate fi una dintre:
o get (implicit ); datele introduse n formular sunt trimise prin ad ugarea la
sfr itul adresei URL, specificat de atributul action, a unor perechi de forma
nume=valoare. ntre adresa URL i date este inserat ? (semnul ntreb rii).
ntre diferitele seturi de date este introdus caracterul &. Astfel, datele trimise
prin metoda get pot fi vizualizate de c tre cel care acceseaz pagina. Aceasta
prezint avantajul c adresa poate fi marcat ca bookmark n browser-ele
actuale, dar are dezavantajul c datele nu pot con ine caractere non-ASCII. De
asemenea, cantitatea de date care poate fi procesat prin metoda get este
limitat la aproximativ 1kB;
o post; datele introduse n formular sunt expediate separat i astfel nu pot fi
vizualizate explicit de c tre cel care acceseaz pagina. Totodat , nu exist o
limit a cantit ii de date trimise sau a tipului de caractere introduse;
atributul action specific adresa URL a scriptului PHP care prelucreaz datele
formularului. Adresa URL poate fi o adres complet , care include protocolul, numele
gazdei i calea de acces, respectiv o adres par ial , care specific doar loca ie relativ
fa de pagina curent .
Majoritatea elementelor unui formular sunt introduse prin intermediul etichetei input ce are
urm toarea sintax simplificat :
<input type=tip name=nume value=valoare>
unde:
etichet
frecvent utilizat
select. Prin select introducem liste de selec ie. Sintaxa simplificat a acestei etichete este:
<select name=nume size=numar>
</select>
unde:
atributul name are aceea i semnifica ie ca n cazul lui input;
atributul size precizeaz cte elemente din list sunt vizibile la un moment dat
(valoarea implicit este 1), celelalte devenind vizibile prin ac ionarea barelor de
defilare.
Elementele din lista de selec ie sunt introduse prin eticheta option ce are urm toarea sintax
simplificat :
<option value=valoare selected> text
unde:
atributul value este op ional i valoarea sa va fi expediat server-ului. Dac lipse te
server-ul va recep iona text-ul ce urmeaz etichetei;
atributul selected nu are valori i este op ional. Dac este prezent determin
vizualizarea selectat a respectivei op iuni din list .
Alte etichete ce introduc elemente n formular vor fi explicate n momentul n care apar n
exemple viitoare.
Vizualizarea acestui fi ier, con innd exclusiv cod HTML, va fi f cut n browser-ul
clientului. Clientul va completa cmpurile, va selecta Universitatea absolvita (n mod
predefinit este selectat Universitatea din Brasov) i va trimite formularul server-ului
prin ac ionarea butonului Expediaza. Trimiterea formularului se va face prin metoda get.
Fi ierul de pe server care va prelucra datele formularului este prelucrare.php (Exemplul 2).
Observatia 1. Numele fisierului de pe server constituie calea relativ a acestuia. Prin
nespecificarea niciunei alte informa ii, cele dou fi iere (cel n care se g se te formularul i
cel n care se fac prelucr rile) sunt n acela i director.
Exemplul 2. Recep ionarea informa iilor transmise dintr-un formular prin variabila
superglobal $_GET
<html>
<head>
<title> Exemplul 2 </title>
</head>
<body>
<?php
echo "Numele tau este: " . $_GET["nume"] . "<br/>";
echo "Prenumele tau este: " . $_GET["prenume"] .
"<br/>";
echo "Esti din: " . $_GET["localitate"] . "<br/>";
echo "Judetul: " . $_GET["judet"] . "<br/>";
echo "<br/>";
echo "Ai absolvit: " . $_GET["universitate"];
?>
Acest fi ier va afi a n browser-ul clientului r spunsul prelucr rii (practic o succesiune de
instruc iuni echo). Browser-ul clientului va avea n zona de specificare a adreselor urm torul
URL:
http://localhost/carte/exemplul81/prelucrare.php?nume=Vasilescu&prenume=Vas
ile&localitate=Brasov&judet=Brasov&universitate=Universitatea+din+Brasov&ex
ped=Expediaza
nume=Vasilescu&prenume=Vasile&localitate=Brasov&judet=Brasov&universitate=U
niversitatea+din+Brasov&exped=Expediaza
Cnd butonul Expediaza este ap sat, o serie de instruc iuni if vor fi folosite
pentru a valida con inutul cmpurilor din formular.
<html>
<head>
<title> Exemplul 6 </title>
</head>
<body>
<?php
$valid = true;
//Determina daca numele a nevid si nenumeric
if (!isset($_POST['nume'])or empty($_POST['nume'])
or is_numeric($_POST['nume'])){
$valid = false;
echo "introduceti numele<br>";
}
else{
$name = $_POST['nume'];
}
//Determina daca numele de utilizator e nevid
if
(!isset($_POST['numeu'])or(empty($_POST['numeu']))){
$valid = false;
echo "introduceti numele utilizator<br>";
}
else{
$username = $_POST['numeu'];
}
//Determina daca parola e nevida si are minim 6
caractere
if (!isset($_POST['pass'])or(empty($_POST['pass']))
or(strlen($_POST['pass'])<6)){
$valid = false;
echo "introduceti o parola corecta";
}
else{
$password = $_POST['pass'];
}
//se afiseaza mesaj de avertizare daca formularul nu
a fost
//completat corect sau datele introduse, altfel
if($valid){
echo "ati introdus:<br>";
echo "numele: $name<br>";
echo "numele utilizator: $username<br>";
echo "si o parola valida";
}
?>
</body>
</html>
10
</head>
<body>
<?php
$addResult = include("pagina2.php");
print "fisierul inclus returneaza $addResult";
?>
</body>
</html>
Fi ierul pagina2.php
<?php
$retval = ( 4 + 4 );
return $retval;
//daca ar exista cod, n continuare, acesta nu ar fi
executat
?>
Cele dou fi iere se afl n acela i director. n fi ierul ex.php calea fi ierului
pagina2.php este precizat relativ.
11
unde:
nume specific numele variabilei cookie i este un identificator. Este singurul
parametru obligatoriu;
valoare specific valoarea variabilei. Este parte a perechii nume-valoare re inut pe
calculatorul client;
expirare specific momentul expir rii variabilei cookie (exprimat n secunde trecute
de la 1 ianuarie 1970, ora 0.00.00, GMT). Dup aceast or variabila cookie nu mai
12
Observatia 8. Pe lng apelul func iei time() PHP mai pune la dispozi ie i o func ie de
creare a datelor, exprimate n secunde. Sintaxa simplificat a acesteia este:
mktime(ore, minute, secunde, luna, zi, an);
13
Astfel, la urm toarea accesare a aplica iei variabila cookie fruct nu va mai fi valabil .
M2.U1.9. Array de cookie-uri
Sub acela i nume putem avea un ir de cookie-uri. Pentru aceasta vom crea un array, n care
cheia fiec rui element reprezint numele fiec rui cookie, iar valoarea elementului este
valoarea cookie-ului. (Exemplul 10)
Exemplul 10.
Array de cookie-uri
<?php
setcookie("cookie[unu]", "unu");
setcookie("cookie[doi]", "doi");
setcookie("cookie[trei]", "trei");
if (isset($_COOKIE['cookie'])) {
foreach ($_COOKIE['cookie'] as $nume => $val) {
echo "$nume : $val <br />\n";
}
}
?>
n Exemplul 10 putem observa modul de construc ie al numelui unui element ntr-un array de
cookie-uri. Avem ntai numele variabilei array, n cazul nostru cookie, i apoi cheia scris
ntre paranteze drepte, f apostrofuri.
.
14
ne reamintim...
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.
nlocui i zona punctat cu termenii corespunz tori.
1. Adaugarea unui cookie pe calculatorul vizitatorului se realizeaza cu ajutorul
functiei . Aceasta are urmatoarea sintaxa: ($nume, $........,
$expirare, $.....).
2. PHP de ine variabila superglobal ........., ce reprezint o variabil de tip ....... n
care cheia unui element este ..... cookie-ului, iar ......... acestuia reprezint .......
cookie-ului.
3. Deoarece o variabila are o data de.. , aceasta va fi stearsa automat la
un oarecare interval de timp dupa .. sa. Totusi, puteti sterge o variabila
cookie imediat. Pentru aceasta, fixati momentul . variabilei cookie la un
moment de timp in trecut.
c) setCookie
d) printCookie()
3. Cum poate scriptul index.php sa acceseze elemental form email din urmatorul form
15
16
d)count($HTTP_POST_PARAM);
17
n mod obi nuit procesul de comunicare se desf oar astfel: clientul HTTP ini iaz o cerere
(format din cererea propriu-zis , un header, o linie liber i eventual un mesaj), apoi printrun protocol de transport (cel mai des TCP - Transmission Control Protocol) se conecteaz la
un port (n mod predefinit portul 80). Server-ul, prin acel port, a teapt cererile clientului, le
recep ioneaz , transmite un mesaj de recep ionare i apoi un r spuns la cererea clientului.
HTTP este un protocol f stare (stateless). Aceasta nseamn c pe server-ul web nu se re in
informa ii despre utilizatori ntre cereri. Totu i acesta nu este neap rat un avantaj pentru c
gestionarea informa iilor despre utilizatori revine n grija programatorului. Exist mai multe
metode de rezolvare: folosind cookie-uri, sesiuni server-side sau prin parametrii adresei URL.
Sesiunile au fost integrate n PHP ncepnd cu versiunea 4 cu rolul de a stoca i urm ri datele
utilizatorilor atunci cnd ace tia navigheaz ntre mai multe pagini ale unui site. Una dintre
principalele caracteristici ale unei sesiuni, datorate protocolului HTTP, este identificatorul de
sesiune (ID).
Un identificator de sesiune este n mod obi nuit atribuit unui vizitator la prima vizit a unui
site. Identificatorul este deseori un string lung de caracteres, alese n mod aleator. n cazul
PHP-ului identificatorul de sesiune este generat de server i trimis clientului care l stocheaz
ca pe un cookie. n afar de identificatorul de sesiune, toate celelate date apar innd sesiunii
utilizatorului curent sunt stocate pe server. Dac identificatorul de sesiune nu este posibil a fi
nregistrat ca un cookie (browser-ul a blocat folosirea cookie-urile), atunci l putem transmite
codificat n adresa URL a cererii client.
M2.U2.4. Pornirea unei sesiuni
Pentru a putea folosi o sesiune trebuie mai nti ca aceasta s fie pornit . n mod predefinit
sesiunile nu pornesc automat.
Pentru a realiza pornirea automat a sesiunilor trebuie ca n fi ierul php.ini s set m
valoarea op iunii session.auto_start la valoarea 1. n mod predefinit:
session.auto_start = 0
n Exemplul 2 avem apelul func iei session_id() cu parametrul idnou. Acesta determin
modificarea identificatorului de sesiune returnnd valoarea nou setat . idnou este, de fapt,
string-ul ce va constitui id-ul noii sesiuni. Dac dorim ca acesta s fie identificatorul de
sesiune
pentru
ntreg
site-ul
curent
va
trebui
s -l
nregistr m
cu
setcookie(session_name(),
session_id())
(Exemplul 2). Func ia predefinit
session_name() va returna numele sesiunii curente. n mod predefinit, n PHP, numele
sesiunii este PHPSESSID.
Exemplul 2. Schimbarea i nregistrarea identificatorului de sesiune
<?php
session_id("idnou");
session_start();
setcookie(session_name(),session_id());
?>
<html>
<head>
<title>Exemplul 2</title>
</head>
<body>
<?php
print "<p>Bine ati venit, sesiunea ID este
".session_id()."</p>\n\n";
?>
<a href="pagina2.php">pagina 2</a>
</body>
</html>
Lucrul cu cookie-uri este n PHP i cel predefinit. Pentru ca identificatorul de sesiune s nu fie
stocat n cookie vom modifica op iunea:
session.use_cookies = 0
alte modific ri sesiunea r mne curent atta timp ct browser-ul este activ. Cnd
utilizatorul reporne te browser-ul, cookie-ul ce re ine valoarea identificatorului este resetat.
Putem schimba acest comportament modificnd variabila session.cookie_lifetime n
fi ierul php.ini, men ionnd i timpul dup care sesiunea va expira dup nchiderea browserului.
func ia
$_SESSION = array();
Pentru tergerea tuturor datelor din sesiunea curent se apeleaz func ia session_destroy().
Aceast func ie nu terge i identificatorul de sesiune memorat. Pentru a terge i cookie-ul
vom apela:
setcookie(session_name(), '', time()-42000, '/');
adar, pentru a distruge o sesiune, inclusiv variabilele ata ate, vom folosi urm toarea
secven :
session_start();
$_SESSION = array();
setcookie(session_name(), '', time()-42000, '/');
session_destroy();
c) session_start();
d) begin_session();
3. Care din urmatoarele se foloseste pentru a mentine o valoare a unei variabile, in cadrul mai
multor pagini?
a) static
c) session_register
b) global.
d) Nici unul de mai sus
4. Pentru a putea sterge doar o variabila memorata in sesiune folosim:
a) unset($_SESSION();
c) session_destroy(nume_variabila)
b)unset($_SESSION(nume_variabila);
d) nici un raspuns de mai sus
5. Cum se numeste variabila de tip array, superglobala, in care cheia unui element este numele
variabilei sesiune, iar valoarea elementului este valoarea variabilei sesiune?
a) $REQUEST
c) $SESSION
b) $POST
d) Nici un raspuns de mai sus.
6
n aceasta unitate de invatare am discutat despre cadrul general de folosire a
sesiunilor, am pornit i am reluat o sesiune precum i am nregistrat o sesiune nou .
Am studiat modalitatea de transmitere a identificatorului de sesiune: prin variabile
cookie sau prin URL. Am creat variabile sesiune i le-am utilizat n diferite pagini.
n final, am distrus sesiunile i am eliberat variabilele ata ate sesiunilor.
Aceast func ie returneaz un flux prin deschiderea unei resurse dat de nume_fi ier.
Sintaxa complet pentru nume_fi ier este de forma: protocol://..., unde protocol
poate fi: file (implicit), http (numai pentru citire) sau ftp (att pentru citire ct i pentru
scriere, dac server-ul suport conexiuni ftp). Este posibil ca protocol s lipseasc i atunci
PHP decide c nume_fi ier este adresa unui fi ier local. n acest caz adresa poate fi una
absolut sau una relativ (construit fa de directorul curent). Pentru ca fi ierul s se poat
deschide trebuie ca PHP s aib drepturi asupra acelui fi ier. Modul n care un fi ier este
deschis este dat de string-ul mod (Tabelul 1) al func iei.
Mod
Descriere
r+
Deschide un fi ier pentru citire sau scriere. Pointerul este plasat la nceputul
fi ierului
Deschide un fi ier pentru scriere. Dac fi ierul nu exist , atunci este creat.
w+
Deschide un fi ier pentru scriere sau citire. Daca fi ierul nu exist , atunci este
creat. Altfel, pointerul este plasat la nceputul fi ierului i con inutul existent
este ters.
Deschide un fi ier pentru scriere. Dac fi ierul nu exist , atunci este creat.
Altfel, pointerul este plasat la sfr itul fi ierului.
a+
Deschide un fi ier pentru scriere sau citire. Dac fi ierul nu exist , atunci este
creat. Altfel, pointerul este plasat la sfr itul fi ierului.
Tabelul 1: Descrierea modurilor de deschidere a unor fi iere
mesaj
die(mesaj) care este un alias al func iei exit().
Pentru nchiderea fluxului c tre un fi ier se folose te func ia fclose() ce are sintaxa:
fclose(flux);
Func ia necesit ca parametru fluxul care a fost creat la deschidere. Returneaz TRUE n caz de
succes i FALSE altfel.
Este recomandat ca nchiderea fluxului s se fac n mod explicit, dar este obligatoriu acest
lucru atunci cnd fluxul a fost deschis pentru scriere (Exemplul 1), pentru a ne asigura de
nchiderea memoriei tampon i transferul tuturor datelor n fi ierul extern.
Exemplul 1. Crearea unui fi ier extern
<?php
$numefisier = "../fi ier.txt";
$flux=@fopen($numefisier,"wt") or exit("Nu se poate
deschide fi ierul");
fclose($flux);
?>
Se observ c
Scrierea n fi ier
Pentru scrierea ntr-un flux deschis pentru creare sau ad ugare PHP pune la dipozi ie mai
multe func ii. Vom da o descriere a celor mai importante dintre ele:
fwrite(flux, string, lungime) func ie care determin scrierea con inutului
parametrului string n flux-ul creat pentru aceasta. lungime este un parametru
op ional care indic cnd se va termina scrierea, dup ce a fost atins num rul de
caractere specificat sau s-a atins sfr itul stringului (Exemplul 5). Func ia returneaz
num rul de octe i scri i, n caz de succes, sau FALSE, altfel.
Exemplul 5. Scrierea n fi ier cu fwrite()
<?php
$numefisier = "fi ier.txt";
Dac exist deja fi ier.txt, con inutul s u va fi ters i se va crea un fi ier nou;
file_put_contents(nume_fiser, date) func ie folosit pentru scrierea ntr-un
fi ier. Primul parametru este numele extern al fi ierului iar al doilea este numele
unei variabile din care se va face scrierea. Acest parametru poate fi string, array
sau un flux deja creat. Returneaz lungimea irului scris, n caz de succes, sau
FALSE, altfel;
stream_copy_to_stream(flux_sursa,
flux_destinatie)
func ie
asem toare ca func ionalitate cu cea anterioar , doar c parametrii sunt fluxuri
create pentru citire, flux_sursa, respectiv scriere, flux_destinatie. Returneaz
num rul de octe i transfera i;
fputcsv(flux, date, delimitator) func ie ce scrie ntr-un flux deja creat o
linie format din elementele parametrului date de tip array i delimitate de
delimitator. Implicit delimitatorul este virgul . Returneaz lungimea irului
scris, n caz de succes, sau FALSE, altfel.
M3.U1.5. Gestionarea lucrului cu fi iere
Copierea fi ierelor
Pentru a copia con inutul unui fi ier extern ntr-un alt fi ier extern PHP pune la dispozi ie
func ia copy(). Sintaxa acesteia este :
copy(nume_fiser_sursa, nume_fiser_destinatie)
Cei doi parametri reprezint numele externe ale fi ierelor. Func ia returneaz TRUE, n caz de
succes, sau FALSE, altfel. Ca n cazul oric ror scrieri, dac destina ie exist , con inutul s u va
fi ters i nlocuit cu cel al fi ierului surs (Exemplul 6).
Func ia returneaz TRUE, n caz de succes, sau FALSE, altfel (Exemplul 7).
Exemplul 7. tergerea unui fi ier cu unlink()
<?php
$numefisier = "fisier.txt";
$status = @unlink($numefisier) or exit("fisierul nu poate
fi sters");
echo "stergere facuta cu succes";
?>
Redenumirea fi ierelor
Func ia rename() este folosit pentru redenumirea fi ierelor. Sintaxa func iei este :
rename(nume_fi ier_original, nume_fi ier_nou)
unde, nume_director poate include i calea c tre director. Func ia returneaz TRUE, n caz de
succes, sau FALSE, altfel.
tergerea unui director se face cu func ia:
rmdir(nume_director)
unde, nume_director poate include i calea c tre director. Func ia returneaz TRUE, n caz de
succes, sau FALSE, altfel.
unde, nume poate include i calea c tre fi ier sau director. Func ia returneaz TRUE, n cazul n
care fi ierul sau directorul exist , sau FALSE, altfel.
if( file_exists("test.txt") )
print "fi ierul exista!";
De asemenea, putem verifica dac entitatea este director cu ajutorul func iei is_dir(nume).
if ( is_dir( "/tmp" ) )
print "/tmp este director";
Exemplul 10.
Formular HTML pentru nc rcarea fi ierelor
<form enctype="multipart/form-data" action="upload.php"
method="post">
Selecteaza fisierul: <input type="file"
name="uploadFile"><br>
<input name="SubmitB" type="submit" value="Incarca">
</form>
Metoda folosit pentru expedierea formularului, n acest caz, este obligatoriu POST i
atributul enctype, care specific metoda de criptare, trebuie s fie obligatoriu setat la
valoarea multipart/form-data. Atributul enctype este folosit n cazul unui formular pentru
a specifica modalitatea de codificare a datelor ce vor fi transmise server-ului. n mod
predefinit valoarea acestuia este application/x-www-form-urlencoded, care, ns , nu
este potrivit pentru transmiterea cantit ilor mari de date binare sau date text non-ASCII.
Unul dintre tag-urile input, din Exemplul 10, are atributul type setat la valoarea file. Acesta
va introduce n pagina web un cmp de text needitabil i un buton etichetat Browse. Butonul
permite deschiderea unei ferestre de selectare (File Upload) a fi ierului ce urmeaz a fi
nc rcat pe server. Dup ac ionarea butonului Open din aceast fereastr , numele fi ierului i
calea complet vor fi introduse n zona de text needitabil. Ac ionarea butonului Incarca, din
pagin va ncheia ac iunea elementar de copiere a fi ierului pe server.
n mod predefinit fi ierul este nc rcat n locul stabilit de directiva upload_tmp_dir din
php.ini, n principiu ntr-un director temporar.
Dup ce fi ierul a fost nc rcat, n loca ia stabilit de pe server, apel m la o aplica ie PHP care
-l gestioneze. n PHP exist variabila superglobal de tip array, $_FILES, care con ine toate
informa iile disponibile despre fi ierul nc rcat din formularul HTML.
n urma nc rc rii fi ierului din Exemplul 10, informa iile se g sesc n array-ul ata at
elementului $_FILES['uploadFile'], cheie a elementului ce a fost stabilit de atributul
name al tag-ului input ce are type="file". Elementele acestui array au urm toarea
semnifica ie:
10
Nu este obligatoriu s
stabilim explicit aceast
dimensiune.
o UPLOAD_ERR_PARTIAL sau 3, nc rcarea par ial
a
fi ierului;
o UPLOAD_ERR_NO_FILE sau 4, nici un fi ier nc rcat.
Fi ierele nc rcate pe server n loca ia temporar vor fi terse automat dup expirarea cererii,
dac nu au fost redenumite sau mutate.
Func ia oferit de PHP pentru mutarea unui fi ier nc rcat pe server este:
move_uploaded_file(nume_fi ier_sursa, nume_fi ier_destinatie)
unde cele dou nume reprezint numele extern al fi ierelor. Dac fi ierul destina ie exist
deja, acesta va fi ters. n caz de insucces returneaz FALSE.
Exemplul 11.
Mutarea unui fi ier nc rcat pe server prin
move_uploaded_file()
Fisierul upload.php
<?php
if ($_POST[SubmitB] == "Incarca"){
move_uploaded_file($_FILES['uploadFile']
['tmp_name'], $_FILES['uploadFile']['name']);
echo "Fisierul a fost incarcat.";
}
?>
11
care determin dac un fi ier a fost cu succes nc rcat pe server dintr-un formular. Returneaz
TRUE n caz de succes i FALSE, altfel. nume_fi ier este numele temporar al fi ierului de pe
server, ob inut prin $_FILES['uploadFile']['tmp_name'].
Observatia 2. PHP permite i nc rcarea mai multor fi iere de pe calculatorul client pe server,
din acela i formular. Metoda optim este de a crea a un array de cmpuri de selectare
(Exemplul 12).
Exemplul 12.
<html>
<head>
<title>Exemplul 12</title>
</head>
<body>
<form action="upload.php" method="post"
enctype="multipart/form-data">
<p>alegeti fisierele de incarcat:<br>
<input type="file" name="fi iere[]" /><br>
<input type="file" name="fi iere[]" /><br>
<input type="file" name="fi iere[]" /><br>
<input type="submit" value="Incarca" />
</p>
</form>
</body>
</html>
Fi ierul upload.php
<?php
foreach ($_FILES["fi iere"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["fi iere"]["tmp_name"][$key];
$name = $_FILES["fi iere"]["name"][$key];
move_uploaded_file($tmp_name, "data/$name");
}
}
?>
n formular nu apar mari deosebiri fa de Exemplul 11, doar numele cmpurilor este identic i
postfixat de [] (perechi de paranteze drepte). n upload.php se observ c indicele ce
specific fiecare fi ier n parte este ultimul n irul celor trei indici asocia i variabilei
superglobale $_FILE.
Observatia 3. Urm toarele directive din php.ini pot influen a nc rcarea fi ierelor pe
server utiliznd formularul de nc rcare: file_uploads, upload_max_filesize,
upload_tmp_dir, post_max_size i max_input_time.
12
ne reamintim...
Fisierele sunt colectii de informatii stocate pe un dispozitiv de stocare (hard-disk,
CD, etc). In functie de formatul datelor continute fisierele se impart in doua
categorii: fisiere text si fisiere binare.
In orice limbaj de programare, si deci si in PHP, cand se lucreaza cu fisiere trebuie
efectuate urmatoarele operatiuni:
- deschiderea fisierului
- citirea din fisier/scrierea in fisier
- inchiderea fisierului
Necesitatea fiecarei operatiuni este probabil usor de inteles. Un fisier trebuie
deschis pentru a putea vedea ce este in el - chiar si pentru o secventa de cod aceasta
este o necesitate. Scrierea/citirea propriu-zisa reprezinta operatia pentru care
fisierul a fost deschis, prin care sunt preluate sau adaugate informatii in fisier. La
finalul folosirii fisierului acesta trebuie sa fie inchis, altfel este posibil ca
informatiile continute sa se piarda.
13
M3.U1.10.
Test de evaluare a cuno tin elor
Marca i varianta corect .
1.Functia ...... este folosita pentru a citi o singura linie dintr-un fisier si este folosita in lucrul
cu fisiere text. Pentru a citi date binare sau alte segmente specifice unui fisier, ar trebui sa se
foloseasca functia ......
a) fgets(), fseek()
c) fputs(), fgets()
b) fread(), fgets()
d) fgets(), fread()
2. Desi resursele fisier sunt automat inchise la sfarsitul unui request in PHP, ele se pot inchide
explicit apeland functia ....... :
a) fopen()
c) fclose()
d) fgets()
b) print()
3. Consideram urmatorul script PHPcare citeste un fisier linie cu linie dintr-un fisier text. Care
apel de functie ar trebui inserat in locul specificat de semnele de intrebare pentru a face
scriptul sa functioneze corect ?
<?php
$file = fopen("test", "r");
while(!feof($file)) {
echo ????????????;
}
fclose($file);
?>
a) file_get_contents($file)
c) read_file($file)
b) file($file)
d) fgets($file)
4. Care din urmatoarele functii returneaza continul fisierului intr-un mod in care acesta poate
fi folosit ca parte a unei expresii? Alegeti 2 raspunsuri.
a) file_get_contents()
c) fopen()
b) fgets()
d) file()
5. Considerand urmatorul script, ce ar trebui sa contina fisierul fisierulmeu.txt la sfarsitul
executiei?
<?php
$array = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$f = fopen ("fisierulmeu.txt", "r");
for ($i = 0; $i < 50; $i++) {
fwrite ($f, $array[rand(0, strlen ($array) - 1)]);
}
?>
a) Nimic, pentru ca $array nu este de
c) O secventa random de 50 caractere
fapt un sir, ci un string
14
d) getFile(false)
n aceasta unitate de invatare am studiat modul n care PHP poate interac iona cu
fi iere externe aplica iei. n func ie de modul n care a fost deschis fluxul ata at
unui fi ier extern putem crea, ad uga sau citi dintr-un fi ier. De asemenea, PHP
pune la dispozi ie o serie de func ii predefinite pentru copierea, tergerea sau
testarea unui fi ier. Putem lucra cu pointerul ata at fi ierului, modificndu-i pozi ia
n func ie de anumite cerin e. Ca aplica ie, am studiat modul n care putem stoca
datele dintr-un formular ntr-un fi ier extern. Fi ierele externe pot fi nc rcate pe
server-ul PHP folosind tag-uri speciale HTML. Dup ce fi ierele au fost nc rcate
putem s le test m atributele sau putem s le salv m n loca ii diferite.
15
unde:
class este cuvnt rezervat PHP, ce precede n mod obligatoriu definirea unei clase;
NumeClasa este un identificator. Conform conven iei de nume PHP, identificatorul
pentru numele clasei va ncepe cu o liter mare, iar dac este format din mai multe
cuvinte, fiecare cuvnt va ncepe cu liter mare.
Perechea de acolade este obligatorie.
n PHP, o clas poate avea oricte atribute, de aproape orice tip. Ca func ii, clasa are metodele
clasice pentru construirea sau distrugerea unui obiect, adic constructor respectiv destructor,
metode de control sau modificare a st rii, adic getter-i respectiv setter-i, precum i alte
metode definite de utilizator.
PHP permite valori predefinite pentru atributele clase. Aceste valori pot fi doar constante, nu
valori returnate de o func ie, valorile unei variabile etc.
unde:
function este cuvnt rezervat PHP necesar deoarece constructorul este o func ie;
__construct, numele predefinit al constructorului (Aten ie! Cuvntul construct este
Exemplul 1. Crearea unei clase, instan ierea clasei i accesul la membrii clasei
Fi ierul: clasa.php
<?php
class Clasa{
public $var=6;
function __construct($v){
$this->var=$v;
}
}
?>
Fi ierul: test.php
<?php
include "clasa.php";
$inst=new Clasa(9);
echo $inst->var;
?>
Regula de stil, atunci cnd se construie te o clas , este ca ea sa fie salvat ntr-un fi ier
propriu, de obicei avnd numele clasei. A adar, n Exemplul 1, am definit clasa Clasa ntr-un
fi ier cu numele clasa.php. n defini ia clasei avem ca atribut pe $var ini ializat cu valoarea
6. Dac nu am fi definit constructorul, n mod predefinit, la crearea unui obiect, s-ar fi folosit
un constructor, f
parametri, care ar fi p strat valoarea predefinit a atributului. n
constructorul definit de noi modific m valoarea predefinit la o nou valoare, dat de
parametrul constructorului. n acest moment nu am mai putea folosi constructorul f
parametri dect dac am crea un constructor cu parametri cu valori predefinite.
function __construct($v=11){
...
}
n fi ierul test.php am inclus mai nti fi ierul ce con ine clasa, am creat obiectul $inst i
am tip rit valoarea parametrului. Acest lucru a fost posibil pentru c am avut drepturi date de
modificatorul de vizibilitate public.
n Exemplul 1 a trebuit s includem explicit n fi ierul test.php fi ierul clasa.php pentru c
acesta con ine clasa invocat , Clasa, la instan ierea obiectului $inst. Acest mod de lucru
i care este
Putem modifica fi ierul test.php din Exemplul 1 astfel nct, n loc s apel m func ia
include()definim func ia autoload() care rezolv problema includerii pentru toate clasele
necesare.
Fi ierul: test.php
<?php
function __autoload($class_name) {
require_once $class_name.'.php';
}
$f=7;
$inst=new Clasa($f);
echo $inst->var;
?>
Membri statici
Declararea membrilor unei clase drept static ofer acces direct la ei innd cont doar de
modificatorul de vizibilitate. Acces direct nseamn f
a crea o instan a clasei, ci direct
prin numele clasei (Exemplul 2).
Declararea static se face prin folosirea cuvntului rezervat static.
Atributele statice au o valoare unic pentru toate instan ele clasei. Celelalte atribute sunt
distincte fiec rei clase, iar valorile lor sunt ini ializate de c tre constructor.
n definirea metodelor statice trebuie s folosim doar atribute sau expresii care nu au de-a face
cu starea obiectului. Spre exemplu, folosirea pseudovariabilei $this este interzis ntr-o
func ie static . Constructorul i destructorul nu pot fi statici.
Pentru metode nu este obligatorie calificarea prin static. Putem apela
metoda ca pe una static , dac n defini ia ei nu folosim starea obiectului.
Observatia 2.
Din punct de vedere sintactic, accesul la un membru static se face prin operatorul domeniu,
:: (pereche de dou puncte), i nu prin operatorul de selectie, ->. De asemenea,
operatorul se aplic numelui clasei i nu vreunui obiect, instan a clasei (Exemplul 2).
n clasa Clasa am declarat variabila static , public $var i cea nestatic (specific fiec rui
obiect) $a. Func ia mesaj(), de i nedeclarat n mod explicit, este considerat static (vezi
apelul din test.php). A a cum este declarat ea ar putea fi invocat i prin operatorul clasic
->. Folosirea numelui generic self, n clasa.php, este necesar pentru a specifica despre ce
variabil $var este vorba, cea a clasei, nu cea local a func iei.
Fi ierul: test.php
<?php
function __autoload($class_name) {
require_once $class_name.'.php';
}
echo Clasa::con."<br>";
echo Clasa::mesaj();
?>
Cel de-al doilea atribut nu va putea fi accesat din cauza lipsei cheii.
M4.U1.6. Parcurgerea atributelor unei clase cu foreach
Putem folosi instruc iunea foreach i pentru a afi a atributele unei clase. Vom ob ine pentru
atributele vizibile numele i valoarea atributului. Sintaxa general este:
foreach(obiect as nume => valoare){
//codul instructiunii
}
iar restul aplica iei ar ramne nemodificat, atunci am genera o eroare fatal de redefinire a
unei metode finale.
M4.U1.9. Clase abstracte
Exist situa ii n care nu putem defini ntreaga func ionalitate a unei clase (nu avem nc
suficiente informa ii). Totu i, anumite metode trebuie declarate pentru p strarea unei
consisten e a clasei. Metodele nu vor fi, ns , definite dect n clasele derivate, acolo unde
vom avea informa ii suficiente.
O metod care ntr-o clas este doar declarat , nu i definit , este o metod abstract i acest
lucru trebuie pus n eviden prin cuvntul rezervat abstract ce prefixeaz semn tura
func iei. Constructorii i destructorii pot fi abstrac i.
O clas care are cel pu in o metod abstract devine la rndul s u abstract i acest lucru
trebuie pus n eviden prin cuvntul rezervat abstract. O clas abstract nu poate fi
instan iat . Prin derivare, clasei abstracte i se pot furniza defini ii ale func iilor abstracte. Dac
nu se definesc toate func iile abstracte, clasa derivat va deveni abstract i va trebui calificat
abstract.
n momentul definirii metodei abstracte n clasa derivat , aceasta trebuie s aib identic
aceea i semn tur ca la declarare. PHP permite un anumit rabat la accesibilitate. Astfel,
modificatorul de vizibilitate poate fi mai permisiv n clasa derivat dect n clasa abstract
(spre ex. poate fi public n loc de protected, dar nu poate fi private n loc de protected).
10
detaliu
M4.U1.10.
Interfe e
Interfe ele sunt cele mai abstracte clase cu putin . O interfa nu con ine niciun detaliu de
implementare, ele sunt practic o colec ie de metode abstracte i publice sau atribute constante
i publice.
Practic, interfa a impune ce metode trebuie s implementeze o clas . Clasa care nu
implementeaz toate metodele devine abstract i trebuie marcat prin cuvntul rezervat
abstract.
O interfa se define te asem
folose te interface.
interface Interfata{
// metode statice
}
i atribute constante
O clas poate implementa oricte interfe e, separate prin virgul . Implementarea se face
asem tor extinderii, doar c n loc de extends se folose te implements.
Exemplul 7. Definirea i implementarea unei interfe e
Fi ierul: interfata.php
<?php
interface Interfata{
const atr=8;
function afisare();
}
?>
Fi ierul: clasaderivata.php
<?php
class ClasaDerivata implements Interfata{
private $v;
function __construct($a){
$this->v=$a;
11
Interfe ele pot fi extinse de c tre alte interfe e, n mod asem tor claselor,
doar c aici este posibil extinderea multipl (interface Interfata1 extends
Interfata2, Interfata3). Att n cadrul extinderii de interfe e, ct i n cadrul
implement rii mai multor interfe e, trebuie avut grij la numele metodelor. O interfa nu
poate extinde alte interfe e dac au metode cu nume identic. O clas nu poate implementa
interfe e n care se reg sesc metode cu acela i nume.
Observatia 3.
M4.U1.11.
Operatorul instanceof
Este un operator care testeaz dac un obiect este instan a unei clase. Sintaxa general este:
obiect instanceof nume_clasa
unde:
obiect a fost instan iat prin operatorul new;
nume_clasa este numele unei clase, clase abstracte sau interfe e.
a dup cum se cunoa te, o clas de baz este compatibil cu orice clas
derivat n ierarhia sa de clase. Acela i lucru este valabil i pentru interfe e. Intr-o
ierarhie de clase, clasele surori nu sunt compatibile. Asadar, n Exemplul 7:
$obDerivat instanceof ClasaDerivata //TRUE
$obDerivat instanceof Interfata //TRUE
n Exemplul 5:
$obDerivat instanceof ClasaBaza //TRUE
$obBaza instanceof ClasaDerivata //FALSE
12
M4.U1.12.
Func ii cu argumente de tip impus
Pn n acest moment argumentelor func iilor nu li se impunea, n semn tur , un tip anume.
ncepnd cu PHP 5 putem declara argumente c rora s le impunem un anumit tip, dintre cele
acceptate, adic class sau array. n cazul obiectelor se va specifica numele clasei (inclusiv
un nume generic), iar n cazul tipurilor array se va folosi cuvntul rezervat array, f
alte
specifica ii. Putem, n plus, s preciz m dac argumentul poate primi i valoarea NULL.
Exemplul 9. Func ii cu argumente cu tip
Fi ierul: comparare.php
<?php
interface Comparare{
function compara(self $s);
}
?>
Fi ierul: clasa.php
<?php
class Clasa implements Comparare{
public $v;
public function compara(self $a){
if($this->v<$a->v)
return -1;
else if($this->v==$a->v)
return 0;
else return 1;
}
function __construct($a){
$this->v=$a;
}
}
?>
Fi ierul: test.php
<?php
function __autoload($class_name) {
require_once $class_name.'.php';
}
13
Interfa a Comparare precizeaz semn tura unei metode, compara(), ce are un argument de tip
interfa a curent i care, prin definire, va furniza o metod de comparare a dou obiecte ce
implementeaz interfa a.
Func ia compara(), a a cum este definit n Clasa, reprezint practic func ia semn. De
remarcat dou aspecte. Primul este folosirea numelui generic self, ceea ce conduce la
nespecificarea explicit a conversiei ntre Comparare i Clasa. Al doilea este semn tura
func iei ce se defineste i care este identic cu cea din interfa .
n fi ierul test.php, am definit func ia de aflare a maximului, func ie ce are dou argumente
de tip Comparare. Doar clasele ce implementeaz interfa a Comparare pot fi argumente ale
acestei func ii. Prin aceasta ne asigur m c obiectele c rora le dorim aflarea maximului se pot
compara. n plus, dac vrem s afl m c cele dou argumente, $a i $b, sunt instan e ale
aceleia i clase putem folosi operatorul instanceof.
Despre compararea obiectelor vom mai discuta n sec iunile urm toare.
M4.U1.13.
Func ii magice
PHP, ncepnd cu versiunea 5, posed o serie de func ii care se autoapeleaz n anumite
condi ii, cunoscute i sub numele de func ii magice. Numele lor este prefixat de __ (dou
underscore-uri). Pn n acest moment am studiat trei dintre ele __construct(),
__destruct() i __autoload(). Vom mai prezenta, n continuare, cteva dintre cele mai
frecvent utilizate.
Getter-i i setter-i
a cum am afirmat i n sec iunile precedente starea unui obiect este recomandat a fi ascuns
de accesul neautorizat (atributele sunt declarate private). Pentru a putea manipula starea
unui obiect, programatorii definesc func ii pentru modificarea st rii (setter-i) respectiv pentru
accesarea acesteia (getter-i) i apoi le apeleaz n afara defini iei clasei, prin intermediul unei
instan e.
PHP rezolv problema mult mai elegant pe baza unor func ii care se autoapeleaz :
pentru setare avem urm toarea sintax general :
function __set(nume, valoare){
//codul pentru setarea valorii unui atribut private
}
unde, nume este numele atributului a c rui valoare dorim s o set m i care este
inaccesibil din clasa ce define te func ia __set(), respectiv valoare este valoarea
nou a atributului;
pentru acces avem urm toarea sintax general :
function __get(nume){
//codul pentru accesul la valorea unui atribut private
//trebuie sa contina return
}
14
Exemplul 10.
Getter-i i setter-i
Fi ierul: clasa.php
<?php
class Clasa{
private $v;
private $sir=array();
function __construct($a){
$this->v=$a;
}
function __set($nume,$valoare){
if(is_array($this->nume))
foreach($valoare as $cheie=>$val)
$this->nume[$cheie]=$val;
else
$this->nume=$valoare;
}
function __get($nume){
return $this->nume;
}
}
?>
Fi ierul: test.php
<?php
function __autoload($class_name) {
require_once $class_name.'.php';
}
$ob=new Clasa(33);
$ob->sir=array(7=>7,"indice"=>8);
var_dump($ob->sir);
?>
n clasa Clasa avem dou atribute private. $v a fost ini ializat prin constructor, iar $sir este
un array gol, creat n mod predefinit. n mod clasic nu avem acces la aceste atribute prin
construc ii de felul: $ob->v, unde $ob este o instan a clasei Clasa. De obicei accesul se face
printr-o construc ie: $ob->getV(), unde getV() este o func ie public ce returneaz valoarea
lui $v. n Clasa am definit func iile __set() i __get().
Func ia __set()din Exemplul 10 construie te o modalitate de atribuire de valori unor atribute
ale clasei Clasa. Modul de lucru este urm torul: mai nti testeaz dac numele atributului
este asociat unui tip array (prin func ia predefinit PHP is_array()) i n caz afirmativ
parcurge cel de-al doilea parametru al func iei printr-o instruc iune foreach modificnd
fiecare element din $sir cu valorile date de $val. Altfel, este vorba de un tip primitiv si
atribuirea are loc direct.
15
a dup cum se observ n fi ierul test.php, dup ce am definit cele dou func ii accesul
este direct la atributele private. Func ia predefinit PHP var_dump() afi eaz propriet ile
variabilei parametru.
__toString()
Frecvent avem nevoie s afi m anumite caracteristici ale clasei (starea ei sau o parte a
acesteia). n POO, se define te o func ie toString() care modeleaz conversia clasei la un
string. Aceast conversie este folosit la afi ri de tipul echo, print, etc.
i pentru aceast opera ie PHP pune la dispozi ie o func ie magic cu urm toarea sintax :
function __toString(){
//cod de conversie la string
}
__isset()
Este invocat de func iile predefinite PHP isset() sau empty() pentru atribute inaccesibile.
Sintaxa general este:
function __isset(nume){
//cod de testare
}
__unset()
Este invocat de func ia predefinit
general este:
function __unset(nume){
//cod de testare
}
Vom completa defini ia clasei Clasa din Exemplul 10 cu aceste func ii.
function __isset($nume) {
return isset($this->nume);
}
function __unset($nume) {
unset($this->nume);
}
16
__call()
PHP extinde no iunea de getter pentru func ii. Astfel, pune la dispozi ie func ia _call() care
va apela o func ie inaccesibil din contextul curent. Sintaxa general este:
function __call(nume, argumente){
//codul pentru apelul unei func ii inaccesibile
}
unde, nume este numele metodei pe care dorim s o apel m i care este inaccesibil din clasa
ce define te func ia __call(), respectiv argumente este un array n care sunt p strate
argumentele func iei apelate.
n Exemplul 10 ad ug m o func ie private care returneaz valoarea argumentului:
private function func ie($a){
return $a;
}
Pentru a putea apela direct aceast func ie definim, n aceea i clas , metoda __call()
function __call($nume, $argumente) {
return $this->$nume(implode(', ', $argumente));
}
M4.U1.14.
Obiecte i referin e
n PHP obiectele sunt transmise ca referin e. Pentru a clarifica situa iile ap rute vom comenta
Exemplul 11.
Exemplul 11.
<?php
class B{
public $y;
function __construct($a){
$this->y=$a;
}
}
class A {
public $x;
17
Am definit, ini ial, o clas , B, care con ine un atribut public (pentru u urarea accesului), $y,
i un constructor clasic, cu un parametru. Clasa A are 2 atribute, $x i $z, declarate public,
care prin constructor au fost ini ializate cu valoarea parametrului respectiv instan iate cu clasa
B. Am creat apoi o instan , $e, a clasei A.
Pentru nceput am definit func ia f(), ce prime te ca parametru, la apel, instan a $e. n
aceast func ie am modificat valoarea primului atribut al lui $e i am construit un nou obiect
pentru cel de-al doilea. De i nu am transmis explicit parametrul func iei f() ca referin ,
totu i modific rile se reg sesc n afara defini iei (afi area cu echo). Este un prim exemplu de
transmitere a obiectului ca parametru i recunoa terea sa implicit ca referin .
n func ia f1(), cu acela i parametru, am modificat valoarea ntregii instan e prin crearea unui
nou obiect. De data aceasta valoarea modificat nu este recunoscut n exteriorul func iei.
Practic, s-a creat un nou identificator de obiect ce nu mai este recunoscut n exterior. Referin a
implicit nu se refer la noua instan .
Pentru a recunoa te noua instan creat n interiorul func iei am definit func ia f2(), n care
parametrul era explicit tratat ca referin , prin opertorul &.
18
Problema apare atunci cnd clon m atribute obiecte. Practic, n urma clon rii vom avea dou
obiecte distincte, care au atribute distincte, cu excep ia atributelor obiect, care vor fi de fapt
nume distincte ale aceluia i identificator de obiect. Pentru aceasta, PHP pune la dispozitie
func ia autoapelant __clone(), care gestioneaz procesul predefinit de clonare i are
urm toarea sintax :
function __clone(){
//cod ce particularizeaza procesul de clonare implicit al unui obiect
}
echo $obj->ob1->atr."<br>";
var_dump($obj->at);
echo "<br>".$obj2->ob1->atr."<br>";
var_dump($obj2->at);
$obj->ob1->atr++;
$obj->at[0]++;
echo "<br>".$obj->ob1->atr."<br>";
19
Clasa este o clas cu un atribut public. Clona este o clas cu dou atribute public, n care al
doilea a fost ini ializat printr-un ir constant, cu dou valori. Am construit apoi obiectul $obj
ca instan a clasei Clona i n cadrul acestui obiect atributul $obj->ob1 ca instan a clasei
Clasa. Am clonat $obj n $obj2. A a cum se observ prin afi are, valorile celor dou obiecte
sunt identice. Modific m apoi valoarea atributului din $obj->ob1, i primul element din irul
$obj->at. Se observ prin afi are c modificarile din $obj nu afecteaz valorile din obiectul
clonat $obj2. Aceasta se explic prin autoapelul, la clonare, al metodei __clone()din clasa
Clona. Dac metoda nu ar fi existat valorile lui $obj->at i $obj2->at ar fi fost distincte,
dar valorile lui $obj->ob1 i $obj2->ob1 ar fi fost comune pentru c ar referi acela i
identificator de obiect. Metoda __clone() specific faptul c , n procesul de clonare al clasei
Clona, atributul obiect ob va fi la rndul s u clonat, n loc s se creeze doar un alias al s u.
M4.U1.16.
Compararea obiectelor
n PHP pentru compararea egalit ii obiectelor folosim doi operatori:
operatorul de comparatie == (dublu egal). Variabilele obiect sunt egale dac au
acelea i atribute, acelea i valori ale atributelor i sunt instan e ale aceleia i clase.
operatorul de identitate === (triplu egal). Variabilele obiect sunt egale dac i numai
dac ele refer aceea i instan a aceleia i clase (sunt practic alias-uri ale aceluia i
obiect).
Exemplul 13.
<?php
class A{
}
Compararea obiectelor
$a = new A();
$b = new A();
$c = $b;
echo ($a==$b)."<br>"; //TRUE
echo ($a===$b)."<br>";//FALSE
echo ($b===$c)."<br>";//TRUE
?>
20
21
M4.U1.17.
Test de evaluare a cuno tin elor
Marca i varianta corect .
1.Cum trebuie sa fie o clasa astfel incat proprietatile sale sa nu poata fi accesate in afara
metodelor sale?
a) clasa trebuie declarata private
c) nu este posibil in PHP5
b) metodele clasei trebuie declarate
private
2. O clasa poate fi extinsa de alta clasa folosind un proces denumit mostenire. In PHP, cati
parinti poate o clasa copil sa mosteneasca?
a) unul
c) depinde de resursele sistemului
d) cati este nevoie
b) doi
3. Sa presupunem ca o clasa numita testclass este definita. Care trebuie sa fie numele metodei
constructor a clasei?
a) __construct
c) testclass
b) initialize
d) __testclass
4. Cum se cheama metoda metodamea a unei clase din clasa insasi?
a) $self=>metodamea();
c) $current-> metodamea();
b) $this-> metodamea ();
d) nici un raspuns de mai sus.
5. Ce va afisa urmatorul script?
<?php
class my_class
{
var $my_var;
function _my_class ($value)
{
$this->my_var = $value;
}
}
$a = new my_class (10);
echo $a->my_var;
22
c) Nimic
d) O eroare
c) 2
d) Null
b) 2
8. Ce face urmatorul segment de cod PHP?
<?php
require_once("clasamea.php");
clasamea::metodamea();
23
d)__overload
10. Care din urmatoarele declaratii de variabile intr-o clasa este invalida in PHP5?
a) private $type = 'moderate';
c)public
$amnt
=
'500';
b) internal $term= 3;
24
M5.U1.2.
Obiectivele unit ii de nv are
Aceast unitate de nv are i propune ca obiectiv exceptiile in PHP. La sfr itul
acestei unit i de nv are studen ii vor parcurge urmatoarele subiecte:
Definirea excep iilor i rolul lor ntr-un program
Procesarea excep iilor
Clasa Exception
Excep ii derivate
Tratarea excep iilor n mod specific PHP
Obiecte i referin e
Clonarea obiectelor
Compararea obiectelo
Durata medie de parcurgere a unit ii de nv are este de 2 ore.
catch(excep ieN){
//cod care trateaz excep ia dac tipul excep iei aruncate se
//potrive te cu tipul parametrului blocului
}
unde, excep ie1, , excep ieN reprezint instan e ale clasei predefinite Exception sau ale
claselor derivate din aceasta (vezi paragraful dedicat excep iilor derivate).
Un bloc try poate con ine un alt bloc try, dar fiecare trebuie s ata eze
propriile blocuri catch.
Observatia 1.
O situa ie excep ie poate s apar n urma execu iei programului sau poate fi aruncat explicit
de c tre programator n momentul n care anumite condi ii sunt ndeplinite pentru a o genera.
n cel de-al doilea caz, PHP folose te instruc iunea throw. Dup ntlnirea instruc iunii throw
celelalte instruc iuni din secven a respectiv nu se mai execut , de aceea se recomand
folosirea ei ntr-o structur alternativ .
throw new Exceptie;
unde, Exceptie este constructorul clasei predefinite Exception sau al unei clase derivate din
aceasta.
La rndul s u i un bloc catch poate arunca o excep ie n mod predefinit sau
prin intermediul instruc iunii throw.
Observatia 2.
$e-
Apelul $e->getMessage() determin afi area mesajului aruncat de excep ie. Exemplul 1
reflect modul de a trata de c tre programator o situa ie care n mod obi nuit ar genera o
eroare ce ar fi tratat predefinit de PHP.
M5.U1.4.
Clasa Exception
Este clasa de baz din ierarhia claselor ce gestioneaz excep iile, att cele predefinite ct i
cele definite de utilizator. Atributele i modificatorii lor de vizibilitate precum i metodele de
acces la aceste atribute sunt prezentate n Tabelul 1.
Numele
atributului
Modificatorul
de vizibilitate
al atributului
Metoda de acces
$message
protected
getMessage()
$code
protected
getCode()
$file
protected
getFile()
$line
protected
getLine()
$trace
private
getTrace()
getTraceAsString()
Observa ii
returneaz un string cu
mesajul de excep ie
returneaza un ntreg cu
codul de excep ie
returneaz
numele
fi ierului de unde excep ia
a fost aruncat
returneaz num rul liniei
unde excep ia a fost
aruncat
returneaz
drumul
excep iei de cnd a fost
aruncat
i pn a fost
prins
M5.U1.5.
Excep ii derivate
Clasa Exception este clasa de baz n ierarhia excep iilor ce pot fi aruncate i prinse n PHP.
Excep ii predefinite PHP
PHP furnizeaz i o colec ie de clase predefinite, derivate din Exception pe care le prezent m
n Tabelul 11.2.
Numele clasei
Observatii
excep
ie
aruncat
la un apel
BadFunctionCallException LogicException
al unei func ii nedefinite
excep ie aruncat la un apel
BadMethodCallException
BadFunctionCallException
al unei metode nedefinite
excep ie aruncat la un
DomainException
LogicException
domeniu nevalid
excep ie aruncat la un apel
de
func ie din cauza
InvalidArgumentException LogicException
nepotrivirii unui argument cu
cel a teptat
excep
ie aruncat de o
LengthException
LogicException
lungime nevalid
excep ie aruncat de o
LogicException
Exception
expresie logic nevalid
excep ie aruncat atunci cnd
OutOfBoundsException
RuntimeException
o valoare este o cheie
nevalid
excep ie aruncat atunci cnd
OutOfRangeException
LogicException
o valoare nu este ntr-un
domeniu
excep ie aruncat atunci cnd
OverflowException
RuntimeException
se doreste introducerea unei
valori ntr-un container plin
excep ie aruncat atunci cnd
RangeException
RuntimeException
o valoare nu corespunde unui
domeniu
excep ie aruncat n timpul
RuntimeException
Exception
rul rii
excep ie aruncat atunci cnd
UnderflowException
RuntimeException
se dore te extragerea unei
valori dintr-un container gol
excep ie aruncat atunci cnd
UnexpectedValueException RuntimeException
o valoare nu corespunde unei
mul imi date
Tabelul 2 : Clase predefinite, derivate din Exception
Toate aceste clase posed doar metodele pe care le-am amintit la clasa Exception. De
asemenea, toate observa iile de acolo r mn valabile.
Excep ii definite de utilizator
Utilizatorii pot defini propriile clase de excep ii prin extinderea clasei Exception.
4
unde, nume este o variabil ce con ine numele func iei ce trateaz excep ia, eventual clasa n
care se g seste aceast func ie (caz n care nume este un array. Vezi Exemplul 3).
Fa
unde, nume are aceea i semnifica ie ca n cazul lui set_exception_handler() (Exemplul 4).
ne reamintim...
Excep iile sunt folosite pentru a schimba controlul execu iei scriptului atunci cnd
are loc o eroare. In PHP 5 se introduce mecanismul excep iilor pentru gestionarea
erorilor modalitate obiect-orientat .
Cnd este lansat o excep ie codul ce urmeaz n bloc nu mai este executat i se
sare la blocul catch corespunz tor. Dac nu exist bloc catch corespunz tor va fi
lansat o eroare fatal cu mesajul: "Uncaught Exception.
M5.U1.7.
Test de evaluare a cuno tin elor
Marca i varianta corect .
1.Ce output va produce urmatorul script ?
<?php
function checkNum($number) {
if($number>1) {
throw new Exception("Valoare trebuie sa fie mai mica ");
}
return true;
}
try {
checkNum(2);
echo Numarul e OK';
}
catch(Exception $e) {
echo 'Message: ' .$e->getMessage();
}
?>
a) 2
c) Message:Valoare trebuie sa fie mai
mica
b) Numarul e OK
d) Nici un output
2. Ce output va produce urmatorul script?
<?php
function checkNum($number)
{
if($number>1)
c) Nici un output
d) Va afisa o eroare
b) Se va afisa o eroare
d) Nici un raspuns de mai sus.
4. Daca nu exista definit nici un bloc catch care sa trateze o exceptie atunci, in mod predefinit,
PHP .:
a) Nu va face nimic
c) lansa o eroare fatal "Uncaught
Exception ..."
10
ofer
un
browser
de
baze
de
date
la
adresa:
http://localhost/phpmyadmin/.
Vom considera c cititorul acestui capitol are cuno tin ele necesare despre baze de
date rela ionale i despre MySQL, ca sistem de gestiune a bazelor de datelor. n
sec iunile urm toare vom detalia doar implementarea n PHP a comenzilor
MySQL i vom comenta acolo unde sunt necesare clarific rile teoretice.
Pentru o aplica ie care interac ioneaz cu un server de baze de date trebuie s
parcurgem mai nti unele etape preg titoare, i anume: conectarea la server i
selectarea bazei de date, iar apoi etape specifice aplica iei: crearea, interogarea sau
administrarea bazei de date, etapa de sfr it fiind nchiderea conexiunii.
unde:
server este numele sever-ului sau IP-ul acestuia urmat de num rul portului. n mod
obi nuit portul este 3306. Dac MySQL se afl pe acela i calculator cu server-ul
Apache atunci server va avea valoarea: localhost:3306 sau 127.0.0.1:3306.
Aceasta este i valoarea predefinit . Putem modifica valoarea predefinit n php.ini
prin directiva mysql.default_host.
Utilizatorul poate avea diverse drepturi asupra bazelor de date de pe server a a cum au
fost create de administratorul server-ului. n momentul instal rii pachetului XAMPP
se creaz n mod implicit un utilizator cu drepturi depline, inclusiv de creare de conturi
de utilizatori, avnd valoarea root. Este recomandat ca aceast valoare s fie
schimbat dup instalare. Valoarea predefinit poate fi modificat n php.ini prin
directiva mysql.default_user.
Parola este parola de logare a utilizatorului, creat de administratorul bazei de date. La
instalarea XAMPP valoarea parolei este stringul vid. Valoarea predefinit poate fi
modificat n php.ini prin directiva mysql.default_password.
Returneaz o conexiune la baza de date sau FALSE n caz de e ec.
Putem suprima mesajul de eroare, n caz de conexiune gre it , prin folosirea
operatorului @.
Observatia 1.
unde, conexiune este numele unei conexiuni create cu mysql_connect(). Dac conexiune
lipse te, se va nchide ultima conexiune deschis , iar dac nu este nicio conexiune deschis se
va genera un mesaj de eroare.
M5.U1.4. Selectarea unei baze de date
Dup ce conexiunea a fost creat cu succes putem deschide o baz de date. Selectarea bazei
de date se face folosind func ia mysql_select_db(), cu urm toarea sintax general :
mysql_select_db(nume_baza, conexiune)
unde:
nume_baza este numele bazei de date ce urmeaz a fi selectat ;
conexiune este numele unei conexiuni deschise cu mysql_connect(). Dac
parametrul conexiune lipse te se va ncerca selectarea bazei de date din ultima
conexiune deschis .
Func ia va returna TRUE n cazul n care selec ia a putut fi f cut
i FALSE, altfel.
func ii:
mysql_errno(conexiune)
returneaz num rul erorii ultimei opera ii MySQL. Num rul erorii este n coresponden
un string returnat de func ia:
mysql_error(conexiune)
cu
= "root";
= "";
"test";
= @ mysql_connect( "localhost", $user, $pass )
or
die( "Nu m-am putut conecta la MySQL!
".mysql_errno());;
print "Conectare la server cu succes!";
@ mysql_select_db( $bd ) or
die ( "Nu m-am putut conecta la baza de date
$db: ".mysql_error());
print "Baza de date $bd selectata cu succes!";
mysql_close( $link );
?>
</body>
</html>
unde, cerere este un string ce con ine o fraz SQL. Parametrul conexiune poate lipsi i
atunci este invocat ultima conexiune. Corectitudinea sintactic a cererii nu este verificat
nainte de expediere. MySQL va returna o eroare n cazul n care cererea are erori de sintax .
Func ia returneaz un rezultat ce urmeaz apoi a fi interpretat dac cererea este de tipul
SELECT, SHOW, DESCRIBE, etc. sau returneaz TRUE dac cererea este de tipul INSERT, UPDATE,
DELETE, DROP, etc. n caz de succes, respectiv FALSE n caz de e ec.
Dac dorim s cre m o baz de date goal , librarie, putem folosi urm torul cod:
$sql = "CREATE DATABASE librarie";
if (mysql_query($sql, $link))
echo "Baza de date librarie a fost creat cu succes\n";
else
echo "Eroare la crearea bazei de date: ".mysql_error()."\n";
unde, $sql con ine string-ul interog rii SQL, iar $link este conexiunea creat
Exemplul 1.
n baza de date anterior creat vom crea acum tabele. Exemplific m crearea de tabele prin
tabela domenii ce are urm toarea structur :
id_domeniu: cheie primara, INTEGER, NOT NULL, AUTO_INCREMENT;
nume_domeniu: VARCHAR( 20 );
descriere: TEXT;
codul PHP pentru a crea aceast structur este:
$sql = "create table `librarie`.`domenii` ( `domenii` int NOT NULL
AUTO_INCREMENT , `nume_domeniu` varchar (20) , `descriere` text , PRIMARY
KEY (`domenii`)) ";
if (mysql_query($sql, $link))
echo "Baza de date my_db a fost creat cu succes\n";
else
echo "Eroare la crearea bazei de date: ".mysql_error()."\n";
Acesta este modul programat de a crea o tabel . Putem crea tabele utiliznd i browser-ul
bazei de date.
n continuare ad ug m date n tabela domenii. Vom folosi un formular cu dou cmpuri
corespunz toare numelui, respectiv descrierii domeniului. C mpul id_domeniu se
autoincrementeaz la fiecare ad ugare de noi nregistr ri.
Exemplul 2. Ad ugarea de date dintr-un formular ntr-o tabel
<html>
<head>
<title>
Exemplul 2
</title>
</head>
<body>
<?php
if ( isset( $_POST['nume_domeniu']) && isset(
$_POST['descriere'] )){
$nume_domeniu=$_POST['nume_domeniu'];
$descriere=$_POST['descriere'];
$dberror = "";
$ret = adauga_n_bd( $nume_domeniu, $descriere,
$dberror );
if ( ! $ret )
print "Error: $dberror<BR>";
else
print "Va multumim";
}
else {
write_form();
}
function adauga_n_bd( $nume_domeniu, $descriere,
&$dberror ){
$user = "root";
unde, conexiune este op ional , dac lipse te se va considera ultima conexiune creat .
Rezultatul ntors este num rul rndurilor afectate de ultimul apel al func iei mysql_query()
cu parametru INSERT, UPDATE sau DELETE n caz de succes i -1 n caz de e ec. Dac
parametrul este REPLACE, atunci, n caz de success, se va ntoarce suma dintre num rul
nregistr rilor eliminate i num rul nregistr rilor ad ugate.
Ob inerea valorii unui cmp care se autoincrementeaz
n Exemplul 2 am ad ugat nregistr ri noi n tabela domenii f
s specific m explicit valori
pentru atributul id_domeniu. Aceasta deoarece valoarea sa se autoincrementeaz . Putem afla
valoarea acestui atribut, pentru ultima nregistare introdus cu INSERT, folosind func ia
mysql_insert_id(), ce are urm toarea sintax general :
unde, conexiune poate s lipseasc i atunci se folose te ultima conexiune creat . Func ia
ntoarce valoarea cmpului autoincrementat al ultimei nregistr ri introduse cu INSERT n caz
de succes, 0 dac ultima nregistrare nu con ine un cmp autoincrementat, sau FALSE dac nu
avem nicio conexiune stabilit , n caz de e ec.
Observatia 2. Tipul returnat este integer n PHP. Dac n MySQL tipul cmpului
autoincrementat este BIGINT, atunci rezultatul returnat nu este corect. Se poate folosi n
schimb o cerere SQL n care s apel m func ia LAST_INSERT_ID().
Pentru a ilustra cu exemple func iile din sec iunile urm toare vom completa baza de date
libr rie cu urm toarele tabele:
carti, care con ine c ile accesibile cump torilor din libr rie. Am presupus c o
carte apar ine unui singur domeniu. Aceast tabel are urm toarea structur :
o id_carte: cheie primar , INTEGER, NOT NULL, AUTO_INCREMENT;
o titlu: VARCHAR( 20 );
o pret: FLOAT;
o id_domeniu: cheie str in , INTEGER;
autori, autorii c ilor i are urm toarea structur :
o id_autor: cheie primar , INTEGER, NOT NULL, AUTO_INCREMENT;
o nume: VARCHAR(20);
o prenume: VARCHAR(20);
carti_autori, tabel de legatur dintre tabelul carti i tabelul autori; o nregistrare
din acest tabel leag o carte de un autor. O carte poate avea mai mul i autori, deci pot
ap rea mai multe nregistr ri cu acela i id_carte. Un autor poate scrie mai multe
i, deci pot ap rea mai multe nregistr ri ce au acela i id_autor. Aceast tabel are
urm toarea structur :
o id_carte: cheie str in , INTEGER;
o id_autor: cheie str in , INTEGER;
Rezultatul returnat de func ie este re inut n variabila $rezultat i este practic un tabel, n
caz de succes, tabel ce va fi apoi parcurs cu func ii PHP.
M5.U1.7. Accesarea unui ResultSet
<html>
<head>
<title>
Exemplul 4
</title>
</head>
<body>
<?php
$user = "root";
$pass = "";
$db = "librarie";
$conexiune = mysql_connect( "localhost", $user,
$pass );
if ( ! $conexiune ) die( "Nu putem conecta server-ul
MySQL" );
mysql_select_db( $db, $conexiune ) or die ( "Nu
putem deschide $db: ".mysql_error() );
$rezultat = mysql_query( "SELECT titlu, pret FROM
carti, autori, carti_autori WHERE
carti.id_carte=carti_autori.id_carte and
carti_autori.id_autor=autori.id_autor and nume='Eminescu' and
prenume='Mihai'" );
$nr_linii = mysql_num_rows( $rezultat );
print "Tabela rezultat are $nr_linii linii<P>";
print "<table border=1>\n";
O alt variant de parcurgere este dat de folosirea func iei mysql_fetch_object(). Aceast
func ie returneaz , n caz de success, un obiect pentru fiecare rnd al rezultatului. Atributele
obiectului sunt cmpurile tabelei. Sintaxa general a acestei func ii este:
mysql_fetch_object(rezultat, nume_clasa, parametri_constructor)
unde:
rezultat este o variabil ce are valoarea rezultatului ntors de mysql_query() cu
parametru SELECT sau SHOW;
numar indic num rul liniei la care se dore te pozi ionarea indicatorului de tabel.
Liniile unui tabel rezultat sunt numerotate ntre 0 i mysql_num_rows()-1.
unde:
rezultat este o variabil ce are valoarea rezultatului ntors de mysql_query() cu
parametru SELECT sau SHOW
numar indic num rul coloanei din cadrul rndului curent la care se dore te aflarea
numelui.
Coloanele unei linii din tabelul rezultat sunt numerotate ntre 0 i mysql_num_fields()-1.
10
print "<tr>\n";
for ( $x=0; $x<$num_fields; $x++ )
print "<th>".mysql_field_name( $rezultat, $x ) ."</th>";
print "</tr>\n";
while ( $linie = mysql_fetch_object( $rezultat ) ){
print "<tr>\n";
print "<td>$linie->titlu</td><td>$linie->pret</td>\n";
print "</tr>\n";
}
print "</table>\n";
unde:
rezultat este o variabil ce are valoarea rezultatului ntors de mysql_query() cu
parametru SELECT sau SHOW;
numar indic numarul coloanei din cadrul rndului curent la care se dore te aflarea
lungimii. Coloanele unei linii din tabelul rezultat sunt numerotate ntre 0 i
mysql_num_fields()-1.
unde:
rezultat este o variabil ce are valoarea rezultatului ntors de mysql_query() cu
parametru SELECT sau SHOW
numar indic num rul coloanei din cadrul rndului curent la care se dore te aflarea
tipului. Coloanele unei linii din tabelul rezultat sunt numerotate ntre 0 i
mysql_num_fields()-1.
unde:
rezultat este o variabil ce are valoarea rezultatului ntors de mysql_query() cu
parametru SELECT sau SHOW;
11
Rezultatul returnat este un string, n care atributele sunt separate prin spa iu, care poate fi
desp it utiliznd func ia explode().
M5.U1.8. Informa ii despre baza de date
PHP con ine un domeniu vast de func ii ce permit returnarea informa iilor despre structura
conexiunii curente.
Listarea bazelor de date
Func ia mysql_list_dbs() returneaz o tabel ce con ine lista bazelor de date disponibile
din conexiune, n caz de succes i FALSE altfel. Sintaxa general este:
mysql_list_dbs(conexiune)
Folosim func ia mysql_num_rows() pentru a afla num rul de baze de date accesibile din
conexiune. Apoi, pentru aflarea numelui acestora apel m func ia mysql_db_name() ce are
urm toarea sintax simplificat :
mysql_db_name(rezultat, numar)
unde:
rezultat este o variabil ce are valoarea rezultatului ntors de mysql_list_dbs()
numar indic num rul liniei la care se dore te pozi ionarea indicatorului de tabel.
Liniile unui tabel rezultat sunt numerotate ntre 0 i mysql_num_rows()-1. Func ia
returneaz un string cu numele n caz de succes i FALSE altfel.
Exemplul 5. Lista bazelor de date disponibile din conexiunea curent
<html>
<head>
<title>Exemplul 5</title>
</head>
<body>
<?php
$user = "root";
$pass = "";
$conexiune = mysql_connect( "localhost", $user,
$pass );
if ( ! $conexiune ) die( "nu ne putem conecta la
server-ul MySQL" );
$rezultat = mysql_list_dbs( $conexiune );
$num = mysql_num_rows( $rezultat );
for( $x = 0; $x < $num; $x++ )
print mysql_db_name( $rezultat, $x )."<br>";
mysql_close( $conexiune );
?>
</body>
</html>
12
ne reamintim...
MySQL reprezinta o baza de date relationala oferita gratuit, disponibila atat pentru
Windows, cat si pentru Linux. Este folosita in realizarea aplicatiilor mici si medii.
Ideea pe care se bazeaza interactiunea PHP - MySQL sau in general
interactiunea dintre PHP si o baza de date este aceea ca permite ca informatiile care
se doresc sa apara pe site sa fie prezente in baza de date. In acest fel informatiile
pot fi actualizate usor si prezentate intr-o forma "dinamica" in cadrul site-ului.
Operatiile cele mai importante effectuate cu o baza de date in PHP prezentate
sunt:
Crearea unei baze de date si introducerea datelor in tabele, deschiderea/inchiderea
bazelor de date, vizualizarea, copierea si modificarea structurii unei baze de date,
stergerea inregistrarilor dintr-o baza de date.
nlocui i zona punctat cu termenii corespunz tori.
1. Cea mai elementara forma de interogare este comanda ".. " simpla.
Cea mai simpla interogare raporteaza toate coloanele din toate rndurile unui
tabel. Interogarea are urmatoarea forma:
.. * tabel;
- Unde "tabel" este numele tabelului la care se va obtine accesul.
2. Inainte de a putea accesa informatii din baza de date , trebuie creata o
cu serverul MySQL.
Pentru a va .. la un server MySQL cu PHP si MySQL, se creaza o de
obiect mysql, cu formula , la care se adauga datele de conectare.
3. Conexiunea va fi inchisa cand scriptul se termina. Se recomanda totusi sa
inchideti conexiunea mai devreme, cand nu o mai foloseste. Acest lucru va
elibera folosita de conexiune. Pentru a inchide o conexiune se foloseste
metoda . () din clasa MySQL
4. Pentru a inregistrari noi intr-un tabel MySQL, se foloseste
comanda INSERT. .
13
b) user ID
d) numele bazei de date
4. Studiati urmatorii pasi si determinate ordinea corecta:
1. Deschiderea unei conexiuni la MySQL server
2. Executarea unui query SQL
3. Obtinerea datelor dintr-un query
4. Selectarea unei baze de date
5. Inchiderea conexiunii,
a) 1.4.2.3.5
c) 1.5.4.2.1
b) 4.1.2.3.5
d) 4.1.3.2.5
5. Care din urmatoarele functii se foloseste pentru a accesa o baza de date MySQL in PHP?
14
d) functia mysql_fetch_object()
n acest capitol am discutat problemele esen iale ale conceptului de excep ie,
tratarea exceptiilor i implement ri specifice PHP ale exceptiilor. Astfel, am
discutat despre membrii clasei Exception care controleaz activitatea de baz n
manipularea exceptiilor. Am discutat apoi despre blocurile implicate n aruncarea,
respectiv prinderea excep iilor. Am derivat, mai departe, clasa de baz i am studiat
principalele clase predefinite, precum i am creat clase utilizator pentru tratarea
excep iilor. n final, am tratat erorile cu ajutorul excep iilor.
15
Bibliografie
Bibliografie
[1] Luke Welling, Laura Thomson, 2005, Dezvoltarea aplicatiilor WEB cu PHP si MySQL, Editia a II-a,,
Teora
[2] David Lane; Hugh E. Williams, 2002, Web Database Applications with PHP & MySQL, O'Reilly.
[3] Andi Gutmans, Stig Sather Bakken, Derick Rethans, 2005, Php 5 Power Programming Pearson
Education Inc.
[4] George Schlossnagle, 2004, Advanced PHP Programming, Sams.
[5] Kevin Tatroe, Rasmus Lerdorf, Peter MacIntyre, 2006, Programming PHP, 2nd Edition, OReilly.
[6] Larry Ulman, 2006, PHP si MySQL pentru site-uri WEB dinamice, Teora.
196
Raspusuri:
M1.U1
TO DO:
1.
2.
3.
4.
Raspuns correct b
Scripturile, comentarii,
Comentariu, /*, */
Browserul, adresa URL, scriptul, slash (/),
TO DO:
1.
2.
3.
4.
5.
6.
FALSE, TRUE
Integer, zecimal, octal
Sirurile, sirurile,
Ghilimele, valoarea, inaintea
Null, valoare, unset()
String, character, 256, mare
TO DO:
1. $ , case sensitive, numele, litera
2. Atribuirea, egale, egale, atribui, valoare, permanenta
3. Operatori, operatori, operatori, simboluri, simboluri
Test de evaluare
1. B
2. B
3. C
4. B
5. D
6. d
7. A
8. A
9. B
10. D
M1.U2
TO DO
1. IF, rezultatelor, IF - THEN ELSE, IF, THEN, ELSE
2. Repetitive, repetata, repetitive, executata, oprire, executii/iteratii
3. While, executii, while, while.
TO DO
1. Setcookie, setcookie, valoare, cale
2. $_COOKIE, array, numele, valoarea, valoarea
3. Cookie, expirare, crearea, expirarii
Test de evaluare
1.
2.
3.
4.
5.
6.
7.
8.
D
C
B
C
B
C
B
D
9. A
10. C
M2.U2
TO DO
1.
2.
3.
4.
5.
Test de evaluare:
1.
2.
3.
4.
5.
B
C
C
B
C
M3.U1
TO DO
1.
2.
3.
4.
5.
Test de evaluare
1. D
2. C
3. D
4. A, D
5. D
6. D
7. B, D
8. B, D
9. A
10. A
M4.U1
TO DO
1.
2.
3.
4.
5.
6.
Test de evaluare
1. B
2. A
3. A
4. B
5. C
6. A
7. A
8. A
9. A
10. B
M4.U2
TO DO
1. tratare a exceptiilor, try-catch, erorilor
2. Exception, getMessage, getLine, getCode, getFile, finale, toString,
Test de evaluare
1.
2.
3.
4.
5.
C
D
A
C
B
M5.U1
TO DO
1.
2.
3.
4.
Test de evaluare:
1. B, C
2. C
3. D
4. A
5. C
6. A
7. C
8. D
9. D
10. A,C,D