CUPRINS - Hyperioninformatica.hyperion.ro/wp-content/uploads/2015/05/Tehnologii-Web.pdf · 1....

90
CUPRINS 1. TEHNOLOGII WEB CLIENT.................................................................................................... 3 1.1 HTML .................................................................................................................................... 3 1.1.1 Introducere în HTML................................................................................................... 3 1.1.2 Tabele în HTML............................................................................................................ 7 1.1.3 Cadre în HTML ............................................................................................................ 9 1.1.4 Formulare în HTML................................................................................................... 11 1.2 Limbajul JavaScript ........................................................................................................... 14 1.2.1 Convenţii de sintaxă .................................................................................................... 14 1.2.2 Adăugarea JavaScript într-o pagină HTML ............................................................ 16 1.2.3 Variabile şi operatori .................................................................................................. 18 1.2.4 Instrucţiuni condiţionale ............................................................................................ 20 1.1.5 Instrucţiuni ciclice (repetitive) ................................................................................... 22 1.1.6 Funcţii JavaScript ....................................................................................................... 25 1.1.7 Obiecte JavaScript ...................................................................................................... 27 1.1.8 Evenimente JavaScript ............................................................................................... 34 1.2 Cookie-uri ............................................................................................................................ 35 1.3 Fişiere XML......................................................................................................................... 37 1.4 Exemplu de utilizare HTML5 şi clase JavaScript ............................................................ 40 2 TEHNOLOGII WEB SERVER................................................................................................. 45 2.1 PHP....................................................................................................................................... 45 2.1.5 Noţiuni introductive .................................................................................................... 45 2.1.6 Variabile PHP.............................................................................................................. 47 2.1.7 Operatori PHP............................................................................................................. 54 2.1.8 Instrucţiuni de decizie................................................................................................. 57 2.1.9 Implementarea instrucţiunilor repetitive (ciclice) ................................................... 61 2.1.10 Prelucrarea datelor din formularele HTML ............................................................ 65 2.1.11 Funcţii în PHP ............................................................................................................. 67 2.1.12 Sesiuni PHP ................................................................................................................. 72 2.2 Conexiunea cu bazele de date (conexiunea cu PostgreSQL) ........................................... 74 2.3 Transferul datelor pe sesrver prin JSONRPC ................................................................. 86 3 BIBLIOGRAFIE ......................................................................................................................... 90 1

Transcript of CUPRINS - Hyperioninformatica.hyperion.ro/wp-content/uploads/2015/05/Tehnologii-Web.pdf · 1....

CUPRINS 1. TEHNOLOGII WEB CLIENT .................................................................................................... 3

1.1 HTML .................................................................................................................................... 3

1.1.1 Introducere în HTML ................................................................................................... 3

1.1.2 Tabele în HTML............................................................................................................ 7

1.1.3 Cadre în HTML ............................................................................................................ 9

1.1.4 Formulare în HTML ................................................................................................... 11

1.2 Limbajul JavaScript ........................................................................................................... 14

1.2.1 Convenţii de sintaxă .................................................................................................... 14

1.2.2 Adăugarea JavaScript într-o pagină HTML ............................................................ 16

1.2.3 Variabile şi operatori .................................................................................................. 18

1.2.4 Instrucţiuni condiţionale ............................................................................................ 20

1.1.5 Instrucţiuni ciclice (repetitive) ................................................................................... 22

1.1.6 Funcţii JavaScript ....................................................................................................... 25

1.1.7 Obiecte JavaScript ...................................................................................................... 27

1.1.8 Evenimente JavaScript ............................................................................................... 34

1.2 Cookie-uri ............................................................................................................................ 35

1.3 Fişiere XML ......................................................................................................................... 37

1.4 Exemplu de utilizare HTML5 şi clase JavaScript ............................................................ 40

2 TEHNOLOGII WEB SERVER ................................................................................................. 45

2.1 PHP....................................................................................................................................... 45

2.1.5 Noţiuni introductive .................................................................................................... 45

2.1.6 Variabile PHP .............................................................................................................. 47

2.1.7 Operatori PHP............................................................................................................. 54

2.1.8 Instrucţiuni de decizie ................................................................................................. 57

2.1.9 Implementarea instrucţiunilor repetitive (ciclice) ................................................... 61

2.1.10 Prelucrarea datelor din formularele HTML ............................................................ 65

2.1.11 Funcţii în PHP ............................................................................................................. 67

2.1.12 Sesiuni PHP ................................................................................................................. 72

2.2 Conexiunea cu bazele de date (conexiunea cu PostgreSQL) ........................................... 74

2.3 Transferul datelor pe sesrver prin JSONRPC ................................................................. 86

3 BIBLIOGRAFIE ......................................................................................................................... 90

1

2

1. TEHNOLOGII WEB CLIENT

1.1 HTML

1.1.1 Introducere în HTML

Unul din primele elemente, fundamentale de altfel, ale WWW (World Wide Web) este HTML (Hypertext Markup Language), standard ce descrie formatul primar în care documentele sunt distribuite și văzute pe Web.

Orice document HTML începe cu notaţia <html> şi se termină cu notaţia </html>. Astfel de perechi de marcaje sau etichete (acolo unde sunt perechi) se numesc în literatura de specialitate TAG-uri. Prin convenţie, toate marcajele HTML încep cu o paranteză unghiulară deschisă "<" şi se termină cu o paranteză unghiulară închisă ">". Marcajele dintre aceste paranteze transmit comenzi către browser pentru a afişa pagina într-un anumit mod. Unele blocuri prezintă delimitator de sfârşit de bloc, în timp ce pentru alte blocuri acest delimitator este opţional sau chiar interzis.

Între cele două marcaje <html> şi </html> vom introduce două secţiuni:

- secţiunea de antet: <head>...</head> - corpul documentului: <body>...</body>

Blocul <body>...</body> cuprinde conţinutul propriu-zis al paginii HTML, adică ceea ce va fi afişat în ferastra browser-ului. Un marcaj poate fi scris atât cu litere mici, cât şi cu litere mari. De exemplu <BODY> = <BodY> = <body>. Caracterele "spaţiu" şi "CR/LF" ce apar între taguri sunt ignorate de către browser.

Un prim document HTML ar fi ceva de genul acesta: <html> <head> </head> <body> </body> </html> <html> <head> <title> titlul paginii</title> </head> <body> Bine ati venit in <br> pagina mea de Web! </body> </html>

3

Legături între pagini aflate în acelaşi director O legatură de pe o pagină catre o alta aflată în acelaşi director se formează cu ajutorul etichetei <a> (de la "anchor"= ancora). <html> <head> <title> Comutarea intre doua pagini</title> </head> <body> <h3>Pagina initiala </h3> <a href="pagina_2.html"> Link(legatura) catre pagina 2 </a> </body> </html> Legatura poate fi si catre un site ex: href="http://www.google.com"> EXEMPLU LEGATURI Fisier: h1.html <html> <head> <title> TITLUL FERESTREI</title> </head> <body bgcolor="#AC9F04" text="#0f0fA0" > <!-- comentariu --> TEST <br/> <p><b>TEST</b></p> TEST <H1> UN ALT TEST </h1> <hr/> <h6> CU TOTUL ALT TEST</h6> <font face="Arial Black" color="#A6ABC0">Acesta este tipul de font Arial Black</font> </br>CARE ESTE FONTUL? <ul> <li>List item 1 .. .</l i> <li>List item 2 .. .</l i> <li>List item 3 .. .</l i> </ul> <img src="i1.jpg" alt="altceva" align="top" width="100" height="120" border="4" hspace="10" vspace="7"></img> <a href="h2.html" title="Legatura ptr. fisierul h2">Nume</a> <div align="center"> <img src="image_map.gif" alt="Harta de imagini" border="0" width="300" height="300" usemap="#map1"> <map name="map1">

4

<area href="h5.html" alt="Date de contact" title="DR" shape="rect" coords="6,116,97,184"> <area href="h3.html" alt="Curs HTML" title="CERC" shape="circle" coords="251,143,47"> <area href="h4.html" alt="Pagina principala" title="ROMB" shape="poly" coords="150,217, 190,257, 150,297,110,257"> </map> </div> </body> </html> Fişier h2.html <HTML> O indirectare </HTML> Fişier h3.html <HTML> CERC </HTML> Fişier h4.html <HTML> ROMB </HTML> Fişier h5.html <HTML> DREPTUNGHI </HTML> Liste în HTML

Unul din cele mai obişnuite elemente din documentele cu mai multe pagini este un set de definiţii, referinte sau indexuri. O listă neordonată este un bloc de text delimitat de etichetele corespondente <ul>...</ul> ("ul" vine de la "unordered list"= listă neordonată).

Fiecare element al listei este iniţiat de eticheta<li> (list item). Lista va fi indentată faţă de restul paginii Web şi fiecare element al listei începe pe un rând nou. Ex1: <html> <head><title> lista nr 1 </title></head> <body><H2 align=center>O lista neordonata</H2><hr> <ul>Culori <li>Negru <li>Alb <li>Galben <li>Albastru <li>Rosu <li>Verde

5

</ul> </body> </html>

6

1.1.2 Tabele în HTML

Tabelele ne permit să creăm o reţea dreptunghiulară de zone, fiecare zonă având propriile opţiuni în ceea ce priveşte culoarea fondului, culoarea textului, alinierea textului, etc.

Pentru a insera un tabel se folosesc etichetele corespondente <TABLE>...</TABLE>. Un tabel este format din rânduri. Pentru a insera un rând într-un tabel se folosesc etichetele <TR>...</TR> (de la "table row" = rând de tabel ). Folosirea etichetei de sfârşit este opţională. Un rând este format din mai multe celule ce conţin date. O celulă de date se introduce cu etichetele<TD>...</TD>. Ex1: <html> <head><title>Tabel</title></head> <body> <table border="1" cellpadding="10" cellspacing="15" width="100%"> <tr> <td align="left">date in celula 1</td> <td align="right">date in celula 2</td> <td align="middle">date in celula 3</td> </tr> <tr> <td align="middle">date in celula 4</td> <td align="middle">date in celula 5</td> <td align="middle">date in celula 6</td> </tr> <tr align="right"> <td>date in celula 7</td> <td>date in celula 8</td> <td>date in celula 9</td> </tr> </table> </body> </html> Ex2: <html> TABELE <table border="1" bgcolor="#0fad0f"> <tr> <td bgcolor="#adadff"> A1 </td> <td> A2</td> <td colspan="2"> A3</td> </tr> <tr> <td>B1 </td>

7

<td> B2</td> <td> B3</td> </tr> <tr bgcolor="#adadff"> <td> C1</td> <td> C2</td> <td> C3</td> </tr> <tr> <td>D1 </td> <td rowspan="2"> D2</td> <td> D3</td> </table> </html> Ex3: <HTML> <HEAD> </HEAD> <BODY> TEST <B> ABC </B> <BR/> 123 <BR/> <!-- un comentariu --> <TABLE BORDER="1" bgcolor="#317995"> <TR> <TD>A11</TD> <TD>A12</TD> <TD>A13</TD> </TR> <TR> <TD>A21</TD> <TD>A22</TD> <TD>A23</TD> </TR> </TABLE> <!--ancora --> <a href="http://www.marplo.net/html/linkuri.html"> O indirectare (legatura -- link) </a> </BODY> </HTML>

8

1.1.3 Cadre în HTML

Ferestrele /cadrele ne permit să definim în fereastra browserului alte ferestre (copil) în care să putem incadra documente noi HTML. Ferestrele noi (copil) sunt definite într-un fişier HTML special, în care blocul <body>...</body> este înlocuit de blocul <frameset>...</frameset>. În interiorul acestui bloc, fiecare cadru este introdus prin eticheta <frame>.

Un atribut obligatoriu al etichetei <frame> este "src", ce primeşte ca valoare adresa URL a documentului HTML care va fi încărcat în acel frame. Definirea cadrelor se face prin împărţirea ferestrei ecran în linii şi coloane: 1. împărţirea unei ferestre într-un număr de ferestre de tip coloană se face cu ajutorul atributului "cols" al etichetei <frameset> ce descrie acea fereastră; 2. împărţirea unei ferestre într-un număr de ferestre de tip linie se face cu ajutorul atributului "rows" al etichetei <frameset> ce descrie acea fereastra; 3. valoarea atributelor "cols" şi "rows" este o listă de elmente separate prin virgulă, care descriu modul în care se face împărţirea. Elementele listei pot fi:

3.1. un numar întreg de pixeli; 3.2. procente din dimensiunea ferestrei (număr între 1 şi 99 terminat cu %); 3.3. n* care inseamna n parti din spatiul ramas;

Exemplu: "cols=100,*,50%,*" înseamnă o împărţire în 4 subferestre, dintre care prima are 100 pixeli laţime, a treia ocupă jumătate din spaţiul total disponibil, iar a doua şi a patra ocupă în mod egal restul de spaţiu rămas disponibil. <html> <head><title>o fereastra</title></head> <frameset rows="100,*,10%"> <frame src="f1.html"> <frame src="f2.html"> <frame src="f3.html"> </frameset> </html> Ex1 <HTML> <HEAD> <TITLE> TITLU PAGINII </TITLE> </HEAD> <FRAMESET COLS="23%,77%"> <FRAME SRC="h3.html" NAME="left" SROLLING="NO"> <FRAME SRC="h4.html" NAME="right" SROLLING="YES"> </FRAMESET> <BODY> </BODY> </HTML>

9

Ex2 <HTML> <FRAMESET COLS="25%,75%"> <FRAME SRC="h1.html" NAME="left" SROLLING="NO"> <FRAMESET ROWS="30,45,*"> <FRAME SRC="h2.html" NAME="R1" SROLLING="YES"> <FRAME SRC="h3.html" NAME="R2" SROLLING="NO"> <FRAME SRC="h4.html" NAME="R3" SROLLING="YES"> </FRAMESET> </FRAMESET> </HTML>

10

1.1.4 Formulare în HTML

Un formular este un ansamblu de zone active alcătuit din butoane, casete de selecţie,

câmpuri de editare, etc. Formularele asigură construirea unor pagini Web care să permită utilizatorilor să introducă efectiv informaţii si să le transmită serverului. Formularele pot varia de la o simplă casetă de text, pentru introducerea unui şir de caractere pe post de cheie de căutare - element caracteristic tuturor motoarelor de căutare din Web, până la o structură complexă, cu multiple secţiuni, care oferă facilităţi puternice de transmisie a datelor. O sesiune cu o pagină web ce conţine un formular cuprinde următoarele etape: 1. Utilizatorul completează formularul şi îl expediează unui server. 2. O aplicaţie dedicată de pe server (ex: php) analizează formularul completat şi (dacă este necesar) stochează datele într-o bază de date. 3. Dacă este necesar, aplicaţia de pe server expediază un răspuns utilizatorului. Un formular este definit într-un bloc delimitat de etichetele corespondente <form> ….... </form> Atribute esenţiale ale elementului <form> Există două atribute esenţiale ale elementului <form>: 1. Atributul "Action" precizează ce se va întampla cu datele formularului odată ce acestea ajung la destinaţie. De regulă, valoarea atributului "Action" este adresa URL a unui script aflat pe un server WWW care primeşte datele formularului, efectuează o prelucrare a lor şi expediează către utilizator un răspuns. Script-urile server side (aplicaţia de pe server) pot fi scrise în limbajele Perl, C, PHP, Unix shell, Java. 2. Atributul "Method" precizează metoda utilizată de browser pentru expedierea datelor formularului. Sunt posibile următoarele valori: 2.1. "Get" (valoarea implicită). În acest caz, datele din formular sunt adăugate la adresa URL precizată de atributul "Action". În acest caz nu sunt permise cantităţi mari de date (maxim 1 Kb), iar intre adresa URL şi date este inserat un "?". 2.2. "Post" În acest caz, datele sunt expediate separat. Sunt permise cantităţi mari de date (de ordinul MB).

Javascript a fost dezvoltat prima data de către firma Netscape, cu numele de Live Script, un limbaj de script care extindea capacităţile HTML, oferea o alternativă parţiala la utilizarea unui număr mare de scripturi CGI pentru prelucrarea informaţiilor din formulare şi care adauga dinamism în paginile web. Formulare cu un câmp de editare şi un buton de expediere Majoritatea elementelor unui formular sunt definite cu ajutorul etichetei <input>. Pentru a preciza tipul elementului se foloseşte atributul " type" al etichetei <input>. Pentru un câmp de editare, acest atribut primeşte valoarea "text". Alte atribute pentru un element <input> sunt:

11

1. Atributul "name" permite ataşarea unui nume fiecărui element al formularului. 2. Atributul "value" permite atribuirea unei valori iniţiale unui element al formularului. Un buton de expediere al unui formular se introduce cu ajutorul etichetei <input>, în care atributul "type" este configurat la valoarea "submit". Acest element poate primi un nume prin atributul "name". Pentru elementul <input> de tipul câmp de editare (type= "text"), alte două atribute pot fi utile: 1. Atributul "size" ce specifică lăţimea câmpului de editare. Dacă textul introdus în câmp de utilizator depaşeşte această lăţime, atunci se execută automat o derulare a conţinutului acestui câmp; 2. Atributul "maxlength" ce specifică numarul maxim de caractere pe care le poate primi un câmp de editare; caracterele tastate peste numarul maxim sunt ignorate. Butoanele radio permit alegerea, la un moment dat, a unei singure variante de răspuns din mai multe posibile. Butoanele radio se introduc prin eticheta <input> cu atributul " type" având valoarea "radio". Ex: <html> <head><title>formex_4</title></head> <body><H2>Un formular cu butoane radio</H2> <hr> <form action="ex:apel functie javascript" method="post"> Selectie 1:<input type="radio" name="var1" value="x1"><br> Selectie 2:<input type="radio" name="var1" value="x2"><br> <input type="reset"> <input type="submit"> </form></body> </html> La expedierea formularului se va transmite una dintre perechile "var1=x1" sau "var1=x2", în funcţie de alegerea făcută de utilizator. Casete de validare O caseta de validare (checkbox) permite selectarea sau deselectarea unei opţiuni. Pentru inserarea unei casete de validare se utilizează eticheta <input> cu atributul " type" configurat la valoarea "checkbox". Observaţii: - fiecare casetă poate avea un nume definit prin atributul "name". - fiecare casetă poate avea valoarea prestabilită "selectat" definită prin atributul"checked". Ex1: <html> <head> </head> <body> <form>

12

<input type="text" name="E1" value="1234"></input> </br> <textarea>.........A.......</textarea> </br> <input type="checkbox" id="36"> selectie </input> </br> <input type="radio" id="41"> selectie </input> <input type="radio"> alta selectie </input> </br> <input type="button" value="Apasa"> </input> </br> <select name="select"> <option>Optiune 1</option> <option>Optiune 2</option> </select> </form> </body> </html>

Ex2: <HTML> <BODY> <FORM> <p> a= <input type="text" name="E1"/></p> <p> b= <input type="text" name="E2"/> </p> <p> verificat: <input type="checkbox" name="CB"></input> <p> O1: <input type="radio" name="RB" id="R1"></input> <p> O2: <input type="radio" name="RB" id="R2"></input> <p> <select name="select" size="3"> <option>Optiune 1</option> <option>Optiune 2</option> <option>Optiune 3</option> <option>Optiune 4</option> <option>Optiune 5</option> </select></p> <p> <select name="select" > <option>Optiune 1</option> <option>Optiune 2</option> <option>Optiune 3</option> <option>Optiune 4</option> <option>Optiune 5</option> </select></p> <br/> <input type="button" value="APASA"></input> <input type="reset" value="Renunta"></input> <input type="submit" value="Trimite"></input> </FORM> </BODY> </HTML>

13

1.2 Limbajul JavaScript

Javascript a fost dezvoltat prima dată de către firma Netscape, cu numele de Live Script, un limbaj de script care extindea capacitățile HTML, oferea o alternativă parțială la utilizarea unui număr mare de scripturi CGI pentru prelucrarea informațiilor din formulare și care adăuga dinamism în paginile web.

După lansarea limbajului Java, Netscape a început să lucreze cu firma Sun, cu scopul de a crea un limbaj de script cu o sintaxă și semantică asemănătoare cu a limbajului Java, și din motive de marketing numele noului limbaj de script a fost schimbat în "Javascript".

1.2.1 Convenţii de sintaxă

În orice limbaj, scrierea are convenţii şi reguli de sintaxă. Chiar şi scrierea în limba română are regulile ei de sintaxă: orice propoziţie începe cu literă mare, se termină cu un semn de punctuaţie, etc.! La fel şi limbajele de programare au regulile şi sintaxa lor.

În continuare vor fi prezentate regulile de sintaxă ala limbajului Javascript.

1. Case-sensitive - se face diferenţa între literele mari şi mici, astfel cuvinte precum “exemple” şi “ Exemple" vor fi tratate diferit. 2. Punct şi virgulă (;) - Toate declaraţiile se termină cu caracterul "punct şi virgulă" (;) (Exemplu" var1 = 3; var2 = 8;) 3. Spatiile libere - JavaScript ignoră spaţiile libere, tab-urile şi liniile libere care apar în instrucţiuni, acestea fiind utile pentru a face codul mai bine structurat şi uşor de citit. Recunoaşte doar spaţiile care apar în string-uri ( şirurile de caractere). Exemplu: "var1 = 2 ;" este la fel cu "var1=2;". 4. Ghilimelele - Ghilimelele simple ('') si duble ("") sunt folosite pentru a delimita şirurile de caractere (string). (Exemplu: "Invat JavaScript" sau 'Invat JavaScript'). 5. Carcactere speciale - când scriem scripturi, apare necesitatea de a folosi un caracter special, sau o apăsare de tastă , cum ar fi tasta TAB , sau o linie nouă. Pentru aceasta folosim caracterul backslash "\" în faţa unuia din codurile Escape , astfel : \b - backspace \f - indică o pagină nouă \n - indică o linie nouă \r - imdică un retur de car \t - indică o apăsare a tastei TAB \\ - indică un caracter backslash \' - indică un apostrof (ghilimele simple) \" - indică ghilimele duble

14

6. Comentarii - comentariile din interiorul codului sunt necesare când dorim să specificăm rolul anumitor funcţii şi variabile, pentru o mai uşoară întelegere ulterioară a scriptului. Pentru a adăuga un comentariu, pe o singura linie, începem scrierea acestuia cu succesiunea // (Exemplu: // Comentariu). Dacă dorim să scriem comentarii pe mai multe rânduri, se foloseşte /* la începutul comentariului şi */ la sfârşitul acestuia (Exemplu: /* ... comentariu pe mai multe rânduri ... */) 7. Numele variabileler si functiilor - numele dat variabilelor şi funcţiilor trebuie să respecte următoarele reguli: - primul caracter trebuie să fie o literă, un caracter de subliniere (_) sau semnul $ - primul caracter nu poate fi un număr - numele nu trebuie să conţină spaţii libere - nu se folosesc cuvinte rezervate, care fac parte din limbajul JavaScript

15

1.2.2 Adăugarea JavaScript într-o pagină HTML

Pentru a insera JavaScript într-un document HTML deja existent, este necesară

introducerea în fişier a etichetelor <script> şi </script>. Această etichetă necesită aributul "type", sau atributul "language" (acesta din urmă este depreciat în standardul XHTML) care va specifica browserului limbajul folosit pentru interpretarea codului inclus.

Ex1: <html><body> <script type="text/javascript"> document.write("Textul care va fi afisat pe ecran"); </script> </body></html> Ex2: <html> <script type="text/javascript"> //document.write("Textul care va fi afisat pe ecran"); var a=5; var b='5'; var s=5; var c; c=a+b; //alert(c); //alert("abc"); document.write(c); if(a==b) alert("a==b"); else alert ("a!=b"); if(a===b) alert ("a===b"); else alert ("a!==b"); if(a===s) alert ("a===s"); else alert ("a!==s"); </script> </html> Ex3: <html> <head> <script type="text/javascript"> function f1(a1) { alert(a1); } </script> </head> <body> <form> <input type="button" onclick="f1('ABC!')" value="LITERE" /> <input type="button" onclick="f1('123!')" value="CIFRE" />

16

</form> </body> </html>

17

1.2.3 Variabile şi operatori

Tipuri de variabile - Spre deosebire de alte limbaje (cum sunt Pascal sau C), Javascript nu are tipuri fixe de date, adică permite schimbarea tipului unei variabile în cadrul scriptului.

De exemplu:

var x = "xyz" x = 8

Durata de viaţă a unei variabile - O variabilă scrisă în cadrul unei funcţii este o variabilă locală, valoarea ei fiind recunoscută numai în cadrul acelei funcţii; când se iese din funcţie, variabila este distrusă. Astfel, o altă funcţie poate declara şi folosi o variabilă cu acelaşi nume. Javascript tratează cele două variabile ca fiind diferite (functiile si lucrul cu acesta vor fi explicate în lecţiile următoare).

Se pot declara şi variabile în afara oricărei funcţii, care să fie folosite de toate funcţiile; acestea se numesc variabile globale şi sunt valabile de la încărcarea paginii web, până la închidere, în orice script de tip JS.

Operatori Pentru a lucra cu datele introduse într-un script şi a manipula valorile variabilelor, se

folosesc operatori. Operatorii sunt simboluri şi identificatori care determină felul în care sunt modificate

datele şi modul în care este evaluată o combinaţie de expresii şi variabile. JavaScript recunoaşte : - operatori binari - care necesită existenţa a doi operanzi în expresie - operatori unari - care au nevoie de un singur operand

Operatori sunt de mai multe tipuri: Operatori aritmetici

- Operatori de atribuire - Operatori de comparare - Operatori logici (numiţi şi booleeni) - Operatori string (sau şiruri) - Operatori typeof - Operator condiţional “?” - Operatori pentru funcţii - Operatori pentru structuri de date

Acestia sunt f. asemanatori cu cei din limbajul C.

18

Ex1: <html> <head> <script type="text/javascript"> function f2(a,b) { var a1,b1; a1=parseFloat(a); b1=parseFloat(b); alert(a1+b1); /* var x,y,z; x=E1.value; y=E2.value; */ E3.value=a1+b1; } </script> </head> <body> <form> <p> a= <input type="text" id="E1"/></p> <p> b= <input type="text" id="E2"/> </p> <input type="button" onclick="f2(E1.value,E2.value)" value="adunare" /> <p> a+b= <input type="text" id="E3"/> </p> </form> </body> </html> Operatorul typeof

Acest operator returnează tipul de date conţinut la momentul respectiv de operandul său. Este util, în special, pentru a determina dacă o variabilă a fost definită.

Spre deosebire de C, există şi operatorul === , ceea ce înseamnă identic atât ca

valoare, cât şi ca tip. Daca a=5 iar b='5' , operatorul == întoarce true, în timp ce operatorul === întoarce

false.

19

1.2.4 Instrucţiuni condiţionale

1. Instrucţiunea "if" Forma generală a acestei instrucţiuni este următoarea : if (conditie) { codul care va fi executat daca este adevarata conditia } unde 'conditie' poate fi orice expresie logică.

Dacă rezultatul condiţiei este TRUE, se execută codul dintre acolade, în caz contrar,

când condiţia returnează FALSE, se trece peste acest cod. Ca și în limbajul C, FALSE corespunde cu ZERO “curat” iar tot ce este diferit de

zero reprezintă TRUE. 2. Instructiunea "if ... else" Forma generală a instrucţiunii "if ... else" este următoarea : if (conditie) { codul care va fi executat dacă este adevarată condiţia } else { codul care va fi executat dacă condiţia este falsă } unde 'conditie' poate fi orice expresie logică.

Dacă rezultatul condiţiei este TRUE, se execută codul dintre primele acolade care

aparţin de "if", în caz contrar, când condiţia returnează FALSE, sunt executate comenzile din a doua grupa de acolade (dupa else).

if (<expresie>)

TRUE FALSE

instr.1 instr.2

20

2. Instructiunea switch

Această instrucţiune este folosită pentru a compara o valoare cu altele dintr-o listă. Sintaxa generală a instrucţiunii "switch" este următoarea. switch (expresie) { case valoare1: // cod executat daca expresie = valoare1 break case valoare2: // cod executat daca expresie = valoare2 break case valoare3: // cod executat daca expresie = valoare3 break …....................................... default ://in caz contrar se executa default // cod executat daca expresie e diferit de valoare1, valoare2 sau valoare3 }

Prima dată este evaluată expresia scrisă între paranteze rotunde, apoi valoarea expresiei este comparată pe rând cu fiecare valoare determinată de "case". Dacă se găseşte o identitate, se execută codul asociat acelui "case". Apoi se iese din instrucţiunea "switch".

Dacă, parcurgând fiecare "case", nu se găseşte o egalitate, se execută codul de după "default".

Prin folosirea lui "break" se ste parcurgerea corpului instrucţiunii atunci când s-a găsit o valoare egală cu 'expresie' şi se iese din "switch".

21

1.1.5 Instrucţiuni ciclice (repetitive)

Instrucţiunile repetitive se folosesc atunci când se doreşte efectuarea unei comenzi de

mai multe ori. În javascript putem folosi următoarele instrucţiuni ciclice:

for - la fel ca şi în C, execută codul de un număr specificat de ori for ... in - execută câte un set de instrucţiuni pentru fiecare proprietate dintr-un obiect while - repetă codul atât timp cât o anumită condiţie este adevărată do ... while - întâi execută o dată codul, apoi îl repetă atât timp cât o anumită condiţie este adevarată 1. Instrucţiunea for Aceasta are următoarea formă generală: for (expresie1; expresie2; expresie3) bloc instructini unde "expresie1" - este folosită la 'iniţializare', pentru a da o valoare iniţiă a numărului de repetări; de multe ori prin aceasta se declară o variabilă care poate fi folosită ca un contoar al ciclului. "expresie2" - verifică dacă numărul de cicluri se încadrează într-o anumită valoare şi, dacă rezultatul este TRUE, se execută încă o dată blocul de instrucţinii. "expresie3" - de obicei incrementează sau decrementează valoarea la care a ajuns contoarul ciclului, apoi aceasta valoare este verificată din nou de "conditie_nr" până când rezultatul este FALSE.

Aceste trei expresii dintre parantezele rotunde sunt opţionale, dar dacă este omisă una dintre ele, caracterul punct şi virgulă ";" trebuie să rămână, pentru ca fiecare expresie să poată fi bine localizată.

În interiorul instrucţiunii for (ca şi la instructiunea "if"), intre acolade, pot fi introduse şi alte instructiuni "for", sau alte instrucţiuni condiaţionale; acest lucru se numeşte “imbricarea instrucţiunilor”.

22

2. Instrucţiunea for ... in Pentru utilizarea acestei instrucţiuni sunt necesare cunoştinţe despre obiectele

JavaScript, aşa că va trebui să reveniţi asupra ei după ce le veţi învăţa - în lecţiile următoare. Cu "for ... in" se execută câte un set de instrucţiuni pentru fiecare proprietate dintr-un

obiect. Acest ciclu se poate executa cu orice obiect JavaScript, indiferent dacă are sau nu proprietăţi. Pentru fiecare proprietate se execută câte o iteraţie; dacă obiectul nu are nici o proprietate, nu se desfaşoară nici un ciclu.

Instrucţiunea "for ... in" are urmatoarea formă generală:

for (nume_proprietate in obiect) { instructiuni } unde "nume_ proprietate" este un literal de tip şir, generat de JavaScript. Pentru fiecare repetare a execuţiei instrucţiunii, lui "nume_proprietate" i se atribuie următorul nume de proprietate conţinut în "obiect", până cand sunt folosite toate. 3.Instrucţiunea while

Instrucţiunea "whole" are urmatoarea formă generală: while(<expresie>) instr1;

La întâlnirea acestei instrucţiuni, se evaluează expresie. Dacă aceasta are valoarea TRUE (diferită de ZERO), se execută instrucţiunea instr1. Se reevaluează valoarea expresiei. Dacă ea este tot 1, se repetă instrucţiunea, etc. Astfel, instrucţiunea (corpul ciclului) se repetă atât timp cât “expresie” are valoarea de adevăr TRUE. În momentul în care <expresie> are valoarea de adevăr FALSE(sau egal cu ZERO), se iese din ciclu şi se trece la următoarea instrucţiune din afara buclei while. În cazul în care la prima evaluare a expresiei, aceasta are valoarea de adevăr FALSE, corpul instrucţiunii while nu va fi executat niciodată. Instr1 din corpul ciclului while poate fi compusă (un bloc).

23

4.Instrucţiunea do while Sintaxa: do instr1; while(<expresie>) Se execută instrucţiunea instr1 sau blocul de instrucţiuni. Se evaluează apoi <expresie>. Dacă aceasta are valoarea TRUE, se execută din nou instr1, altfel se iese din buclă. Se testează din nou valoarea expresiei. Se repetă execuţia instrucţiunii instr1 atât timp cât valoarea expresiei este TRUE. În cazul instrucţiunii do while, corpul ciclului se execută cel puţin o dată. Alte instructiuni Instrucţiunea break

Aceasta forţează ieşirea din interiorul unei bucle fără a se mai ţine seama de condiţia

de menţinere în buclă. Instrucţiunile situate în corpul buclei după instrucţiunea break nu vor mai fi executate. Intrucţiunea continue

Aceasta duce la ignorarea instrucţiunilor din buclă, situate după aceasta, şi testarea din nou a expresiei de menţinere în buclă. În cazul buclelor for se realizează si evaluarea celei de a treia expresii responsabilă cu incrementarea contorilor. Instrucţiunea with

Această comandă se foloseşte pentru a evita referirea în mod repetat la un obiect, atunci când îi accesăm metodele sau proprietăţile de mai multe ori. Orice metodă sau proprietate dintr-un bloc "with" pe care JavaScript nu o recunoaşte va fi asociată cu obiectul specificat pentru acel bloc.

Sintaxa acestei instrucţiuni este :

with (obiect) { instructiuni }

24

1.1.6 Funcţii JavaScript

Funcţiile ajută la divizarea mai multor sarcini pe care trebuie să le facă un program. O funcţie poate conţine mai multe instrucţiuni şi comenzi, care ulterior pot fi utilizate

uşor şi de mai multe ori. prin apelarea funcţiei care le conţine.

Asemănător cu limbajul C, pot fi două feluri de funcţii: predefinite - cum sunt de exemplu: "parseIntt(string)", "parseFloat(string)", ... Create de programator - care returnează o valoare - care nu returnează o valoare

1. Explicitarea (definirea) funcţiilor

O funcţie se defineşte la începutul fişierului, în secţiunea head, şi poate fi folosită în cadrul paginii prin apelarea ei. Scriptul care conţine definirea unei funcţii se adaugă în secţiunea "head", pentru a fi siguri că aceasta a fost încărcată înainte de a fi apelată.

Pentru crearea unei funcţii, se foloseşte cuvântul rezervat “function”, urmat de numele pe care vrem să-l dăm funcţiei, după care putem adăuga între paranteze rotunde argumentele (numite şi atribute) funcţiei (separate prin virgule, daca sunt mai multe) şi, între acolade, corpul funcţiei, care conţine codul care trebuie executat.

Forma generală a unei funcţii este: function nume_functie(argument1, argument, ...) { codul care va fi executat }

Argumentele sunt variabile folosite de funcţie, şi a căror valoare este preluată la apelarea funcţiei.

Atributele nu sun obligatorii, o funcţie poate fi definită şi fără argumente, dar se pastrează parantezele rotunde; astfel, sintaxa unei funcţii fără argumente este:

function nume_functie() { codul care va fi executat }

2. Instructiunea return

O funcţie care returnează un rezultat foloseşte pentru aceasta instrucţiunea “return”. Aceasta specifică valoarea pe care o returnează funcţia când este apelată.

3. Apelarea functiilor

După ce am explicitat o funcţie, pentru a fi folosită, fucţia trebuie apelată.

25

- O funcţie care conţine argumente se apelează în felul următor: nume_functie(argument1, argument, ...) - O funcţie fără argumente se apelează în felul următor: nume_functie() La apelul funcţiei, nu se mai folosesc cuvântul "function" şi acoladele În locul în care am apelat astfel o funcţie, va fi executat corpul acelei funcţii.

26

1.1.7 Obiecte JavaScript

JavaScript nu este un program orientat pe obiecte (OO), cum sunt C++ sau Java, dar este bazat pe obiecte.

În JavaScript obiectele sun,t de exemplu: un formular, o fereastră, butoane, imagini ,etc. Toate elementele dintr-o pagină sunt văzute de JavaScript ca fiind obiecte.

Putem cataloga obiectele din JavaScript în trei categorii principale:

- Obiecte pe partea de client - Obiecte pe partea de server - Obiecte esenţiale

JavaScript are următoarele obiecte esenţiale, predefinite:

1 - String 2 - Math 3 - Date 4 - Array 5 – Global

String (sau şir) se foloseşte pentru a prelua text.

Obiectul Array (numit şi “tablou”) se foloseşte pentru a stoca mai multe valori într-un singur nume de variabilă.

Fiecare valoare stocată devine un element al tabloului; acesta are asociat un "număr index" (sau “cheie”).

Cu ajutorul acestei chei, se poate face referire la oricare element specificat din tablou. Cu operatorul new se poate crea o "instanţă" a obiectului Array, ca în exemplul

următor: var a= new Array(5)

unde între parantezele rotunde este trecut numărul de elemente ale tabloului

Obiectul Date se foloseşte pentru a lucra cu data zilei şi timpul

Obiectul Math Acest obiect include constante matematice şi funcţii.

Nu este nevoie să fie creat (instanţat) un obiect Math, înainte de a fi folosit. Dacă, de exemplu, dorim să obţinem un număr aleator între 0 şi 1, scriem comanda:

nr_aleator = Math.random

Obiectul Global Acest obiect grupează proprietăţile şi metodele de nivel cel mai înalt, fără un obiect

părinte.

27

JavaScript organizează toate elementele unei pagini web într-o ierarhie. Toate elementele sunt văzute ca obiecte, şi fiecare obiect are anumite proprietăţi şi metode.

Cu JavaScript putem manipula uşor obiectele. Pentru aceasta, este importantă întelegerea ierarhiei obiectelor HTML.

JavaScript intelege fereastra browser-ului ca pe un obiect “window”; acesta

conţine anumite elemente, cum ar fi de exemplu “bara de stare”. În fereastra browser-ului, putem încărca/afişa un document HTML. Pagina din interiorul browser-ului este un obiect document.

Modelul Obiectului Document (DOM)

DOM defineşte o structura logică şi standardizată a documentelor, o ordine prin care putem parcurge şi edita elemente şi continut din documente HTML sau XML.

Structura DOM este o ierarhie de obiecte, compatibilă cu a limbajului Javascript, sau cu a oricărui limbaj bazat pe obiecte.

În schema urmatoare se poate vedea modelul şi ierarhia obiectelor:

0.Fereastra curentă 1. self, window, parent, top 2. navigator 2.1. plugins[] 2.2. mimetypes[] 3. frames[] 4. location 5. history 6. document

6.1. forms[] (buttons, checkbox, hidden, radio, password, reset, select, submit, text, textarea, fileupload

6.2. anchors[] 6.3. links[] 6.4. images[] 6.5. embeds[] 6.6. layer[] 6.7. are[] 6.8. applets[]

1. Obiecte pe partea de client

Elementele principale legate de lucrul pe partea de client din JavaScript se axează pe ceea ce putem face cu paginile HTML, mai exact - ceea ce poate face vizitatorul cu scriptul Javascript încărcat în pagina HTML.

Primul set de obiecte are o legatură cu navigatorul şi cu etichetele HTML din acesta. Majoritatea obiectelor JavaScript din nivelul 2 sunt văzute ca obiecte ale etichetelor HTML, după cum se poate observa în lista de mai jos, în care sunt prezentate obiectele JavaScript şi etichetele HTML corespunzătoare:

28

Button - <input type="button"> Checkbox - <input type="checkbox"> Hidden - <input type="hidden"> Fileupload - <input type="file"> Password - <input type="password"> Radio - <input type="radio"> Reset - <input type="reset"> Select - <select> Frame - <frame> Document - <body> Layer - <layer> sau <ilayer> Link - <a href=""> Image - <img> Area - <map> Anchor - <a name=""> Applet - <applet> Plugin - <embed> Form - <form> Submit - <input type="submit"> Text - <input type="text"> Textarea - <textarea> Option - <option>

OBIECTE DE NIVEL 3 ŞI 4 Obiectele de nivelul 3 sunt subobiecte ale obiectului "Form". La fel cum imbricaţi elementele HTML în interiorul etichetelor <form>, aceste obiecte sunt imbricate în interiorul obiectului "Form". 1. Obiectul Button

Javascript are trei obiecte buttons: Button, Submit şi Reset. Fiecare din ele are o reprezentare a unei etichete HTML. Obiectul Button este un buton generic, la care, pentru a fi folosit pentru o anumită funcţie, trebuie să îi adăugam linii de cod specifice, dar celelalte două: Submit (trimite datele la un script) şi Reset (şterge datele noi completate în formular), au scopuri specifice. Totuşi, se poate să folosim un obiect "Button" pentru a juca acelaşi rol ca şi obiectul "Submit" (apelând Form.submit()), sau ca obiect "Reset" (apelândForm.reset()). Proprietăţile obiectului " Button” : form - returnează obiectul Form al cărui membru este butonul name - returnează şirul specificat în atributul name al etichetei HTML <input> type - returnează şirul specificat în atributul type al etichetei HTML <input> value - returnează şirul care apare în reprezentarea grafică a unui buton, afişată în browser Metodele obiectului " Button”: blur() - dezactivează butonul click() - apelează un eveniment click pentru butonul respectiv. focus() - eveniment de activare a butonului handle Event() - transferă un eveniment handlerului de eveniment corespunzător

29

2. Obiectul Checkbox Acest obiect reprezintă caseta de validare HTML dintr-un "Form", care permite

vizitatorului să specifice o valoare "DA" sau "NU", ori "true" sau "false".

Proprietati ale obiectului " Checkbox" : Checked - returnează o valoare booleană care determină dacă este bifată caseta de validare defaultChecked - returnează o valoare booleană care păstrează starea iniţiala a casetei de validare. Este stabilită cu atributul "checked" form - returnează obiectul Form al casetei de validare name - returnează şirul specificat în atributul name al etichetei HTML <input> type - returnează şirul specificat în atributul type al etichetei HTML <input> value - returnează o valoare returnată când formularul este înaintat Metode ale obiectului " Checkbox" : blur() - dezactivează caseta de validare click() - apelează un eveniment click pentru caseta de validare respectivă focus() - eveniment de activare a casetei de validare handle Event() - transferă un eveniment handlerului de eveniment corespunzator 3. Obiectul FileUpload

Acest obiect este echivalentul elementului folosit pentru încărcarea fişierelor. Cu Javascript nu se pot face prea multe cu acest obiect, decât făcând referire la

proprietăţile sale. Proprietati ale obiectului " FileUpload" : form - face referire la obiectul form ce conţine caseta FileUpload name - conţine şirul specificat în atributul name al casetei FileUpload type - conţine şirul specificat în atributul type al casetei FileUpload value - conţine şirul care specifică numele căii fişierului pentru upload Metode ale obiectului " FileUpload" : blur() - dezactivează caseta FileUpload focus() - activează caseta FileUpload handle Event() - transferă un eveniment handlerului de eveniment corespunzător select() - selectează suprafaţa de adăugare a datelor pentru caseta FileUpload. 4. Obiectul Password

Obiectul password este asemănător cu obiectul "text", diferenţa fiind că toate caracterele introduse în caseta "Password" sunt afişate cu "*" pentru a nu se vedea textul introdus. Proprietati ale obiectului " Password" : defaultValue - face referire la atributul "value" al casetei pt. parola din formularul HTML form - face referire la obiectul Form ce conţine caseta pentru parolă name - conţine şirul specificat în atributul name al casetei pentru parolă type - conţine şirul specificat în atributul type al casetei pentru parolă value - face referire la conţinutul curent din caseta pentru parolă

30

Metode ale obiectului " Password" : blur() - dezactivează caseta pentru parolă focus() - activează caseta pentru parolă handle Event() - transferă un eveniment handlerului de eveniment corespunzător select() - selectează textul adăugat în caseta pentru parolă 5. Obiectul Radio

Butoanele radio sunt controale dintr-un formular HTML care se exclud unul pe altul; astfel, dacă este selectat un buton radio, toate celelalte butoane din set sunt neselectate. Setul de butoane se defineşte având aceaşi proprietate "name" pentru toate butoanele radio. Proprietati ale obiectului " Radio" : checked - retrneaza o valoare care determina daca este bifat obiectul radio defaultChecked - returneaza o valoare care pastreaza starea initiala a obiectului Radio, care se stabileste cu atributul "checked" al etichetei <input> respective form - returnează obiectul form ce conţine obiectul Radio name - conţine şirul specificat în atributul name al etichetei <input> type - conţine şirul specificat în atributul type al etichetei <input> value - face referire la atributul value al etichetei <input> Metode ale obiectului " Radio" : blur() - dezactivează obiectul Radio click( - apelează un eveniment "click" pentru obiectul Radio focus() - activează un buton radio handle Event() - transferă un eveniment handlerului de eveniment corespunzător 6. Obiectul Submit

Acest obiect este asociat butonului "submit" dintr-un formular HTML; când butonul este acţionat, trimite datele din formular către server, pe calea specificată în atributul "action" din eticheta <form> . Proprietati ale obiectului " Submit" : Form - returnează datele din întreg formularul ce conţine butonul "submit" name - returnează şirul specificat în atributul name al etichetei <input> corespunzătoare butonului type - returnează şirul specificat în atributul type din eticheta <input> a butonului "submit" value - returnează şirul agăugat în atributul value din eticheta <input> a butonului Metode ale obiectului "Submit" : blur() - dezactivează butonul click() - apelează un eveniment "click" pentru butonul respectiv focus() - activează butonul handle Event() - apelează handlerul pentru evenimentul specificat

31

7. Obiectul Reset Acest obiect este asociat butonului "reset" dintr-un formular HTML; când butonul

este acţionat, şterge toate datele introduse în formular, stabilind câmpurile la valoarea lor iniţială. Proprietati ale obiectului " Reset" : Form - returnează obiectul Form ce conţine butonul name - conţine şirul specificat în atributul name al etichetei <input> corespunzătoare butonului type - conţine şirul specificat în atributul type al etichetei <input> value - returnează şirul adăugat în atributul value din eticheta <input> a butonului Metode ale obiectului " Reset" : blur() - dezactivează butonul click() - apelează un eveniment "click" pentru butonul respectiv focus() - activează butonul 8. Obiectul Select

Acest obiect este asociat unei liste de selecţie dintr-un formular HTML. Acesta permite utilizatorului selectarea unor valori dintr-o listă predefinită. Aceasta poate fi de tipul “listbox” sau “combobox”. Dintr-o lista derulantă (combobox) se poate selecta numai o singură valoare, iar dintr-o casetă (listbox) se pot selecta mai multe valori.

Obiectul select poate apare ca listă derulantă (în mod iniţial), sau ca listă de selectare, dacă se specifică proprietatea "multiple" ca adevarată (true). Proprietati ale obiectului " Select" : form - returnează obiectul form ce conţine lista de selectare lengt - returnează numarul de opţiuni din lista de selectare name - returnează şirul specificat în atributul name al etichetei HTML corespunzătoare type - returnează şirul specificat în atributul type al etichetei HTML (pentru instanţele select ce conţin atributul "multiple" returneaza "select-multiple", iar pentru cele fără acest atribut returnează "select-one") options - returnează un tablou ce conţine toate elementele din caseta de selectare. Elementele sunt definite cu eticheta HTML <options>. Această proprietate are doua subproprietăţi: "length" şi "selectedIndex" selectedIndex - returnează un număr care specifică indicele opţiunii selectate din caseta de selectare Metode ale obiectului " Select" : blur() - dezactivează caseta de selectare click() - apelează un eveniment "click" pentru caseta de selectare handleEvent() - transferă un eveniment handlerului de eveniment corespunzător

32

9. Obiectul Text Acest obiect este reprezentarea casetei de tip "editbox" dintr-un formular HTML.

Obiectul text serveşte pentru preluarea datelor dintr-o casetă de tip "text". Proprietati ale obiectului " Text" : defaultValue - returnează valoarea casetei de text, specificată de atributul value form - returnează obiectul form ce conţine caseta de text name - returnează şirul specificat în atributul name al etichetei HTML corespunzătoare type - returnează şirul specificat în atributul type al etichetei HTML value - returnează valoarea afişată în caseta de text Metode ale obiectului " Text" : blur() - dezactivează caseta de text focus() - activează caseta de tip text handleEvent() - transferă un eveniment handlerului de eveniment corespunzător select() - selectează textul din caseta de text 10. Obiectul Textarea

Asemănător cu obiectul "Text", obiectul Textarea este reprezentarea casetei de tip "Memo" dintr-un formular HTML. Această caseta permite adăugarea mai multor linii de text în acelasi câmp (caseta). Proprietati ale obiectului " Textarea" : defaultValue - returnează valoarea zonei de text, specificate între etichetele <textarea> form - returnează obiectul Form ce conţine caseta textarea name - returnează şirul specificat în atributul name al etichetei HTML corespunzatoare type - returnează şirul specificat în atributul type al etichetei HTML value - returneaza valoarea afişată în caseta textarea Metode ale obiectului " Textarea" : blur() - dezactivează zona de text focus() - activează zona de text handleEvent() - transferă un eveniment handlerului de eveniment corespunzător select() - selectează textul din câmpul de text

33

1.1.8 Evenimente JavaScript

Evenimentele sunt elemente foarte importante în programarea JavaScript. Acestea sunt acţiuni provocate (de cele mai multe ori) de vizitatorul paginii.

Dacă vizitatorul apasă un buton din pagină, se provoacă evenimentul "Click". Dacă mouse-ul este deasupra unui link, se declanşează un eveniment "MouseOver". JavaScript poate reacţiona la unele evenimente. Aceasta se poate realiza cu ajutorul

"event-handlers" (manageri de evenimente, sau gestionar de evenimente). Handlerele de evenimente se adaugă ca atribute ale etichetelor HTML.

Principalele evenimente:

onClick - Se execută la apăsarea unui click pe un obiect.(document, link, buton, checkbox,

buton radio, buton reset sau submit) onDblClick - Execută acţiunea la efectuarea a două clickuri unul după altul on MouseOver - Acţionează când se poziţionează mouse-ul deasupra unui link sau unei imagini onMouseOut - Acţionează când se mută mouse-ul de pe un hiperlink sau o imagine onMouseMove - Acţionează când se mişca mouse-ul onMouseDown - Acţionează când ţinem apăsat unul din butoanele mouse-ului, pe un document,

buton sau link onMouseUp - Acţiunea se execută atunci când este eliberat unul din butoanele mouse-ului onFocus - Acţiunea apare când este activat un obiect câmp: caseta password, câmp text, bloc

de text, câmp FileUpload dintr-un formular HTML onChange - Acţiunea apare când se modifică conţinutul unui câmp dintr-un formular HTML (o

parolă, text, bloc de text, sau FileUpload) şi când acesta pierde focalizarea onBlur - Este inversul lui "onFocus()"; este declanşat atunci când un obiect nu mai este activ,

prin trecerea la o altă resursă onLoad - Acţionează când browserul a terminat de încărcat un document, imagine sau toate

Frame-urile

34

1.2 Cookie-uri

Valorile majorităţii variabilelor dintr-un script dispar atunci când fereastra browser-ului este închisă. Spre deosebire de acestea, valorile variabilelor cookie se pot păstra un timp indefinit. Pentru ca valorile lor să se poată păstra, browserul utilizatorului stochează variabilele cookie în unitatea de hard-disc a utilizatorului.

Astfel, cookie-urile sunt fişiere care conţin diferite date despre un anumit site vizitat şi valori de variabile, salvate pe calculatorul vizitatorului.

Un cookie constă, în principal, dintr-o pereche nume = valoare, iar caracteristici mai avansate permit stabilirea unei date de expirare şi pot stabili un sistem de management al acestora.

Unul dintre avantajele folosirii fisierelor cookie este persistenţa acestora. Un fişier cookie poate persista luni de zile (sau ani), simplificând vizitele ulterioare ale utilizatorului pe site, deoarece informaţiile referitoare la vizite şi preferinţele utilizatorului sunt salvate şi preluate din cookie de fiecare data când va reveni la site.

Fişierele cookie sunt deosebit de utile când sunt folosite cu JavaScript, deoarece JavaScript are funcţii pentru citirea, adăugarea şi editarea fişierelor cookie.

Browserul poate fi setat pentru un anumit tip de management al acestor fişiere; astfel se pot impune restricţii privind dimensiunea şi numărul de fişiere cookie care pot fi stocate, iar fişierele cookie mai noi pot suprascrie pe cele vechi.

Când un utilizator trece de la un browser la altul, fişierele cookie salvate de un browser nu sunt recunoscute de celalalt.

Cele mai multe browsere stochează informaţiile cookie în fişiere text necriptate, de aceea informaţiile private precum parole, numere personale nu trebuie stocate direct într-un cookie.

Utilizatorul poate configura browserul astfel încât să interzică stocarea informaţiilor de cookie; în acest caz, aplicaţia care foloseşte cookie ar putea sa nu funcţioneze.

Numele şi valorile dintr-un cookie sunt stocate şi stabilite utilizând proprietatea cookie a obiectului Document.

Pentru a stoca şirul cookie într-o variabilă, se foloseşte o comandă precum aceasta:

var myCookie = document.cookie

Pentru a afişa într-o pagină web şirul astfel stocat , putem folosi comanda:

document.write(document.cookie)

JavaScript stochează fişierele cookie în formatul următor:

nume1=valoare1; nume2=valoare2; nume3=valoare3

unde "nume1", "nume2" si "nume3" reprezintă numele fiecărui cookie, iar "valoare1", "valoare2" şi "valoare3" reprezintă valorile care vor fi adăugate şi stocate în fiecare cookie. Perechile nume=valoare sunt separate prin caracterul punct şi virgulă (;) şi un spaţiu, iar dupa ultima pereche nu se mai pune caracterul punct si virgulă.

35

<script type="text/javascript"> function GetCookie (name) { var result = null; var myCookie = " " + document.cookie + ";"; // toate sirurile de cookie incep cu spatiu si se incheie cu ; var searchName = " " + name + "="; // se cauta tot ce e intre name si = urmator var startOfCookie = myCookie.indexOf(searchName); var endOfCookie; if (startOfCookie != -1) { // daca gaseste ceva intre ele startOfCookie += searchName.length; // omite nume cookie anterior endOfCookie = myCookie.indexOf(";", startOfCookie); result = unescape(myCookie.substring(startOfCookie, endOfCookie)); } return result; } var valoare_c = GetCookie('nume_cookie'); document.write(valoare_c); // Afiseaza valoarea cookie-ului cautat, sau cuvantul null </script>

Funcţia "GetCookie(name)" prelucrează şirul obţinut de comanda "document.cookie" şi verifică dacă există cookie-ul cu numele transmis ca argument funcţiei. Dacă cookie-ul cu numele respectiv există, atribuie variabilei "result" valoarea asociată numelui, şi funcţia va returna aceasta valoare. Dacă numele nu există, valoarea variabilei "result", şi returnată de funcţie, rămâne "null".

Variabila "valoare_c" apelează funcţia "GetCookie()", unde 'nume_cookie' dintre paranteze, este numele cookie-ului a cărui valoare dorim să o obtinem.

Prin comanda "document.write(valoare_c)", scriptul va afişa valoarea acestei variabile, care este cea returnată de funcţie.

36

1.3 Fişiere XML

XML (Extensible Markup Language) este un meta-limbaj; datele sunt "marcate" cu etichete similare, tag-uri HTML.

Există o versiune de HTML XML, numit XHTML. XHTML are aceleași etichete ca HTML, dar urmează regulile de sintaxă XML. XML este utilizat pentru a stoca date sau informații; aceste date ar putea fi destinate

pentru a fi citite de oameni sau de către alte aplicaţii (ex:majoritatea driver-elor au fişierele de configurare în structura XML).

XML-ul permite stocarea datelor ce nu au o structura definitivă şi a căror structură este complexă.

Documentele XML sunt realizate din unităţi de stocare numite entităţi, ce conţin date parsate sau neparsate. Datele parsate sunt realizate din caractere, unele dintre ele formând date character, iar altele ca marcaje. Marcajele codifică o descriere a schemei de stocare a documentului şi structura logica. XML furnizează un mecanism pentru a impune constrângeri asupra schemei de stocare şi a structurii logice.

XML a fost elaborat pentru:

- separarea sintaxei de semantică, pentru a furniza un cadru comun de structurare a informaţiei

- construirea de limbaje de mark-up pentru aplicaţii din orice domeniu - structurarea informaţiei în viitor - asigurarea independenţiei de platformă şi suport pentru internaţionalizare

Un document XML este un arbore ordonat etichetat:

- date caracter - noduri frunză ce conţin datele - noduri elemente etichetate cu

o un nume (adesea numit şi tipul elementului) şi o o mulţime de atribute, fiecare din ele având un nume şi o valoare; acestea pot

conţine unu sau mai mulţi copii. Ex: <?xml version="1.0"?> <persoana> <nume> <firstname>Nume</firstname> <lastname>Prenume</lastname> </nume> <job>Nume_job</job> <part_time>Nu</part_time> /persoana>

37

Structura documentelor XML

Un document XML este format din marcaje (tag-uri) şi date caracter. Cuvântul marcaj (markup) a fost folosit iniţial pentru a descrie anumite adnotări, note marginale în cadrul unui text, cu intenţia de a indica tehnoredactorului cum trebuie listat un anumit pasaj. Generalizând, putem defini marcajul drept orice acţiune de a interpreta explicit o porţiune de text.

Un marcaj (tag) este un şir de caractere delimitat de caracterele "<" şi ">". Tag-urile sunt case sesitive, adică se face distincţia între litere mari şi litere mici Datele caracter reprezinta continutul marcajelor. Numele unui tag este o sucesiune de

caractere alfa-numerice ce începe obligatoriu cu o literă.

În XML, marcajele nu sunt folosite pentru afişarea datelor conţinute, ci au alte scopuri printre care:

- asigură o sintaxă simplă şi standardizată, pe care analizoarele XML o pot folosi pentru

a utiliza informaţia stocată - asigură o metodă de a descrie structura ierarhică a conţinutului prin împărţirea

informaţiei (datele caracter) în părţi numite elemente, care mai departe sunt descrise prin atribute. Structura ierarhică a întregului document este pusă în evidenţăş prin utilizarea marcajelor.

Un fişier XML cuprinde următoarele secţiuni:

- Prolog - Definiţia tipului de document (opţională) - Elementul rădăcină

Prologul: Ex: <?xml version="1.0" encoding="UTF-8"?>

Este o instrucţiune de procesare. Ea informează că urmează descrierea unui fişier XML ce respectă versiunea de specificaţie 1.0 , iar setul de caractere utilizat este encodat UTF-8 Sintaxa unui document XML

Un document XML poate conţine următoarele tipuri de marcaje:

- Elemente - Atribute - Comentarii - Entităţi - Instrucţiuni de procesare - Declaraţia tipului de document

Elementele sunt blocurile de bază ale unui document XML. Pot fi folosite atât pentru

a reţine informaţii, cât şi pentru definirea structurii. Un element începe cu un tag de start şi se termină cu corespunzătorul tag de sfârşit:

38

<nume_tag_abc > ........ </nume_tag_abc>

Un element poate fi vid, adică nu conţine nimic. Sintaxa pentru un element vid este : <nume_tag/>

Atribute

Atributele au rolul de a descrie elementele. Atributele din XML sunt aceleaşi cu atributele din HTML. De exemplu, un atribut al elementului <table> ar fi align="center". Atributele sunt localizate în tag-ul de start al unui element, imediat după numele

elementului, sunt urmate de semnul ‘=’, care este urmat de valoarea atributului, între ghilimele.

Sintaxa este urmatoarea: <nume_tag numeAtribut1="valoare1" ... numeAtributN="valoareN"> . . . </nume_tag> Pentru un element pot exista oricâte atribute

Comentarii

Comentariile sunt secevenţe de caractere ce pot apărea oriunde în document, în afara altor marcaje ce sunt utilizate pentru a descrie anumite detalii legate de conţinutul şi structura documentului programatorului. Un comentariu începe cu secvenţa <!-- şi se încheie cu -->.

<!-- comentariu -->

Comentariile pot fi oricât de lungi - nu există limite în ceea ce priveşte lungimea lor. Un cometariu nu poate să conţina secvenţa de caractere --.

39

1.4 Exemplu de utilizare HTML5 şi clase JavaScript

Exemplu utilizare HTML5 și clase javascript din qooxdoo pentru afișarea unui grid în vederea realizării unei hărți stelare (simplificate) a emisferei nordice:

Fișier w_bvo2_0.js function poz_harta_x(dim, asc_hms, decl) { var fi=15.0*asc_hms.split(':')[0]+asc_hms.split(':')[1]/4+asc_hms.split(':')[2]/240; var fi_rad=fi*2*Math.PI/360.0; var r=(90.0-decl)*dim/180.0; var x=r*Math.cos(fi_rad); return x; }

40

function poz_harta_y(dim, asc_hms, decl) { var fi=15.0*asc_hms.split(':')[0]+asc_hms.split(':')[1]/4+asc_hms.split(':')[2]/240; var fi_rad=fi*2*Math.PI/360.0; var r=(90.0-decl)*dim/180.0; var y=r*Math.sin(fi_rad); return y; } function aduna_1grd(sir) {//7'30" var h=parseInt(sir.split(':')[0]); var m=parseInt(sir.split(':')[1]); var s=parseInt(sir.split(':')[2]); if(s>29) {s=60-s;m++;} else s+=30; if(m>52) {m=60-m;h++;} else m+=7; if(h>23) h=0; return h+':'+m+':'+s; } function scade_1grd(sir) {//7'30" var h=parseInt(sir.split(':')[0]); var m=parseInt(sir.split(':')[1]); var s=parseInt(sir.split(':')[2]); if(s<30) {s=60-s-30;m--;} else s-=30; if(m<7) {m=60-m-7;h--;} else m-=7; if(h<0) h=23; return h+':'+m+':'+s; } function afis_2_2(ctx,ccx,ccy,cx,cy,__dx,__dy,__zoom) { ctx.beginPath(); ctx.fillStyle="yellow"; //ctx.strokeStyle = '#aa1122'; ctx.strokeStyle='red'; var x1=poz_harta_x(ccx*2*__zoom, scade_1grd(cx), cy-1); var y1=poz_harta_y(ccx*2*__zoom, scade_1grd(cx), cy-1); var x2=poz_harta_x(ccx*2*__zoom, aduna_1grd(cx), cy-1); var y2=poz_harta_y(ccx*2*__zoom, aduna_1grd(cx), cy-1); var x3=poz_harta_x(ccx*2*__zoom, aduna_1grd(cx), cy+1); var y3=poz_harta_y(ccx*2*__zoom, aduna_1grd(cx), cy+1); var x4=poz_harta_x(ccx*2*__zoom, scade_1grd(cx), cy+1); var y4=poz_harta_y(ccx*2*__zoom, scade_1grd(cx), cy+1); ctx.moveTo(ccx+x1+__dx,ccy+y1+__dy); ctx.lineTo(ccx+x2+__dx,ccy+y2+__dy); ctx.lineTo(ccx+x3+__dx,ccy+y3+__dy); ctx.lineTo(ccx+x4+__dx,ccy+y4+__dy); ctx.lineTo(ccx+x1+__dx,ccy+y1+__dy); ctx.fill(); ctx.stroke();}

41

qx.Class.define("bvo2.w_bvo2_0", { extend : qx.ui.window.Window, construct : function() { this.base(arguments, "bvo2"); this.date_ini(); var containerBaza = new qx.ui.container.Composite(new qx.ui.layout.Dock()).set( { decorator: "main", //backgroundColor: "yellow", width:800, height:600, allowGrowX : false }); this.add(containerBaza, {edge:0}); if (!qx.core.Environment.get("html.canvas")) { var canvas1 = new qx.ui.container.Composite(new qx.ui.layout.HBox()); canvas1.add(new qx.ui.basic.Label("Canvas is not supported by this browser!").set({ rich : true,alignX: "center", alignY: "middle" })); } else { var canvas1 = new qx.ui.embed.Canvas().set({ canvasWidth: 500+10, canvasHeight: 500+10,syncDimension: false }); canvas1.addListener("redraw", this.draw, this); } var w2 = new qx.ui.core.Widget().set({decorator: "main", backgroundColor: "blue"}); containerBaza.add(w2, {edge:"west"}); var w3 = new qx.ui.container.Composite(new qx.ui.layout.HBox()); containerBaza.add(w3, {edge: "south"}); var sliderX = new qx.ui.form.Slider().set({minimum:0, maximum: 200,width:200}); var infoX = new qx.ui.basic.Label(); w3.add(sliderX);w3.add(infoX); var sliderZ = new qx.ui.form.Slider().set({minimum:0, maximum: 200,width:200}); var infoZ = new qx.ui.basic.Label(); w3.add(sliderZ);w3.add(infoZ); containerBaza.add(canvas1, {edge: "center"}); },//end constructor members:{ }, statics:{ }, events : { "reload" : "qx.event.type.Event",

42

"post" : "qx.event.type.Data", "changeSelection" : "qx.event.type.Data", "changeValue" : "qx.event.type.Data" } }); //------------------------------------------------------------------------------------------------------------------------------------------ bvo2.w_bvo2_0.prototype.draw = function(e) { var data = e.getData(); var ctx = data.context; var __dx=0;//0-300; var __dy=0; var __zoom=1;//3.5; ctx.beginPath(); var ccx=(data.width-10)/2.0; var ccy=(data.height-10)/2.0; //disc var raza_disc=(data.width-10)/2.0; ctx.fillStyle="rgba(0, 0, 200, 0.2)"; ctx.strokeStyle = '#00ff00'; ctx.arc(ccx+__dx,ccy+__dy,raza_disc*__zoom,0,2*Math.PI); ctx.fill(); ctx.stroke(); //declinatie text ctx.beginPath(); ctx.font = 'italic 7pt Calibri'; ctx.fillStyle="rgb(0, 0, 250)"; for(var i=0;i<90;i+=10) ctx.fillText('+'+(90-i),ccx+ poz_harta_x(ccx*2*__zoom, '06:00:00', 90-i)+__dx,ccy+poz_harta_y(ccx*2*__zoom, '06:00:00', 90-i)+__dy); //ascensie dreapta text ctx.fillStyle="rgb(0, 0, 250)"; for(var i=0;i<24;i++) { var x1=poz_harta_x(ccx*2*__zoom, i+':00:00', 0); var y1=poz_harta_y(ccx*2*__zoom, i+':00:00', 0); ctx.fillText('+'+i+'h',ccx+x1+__dx,ccy+y1+__dy); } //cerc conc. ctx.stroke(); //ctx.endPath(); ctx.beginPath(); //ctx.fillStyle="rgba(0, 0, 200, 0.5)"; ctx.strokeStyle = '#228855'; for(var i=0; i<90; i+=15) { var r1=poz_harta_x(ccx*2*__zoom,"00:00:00" ,90-i); ctx.arc(ccx+__dx,ccy+__dy,r1,0,2*Math.PI); }

43

ctx.stroke(); afis_2_2(ctx,ccx,ccy,'00:22:00',46,__dx,__dy,__zoom); ctx.endPath(); } //------------------------------------------------------------------------------------------------------------------------------------------ bvo2.w_bvo2_0.prototype.date_ini = function() { } Fișier Application.js /* ************************************************************************ #asset(bvo2/*) ************************************************************************ */ /** * This is the main application class of your custom application "bvo2" */ qx.Class.define("bvo2.Application", { extend : qx.application.Standalone, members : { main : function() { this.base(arguments); if (qx.core.Environment.get("qx.debug")) { qx.log.appender.Native; qx.log.appender.Console; } this.m_bvo2_0(); }, m_bvo2_0 : function() { var win_bvo2_0 = new bvo2.w_bvo2_0; win_bvo2_0.setLayout(new qx.ui.layout.Grow()); win_bvo2_0.setWidth(800);win_bvo2_0.setHeight(600);win_bvo2_0.setShowMinimize(false); this.getRoot().add(win_bvo2_0, {left:20, top:20}); win_bvo2_0.open(); //alert(document.getElementByName("P_1")); // qx.event.Registration.addListener(win_nir_0.P1_1, "keydown", function(e) {alert(e.getKeyIdentifier());}, this); } } });

44

2 TEHNOLOGII WEB SERVER

2.1 PHP

2.1.5 Noţiuni introductive

Notă: pentru testarea exemplelor se pot instala postgreSQL și ApachePHP (din cadrul postgres Plud Add-Ons): http://www.postgresql.org

După instalare se crează automat directorul www sau httdoc. Fişierele php se vor pune în acest director, sau într-un subdirector al acestuia.

Exemplu de apel: http://localhost:8080/T1/test.php

sau http://nume_calculator/T1/test.php

PHP este prescurtarea de la Hypertext PreProcessor.

Când accesăm o pagină HTML serverul care o găzduiește trimite pagina HTML către browser spre afișare. În cazul unei pagini PHP serverul citește codul PHP, îl interpretează și generează dinamic pagina HTML care este trimisă browserului spre afișare. Acesta este motivul pentru care unii utilizatori folosesc PHP și pentru construirea unor pagini cu conținut dinamic.

Fișierele PHP au extensia php. Fișierele pot fi scrise cu orice editor de texte. Este preferat Notepad++ datorită faptului că pune în evidență sintaxa limbajului. Există și editoare ce oferă mai multe facilități (help interactiv, apel debugger, etc) cum ar fi eclipse php sau cele oferite de Zend.

Când PHP-ul parcurge un fișier de fapt "citește" textul până când întâlnește una din etichetele speciale care-i spun să înceapă să interpreteze textul ca pe cod PHP. Se executată codul până când este întâlnită eticheta de închidere. Apoi se "citește" din nou textul mai departe. Acesta este motivul pentru care se poate adaugă cod PHP în interiorul HTML-ului.

Câteva reguli de sintaxă:

- închiderea unui rând se face obligatoriu cu caracterul “;” - numele funcţiilor NU sunt Case Sensitive (nu se face diferenţă între utilizarea literelor

mari sau mici) - numele variabilelor SUNT Case Sensitive (se face diferenţă între utilizarea literelor

mari sau mici) Codul PHP este delimitat de unul din urmatoarele seturi de etichete de deschidere şi închidere: <?php ?> etichete recomandate <script language="php"?> </script>

45

<? ?> folosirea lor necesită anumite setări pe server <% %> etichete tip ASP; folosirea lor necesită anumite setări

pe server Ex: cel mai simplu script PHP este:

<?php echo "Acesta este un script PHP"; ?>

Funcţia echo este folosită pentru afişarea informaţiilor delimitate de ghilimele. Similară funcţiei echo este funcţia print. În situaţia în care scriptul nu este scris correct, PHP-ul va afişa eroarea, indicand şi

locul unde aceasta apare. Erorile sunt afişate doar dacă serverul este setat corespunzător (in php.ini este setat display_errors=On şi error_reporting=E_ALL). Ex: în interiorul scriptului se pot insera şi etichete HTML <?php echo "Acesta este un script <b>PHP</b><br>care contine si etichete HTML"; ?> Ex: fisierul PHP poate conţine între etichetele <html> şi </html> blocuri PHP delimitate de <?php ?>

<html> <head> <title>Ex</title> </head> <body> Bloc HTML<br> <?php echo "Bloc PHP"; ?> </body> </html>

În PHP există trei metode prin care se poate adăuga un comentariu. Tot ce urmează după caracterele // sau # este considerat comentariu. De Ex:

// Urmeaza un comentariu in PHP # Urmeaza un comentariu in PHP

Utilizare: echo "test"; // browser-ul va afisa test echo "proba"; # browser-ul va afisa proba

Un comentariu format din mai multe linii este încadrat de /* şi */. De Ex: /* Comentariul in PHP scris pe doua linii */

46

2.1.6 Variabile PHP

Variabila, ca şi în limbajul C, este un “container de date” care poartă un nume şi căreia i se poate atribui o valoare, care poate fi modificată de mai multe ori, sau salvată într-o bază de date. În PHP, numele dat variabilei începe cu simbolul “$”, urmat de orice literă mică (a-z) sau mare (A-Z), sau cu caracterul “_”, dar niciodată cu o cifră; NU poate conţine spaţii goale. De Ex: $nume_variabila $nume_variabila="valoare" Ex: atribuim variabilei $program valoarea PHP, şi apoi o tipărim

<?php $program="PHP"; echo $program; ?>

Modificând valoarea variabilei, se modifică ceea ce este afişat de browser.

Într-un script se pot folosi mai multe variabile, care pot fi adăugate în aceeaşi construcţie echo. Ex:

<?php $ziua="01";$luna="12";$anul="2012"; echo "Data este ".$ziua.".".$luna.".".$anul; ?>

În PHP sunt opt tipuri de variabile primitive: - patru tipuri scalare: întregi, numere cu virgula flotantă, şiruri şi booleene - două tipuri compuse: matrice şi obiecte - două tipuri speciale: resurse şi NULL

Întreg (integer) este un simplu număr întreg, exprimat în sistem zecimal, hexazecimal sau octal, optional putând purta şi semn (+ sau -). În sistem octal, numărul trebuie precedat de “0”, iar pentru hexazecimal precedat de “0x”.

$a=13; //numar exprimat in sistem zecimal $a=-13; //numar negativ exprimat in sistem zecimal $a=0137; //numar octal $a=0x1F; //numar hexazecimal

Numere reale (float)

$a=-3.14; //numar zecimal negativ $a=1.3e2; //130 $a=1E+3; //1000

47

Sirul (string) este o variabilă care conţine o combinaţie de numere, litere, simboluri şi spaţii delimitate între două ghilimele simple sau duble. Şirurile pot conţine şi nume de variabile. Ex:

<?php $nume="Ion"; $varsta=24; echo "Numele persoanei este ".$nume." si are ".$varsta.” ani”; ?>

Cea mai simplă cale pentru a specifica un şir este să îl încadrăm între ghilimele simple (') , dar eventualele ghilimele simple conţinute în şir vor fi precedate atunci de caracterul ”\”.

În această situaţie, variabilele şi caracterele speciale vor fi ignorate.

echo "acesta este un sir"; //acesta este un sir echo "variabila $a"; //variabila $a echo "rand1 \n rand2"; //rand1 \n rand2

Variabila booleana exprimă valoarea de adevar: TRUE sau FALSE. Orice valoare diferită de zero sau şir care nu este gol (conţine cel puţin un caracter) sunt considerate ca TRUE.

Ca şi în limbajul C, valoarea 0 corespunde cu FALSE, iar tot ceea ce este diferit de zero este TRUE.

Tablouri (array) Acestea utilizează chei, sau indecşi, pentru a identifica valorile stocate. Un tablou se crează folosind funcţia array():

$vector = array('unu','doi','trei');

Ex: creăm un tablou şi îi tipărim elementele folosind funcţia print_r

<?php $vector = array('unu','doi','trei'); print_r ($vector); ?>

Ex: utilizăm acelaşi tablou, dar folosim funcţia var_dump() care ne arată câte elemente sunt în tablou şi lungimea fiecărei valori a sa

<?php $vector = array('unu','doi','trei'); var_dump ($vector); ?>

Primul index al unui vector are valoarea 0. Valorile indecşilor pot fi declarate şi manual.

48

Ex: cream o matrice cu indecşii 1, 3 si 5

<?php $ vector = array(1=>'unu',3=>'trei',5=>'cinci'); var_dump ($vector); ?>

Pentru a şterge o pereche cheie/valoare se foloseşte unset() unset($vector[2]); //sterge cheia 2 din matrice unset($vector); //sterge intregul vector Tablouri multidimensionale: sunt o listă de tablori cu o dimeniune mai mică Ex

<?php $Romania = array( "Bucuresti" => array("Cartier Unirea"," Cartier Crangasi","Cartier Militari",....), "Brasov" => array(), "Timisoara" => array(.........), …............................... ); ?>

Variabile predefinite

PHP oferă un mare număr de variabile predefinite oricărui script care rulează şi sunt funcţie de serverul pe care funcţionează.

Începând cu PHP 4.2.0 , valoarea default pentru directiva register_globals este off. Aceasta afectează setul de variabile predefinite disponibile în scop global.

De Ex pentru a obtine DOCUMENT_ROOT vom olosi $_SERVER['DOCUMENT_ROOT'] în loc de $DOCUMENT_ROOT , cum era în cazul în care register_globals erau on.

PHP Superglobals sunt variabile disponibile oriunde in script $GLOBALS conţine referinţe către toate variabilele care sunt disponibile în scop global scriptului $_SERVER variabile furnizate scriptului de către serverul web $_GET variabile furnizate scriptului via HTTP GET (provin dintr-un formular in care

method="GET") $_POST variabile furnizate scriptului via HTTP POST (provin dintr-un formular în care

method="POST") $_COOKIE variabile furnizate scriptului via HTTP cookies $_ENV variabile furnizate scriptului de către mediu

49

Variabile globale uzuale $_SERVER['REMOTE_ADDR'] Ex: adresa IP a vizitatorului $_SERVER['HTTP_USER_AGENT'] Ex: informaţii despre browserul utilizat

$_SERVER['HTTP_REFERER'] Ex: pagina vizitată anterior $_SERVER['SERVER_NAME'] Ex: numele serverului $_SERVER['SCRIPT_NAME'] Ex: numele scriptului Vizibilitatea variabilelor depinde de contextul în care sunt definite. Majoritatea variabilelor din PHP sunt vizibile doar în blocul curent de instrucţiuni. Orice variabila folosită în interiorul unei funcţii este limitată doar la blocul funcţiei. Ex: deoarece funcţia foloseşte o variabilă declarată în afara ei, echo nu va afişa nimic

<?php $a=10; function mihai() { echo "Mihai are ".$a." ani"; } mihai(); ?>

Ex: aceeasi funcţie, dar acum declarăm variabila de tip global, motiv pentru care echo va afişa correct

<?php $a=10; function mihai() { global $a; //declaram variabila $a de tip global echo "Mihai are ".$a." ani"; } mihai(); ?>

Variabile statice

O altă caracteristicaăimportantă a scopului variabilei este variabila static, care există doar în blocul funcţiei locale, dar NU îşi pierde valoarea când este reluată execuţia funcţiei. Variabila îşi pierde valoarea când este încheiat scriptul curent.

Ex: executarea succesivă a funcţiei va afişa tot timpul 0

<?php function static1() { $a=0; echo $a;

50

$a++; } static1(); echo "<br>"; static1(); echo "<br>"; static1(); ?>

Ex: aceeaşi funcţie, dar declarăm variabila ca fiind statică. De câte ori funcţia va fi executată, ea va incrementa valoarea anterioară a variabilei $a

<?php function static1() { static $a=0; echo $a; $a++; } static1(); echo "<br>"; static1(); echo "<br>"; static1(); ?>

Variabile referinţă Câteodata este util să avem un nume variabil pentru o variabilă Ex:

<?php $a="Mihai"; $$a="Ionescu"; echo "$a $Mihai"; ?>

Functii de tipul typeof Există funcţii care determină tipul variabilei. Ex: verificăm daca variabila $a este de tip întreg

<?php $a=19; if (is_integer($a)) { echo '$a este intreg'; } else {

51

echo '$a nu este intreg'; } ?>

Ex: verificăm dacă variabila $a este de tip număr cu virgula flotantă

<?php $a=3.14; if (is_float($a)) { echo '$a este numar cu virgula flotanta'; } else { echo '$a nu este numar cu virgula flotanta'; } ?>

Ex: verificăm dacă variabila $a este de tip şir

<?php $a="sir"; if (is_string($a)) { echo '$a este un sir'; } else { echo '$a nu este un sir'; } ?>

Ex: verificăm dacă variabila $a este un tablou

<?php $a = array('unu','doi','trei'); if (is_array($a)) { echo '$a este un tablou'; } else { echo '$a nu este un tablou'; } ?>

Ex:tipuri de date

<?php //TIPURI DE DATE //boolean - 0 false , resul adevarat -0.000000001 este TRUE $a=-0.000000001; if($a) echo "TRUE <br/>"; else echo "FALSE<br/>"; //integer $a=-123; //reale $a=-343.656; //siruri

52

$a='un sir'; $b=" --- alt sir ce contine si pe a: $a"; echo $a.$b; // concatenare siruri $c="<br/> ---".$a." ---- "; echo $c; //ARRAY (TABLOURI) $a=array(); $a[0]=5; $a[2]=7; $a[3]=8; echo("<br/>"); unset($a[2]); // sterge pe $a[2] // unset $a sterge continutul intregului tablou for($i=0;$i<4;$i++) echo(" a[$i]=$a[$i]; "); $a[]=9; $a["unu"]=10; echo("<br/>"); for($i=0;$i<11;$i++) echo(" a[$i]=$a[$i]; "); //echo "a[unu]=".$a["unu"]; //tablouri asociative echo("<br/>"); $b=array("unu"=>"galben", "doi"=>"verde", 2 => "albastru", "trei" =>3); echo $b["unu"];echo" ";echo $b[2];echo" "; echo $b["trei"]; // //tablou asociativ cu doua dimensiuni $c=array("t2"=>array(1=>3, 2=>"alb","negru"=>45,9=>10),"s2"=>array("a"=>"r1")); echo("<br/>"); echo $c["t2"][2];echo" "; echo $c["s2"]["a"];

53

2.1.7 Operatori PHP

Operatori unari

SIMBOLUL FORMA Operaţia realizată Exemplu - -$a negarea lui $a -3 + +$a valoarea lui $a 3

++

$a++ Postincrementare: preia valoare, apoi creşte cu 1

$a=3++; $a are val. 3

++$a Preincrementare: mai întâi creşte cu 1, apoi preia valoarea

$a=++3; $a are val. 4

--

$a-- Postdecrementare: preia valoarea, apoi scade cu 1

$a=3--; $a are val. 3

--$a Predecrementare: mai întâi scade cu 1, apoi preia valoarea

$a=--3; $a are val. 2

Operatori binari aritmetici

SIMBOLUL FORMA Operaţia realizată Exemplu + $a+$b $a adunat cu $b 3.7+5.3 - $a-$b $b scăzut din $a 3.1-5.0 * $a*$b $a înmuţit cu $b 1.2*4.1 / $a/$b $a împărţit la $b 1.2/4.1

% $a%$b $a modulo $b (restul împărţirii)

5%4

Operatori de atribuire aritmetici

SIMBOLUL FORMA Operaţia realizată = $a=$b $a preia valoarea lui $b

+= $a+=$b $a=$a(fostul conţinut)+$b -= $a-=$b $a=$a-$b /= $a/=$b $a=$a/$b

%= $a%=$b $a=$a%$b Operatori relaţionali ( 0 este false, diferit de 0 este adevărat, ex:-0.0000007 este adevărat / are valoare de adevăr true)

54

SIMBOLUL FORMA Operaţia realizată

> $a>$b dacă $a>$b, atunci true, altfel false >= $a>=$b daca $a>=$b atunci true, altfel false < $a<$b daca $a<$b atunci true, altfel false

<= $a<=$b daca $a<=$b atunci true, altfel false == $a==$b dacă $a identic cu $b (pot sa nu fie de

acelasi tip de ex. 3=='3'este true), atunci true, altfel false

=== $a===$b dacă $a identic cu $b si sunt de acelasi tip de data, atunci true, altfel false

!= $a!=$b dacă $a diferă de $b, atunci true, altfel false (nu tine cont de tip)

<> $a<>$b dacă $a diferă de $b, atunci true, altfel false (nu tine cont de tip)

!== $a!=$b dacă $a diferă de $b, atunci true, altfel false (tine cont de tip)

Operatorii logici

SIMBOLUL FORMA Operaţia && $a&&$b ŞI/AND and $a and $b ŞI/AND

|| $a||$b SAU/OR or $a or $b SAU/OR ! !$a NEGAT/NOT

xor $a xor $b SAU exclusiv/XOR (T – true, F - false)

x y x&&y x||y !x x xor y F F F F T F F T F T T T T F F T F T T T T T F F

Numere aleatoare rand() este funcţia din PHP care generează automat numere aleatoare. Poate primi ca parametri limita minimă şi maximă a numerelor generate. Ex: <?php echo "numar generat aleator: ".rand()."<br>"; echo "numar generat aleator din intervalul 1-100: ".rand(1,100); ?>

55

Funcţia de rotunjire round() este funcţia de rotunjire şi poate primi ca parametru numărul de cifre zecimale după rotunjire Ex: <?php echo "12,34567 rotunjit este: ".round(12.34567)."<br>"; echo " 12,34567 rotunjit cu 2 zecimale este: ".round(12.34567,2); ?>

56

2.1.8 Instrucţiuni de decizie

Instrucţiunea if Sintaxa: if(<expresie>) instr1; [else instr2;] unde 'conditie' poate fi orice expresie logică. iar [ ...] semnifică faptul că este optional Ramura else este opţională.

La întâlnirea instrucţiunii if, se evaluează <expresie>. Dacă valoarea expresiei este true ( diferită de zero) se execută instrucţiunea 1; dacă valoarea expresiei este false (egală cu zero), se execută instrucţiunea 2. Se execută doar una dintre cele două instrucţiuni: fie instr1, fie instr2. După execuţia instrucţiunii if se trece la execuţia instrucţiunii care urmează acesteia. Instr1 şi Instr2 pot fi instrucţiuni compuse (blocuri), sau chiar alte instrucţiuni if (if-uri imbricate). Exemplu:

<?php $a=4; $b=3; echo "$a=4<br>"; echo "$b=3<br>"; if ($a>$b) { echo "$a>$b"; } ?>

sau <?php $a=2;

if (<expresie>)

TRUE FALSE

instr.1 instr.2

57

$b=9; echo "$a=2<br>"; echo "$b=9<br>"; if ($a>$b) { echo "$a>$b"; } else { echo "$a<$b"; } ?>

elseif este o combinaţie între if şi else. În cazul în care condiţia if nu este îndeplinită, se introduce elseif, care testează încă o condiţie. Dacă nu este îndeplinită a doua condiţie, se execută declaraţia introdusă prin else. if (conditia1) { instructiuni executate daca este indeplinita conditia 1; } elseif (conditia2) { instructiuni executate daca este indeplinita conditia 2; } else { instructiuni executate daca nu este indeplinita conditia 2; } Ex:

<?php $a=10; $b=15; if ($a<$b) { echo "$a<$b"; } elseif ($a==$b) { echo "$a==$b"; } else { echo "$a>$b"; } ?>

58

Instrucţiunea switch În unele cazuri este necesară o decizie multiplă specială. Instrucţiunea switch permite

acest lucru.

Dacă expresie=expresie_const_1

instrucţiune1; [ieşire;]

Dacă expresie=expresie_const_2 instrucţiune2; [ieşire;]

........................ Dacă expresie=expresie_const_n

instrucţiune_n; Altfel instrucţiune_m;

Se testează dacă valoarea pentru expresie este una dintre constantele specificate (expresie_const_1, expresie_const_2, etc.) şi se execută instrucţiunea de pe ramura corespunzătoare. În schema logică test_expresie este una din condiţiile: expresie=expresie_const_1, expresie=expresie_const_2, etc. Sintaxa: switch (<expresie>) { case expresie_const_1: instructiune_1;[break;] case expresie_const_2: instructiune_2;[break;] . . . . . . . . . . . . . . . . . . . . . . . case expresie_const_n: instructiune_n; [ default:instructiune_n; ] }

59

Este evaluată <expresie> (expresie aritmetică), iar valoarea ei este comparată cu valoarea expresiilor constante 1, 2, n, etc. (expresii constante = expresii care nu conţin variabile). Se execută instrucţiunea corespunzătoare acelei ramuri (instrucţiune_k), unde expresie_const_k este egală cu rezultatul evaluării expresiei <expresie>. Dacă se întâlneşte instrucţiunea break, parcurgerea este întreruptă şi se va ieşi din blocul dat de switch.

Dacă nu este întâlnită instrucţiunea break, se parcurge şi instrucţiunea următoare. În cazul în care valoarea expresiei nu este găsită printre valorile expresiilor constante,

se execută cazul marcat cu eticheta default (opţională). Expresiile expresie, expresie_const_1, expresie_const_2, etc., trebuie să fie întregi. În cazul în care sunt de alt tip, este necesară convertirea acestora la tipul întreg. Ex:

int a=3,b=4,luna; cin>>luna; switch(luna) { case 1:a++; break; case 2:{a--;b++;} break; case 3:{a--;b--;} case 4:a--; default:{a=0;b=0;} } pentru luna=1 obţinem a=4, b=4 pentru luna=2 obţinem a=2, b=5 pentru luna=3 obţinem a=1, b=3 pentru luna=4 obţinem a=2, b=4 pentru luna>4 obţinem a=0, b=0

60

2.1.9 Implementarea instrucţiunilor repetitive (ciclice)

Există două categorii de instrucţiuni ciclice: cu test iniţial şi cu test final. Implementarea structurilor ciclice cu test iniţial Structura ciclică cu test iniţial este implementată prin instrucţiunile for şi while. Instrucţiunea for

Limbajul C are o instrucţiune for deosebit de flexibilă. Instrucţiunea for implementează structura ciclică cu număr cunoscut de paşi evaluare expresie1 ATÂTA CÂT TIMP expresie2 este TRUE REPETĂ begin instrucţiune evaluare expresie3 end

Sintaxa:

for (expresie1; expresie2; expresie3) instructiune; Nu este obligatorie prezenţa expresiilor, ci doar a instrucţiunilor vide.

61

int i=0,a=0; for(;i<100;) {i++;a++;} Exemple: int i,j,m,n,a,b; for(i=0;i<n;i++) for(j=0;j<m;j++) {a+=i*j; if(i<j) b=a; else b=-a; } foreach este o constructie care functioneaza doar cu un vector generand erori cand sunt folosite variabile cu tipuri de date diferite sau variabile neinitializate. Sintaxa este: foreach ($vector as $cheie=>$valoare) { instructiuni de executat; } Instrucţiunea while Sintaxa:

while(<expresie>) instr1;

La întâlnirea acestei instrucţiuni, se evaluează expresie. Dacă aceasta are valoarea TRUE (diferită de ZERO), se execută instrucţiunea instr1. Se reevaluează din nou valoarea expresiei. Dacă ea este tot 1, se repetă instrucţiunea, etc. Astfel, instrucţiunea (corpul ciclului) se repetă atât timp cât <expresie> are valoarea de adevăr TRUE. În momentul în care <expresie> are valoarea de adevăr FALSE (sau egal cu ZERO), se iese din ciclu şi se trece la următoarea instrucţiune din afara buclei while. În cazul în care la prima evaluare a expresiei, aceasta are valoarea de adevăr FALSE, corpul instrucţiunii while nu va fi executat niciodată. Instr1 din corpul ciclului while poate fi o instrucţiune compusă (un bloc). Instrucţiunea/nile din corpul ciclului while trebuie să determine într-un mod oarecare valoarea expresiei, altfel va fi un „ciclu infinit”.

62

Implementarea structurilor ciclice cu test final Instrucţiunea do while Sintaxa:

do instr1; while(<expresie>) Se execută instrucţiunea instr1 sau blocul de instrucţiuni. Se evaluează apoi <expresie>. Dacă aceasta are valoarea TRUE, se execută din nou instr1, altfel se iese din buclă. Se testează din nou valoarea expresiei. Se repetă execuţia instrucţiunii instr1 atâta cât timp valoarea expresiei este TRUE. În cazul instrucţiunii do while, corpul ciclului se execută cel puţin o dată. Instrucţiunea break

Această instrucţiune forţează ieşirea din interiorul unei bucle, fără a se mai ţine seama de condiţia de menţinere în buclă. Instrucţiunile situate în corpul buclei după instrucţiunea break nu vor mai fi executate. tip_val_return nume_func (lista_declaraţiilor_param_ formali) {declaraţii_variabile_locale instrucţiuni return valoare/pointer

}

Intrucţiunea continue

Această instrucţiune duce la ignorarea instrucţiunilor din buclă, situate după aceasta, şi testarea din nou a expresiei de menţinere în buclă. În cazul buclelor for se realizează şi evaluarea celei de a treia expresii, responsabilă cu incrementarea contorilor.

Ex. ptr. Instr. for: calculul valorii unei integrale definite

#include <stdio.h> //f1 este un ex. De functie double f1(int x) { return x*x-5*x+2;} // functia ce intoarce val. integralei double integr(double a, double b, int n) { //pas – inaltimea unui trapez // sum suma partiala si cea finala

63

// a b sunt cele doua valori intre care se calc. integrala double q,sum,pas=(b-a)/(n*1.0); for(sum=0,q=a+pas;q<=b;q+=pas) sum+=(f1(q)+f1(q-pas))*pas/2.0; return sum; } int main() { double h=integr(2,8,10000); printf("Integrala: %f\n",h); return 0; }

include şi require sunt două funcţii asemănătoare, folosite pentru includerea în paginile PHP a unor fişiere externe. Diferenţa între cele două funcţii constă în faptul că, dacă include dă greş, scriptul generează o avertizare, dar funcţionează în continuare, în timp ce la require se termină executarea scriptului. include "fisier1.php";

require "fisier2.html";

64

2.1.10 Prelucrarea datelor din formularele HTML

Eticheta form din HTML are atributele action şi method, iar fiecare câmp din formular avea un name sau/şi un id.

action indică fişierul care prelucrează datele introduse în formular atunci când este apăsat butonul Trimite. method indică modul în care datele sunt trimise spre prelucrare pe server, şi poate avea valorile: POST - când datele trimise nu sunt vizibile utilizatorului, şi GET - când datele sunt adăugate la adresa URL. Metoda POST permite trimiterea unei cantităţi mai mari de date decât metoda GET. name este un atribut care identifică datele introduse în fiecare câmp al formularului. Să presupunem că într-un formular avem un câmp cu name = "nume" şi method = "POST". Fişierul indicat de action va prelua datele introduse în câmpul "nume" astfel: $_POST["nume"]; Ex: formular cu un câmp şi scriptul php de preluare a datelor

<form action="t1.php" method="POST"> Nume: <input type="text" name="nume"><br> <input type="submit" value="Trimite"> </form> /* urmeaza fisierul t1.php */ <?php $nume=$_POST["nume"]; echo $nume; ?>

Verificarea datelor introduse in formular

Pentru a fi siguri că utilizatorul a completat câmpurile, trebuie să adăugam scriptului partea de verificare. Ex: folosim acelaşi formular, dar adăugam partea de verificare

<?php $nume=$_POST["nume"]; if ($nume=="") { echo "Campul nume nu este completat"; } else { echo $nume; } ?>

65

Partea de verificare poate avea mai multe condiţii simultane. Ex: acelaşi formular, dar partea de verificare are două condiţii legate prin operatorul || (OR)

<?php $nume=$_POST["nume"]; if (($nume=="") || (strlen($nume)<2)) { echo "Campul nume nu este completat corect"; } else { echo $nume; } ?>

Folosind modelele anterioare se pot prelua date şi face verificarea pentru toate câmpurile formularului. Ex: fisierul fx1.html

<html> <form action="fx1.php" method="post"> Nume: <input type="text" name="e_nume" /> <br/> Varsta: <input type="text" name="e_varsta" /> <br/> Inaltime: <input type="text" name="e_inaltime" /> <br/> <input type="submit" name="b_trimite" value="Trimite date" /> </form> </html>

fisierul fx1.php

<?php $nume=$_POST['e_nume']; $varsta=$_POST['e_varsta']; $inaltime=$_POST['e_inaltime']; echo "<table border='1'> <tr><td>DATE</td> <td>VALORI</td></tr> <tr><td>Nume</td><td>$nume</td></tr> <tr><td>Inaltime</td><td>$inaltime</td></tr> <tr><td>Varsta</td><td>$varsta</td></tr> </table>"; ?>

66

2.1.11 Funcţii în PHP

Funcţia este o secvenţă de cod ce poate fi utilizată de mai multe ori în interiorul scripturilor şi este prezentată în script prin declaraţia ei.

Funcţia apelată va conţine acelaşi numar de argumente ca în declaraţie.

function f1($arg_1,$arg_2, $arg_n) { echo "Ex.\n"; return $val; }

unde: f1 este numele funcţiei $arg_1, $arg_2, ... , $arg_n sunt argumentele funcţiei $val este valoarea returnată de funcţie Ex: construim o funcţie care adună valorile a două variabile

<?php function adunare($a,$b) { $suma=$a+$b; return $suma; } $rezultat=adunare(10,5); echo $rezultat; ?>

Ex: o funcţie care generează un tabel HTML

<?php function tabel($lin) { echo "<table border=\"1\">\n"; for ($i=0; $i<$lin; $i++) { echo "<tr><td>randul ".$i."</td></tr>\n"; } echo "</table>"; } tabel(10); //tabel cu 10 randuri ?>

În PHP, funcţiile pot fi definite de către utilizator folosind următoarea sintaxă:

function numef ($param1, $param2, ..., $paramN) { // instructiuni }

În PHP, o funcţie poate fi definită oriunde în cadrul script-ului iar în interiorul unei funcţii poate să apară orice secvenţă validă de cod, care include definirea de alte funcţii şi definiţii

67

de clase. Argumentele unei funcţii trebuie separate prin virgulă, şi, implicit, acestea sunt transmise prin valoare. Pentru ca funcţia să returneze un rezultat se foloseşte construcţia return, care primeşte ca parametru o expresie care reprezintă valoarea funcţiei. În momentul în care este întâlnită construcţia return, execuţia funcţiei se încheie. Transmiterea parametrilor prin referinţă Pentru a transmite parametri unei funcţii prin referinţă, fapt care implică modificarea valorii parametrilor şi păstrarea noii valori după ce execuţia funcţiei s-a încheiat, se foloseşte operatorul '&' înaintea numelui parametrului formal, în momentul definirii funcţiei. Ex:

<?php function p_valoare($a) { $a = 1; } function p_referinta(&$a) { $a = 1; } $b = 0; p_valoare($b); echo "<br /> \$b = $b"; $b = 0; p_valoare(&$b); echo "<br /> \$b = $b"; $b = 0; p_referinta($b); echo "<br /> \$b = $b"; ?>

Rezultat: $b = 0 $b = 1 $b = 1

Parametri cu valori implicite În PH, parametrii formali pot avea valori implicite şi, în cazul în care parametrul actual lipseşte, atunci se va considera că are valoarea implicită.

68

Ex: <?php function inceput($s='abc') { return "Sirul este ".$s."."; } echo inceput(); echo "<br>"; echo inceput("xyz"); ?>

Rezultat: Sirul este abc. Sirul este xyz

În cazul în care se folosesc parametri cu valori implicite este necesar ca orice parametru care are o valoare implicită să se afle în partea dreaptă a tuturor parametrilor pentru care nu se folosesc valori implicite, în caz contrar interpretorul PHP nu poate să decidă cărui parametru să-i atribuie valoarea de pe o anumită poziţie din lista de parametri Valorile returnate de funcţii

Rezultatul obţinut după apelarea unei funcţii poate avea orice tip. O funcţie poate să returneze chiar şi liste sau obiecte. În PHP există un caz special de rezultat numit referinţă.

Pentru ca o funcţie să poată returna o referinţă, aceasta trebuie declarată folosindu-se operatorul '&' înaintea numelui funcţiei. Acest operator trebuie să apară înaintea numelui funcţiei şi în momentul când o variabilă primeşte ca valoare referinţa rezultată din apelul funcţiei. În exemplul următor, se defineşte o funcţie al cărui rezultat îl constituie o referinţă: Ex:

<?php function &refer() { global $s; return $s; } $s = "Acesta este continutul variabilei referite cu ajutorul functiei."; $z = &refer(); echo $z; ?>

Rezultat:

Acesta este continutul variabilei referite cu ajutorul functiei.

69

Lucrul cu şiruri PHP conţine zeci de funcţii care lucrează cu şiruri. Această secţiune descrie doar câteva funcţii, mai frecvent utilizate. Aceste funcţii permit obţinerea lungimii unui şir, eliminarea dintr-un şir a caracterelor de tip spatiu alb, conversia caracterelor unui şir în majuscule sau minuscule, şi altele. <?php $s = " Acesta este un sir "; $n = strlen($s); echo "<br /> Lungimea sirului este: $n"; $trim =chop($s); // Elimina spatiile albe din partea dreapta a sirului $n = strlen($trim); echo "<br /> Lungimea sirului este: $n"; $trim = ltrim($s); // Elimina spatiile albe din partea stanga a sirului $n = strlen($trim); echo "<br /> Lungimea sirului este: $n"; $trim = rtrim($s); // Elimina spatiile albe din partea dreapta a sirului $n = strlen($trim); echo "<br /> Lungimea sirului este: $n"; $trim = trim($s); // Elimina spatiile albe din ambele parti a sirului $n = strlen($trim); echo "<br /> Lungimea sirului este: $n"; ?> PHP furnizează patru funcţii care sunt deosebit de utile pentru compararea şirurilor. Fiecare funcţie returnează o valoare al cărei semn determină rezultatul comparaţiei; nu trebuie să încercaţi să interpretaţi valoarea returnată, ci numai semnul ei. <?php $s1 = "abcd"; $s2 = "ABCE"; $rezultat = strcasecmp($s1, $s2); echo "<br /> Functia strcasecmp a returnat $rezultat"; $rezultat = strcmp($s1, $s2); echo "<br /> Functia strcmp a returnat $rezultat"; $rezultat = strncasecmp($s1, $s2, 3); echo "<br /> Functia strncasecmp returnat $rezultat"; $rezultat = strncmp($s1, $s2, 3); echo "<br /> Functia strncmp a returnat $rezultat"; ?>

Datele de ieşire arată că funcţia strcasecmp() a identificat şirul "abcd" ca fiind mai mic decât "ABCE", în schimb, funcţia strcmp(), ca de altfel şi functia strncmp(), a identificat şirul "abcd" ca fiind mai mare decât "ABCE". Aceasta s-a întâmplat deoarece literele

70

minuscule au în secventa ASCII o poziţie superioară literelor; litera 'A' are valoarea ASCII 65, iar litera 'a' are valoarea ASCII 97.

De asemenea, datele de ieşire arată că funcţia strncasecmp() a identificat şirul "s1" ca egal cu "s2", deoarece au fost luate în considerare numai primele 3 caractere.

PHP include numeroase funcţii care găsesc şi extrag părţi dintr-un şir. De exemplu, functia strchr(s1,s2) ce returnează toate şirurile 's1' de la prima apariţie a şirului 's2' şi până la sfârsit. Dacă 's1' nu este găsit, funcţia returnează FALSE. Funcţia strstr() execută aceeaşi operaţie.

O operaţie frecvent folosită în programare constă în găsirea unui sub-şir si înlocuirea sa cu o valoare nouă. PHP are două funcţii deosebit de utile pentru asemenea operaţii, şi anume str_replace() şi substr_replace(). str_replace (cauta, inlocuire, subiect) - Se caută în şirul 'subiect' sub-şirul 'cauta'; dacă sub-şirul este găsit, returnează valoarea 'subiect', înlocuindu-se prima apariţie a şirului 'cauta' cu 'inlocuire'. substr_replace(subiect, inlocuire, start, lungime) - Returnează valoarea 'subiect', înlocuind sub-sirul care începe de la 'start' şi având lungimea 'lungime' cu şirul 'inlocuire'.

71

2.1.12 Sesiuni PHP

Sesiunea reprezintă o modalitate prin care PHP reţine informaţii de la o pagina la alta.

Odată cu iniţializarea unei sesiuni, utilizatorul poate păstra anumite variabile, chiar dacă vizitează în continuare şi alte pagini ale site-ului. În principiu, informaţia se pastrează până la închiderea browser-ului, sau până când utilizatorul distruge în mod intenţionat sesiunea curentă.

Lucrurile se desfaşoară în felul următor: în momentul în care un user s-a logat la site, PHP atribuie acestuia un identificator unic de sesiune : SID. Acest SID este înglobat într-un coockie cu numele PHPSESSID şi trimis apoi către browserul utilizatorului. Dacă browserul nu suportă cookie-uri, sau acestea sunt dezactivate, atunci acest SID este adăugat la adresa URL. În acelaşi timp, se creează pe server un fişier cu numele SID. În continuare, dacă utilizatorul doreşte să stocheze anumite informaţii, acestea vor fi practic scrise în acest fişier SID de pe server.

Sesiunile au urmatoarele avantaje:

- Pot fi folosite chiar dacă browserul utilizatorului nu suportă cookie-uri, sau dacă acestea sunt dezactivate.

- Permit stocarea unui volum mare de informaţii, spre deosebire de cookie-uri, care sunt limitate în această privinţă.

- Sunt mai sigure în raport cu cookie-urile, deoarece informaţiile nu sunt transmise în mod repetat între client şi server.

Iniţializarea unei sesiuni se face cu funcţia : session_start()

Aceasta trebuie să fie printre primele linii de cod dintr-un script PHP, deoarece apelul acestei funcţii trebuie facut înaintea trimiterii către browser-ul Web a vreunui cod HTML, sau chiar a unui spaţiu vid.

Dacă folosim stocarea ieşirii în buffer, instrucţiunea session_start() nu trebuie inserată neaparat la începutul codului.

Instructiunea session_start() nu este necesară dacă în fişierul de configurare "php.ini", variabila "session.auto_start" are valoarea TRUE. Ex:

<?php echo "<br /> Identificatorul sesiunii curente SID este:". session_id(); // Initializeaza datele sesiunii session_id('124abc'); session_start(); echo "<br /> Identificatorul sesiunii curente SID = ". session_id(); // Sterge tabloul $_SESSION unset($_SESSION); // Sterge datele de sesiune din server session_destroy(); echo "<br /> Sesiunea curenta a fost inchisa"; ?>

72

Ex: <?php error_reporting(E_ALL);ini_set('display_errors', '1'); session_id('119abc'); echo "<br /> Identificatorul sesiunii curente SID este:". session_id(); session_id('120abc'); $a='8'; $y='TEST1'; session_start(); $_SESSION['a'] = $y; $x=$_SESSION['a']; echo "<br/>a=$a<br/>"; echo "<br/>a=$x<br/>"; echo "<br /> Identificatorul noii sesiunii SID = ". session_id(); ?>

73

2.2 Conexiunea cu bazele de date (conexiunea cu PostgreSQL)

Conexiunea cu PostgreSQL se poate realiza prin funcţiile din bibliotecile PHP. Citirea datelor dintr-un form HTML şi introducerea acestora într-un tabel. Generarea tabelului HTML cu php-ul Pentru aceasta, se lansează un bloc de instrucţiuni SQL pentru crearea acestui tabel în PostgreSQL create schema c13; CREATE TABLE c13.t1(a serial PRIMARY KEY, b varchar(30), c int); –- adauga cateva valori in tabel INSERT INTO c13.t1(b,c) VALUES('A1',10),('A2',11),('A3',13); Construim un form HTML //fisier ibd1.html <html> <form action="ibd1.php" method="post"> B(text): <input type="text" name="e_b" /> <br/> C(nr): <input type="text" name="e_c" /> <br/> <input type="submit" name="b_adauga" value="Adauga" /> </form> </html> Acesta va afişa:

74

//fisier ibd1.php <?php error_reporting(E_ALL);ini_set('display_errors', '1'); //header('Content-type:text/javascript;charset=UTF-8'); function conexiune($host,$port,$dbname,$user,$password) { //pg_connect - functie php ptr. conectarea la BD $conexiune1 = pg_connect ("host=$host port=$port dbname=$dbname user=$user password=$password") or die("Nu se poate conecta: " . pgsql_last_error()); // pgsql_last_error() intoarce descrierea erorii, de la serverul PostgreSQL, //aceasta este concatenata cu sirul din fata prin operatorul '.' return $conexiune1; } $cda_sql="select * from c13.t1"; //realizare conexiune $conexiuneR1 = conexiune ('localhost','5435','postgres','postgres','abcd'); //adaugare $b=$_POST['e_b'];$c=$_POST['e_c']; pg_query($conexiuneR1,"INSERT INTO c13.t1(b,c)VALUES('".$b."',".$c.");"); //citire tabel $rezultat = pg_query($conexiuneR1,$cda_sql); $nr_inregistrari=pg_num_rows($rezultat); $nr_campuri=pg_num_fields($rezultat); echo "Nr.inregistrari: $nr_inregistrari<br/>"; $c1= pg_field_name($rezultat,0); $c2= pg_field_name($rezultat,1); $c3= pg_field_name($rezultat,2); echo "Campurile: $c1 $c2 $c3<br/>"; $date_matrice = pg_fetch_all($rezultat); echo $date_matrice[1]["b"];//al doilea rand, campul b; echo" <table border='1'>"; echo"<tr>"; for($i=0;$i<$nr_campuri;$i++) echo "<td>".pg_field_name($rezultat,$i)."</td>"; echo"</tr>"; for($i=0;$i<$nr_inregistrari;$i++) { echo "<tr>"; for($j=0;$j<$nr_campuri;$j++) echo "<td>".$date_matrice[$i][pg_field_name($rezultat,$j)]."</td>"; echo "</tr>"; } echo"</table>" //echo "conexiune realizata"; ?>

75

După apăsarea butonului “adauga” se va afişa:

Realizarea unor interogări a unei baze de date printr-un form HTML cu selecţii Utilizăm baza de date implicită postgres. În cadrul acesteia creăm schema “biblioteca”. CREATE SCHEMA biblioteca; CREATE TABLE biblioteca.bibl ( cota character varying(20) NOT NULL, autori character varying(200) NOT NULL, titlu_o character varying(200), tip_doc character varying(150), limba character varying(150), domeniu character varying(50), an_apar integer, editura character varying(20), loc_edit character varying(20), nr_pag integer, nr_vol integer, rezumat character varying(250), imprumutat character varying(50) ); INSERT INTO biblioteca.bibl( cota, autori, titlu_o, limba, domeniu, an_apar, editura ) VALUES ('001', 'Auror1', 'Titlu1', 'ro', 'Domeniu1', 1987, 'Editura1'); Aplicaţia o putem realiza utilizând facilităţile oferite de un framework simplu. În continuare este utilizat sigmagrid-ul http://www.sigmawidgets.com

76

Fişierul index.html va cuprinde: <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="-1" /> <meta http-equiv="Cache-Control" content="no-cache" /> <TITLE> LIBRARY - vers. beta 01 - recomandated browser: google chrome </TITLE> </HEAD> <FRAMESET ROWS="40,*,30" FRAMEBORDER="0" value='start2' framespacing="0" border=0> <FRAME SRC="bibl-menu.html" NAME="menu" scrolling="no" noresize> <FRAME SRC="bibl-home.html" NAME="princ"> <FRAME SRC="bibl-subsol.html" NAME="subsol" scrolling="no" noresize> </FRAMESET> </HTML> Fişierul bibl-home.html va cuprinde pagina de start <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>bibl-home</title> <meta name="generator" content="Amaya, see http://www.w3.org/Amaya/" /> </head> <body> <p style="text-align:center;margin-left:auto;margin-right:auto;"><span style="font_string, font-family: Courier New,Courier,monospace; font-size: 32pt;color:#004080">BIBLIOTECA <br/>v.test </span> </p> <hr /> <hr /> </body> </html> Fişierul ce gestionează meniul va avea forma:

77

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="-1" /> <meta http-equiv="Cache-Control" content="no-cache" /> <title>LIBRARY</title> <link rel="stylesheet" href="menu/styles.css" type="text/css" /> <script type="text/javascript"> obx={}; //variabila de transfer obx.c1="un test"; obx.achQ__="start2"; function selmenu(fereastra) { switch(fereastra) {case 'home':parent.frames[1].location="bibl-home.html";break; case 'rap':parent.frames[1].location="bibl-rap.html";break; } } var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1; var is_mozilla = navigator.userAgent.toLowerCase().indexOf('mozilla') > -1; if(!is_chrome && !is_mozilla) alert("Recomanded browser for this application : Google Chrome or Mozilla"); </script> </head> <body> <div id="styleone"> <ul> <li><a href="" onClick="javascript:selmenu('home');">HOME</a></li> <li><a href="" onClick="javascript:selmenu('rap');">REPORTS ...</a></li> </ul> </div> </body> </html> Fişierul ce cuprinde datele de căutare şi raportul va avea forma: <HTML> <HEAD> </HEAD> <FRAMESET ROWS="90,*" FRAMEBORDER="0" framespacing="0" border=0> <FRAME SRC="bibl-rap-sel.html" NAME="bibl_sel" scrolling="no" marginheight="0" > </FRAME> <FRAME SRC="bibl-rap-grid.html" NAME="bibl_grid" marginheight="0" > </FRAME> </FRAMESET> </HTML>

78

Fişierul responsabil cu grid-ul de afişare bibl-rap-grid.html:

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="-1" /> <meta http-equiv="Cache-Control" content="no-cache" /> <title>LIBRARY GRID REPORTS</title> <link rel="stylesheet" type="text/css" href="grid/gt_grid.css" /> <script type="text/javascript" src="grid/gt_const.js"></script> <script type="text/javascript" src="grid/gt_msg_en.js"></script> <script type="text/javascript" src="grid/gt_grid_all.js"></script> <script type="text/javascript" src="bibl-rap.js"></script> <script type="text/javascript" > //alert("in grid"); try{ var z = parent.parent.frames[0].obx.achQ__; // alert(z); if( z != 'start2') sgrid2(z); } catch (e) {alert("Nedefinit....M");} </script> </head> <body> <!-- grid container. --> <div id="grid1_container" style=""> </div> </body> </html> Fişierul responsabil cu secţiunea de preluare a datelor selectate şi de construcţie a interogării bibl-rap-sel.html va avea forma:

79

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="-1" /> <meta http-equiv="Cache-Control" content="no-cache" /> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>LIBRARY - BOOK SEARCH</title> <script type="text/javascript"> //----------------------------------------------------------------------- function query1() { if(form_bibl_sel.ick_title.checked && form_bibl_sel.i_title.value == '') {alert("Missing value for selection : title!");return;} if(form_bibl_sel.ick_authors.checked && form_bibl_sel.i_authors.value == '') {alert("Missing value for selection : author!");return;} if(form_bibl_sel.ick_ph.checked && form_bibl_sel.i_ph.value == '') {alert("Missing value for selection : Publish house!");return;} if(form_bibl_sel.ick_year.checked && form_bibl_sel.i_year1.value == '') {alert("Missing value for selection : From year!");return;} if(form_bibl_sel.ick_year.checked && form_bibl_sel.i_year2.value == '') {alert("Missing value for selection : to year!");return;} var achQ="",a1_title="",a1_authors="",a1_ph="",a1_year=""; var achCol,achSel; achCol="bibl.cota,bibl.titlu_o,bibl.autori,bibl.editura,bibl.an_apar,bibl.nr_vol,CASE WHEN imprumutat is not null THEN 1 ELSE 0 END as impr "; if(form_bibl_sel.ick_title.checked) a1_title= "AND(titlu_o ILIKE '%"+form_bibl_sel.i_title.value+"%')"; if(form_bibl_sel.ick_authors.checked) a1_authors= "AND(autori ILIKE '%"+form_bibl_sel.i_authors.value+"%')"; if(form_bibl_sel.ick_ph.checked) a1_ph= "AND(editura ILIKE '%"+form_bibl_sel.i_ph.value+"%')"; if(form_bibl_sel.ick_year.checked) a1_year= "AND(an_apar >="+form_bibl_sel.i_year1.value+")AND(an_apar<="+form_bibl_sel.i_year2.value+")"; achSel="WHERE cota IS NOT NULL "+a1_title+a1_authors+a1_ph+a1_year+""; achQ="SELECT DISTINCT "+achCol+" FROM biblioteca.bibl "+achSel+""; //nu se pune ; deoarece urmeaza concatenarea(offset, limit) //alert(achQ); parent.parent.frames[0].obx.achQ__=achQ; // alert(v.innerText); //var x=document.getElementById("form_placi_sel"); //prel_placi_sel(x); //alert("procesare query2 incheiata"); parent.frames[1].location.reload(); } //---------------------------------------------------------------------------------------------------------------------------------------- function fields_help() {

80

alert("un help"); } //----------------------------------------------------------------------------------------------------------------------------------------------- //CONTROL EVENIMENTE window.onload=setup; function setup(evnt) { var evtObject = document.getElementById("bq1"); if (evtObject.addEventListener) { evtObject.addEventListener("click",query1,false); } else if (evtObject.attachEvent) { evtObject.attachEvent("onclick", query1); } else if (evtObject.onclick) { evtObject.onclick=query1; } } //----------------------------------------------------------------------------------------------------------------------------------------------- </script> </head> <body> <form action="" style="background-color:#e8e8e8" id='form_bibl_sel'> <table border="0"><tr> <td style="VALIGN: middle; text-align:center;margin-left:auto;margin-right:auto;"><button style="FONT-SIZE: 14pt" id="bq1" > Query </button> </td> <td><table> <tr> <td > <label><u>Title</u></label> </td> <td> <input type="text" id='i_title' value="" size="50"/> </td> <td style="text-align:center;margin-left:auto;margin-right:auto;"> <input type="checkbox" value="" size="8" id='ick_title'/> </td> </tr> <tr> <td > <label><u>Authors</u></label> </td> <td> <input type="text" id='i_authors' value="" size="50"/> </td> <td style="text-align:center;margin-left:auto;margin-right:auto;"> <input type="checkbox" value="" size="8" id='ick_authors'/> </td> </tr> </table></td> <td style="padding-left:30px"><table> <tr><td><table><tr> <td > <label><u>Publishing house</u></label> </td> <td> <input type="text" id='i_ph' value="" size="10"/> </td> <td style="text-align:center;margin-left:auto;margin-right:auto;"> <input type="checkbox" value="" size="8" id='ick_ph'/> </td> </tr></table></td></tr> <tr><table><tr> <td > <label><u>Year: from </u></label> </td>

81

<td> <input type="text" id='i_year1' value="" size="3"/> </td> <td > <label><u> to:</u></label> </td> <td> <input type="text" id='i_year2' value="" size="3"/> </td> <td style="text-align:center;margin-left:auto;margin-right:auto;"> <input type="checkbox" value="" size="8" id='ick_year'/> </td> </tr></table></tr> </table></td> </tr></table> </form> </body> </html>

Fişierul responsabil pentru transmiterea datelor către server va avea forma bibl-rap.js: function afisImpr(value ,record,columnObj,grid,colNo,rowNo) { if(value==0) return "<img src='grid/div/unchecked.gif'>"; return "<img src='grid/div/checked.gif'>"; } function setare_grid_(gridOption,achQ1) {//stabileste ce campuri vor fi afisate //0 - dsOption, 1 - colsOption, 2 - gridOption var dsOption= { fields :[ {name : "cota",type: 'string'}, {name : "titlu_o",type: 'string'}, {name : "autori",type: 'string'}, {name : "editura",type: 'string'}, {name : "an_apar",type: 'numeric'}, {name : "nr_vol",type: 'numeric'}, {name : "impr",type: 'int'} ], recordType : 'object' }; var colsOption = [ {id: 'cota' , header: "Code" , width :60, fieldName: 'cota' }, {id: 'titlu_o' , header: "Title" , width :250, fieldName: 'titlu_o'},

82

{id: 'autori' , header: "Authors" , width :200, fieldName: 'autori' }, {id: 'editura' , header: "Publishing house" , width :10, fieldName: 'editura'}, {id: 'an_apar' , header: "Year" , width :50, fieldName: 'an_apar' }, {id: 'nr_vol' , header: "Volum No" , width :50, fieldName: 'nr_vol' }, {id: 'impr' , header: "Borow." , width :60, renderer: afisImpr } ]; gridOption[0]={ id : "grid1", loadURL : "bibl-rap.php", saveURL :"", container : 'grid1_container', dataset : dsOption , columns : colsOption, pageSize:20, pageSizeList :[5,10,20,50,100], exportFileName : 'test_export_doc', parameters:{achQ_x:achQ1},//transmite textul interogarii toolbarContent : 'nav goto | pagesize | reload | print filter | state' }; } function sgrid2(achQ1) {//incarca tabelul var gridOption=new Array(); setare_grid_(gridOption,achQ1); var mygrid=new Sigma.Grid(gridOption[0]); Sigma.Util.onLoad( Sigma.Grid.render(mygrid) ); } Fisierul ptr. Nota de subsol bibl-subsol.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" --> <html> <head> <script type="text/javascript"> </script> </head> <body style="text-align:center;margin-left:auto;margin-right:auto;background-color:#c0c0c0;color:#004080;font_string, font-family: Courier New,Courier,monospace; font-size: 14pt"> TEST BIBLIOTECA </body> </html>

83

Fişierul php pentru conexiunea cu serverul de baze de date va avea forma bibl-rap.php <?php error_reporting(E_ALL);ini_set('display_errors', '1'); header('Content-type:text/javascript;charset=UTF-8'); //header('WWW-Authenticate: Basic realm=Private'); //header('HTTP/1.0 401 Unauthorized'); //exit; //print_r($variable) ; function conexiune($host,$port,$dbname,$user,$password) {$db_conn = pg_connect ("host=$host port=$port dbname=$dbname user=$user password=$password") or die("Could not connect: " . pgsql_last_error()); return $db_conn; } function sel($db_conn) { $json=json_decode(stripslashes($_POST["_gt_json"])); $pageNo = $json->{'pageInfo'}->{'pageNum'}; //$pageSize = 5;//10 rows per page $pageSize = $json->{'pageInfo'}->{'pageSize'}; $sql = $json->{'parameters'}->{'achQ_x'}; $result = pg_query($db_conn,$sql); $totalRec=pg_num_rows($result); if($pageNo<1||$pageNo>ceil(($totalRec/$pageSize))) { $pageNo = 1;} $sql_ = $sql." OFFSET " . ($pageNo - 1)*$pageSize . " LIMIT " . $pageSize; $result = pg_query($sql_); if (!$result) { echo "Interogare eronata!\n"; exit;} //if($pageNo>1) echo "RRR: $result"; $retArray = pg_fetch_all ($result); $data = json_encode($retArray); $ret = "{data:" . $data .",\n"; $ret .= "pageInfo:{totalRowNum:" . $totalRec . "},\n"; $ret .= "recordType : 'object'}"; return $ret; }

84

//----------------------------------------------------------------- //$db_conn = conexiune ($GLOBALS['host_'],'5432','bibl',GLOBALS['user_'],GLOBALS['pw_']); $db_conn = conexiune ('localhost','5435','postgres','postgres','abcd'); $ret=sel($db_conn); //------------------------------------------------------------------ echo $ret; ?>

85

2.3 Transferul datelor pe sesrver prin JSONRPC Acesta permite transferul datelor în format JSON, folosind atât mecanisme de comunicaţie sincronă cât şi mecanisme de comunicaţie asincronă. Fişierul jevi_server.php <?php require_once 'jsonRPCServer.php'; require 'jevi_clase.php'; $x = new jevi_clase(); jsonRPCServer::handle($x) or print 'nici o cerere'; ?> Fişierul jevi_clase.php <?php /** * Interfata WEB postgreSQL * @author liviu <[email protected]> */ error_reporting(E_ALL);ini_set('display_errors', '1'); header('Content-type:text/javascript;charset=UTF-8'); ------------------------------------------------------------------------ function conexiune($host,$port,$dbname,$user,$password) {$db_conn=null; $db_conn = pg_connect("host=$host port=$port dbname=$dbname user=$user password=$password") or die("Conectare esuata: " . pgsql_last_error()); return $db_conn; } //----------------------------------------------------------------------- //nr de inreg function recCount($db_conn,$pageNo,$pageSize,$cda_sql) {$result = pg_query($db_conn,$cda_sql); //nr. toatal de inreg. in vederea realizarii paginatiei $totalRec=pg_num_rows($result); return $totalRec; } //----------------------------------------------------------------------- //functia de interogare function sel($db_conn,$pageNo,$pageSize,$cda_sql)

86

{$retArray=array(); $ax=array(); if($pageSize>0) {$totalRec=recCount($db_conn,$pageNo,$pageSize,$cda_sql); //$ax[0]=$totalRec; if($totalRec<1) return null; if($totalRec<$pageSize) $nrInreg=$totalRec; else $nrInreg=$pageSize; if($pageNo<1||$pageNo>ceil(($totalRec/$pageSize))) { $pageNo = 1;} // refacerea interogarii doar pentru pagina solicitata de client prin daugarea comenzilor SQL OFFSET (nr. primei linii din cadrul // rezultatului selectat) si LIMIT (nr. max de inreg ce poate fi transmis catre client) $sql_ = $cda_sql." OFFSET " . ($pageNo - 1)*$pageSize . " LIMIT " . $pageSize; } else $sql_ = $cda_sql; //executie interogare finala $result = pg_query($sql_); $eroare=array(); if(!$result) {$eroare[0]=pg_last_error($db_conn); return $eroare;} $nrCampuri=pg_num_fields($result); //if (!$result) { return null;} //preluarea intr-un array a datelor din resursa cu rezultatul for($i=0;$i<$nrInreg;$i++) for($j=0;$j<$nrCampuri;$j++) $ax[$i][$j]=pg_fetch_result($result, $i, $j); return $ax; } //----------------------------------------------------------------- //NOTA: 1. Nu se pot executa apeluri imbricate ale fct. din clasa serviciu // 2. NU se pot transmite param array initializati prin =>------------------------------------------------------------------ class jevi_clase{ //------------------------------------------------------------------ //test comunicatie server php public function testphp($p) {$c=array(); $c[0]=$p[0]+$p["unu"]; $c["minus"]=$p[0]-$p["unu"]; return $c; } //------------------------------------------------------------------- function conexiune2($host,$port,$dbname,$user,$password) {$db_conn=null; $db_conn = conexiune($host,$port,$dbname,$user,$password); return $db_conn; } //--------------------------------------------------------------------- //select

87

public function selectie($par) {$arr=array(); $arr[0]=55; $db_conn=null; $db_conn=conexiune($par["host"],$par["port"],$par["dbname"],$par["user"],$par["password"]); if(!db_conn) return null; $arr[0]=$par["port"]; $arr=sel($db_conn,$par["pageNo"],$par["pageSize"],$par["cda_sql"]); return $arr; } //---------------------------------------------------------------- //intoarce nr. de inreg. afectate: insert,update,delete public function comanda($host,$port,$dbname,$user,$password,$cda_sql) { $db_conn=null; $db_conn=conexiune($host,$port,$dbname,$user,$password); if(!db_conn) return null; $result = pg_query($sql_); if (!$result) { return null;} $cmdtuples = pg_affected_rows($result); return $cmdtuples; } } ?> Fişierul jevi_client.php --- exemplu <?php error_reporting(E_ALL);ini_set('display_errors', '1'); require_once 'jsonRPCClient.php'; $myExample = new jsonRPCClient('http://localhost:8080/teste_php/jevi_server.php'); echo '<b>Testare comunicatie server</b><br />'."\n"; try {$c=array(); $p=array(); $p[0]=8; $p["unu"]=6; $c=$myExample->testphp($p); echo 'A+B= <i>'.$c[0].'</i> '." --- ";echo 'A-B= <i>'.$c["minus"].'</i><br />'."\n"; } catch (Exception $e) { echo nl2br($e->getMessage()).'<br />'."\n"; } echo '<br /><b>Test conexiune baza de date</b><br />'."\n"; try {$par=array();$arr = array(); $par["host"]="localhost"; $par["port"]="5435";$par["dbname"]="...........";$par["user"]="postgres"; $par["password"]="abcd";$par["pageNo"]="1";$par["pageSize"]="0";

88

$par["cda_sql"]="select zacamant, data, ph,true as bifa from vest.hidro "; //fara ; si cu pauza // $par["cda_sql"]="update a1.hidro set nd=876 where nd=55 "; $arr=$myExample->selectie($par); echo $arr[0]; } catch (Exception $e) { echo nl2br($e->getMessage()); } ?>

89

3 BIBLIOGRAFIE

3.1 Anghel, T., Dezvoltarea aplicaţiilor WEB folosind XHTML, PHP ŞI MySQL, Ed. Polirom, Iaşi, 2005

3.2 Pîrnău, M., Tehnologii Web, Editura Renaissance, Bucureşti, 2010 3.3 Diaconu, D.E., Morărescu, C., JavaScript prin exemple, Editura Printech,

Bucureşti, 2007 3.4 Anghel, O. A., Anghel, L., Tehnologii XML – XML în Java, Ed. Albastră, Cluj-

Naspoca, 2007 3.5 Welling, C., Thomson, L., Dezvoltarea aplicaţiilor Web cu PHP şi MySQL,

Editura Teora, Bucureşti, 2004

http://www.w3.org/MarkUp/Guide/ http://www.w3.org/MarkUp/ http://archive.ncsa.illinois.edu/primer.html http://www.case.edu/its/its404/ http://www.dmoz.org/Computers/Programming/Languages/JavaScript/ http://www.webreference.com/ http://prototypejs.org/learn/json

90