Cap 2.1.1. Inserarea codului PHP intr-o pagina HTML.

Taguri PHP

Scripturile PHP sunt destinate generarii dinamice de continut in paginile de Web. De aici rezulta faptul ca un astfel de script trebuie inclus intr-o pagina HTML. In acest scop pot fi folosite mai multe tipuri de tag-uri HTML dupa cum urmeaza:

stilul "scurt": <? echo "<H1>Text generat dinamic din PHP</H1?>"; ?> Avantajul acestui stil este simplitatea. De aici rezulta o visteza mai mare de scriere a codului.

stilul XML: <?php echo "<H1>Text generat dinamic din PHP</H1?>"; ?> Acest stil este compatibil cu documente conforme cu standardul XML (Extensible Markup Language). Datorita raspandirii in continua crestere a acestui standard in continuare se va prefera acest stil.

stilul SCRIPT: <SCRIPT LANGUAGE='php'> echo "<H1>Text generat dinamic din PHP</H1?>"; </SCRIPT> Acest stil este destinat celor obisnuiti cu scrierea de cod JavaScript sau VBScript. Este util daca se foloseste un editor HTML care are probleme cu alte stiluri de tag-uri.

stilul ASP: <% echo "<H1>Text generat dinamic din PHP</H1?>"; %> Acest stil este similar cu cel folosit la ASP (Active Server Pages). Este util daca se foloseste un editor HTML care genereaza cod ASP.

Texul care apare intre tagul de inceput si cel de incheiere (indiferent de stil) va fi interpretat ca script PHP. Textul care apare in afara acestor taguri va fi tratat ca si cod HTML obisnuit.

Cap 2.1.2. Generarea dinamica de continut HTML

Codul PHP nu va fi vizibil in sursa trimisa de serverul Web catre navigatorul clientului. Acest cod va fi interpretat de catre modulul PHP din server si doar textul generat de acest script va fi trimis mai departe de catre server. La scrierea codului, instructiunile PHP din script vor fi terminate printr-un separator punct si virgula ';' asemanator celor din limbajul C, C++ sau Java. Omiterea acestul separator va genera o eroare de sintaxa. Interpretorul de PHP va ingnora in schimb spatiile dintre instructiuni sau dintre elementele unei instructiuni. Spre exemplu, secventele: <?php echo "Hello"; echo "world !"; ?>
mircea.neamtu@ulbsibiu.ro.

si <?php echo "Hello"; echo "world !" ;?> vor genera acelasi rezultat. Pentru claritatea codului se obisnuieste sa se adauge comentarii in care sa se explice rolul liniilor respective. Interpretorul de PHP va ignora textul din comentarii, el avand doar rolul de a ajuta programatorul in dezvoltarea codului respectiv. Comentariile pot si adaugate in trei moduri:

• •

stilul C: Comentariul se poate intinde pe mai multe linii si este cuprins intre semnele '/*' si '*/'. El se poate insera chiar si in mijlocul unei expresii dar nu poate fi imbricat in alt comentariu. stilul C++: Comentariul se intinde pe o singura linie, de la aparitia semnului '//' pana la sfarsitul liniei curente. stilul Shell: Comentariul se intinde pe o singura linie, de la aparitia semnului '#' pana la sfarsitul liniei curente.

Pentru a exemplifica generarea dinamica de continut se va utiliza functia date() pentru a afisa data si ora la care a fost interpretat scriptul pe server: Creati fisierul a2121.php cu urmatorul continut: <HTML> <HEAD> <TITLE>Activitate 1.</TITLE> </HEAD> <BODY> <H2>Exemplu de generare dinamica de cod.</H1><P> Linia urmatoare este generata de PHP:<P> <?php echo "Data curenta pe server: "; echo date("H:i, jS F"); // se obtine data si ora curenta cu ajutorul functiei date() echo "<BR>"; ?> </BODY> </HTML> Incarcati fisirul direct in navigator (prin File/Open) si apoi copiati fisierul in directorul htdocs al serverului de Web si incarcati adresa http://localhost/a2121.php Cap 2.1.3. Tipuri de date. Conversii de tip

Activitate 1

Limbajul PHP suporta urmatoarele tipuri de date:
• • • • •

Integer - utilizat pentru numere intregi Double - utilizat pentru numere reale String - utilizat pentru siruri de caractere Array - utilizat pentru a stoca date multile de acelasi tip Object - utilizat pentru a retine obiecte - instante ale claselor

In plus, PHP suporta si tipurile pdfdoc respectiv pdfinfo pentru a asigura suport pentru PDF (standardul Portable Document Format). PHP este un limbaj slab tipizat. In limbajele puternic tipizate, o variabila poate retine un singur tip de date pe toata durata sa de viata, tip asignat la declararea acelei variabile. In PHP
mircea.neamtu@ulbsibiu.ro.

varibilele nu trebuie declarate explicit (ele sunt considerate ca fiind declarate implicit la prima lor utilizare in cod), iar tipul de date asignat este determinat de valoarea retinuta in acel moment. Urmatoarele linii de cod sunt corecte in PHP (numele variabilelor PHP sunt prefixate de semnul $): $var1 = 1; $var1 = "sirul 1"; Tipul datelor extrase din variabile poate fi schimbat fortat (casting sau conversie de tip) in expresiile unde acestea intervin. Acest lucru se face prin precizarea noului tip intre paranteze rotunde in fata variabilei respective: $var1 = 1; $var2 = (double)$var1 + 3.52; Conversia de tip nu afecteaza tipul real al varibilei. Cap 2.1.4. Identificatori. Constante

Identificatorii sunt cuvinte care denota entitati intr-un program. Exemple de identificatori sunt: numele de variabile, de functii sau de clase. In PHP identificatorii trebuie sa respecte urmatoarele reguli:
• • •

Identificatorii pot fi de orice lungime si pot fi formati din litere, cifre, liniuta de subliniere sau semnul dolar. Identificatorii nu pot incepe cu o cifra. Identificatorii sunt de tip "case sensitive" (tin cont de litere mici-mari). Spre exemplu, $numepers este diferit de $numePers. Singurii identificatori care nu respecta aceasta regula sunt cei care denota nume de functii PHP predefinite.

PHP permite folosirea a doua tipuri de constante. Constantele de tip valoare sunt precizate direct in expresii dependent de tipul lor:
• • •

constantele intregi: 0, 100, -1320 constantele de tip double: 0.00, 3.1523, -4.5 constantele de tip sir de caractere: "sir1", 'sir2', 'sir cu "gilimele"! ', "sir cu 'apostrof'! "

Constantele cu nume se aseamana cu varibilele, dar valoarea lor nu poate fi schimbata de-a lungul programului. Pentru a face codul scris mai lizibil se obisnuieste ca numele varibilelor sa fie scrise in intregime cu litere mari. O diferenta notabila fata de variabile este aceia ca numele acestora nu sunt precedate de semnul $. Declararea cosntantelor se face cu ajutorul cuvantului cheie define. ... define("PI",3.14); $unUnghi = PI; $altUnghi = 2*PI; Cap 2.1.5. Variabile utilizator. Variabile referinta. Domeniu de valabilitate

Variabilele sunt locatii de memorie desemnate printr-un identificator care incepe cu semnul $. Ele permit memorarea valorilor de diverse tipuri. Tipul unei variabile PHP poate fi modifcat in momentul cand i se asigneaza o valoare. Declararea variabilelor utilizator nu trebuie facuta explicit. O variabila se considera declarata implicit prima data cand este folosita.
mircea.neamtu@ulbsibiu.ro.

Pentru a asigna o valoare unei variabile se va folosi operatorul = sub forma $variabila = expresie. Daca $variabila nu exista ea va fi creata in prealabil apoi i se va asigna valoarea expresiei. Varibilele referinta permit schimbarea numelui unei variabile in mod dinamic. Acest lucru se face prin utilizarea valorii unei varibile pe post de nume de variabila. Indirectarea se realizeaza prin utilizarea marcajului dolar '$' in fata numelui variabilei referinta, ca si in exemplul urmator: $var1 = 5; $var2 = "var1"; echo "Valoarea din var1 este "; echo $var1; echo " sau "; echo $$var2; In acest exemplu notatia $$var2 a fost folosita pentru a desemna valoarea retinuta de varibila $var1. Prin domeniul de valabilitate a unei variabile se intelege locurile in care o variabila poate fi folosita (este vizibila) dupa ce a fost creata. Domeniile definite de PHP sunt urmatoarele:
• • •

Global - varibilele globale, definite in afara functiilor sunt vizibile in tot fisierul curent, mai putin in interiorul functiilor. Locale unei functii - variabilele create in functii sunt vizibile doar in interiorul acestora. Globale in interiorul unei functii - acest tip de varibile sunt folosite pentru a accesa variabilele globale cu acelasi nume.

Cap 2.1.6. Accesarea variabilelor din form-uri HTML

Principalul mecanism de colectare a datelor de la utilizatori prin intermediul unui site Web il reprezinta formularele HTML (HTML forms). Din acest motiv, limbajul PHP pune accent pe facilitarea accesului la aceste date. Un formular HTML cuprinde campuri in care utilizatorul (cel care acceseaza pagina) poate introduce date. Pentru procesarea acestor date formularul defineste o actiune numita submit (trimitere), care corespunde de obicei apasarii unui buton cu acelasi titlu. Rezultatul acestei actiuni este accesarea unei alte pagini (pagina tinta - target) care va primi automat valorile completate in campurile formularului si le va prelucra. In cadrul subiectului prezentat, paginile tinta ale formularelor vor fi fisiere PHP, paginile cuprinzand formularele putand fi fisiere PHP sau HTML. Mai multe informatii despre formulare HTML se pot obtine la adresa http://www.w3.org/MarkUp/. In PHP datele dintr-un formular HTML pot fi accesate prin doua metode. Prima metoda, mai simpla dar mai inceata si mai nesigura, consta in folosirea varibilelor inregistrate global. In acest fel numele campurilor dintr-un formular HTML devin automat varibile PHP, cu valori setate corespunzator, in pagina tinta a formularului. Transmiterea se face asemanator cu transmiterea parametrilor spre functii. Pentru a putea folosi aceasta metoda trebuie ca fisierul de configurare php.ini sa aiba setarea register_globals pe valoarea "On". A doua metoda presupune obtinerea valorilor din doua tablouri create automat si denumite $HTTP_POST_VARS, respectiv $HTTP_GET_VARS corespunzator metodei de trimitere din formular spre server (post sau get). Indicele de acces in tablou va fi chiar numele campului dorit din formular.
mircea.neamtu@ulbsibiu.ro.

Din motive de claritate in general se utilizeaza prima metoda. In schimb, in scripturile profesionale, unde viteza si securitatea sunt determinante, a doua metoda este de preferat. Creati fisierul a2161.html cu urmatorul continut: <HTML> <HEAD> <TITLE>Activitate 2 (form)</TITLE> </HEAD> <BODY> <FORM name="primulForm" method="post" action="a2162.php"> <P>Date personale <P>Nume <INPUT type="text" name="numePers" size="36" maxlength="36"><BR> Prenume <INPUT type="text" name="prenumePers" size="36" maxlength="36"><BR> Mijlocul de transport preferat <SELECT name="transport"> <OPTION>Masina</OPTION> <OPTION>Trenul</OPTION> <OPTION>Avionul</OPTION> <OPTION>Vaporul</OPTION> </SELECT> <P> <INPUT type="submit" name="trimit" value="Submit"> <INPUT type="reset" name="sterg" value="Reset"> </FORM> </BODY> Activitate 2 </HTML> Creati fisierul a2162.php cu urmatorul continut: <HTML> <HEAD> <TITLE>Activitate 2 (procesare)</TITLE> </HEAD> <BODY> <H1>Prelucrare date din formularul a261.html</H1> <HR> <?php echo "Nume persoana: ".$numePers."<BR>"; echo "Prenume persoana: ".$prenumePers."<BR>"; echo "Mijloc de transport preferat: ".$transport."<BR>"; $nume=$numePers." ".$prenumePers; echo $nume." prefera sa calatoreasca cu ".$transport."."."<BR>"; ?> <HR> </BODY> </HTML> Copiati fisierele in directorul htdocs al serverului de Web si incarcati adresa http://localhost/a2161.html. Completati formularul si apasati apoi butonul Submit. Cap 2.1.7. Tema 2.a

A) Efectuati cele doua activitati prezentate pe parcursul acestui capitol.

mircea.neamtu@ulbsibiu.ro.

B) Creati un formular HTML tip sondaj de opinie intr-un domeniu ales de dumneavoastra. Scrieti apoi un fisier PHP care sa prelucreze acest formular afisind datele personale si optiunile marcate. Raspunsul la aceasta tema va consta in numele celor doua fisiere si observatiile referitoare la problemele intampinate

Cap 2.2.1. Operatori

Operatorii sunt simboluri care pot fi utilizate pentru a efectua operatii asupra unor varibile si constante de diverse tipuri. Entitatile asupra carora se aplica un operator se numesc operanzi. Un operator poate avea unul, doi sau chiar trei operanzi. Majoritatea operatorilor sunt binari (au doi operanzi). In general operatorii sunt clasificati functie de tipul datelor asupra carora actioneaza. Cap 2.2.1.1. Operatori aritmetici Operatorii aritmetici provin din matematica si actioneaza asupra datelor de tip numeric. Acestia sunt: Operator Denumire + * / % ++ ++ --adunare scadere inmultire impartire modulo Exemplu $a + $b $a - $b $a * $b $a / $b $a % $b

incrementare - post $a++ incrementare - pre ++$a decrementare - post $a-decrementare - pre --$a

Operatorul % (modulo) are ca si rezultat restul impartirii numerelor transmise. Operatorii de incrementare/decrementare sunt operatori unari care au ca rezultat cresterea/descresterea cu o unitate a varibilei operand asupra careia se aplica. Operatorii post se aplica dupa ce valoarea este evaluata in expresia din care face parte iar operatorii pre se aplica inainte de evaluarea expresiei. Ex: $a = 5; $b = $a++; // b = 5, a = 6 $c = ++$a; // c = 7, a = 7 $d = 4 + --$a; // d = 10, a = 6 $e = 4 + --$c; // e = 11, c = 6 Daca operatorii aritmetici se aplica asupra unor valori de tip string, PHP va incerca conversia acestora in numere. Daca conversia nu reuseste, sirurile sunt convertite la valoarea 0. Activitate 1 Creati fisierul a2211.php cu urmatorul continut: <HTML> <HEAD> <TITLE>Activitate 2.2.1.1.</TITLE> </HEAD> <BODY> <H2>Operatori aritmetici.</H1><P> <?php
mircea.neamtu@ulbsibiu.ro.

$a = 3; $b = 11; $c = 4.7; echo "a = "; echo $a; echo "<BR>"; echo " b = "; echo $b; echo "<BR>"; echo " c = "; echo $c; echo "<BR>"; echo "a - b = "; echo $a - $b; echo "<BR>"; echo "a * c = "; echo $a * $c; echo "<BR>"; echo "b % a = "; echo $b % $a; echo "<BR>"; echo "b % c = "; echo $b % $c; echo "<BR>"; echo "b + --a= "; echo $b + --$a; echo "<BR>"; echo "a / 0 = "; echo $a / 0; echo "<BR>"; ?> </BODY> </HTML> Copiati fisierul in directorul htdocs al serverului de Web si incarcati adresa http://localhost/a2211.php

Cap 2.2.1.2. Operatori pe siruri de caractere In PHP exista un singur operator pe siruri de caractere, restul operatiilor fiind efectuate prin intermediul unor functii din biblioteca standard a limbajului. Acest operator este operatorul de concatenare - punct '.'. $s1 = "Sirul 1"; $s2 = "Sirul 2"; $s3 = $s1."-".$s2; // s3 = "Sirul 1-Sirul 2" Cap 2.2.1.3. Operatori de asignare Operatorii de asignare permit atribuirea de valori varibilelor. Cel mai simplu operator este operatorul '='. El are doi operanzi: o variabila in partea stanga si o expresie in partea dreapta. Valoarea expresiei este evaluata apoi atribuita variabilei din partea stanga si, in final, returnata de operator. Deoarece = nu este o intructiune PHP ci un operator, el poate intra in expresii complexe de genul: $a = $b = 4 + ($c = 3); // a = 7, b = 7, c=3 In plus fata de operatorul de asignare simplu, PHP pune la dispozitia programatorilor si operatori de asignare combinati: Operator Utilizare += -= *= /= %= .= $a -= $b $a *= $b $a /= $b Echivalent cu $a = $a - $b $a = $a * $b $a = $a / $b

$a += $b $a = $a + $b

$a %= $b $a = $a % $b $s1 .= $s2 $s1 = $s1 . $s2

Cap 2.2.1.4. Operatori de referire Varsiunea PHP 4 a introdus un nou operator si anume operatorul de referire '&'. El este un operator unar, avand ca operand o variabila si permite legarea unui nume de variabila de zona de memorie a varaibilei operand. Spre exemplu se considera secventa:
mircea.neamtu@ulbsibiu.ro.

$a = 3; $b = $a; // a = 3, b = 3 $b = 5; // a = 3, b = 5 In urma acestei secvente vor exista doua variabile independente $a si $b. Modificarea ulterioara a valorii lui $b nu afecteaza valoarea retinuta de $a. Daca, in schimb, consideram secventa: $a = 3; $b = &$a; // a = 3, b = 3 $b = 5; // a = 5, b = 5 Se va observa ca $b nu este o varibila independenta ci este un nou nume pentru variabila $a (ambele vor indica spre aceiasi zona de memorie). Orice modificare a valorii lui $b va afecta in aceiasi masura si valoarea lui $a. Cap 2.2.1.5. Operatori de comparare Operatorii de comparare sunt operatori binari care au ca si scop compararea valorilor operanzilor. Rezultatul acestor operatori este unul logic, avand valoarea true (adevarat) sau flase (fals). Acestia sunt: Operator Denumire == === != <> < > <= >= egalitate inegalitate inegalitate mai mic mai mare mai mic egal mai mare egal Exemplu $a == $b $a != $b $a <> $b $a < $b $a > $b $a <= $b $a >= $b

test de identitate $a === $b

Daca operanzii nu sunt de acelasi tip se va incerca conversia operanzilor pentru a deveni compatibili si apoi se va face comparatia. In cazul operatorului test de identitate '===' operanzii nu sunt considerati egali daca nu au acelasi tip. Cap 2.2.1.6. Operatori logici Operatorii logici sunt utilizati pentru a combina valori logici in expresii. Acestia sunt: Operator Denumire ! && and || or xor negare si logic si logic sau logic sau logic Rezultat !$a neaga valoarea logica a lui $a $a && $b intoarce adevarat doar daca ambele valori $a si $b sunt adevarate $a and $b intoarce adevarat doar daca ambele valori $a si $b sunt adevarate $a || $b intoarce adevarat daca cel putin una dintre valorile lui $a sau $b este adevarata $a or $b intoarce adevarat daca cel putin una dintre valorile lui $a sau $b este adevarata

sau exclusiv $a xor $b intoarce adevarat daca $a si $b au valori logice diferite

Cap 2.2.1.7. Operatori pe biti Operatorii pe biti ajuta la prelucrarea numerelor intregi considerate ca siruri de biti.
mircea.neamtu@ulbsibiu.ro.

Acestia sunt: Operator Denumire ~ & | ^ << >> negare pe biti si pe biti sau pe biti deplasare stanga deplasare dreapta Rezultat ~$a inverseaza valorilor tuturor bitilor lui $a $a &$b doar biti pe 1 in $a si $b simultan sunt setati pe 1 in rezultat $a | $b biti pe 1 in $a sau $b sunt setati pe 1 in rezultat $a << $b deplaseaza bitii din $a la stanga cu $b pozitii $a >>$b deplaseaza bitii din $a la dreapta cu $b pozitii

sau exclusiv pe biti $a ^ $b bitii setati in $a sau $b dar nu in ambele sunt setati pe 1 in rezultat

Cap 2.2.1.8. Operatori aditionali Operatorii prezentati in acest subcapitol sunt: operatorul conditional, operatorul de suprimare a erorilor si operatorul de executie. Operatorul conditional are sintaxa: conditie ? valoare_adevarata : valoare_falsa Operatorul evalueaza mai intai expresia logica din conditie. Daca conditia este adevarata va intoarce expresia valoare_adevarata iar in caz contrar valoare_falsa. Exemplu: echo ($varsta < 18) ? "adolescent" : "matur"; Operatorul de suprimare a erorilor '@' are sintaxa: @(expresie) El are rolul de a suprima erorile si avertismentele generate de expresia operand. Exemplu: $a = ($b / 0); // genereaza avertisment de impartire la zero $a = @($b / 0 ); // nu genereaza avertisment In cel de al doilea caz, valoarea lui $a va fi setata pe valoare vida ( convertita la 0 ca intreg). Operatorul de executie poate fi folosit pentru a executa o comanda pe interpretorul de comenzi al serverului. El consta in doua apostroafe inverse '`'intre care este plasata comanda de executat. Exemplu `ls -al`. Operatorul de executie actioneaza doar daca optiunea safe_mode din php.ini este dezactivata (Off). In general acest operator nu se foloseste datorita breselor de securitate pe care le deschide pe server. Cap 2.2.2. Expresii

O definitie simpla a expresiilor PHP este urmatoarea: "expresie = orice are o valoare". Cea mai mare parte a unui program PHP consta in expresii. Expresiile combina operanzi si operatori de diverse tipuri: constante, variabile sau nume de functii.

mircea.neamtu@ulbsibiu.ro.

La evaluarea expresiilor operatorii se vor aplica intr-o ordine prestabilita, data de "precedenta" lor. Tabelul urmator prezinta operatorii in ordinea inversa a precedenteiv lor (in fata sunt cei mai putin prioritari). Precedenta Asociativitate Operator 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 stanga stanga stanga stanga stanga stanga stanga stanga stanga stanga stanga stanga stanga stanga dreapta dreapta , or xor and = += -= *= /= .= %= ?: || && | ^ & == != === < > <= >= << >> +-. */% ! ~ ++ -- @ [] new ()

O atentie deosebita trebuie acordata sirurilor de caractere intre ghilimele " ". La evaluarea expresiei in care acestea apar, toate numele de variabile care apar in interiorul lor sunt inlocuite cu valorile corespunzatoare. Exemplu: $nume = "Vasile"; $sir1 = "Domnul $nume are masina rosie!"; $sir2 = 'Domnul $nume are masina rosie!'; echo $sir1; // afiseaza Domnul Vasile are masina rosie! echo $sir2; // afiseaza Domnul $nume are masina rosie! Activitate 2 Creati fisierul a2221.php cu urmatorul continut: <HTML> <HEAD> <TITLE>Activitate 2.2.2.1.</TITLE> </HEAD> <BODY> <H2>Operatori si expresii.</H1><P> <?php $nume = "Ionescu"; $prenume = "Vasile"; $varsta = 38; $salar = 1500; $prop1 = "Domnul $prenume $nume are $varsta ani."."<BR>"; echo $prop1; $prop2 = "Domnul ".$nume." are salar ".(($salar<1000)?"mic":"mare")."!<BR>"; echo $prop2;
mircea.neamtu@ulbsibiu.ro.

$salarNou = &$salar; // salarNou indica spre salar $procentMarire = 26; // procentul cu care se mareste salarul $salarNou += $salarNou*($procentMarire / 100); $prop3 = " Salarul sau dupa marire este de $salar $."; // salar si salar nou indica spre aceiasi valoare echo $prop3; ?> </BODY> </HTML> Copiati fisierul in directorul htdocs al serverului de Web si incarcati adresa http://localhost/a2221.php

Cap 2.2.3. Tema 2.b

A) Efectuati cele doua activitati prezentate pe parcursul acestui capitol. B) Creati un formular HTML in care se citesc numele, prenumele, anul de studiu si nota luata la un examen de un student. La apasarea butonului de Submit se va incarca o pagina PHP in care se va afisa sub forma de fraze situatia elevului, transformand nota in calificativ: promovat / nepromovat si apoi calculand bursa ca fiind 100000*nota daca nota este peste 7, respectiv 50000*(nota-1) daca este sub 7. Raspunsul la aceasta tema va consta in numele celor doua fisiere si observatiile referitoare la problemele intampinate.

Cap 3.1.1. Instructiuni conditionale

Instructiunile conditionale permit executia conditionata a secventelor de program. In lipsa unor astfel de instructiuni ar fi practic imposil de implementat o mare parte dintre problemele din luma reala. Cap 3.1.1.1. Instructiunea if Instructiunea if permite luarea de decizii privind executia unei alte instructiuni sau a unui bloc de instructiuni inclus intre acolade ('{' si '}'). Cea mai simpla sintaxa a instructiunii if este: if (expr) instructiune Expresia expr este o expresie (conditie) logica ce se evalueaza la true sau false. Daca evaluarea conditiei are ca rezultat o valoare adevarata se va executa instructiunea specificata, daca nu, instructiunea va fi ignorata si se va trece mai departe. Exemplu: if ($nota < 5) echo 'Examenul trebuie repetat!';
mircea.neamtu@ulbsibiu.ro.

Daca expresia conditionala nu este una logica, se va face o conversie automata la o valoare logica. Valorile numerice 0 sau 0.0, sirurile vide (""), tablourile fara nici un element sau variabilele neinitializate vor fi evaluate la fals, restul fiind evaluate la true. Daca se doreste executia conditionala a mai mult de o instructiune se va utiliza costructia de bloc, ca in exemplul urmator: if ($nota < 5) { echo 'Examenul trebuie repetat!'; $bursa = 0; } In multe cazuri, pentru conditie neadevarata se doreste executia altei instructiuni sau a unu bloc de instructiuni. In acest caz se va folosi clauza optionala else. Exemplu: if ($nota < 5) { echo 'Examenul trebuie repetat!'; $bursa = 0; } else { echo 'Felicitari pentru trecerea examenului!'; $bursa = 1000000; } In unele situatii, la luarea unei decizii exista mai multe optiuni. In acest caz ar trebui testate mai multe conditii. Pentru aceasta, limbajul PHP pune la dispozitia programatorilor clauza elseif. In acest caz sintaxa instructiunii este: if (expr1) instructiune1 elseif (expr2) instructiune2 ... elseif (expr3) instructiune Exemplu: if ($nota < 5) { echo 'Insuficient'; $bursa = 0; } elseif ($nota<7) { echo 'Suficient'; $bursa = 500000; } elseif ($nota<9) { echo 'Bine'; $bursa = 1000000; } else {
mircea.neamtu@ulbsibiu.ro.

}

echo 'Bine'; $bursa = 1500000;

Cap 3.1.1.2. Instructiunea switch Instructiunea switch este similara cu o serie de instructiuni if care testeaza mai multe valori posibile pentru o anumita expresie. Avantajul sau este o scriere mai concisa si mai simplu de inteles si depanat. Sintaxa acestei instructiuni este: switch (expr) { case valoare_1: instructiune_1; break; case valoare_2: instructiune_2; break; ... case valoare_n: instructiune_n; break; defaut: instructiune_default; } Dupa evaluarea expresiei, valoarea obtinuta este comparata cu valorile din clauzele case. Daca se intalneste o potrivire se va continua cu executia instructiunilor din clauzele case urmatoare, pana la intalnirea instructiunii break. Consecinta este ca, daca instructiunile dintr-o clauza case nu se termina cu break, se va continua executia cu instructiunile clazei urmatoare. Acest lucru se poate utiliza pentru a executa o secventa de instructiuni comuna pentru mai multe valori, ca si in exemplu urmator: switch ($nota) { case 1: case 2: case 3: case 4: echo ' nu are bursa!'; break; case 5: case 6: echo ' bursa este 500000.'; break; case 7: echo ' bursa este 700000.'; break; case 8: case 9: echo ' bursa este 1000000.'; break; case 10: echo ' bursa este 1500000.'; break; defaut: echo 'nota nu este corecta!'; } Cap 3.1.2. Instructiuni repetitive

Instructiunile repetitive permit implementarea algoritmilor care necesita repetarea unei secvente de calcul.

mircea.neamtu@ulbsibiu.ro.

Cap 3.1.2.1. Instructiunea while Instructiunea while se foloseste pentru a implementa o bucla repetitiva cu test initial. Ea permite executia unei instructiuni sau a unui bloc de instructiuni inclus intre acolade ('{' si '}') si are sintaxa: while (expr) instructiune Expresia expr este o expresie (conditie) logica ce se evalueaza inainte de fiecare repetitie. Daca rezultatul evaluarii conditiei este adevarat, se va executa instructiunea specificata apoi secventa se va relua. Daca rezultatul evaluarii este fals, instructiunea va fi ignorata si se va trece la intructiunea de dupa while. Exemplu: $i = 1; while ($i< 5) echo 'Numarul '.$i++."<BR>"; In cazul in care conditia este neadevarata de la inceput, instructiunea din bucla nu se va executa de loc. Creati fisierul a3121.php pentru a genera o tabela de conversie valutara. <HTML> <HEAD> <TITLE>Activitate 3.1.2.1.</TITLE> </HEAD> <BODY> <H2>Tabela de conversie dolari/lei.</H1><P> <?php $curs= 33000; $n = 50; echo "<TABLE border=1>"; while ($n<=5000) { Activitate 1 echo "<TR>"; // se creeaza o noua linie in tabel echo "<TD>"; // se creeaza coloana pentru valoarea in lei echo number_format($n)." $ </TD>"; // se completeaza valoarea in lei echo "<TD>"; // se creeaza coloana pentru valoarea in dolari echo number_format($n*$curs)." lei </TD> </TR>"; // se completeaza valoarea in dolari $n+=50; // se vor tabela valorile din 50 in 50 de dolari } echo "</TABLE>"; ?> </BODY> </HTML> Copiati fisierul in directorul htdocs al serverului de Web si incarcati adresa http://localhost/a3121.php Cap 3.1.2.2. Instructiunea do-while Instructiunea do-while este asemanatoare cu instructiunea while dar se foloseste pentru a implementa o bucla repetitiva cu test final. Ca si while, ea permite executia unei instructiuni sau a unui bloc de instructiuni inclus intre acolade ('{' si '}') si are sintaxa:
mircea.neamtu@ulbsibiu.ro.

do instructiune while (expr); Expresia expr este o expresie (conditie) logica ce se evalueaza dupa fiecare repetitie. Daca, dupa executarea instructiunii conditia este adevarata se va relua secventa de la inceput. In cazul in care conditia devine falsa, repetitia se va incheia si se va trece la intructiunea de dupa do-while. Exemplu: echo "Se genereaza un sir de numere aleatoare in intervalul 0-100.<BR>"; echo "Generarea se opereste la primului numar mai mare de 90 sau cand s-au depasit 20 de numere.<BR>"; $i = 1; do { $n = rand(0,100); echo 'Numarul '.$i++." = ".$n."<BR>"; } while ($n<=90 and $i<21); In cazul buclei do-while, instructiunea din bucla se va executa cel putin o data chiar si in cazul in care conditia nu este adevarata de la inceput. Cap 3.1.2.3. Instructiunea for Instructiunea for este inspirata din limbajul C. Ca si while, ea permite executia unei instructiuni sau a unui bloc de instructiuni inclus intre acolade ('{' si '}') si are sintaxa: for (expr1; expr2; expr3) instructiune Prima expresie (expr1) este numita expresie de initializare si se executa o singura data, neconditionat, la inceputul ciclului. De obicei aceasta expresie contine atribuiri. Expr2 este o conditie logica ce se evalueaza la inceputul fiecarei iteratii. Pentru conditie adevarata se va executa instructiunea din bucla, daca este falsa, repetitia se va incheia si se va trece la intructiunea de dupa for. Expr3 se numeste expresie de iterare si se evalueaza la sfarsitul fiecarei repetari. Ea are rolul de a asigura trecerea la pasul urmator (incrementarea contoarelor, citirea datelor urmatoare etc.). Oricare dintre cele trei expresii pot fi vide. Daca expr3 este vida PHP o va considera adevarata si va cicla la infinit. In acest caz trebuie asigurata o iesire fortata din bucla utilizand una dintre instructiunile de control pentru repetitii (vezi capitolul 3.1.3). Exemplu de folosire a instruciunii for: echo "Tabloul factorialelor primelor 10 numere naturale.<BR>"; echo "Definitia factorialului unui numar n este n!=1*2*3*...*n.<BR>"; echo "<TABLE border=1>"; for ($n = 1, $factorial = 1; $n <= 10; $n++) { echo "<TR> <TD>"; echo $n; echo "</TD> <TD>"; $factorial *= $n; echo $factorial; echo "</TD> </TR>"; }
mircea.neamtu@ulbsibiu.ro.

Cap 3.1.2.4. Tablouri PHP. Instructiunea foreach Un tablou este un tip de date ce poate retine un set de valori. In PHP tabloul va asocia fiecarei intrari o cheie prin care aceasta poate fi regasita. Cheile pot fi numerice (in acest caz indicii creati implicit vor fi 0,1,2 ...) sau pot fi siruri de caractere (caz in care tabloul se numeste asociativ). Valorile retinute pot avea orice tip dar sunt de acelasi fel pentru un tablou dat. O variabila de tip tablou poate fi creata prin constructorul array(). Sintaxa pentru crearea unui tablou indexat numeric este: $tablou = array (el0, el1, ... el_n); Exemplu: $culori= array ("alb", "albastru", "verde", "rosu", "galben"); Accesul la elementele tabloului se face prin indecsi numerici (cu semnificatia de numere de ordine in tablou). Spre exemplu $culori[0] are valoarea "alb", $culori[4] are valoarea "galben" etc. In PHP dimensiunea unui tablou este variabila. Pentru a adauga un nou element se va atribui pur si simplu variabilei cu urmatorul indice o anumita valoare. Spre exemplu $culori[5]="negru" va adauga un nou element ("negru") la sfarsitul tabloului $culori. Numarul curent de elemente ale unui tablou se poate afla in orice moment cu ajutorul functiei count($tablou). Tablourile asociative sunt tablouri in care valorilor continute le sunt asociate chei prin care acestea pot fi regasite. Sintaxa pentru crearea unui astfel de tablou este: $tablou = array( "cheie1" => el1, "cheie2" => el2, ... "cheie_n" => el_n); Exemplu: $pret = array ("paine alba" => 7000, "ou" => 3000, "zahar" => 24000); Accesul la un element se face prin cheia asociata. Spre exemplu $pret["paine alba"] are valoarea 7000. Si in acest caz tabloul poate si extins dinamic prin adaugarea unui nou element a carei cheie nu exista in tablou. Spre exemplu $pret["miere 500g"] = 30000 va adauga elementul 30000 cu cheia "miere 500g" la tabloul $pret, acesta avand acum patru elemente. Ambele tipuri de tablouri retin intern o referinta (pointer) catre elementul curent de prelucrat. Acest lucru permite scrierea secventelor pentru parcurgerea si prelucrarea elementelor lor. Instructiunea foreach este asemanatoare cu instructiunea for dar este destinata exclusiv parcurgerii de tablouri, in special a celor asociative. Sintaxa acestei instructiuni are doua forme alternative: foreach (tablou as valoare_element_curent) instructiune foreach (tablou as cheie => valoare_element_curent) instructiune Prima forma permite extragerea tuturor valorilor din tablou si prelucrarea lor individual, pe cand cea de a doua forma permite si extargerea si prelucrarea cheilor asociate.

mircea.neamtu@ulbsibiu.ro.

Creati fisierul a3124.php pentru a genera o tabela de conversie valutara. <HTML> <HEAD> <TITLE>Activitate 3.1.2.4.</TITLE> </HEAD> <BODY> <H2>Parcurgerea tablourilor.</H1> <P> <?php $culori= array ("alb", "albastru", "verde", "rosu", "galben"); $pret = array ("paine alba" => 7000, "ou" => 3000, "zahar" => 24000); echo "<P>Tablou indexat numeric, extragere valori.<BR>"; echo "<UL>"; foreach ($culori as $culoare) echo "<LI>".$culoare."</LI>"; echo "</UL>"; echo "<P>Tablou indexat numeric, extragere valori si indecsi.<BR>"; echo "<TABLE border=1>"; foreach ($culori as $indice => $culoare) { echo "<TR>"; // se creaza o noua linie in tabel echo "<TD>"; // se creaza coloana pentru valoarea indexului echo $indice; // se completeaza valoarea indexului echo "</TD> <TD>"; // se creaza coloana pentru culori echo $culoare; // se completeaza culoarea echo "</TD> </TR>"; // se inchide linia curenta Activitate 2 } echo "</TABLE>"; echo "<HR>"; echo "<P>Tablou asociativ, extragere valori.<BR>"; echo "<UL>"; foreach ($pret as $pret_produs) echo "<LI>".$pret_produs."</LI>"; echo "</UL>"; echo "<P>Tablou asociativ, extragere valori si chei.<BR>"; echo "<TABLE border=1>"; foreach ($pret as $produs => $pret_produs) { echo "<TR>"; // se creaza o noua linie in tabel echo "<TD>"; // se creaza coloana pentru valoarea cheii (produsul) echo $produs; // se completeaza valoarea cheii echo "</TD> <TD>"; // se creaza coloana pentru pret echo $pret_produs; // se completeaza pretul echo "</TD> </TR>"; // se inchide linia curenta } echo "</TABLE>"; ?> </HR> </BODY> </HTML> Copiati fisierul in directorul htdocs al serverului de Web si incarcati adresa http://localhost/a3124.php La prelucrarea tablourilor numerice se prefera folosirea iteratiei dupa index in genul: echo "<UL>"; for ($i = 0; $i < count($culori); $i++)
mircea.neamtu@ulbsibiu.ro.

echo "<LI>".$culori[$i]."</LI>"; echo "</UL>"; Cap 3.1.3. Instructiuni de control pentru repetitii

In multe situatii, pentru simplificarea implementarii este necesar sa se iasa fortat dintr-o iteratie. In acest scop limbajul PHP include trei instructiuni speciale: continue, break si return. Instructiunea break permite intreruperea fortata a buclei curente. Ea poate fi folosita cu instructiunile for, foreach, while, do..while sau switch. Exemplu - se vor genera 20 de numere aleatoare in intervalul [0-50] si se va imparti numarul 1000 la numerele generate. Generarea se va opri fortat daca se genereaza 0: for ($i=1; $i <= 20; $i++) { $a = rand(0,50); if ($a == 0) { echo "S-a generat 0.<BR> "; break; } echo "Pasul $i: 1000 / $a = ".(1000/$a)."<BR>"; } echo "Generare terminata!"; Instructiunea continue permite terminarea fortata a iteratiei curente si trecerea la urmatoarea iteratie. Ea poate fi folosita cu instructiunile for, foreach, while sau do..while. Exemplu - se considera exemplul anterior, dar daca se genereaza numarul 0 nu se va executa impartirea si se va trece la generarea urmatorului numar: for ($i=1; $i <= 20; $i++) { $a = rand(0,50); if ($a == 0) { echo "S-a generat 0.<BR> "; continue; } echo "Pasul $i: 1000 / $a = ".(1000/$a)."<BR>"; } echo "Generare terminata !"; Instructiunea return permite terminarea fortata a functiei sau programului curent. Ea poate fi folosita in instructiunile for, foreach, while sau do..while unde, prin terminarea scriptului, termina in mod evident si bucla curenta. Daca se doreste generarea unui mesaj in pagina inainte de incheierea scriptului, in loc de return se pot folosi functiile exit(mesaj) sau die(mesaj) - die fiind un alias al functiei exit. Exemplu - in exemplul anterior, la generarea lui 0 se termina fortat pagina: for ($i=1; $i <= 20; $i++) { $a = rand(0,50); if ($a == 0) { echo "Eroare: S-a generat 0."; return; } /* alternativ se poate folosi secventa
mircea.neamtu@ulbsibiu.ro.

} echo "Generare terminata !"; Cap 3.1.4. Tema 3.a

if ($a == 0) die("Eroare: S-a generat 0."); */ echo "Pasul $i: 1000 / $a = ".(1000/$a)."<BR>";

A) Efectuati cele doua activitati prezentate pe parcursul acestui capitol. B) Sa se creeze o pagina in care se va afisa un tabel de conversie valutara dolar/euro/lei personalizat pentru o casa de schimb valutar. Pentru aceasta se va crea un formular HTML in care se citeste cursul valutar curent, prima si ultima valoare din tabel precum si pasul cu care se face tabelarea. La apasarea butonului de Submit se va incarca o pagina PHP in care se va afisa tabelul rezultat, avand trei coloane: suma-lei/dolari-lei/euro, ca in figura de mai jos. Raspunsul la aceasta tema va consta in numele celor doua fisiere si observatiile referitoare la problemele intampinate. suma in Dolari(Euro) Lei/dolari Lei/euro 100 200 3,300,000 3,250,000 6,600,000 6,500,000

mircea.neamtu@ulbsibiu.ro.

Sign up to vote on this title
UsefulNot useful