Sunteți pe pagina 1din 138

1 CUPRINS PARTEA A III-A PROGRAMARE WEB..........................................................................3 CAP. 1 LIMBAJUL HTML.................................................................................................4 CREAREA UNEI PAGINI HTML SIMPLE................................................................................

4 INTRODUCEREA TEXTELOR I FORMATAREA ACESTORA.....................................................5 UTILIZAREA LISTELOR I TABELELOR.................................................................................8 INTRODUCEREA IMAGINILOR I STABILIREA CULORILOR..................................................11 CREAREA LEGTURILOR....................................................................................................12 CREAREA I UTILIZAREA FORMULARELOR........................................................................13 CADRE...............................................................................................................................16 APLICAII..........................................................................................................................17 CAP. 2 LIMBAJUL PHP....................................................................................................19 ELEMENTE DE BAZ ALE LIMBAJULUI...............................................................................19 Introducere...................................................................................................................19 Structura unui program PHP.......................................................................................19 Vocabularul limbajului................................................................................................21 Separatori i comentarii...............................................................................................21 Afiarea datelor............................................................................................................22 Constante .....................................................................................................................23 Variabile.......................................................................................................................24 Expresii........................................................................................................................24 PRELUCRAREA DATELOR PRINTR-UN FORMULAR..............................................................25 TIPURI DE DATE.................................................................................................................32 Tipuri simple de date....................................................................................................32 Tipuri structurate de date.............................................................................................37 Tipuri speciale..............................................................................................................39 OPERATORI........................................................................................................................39 Operatori aritmetici.....................................................................................................40 Operatori de incrementare/decrementare....................................................................43 Operatori de atribuire..................................................................................................44 Operatori relaionali....................................................................................................44 Operatori de egalitate..................................................................................................45 Operatori pe bii...........................................................................................................46 Operatori logici............................................................................................................48 Operatori pentru iruri de caractere...........................................................................48 Operatorul condiional.................................................................................................49 Operatori de control al erorilor...................................................................................49 Operatori de execuie...................................................................................................49 PROBLEME PROPUSE..........................................................................................................50 STRUCTURI DE CONTROL...................................................................................................52 Structuri alternative.....................................................................................................52 Structuri repetitive.......................................................................................................55 PROBLEME PROPUSE..........................................................................................................58 TABLOURI..........................................................................................................................59 Tablouri unidimensionale............................................................................................59 Instruciunea foreach...................................................................................................60

Manual de informatic pentru clasa a XII-a

Tablouri multidimensionale.........................................................................................62 Funcii utile n prelucrarea tablourilor.......................................................................63 PROBLEME PROPUSE..........................................................................................................65 FUNCII.............................................................................................................................66 Funciile definite de utilizator......................................................................................66 Argumentul funciilor...................................................................................................66 Transmiterea argumentelor.........................................................................................67 Valorile returnate de funcii.........................................................................................67 FIIERE..............................................................................................................................68 PROBLEME PROPUSE..........................................................................................................73 APLICAII..........................................................................................................................74 CAP. 3 SERVERUL MYSQL............................................................................................76 CE ESTE MYSQL? ............................................................................................................76 ELEMENTE DE BAZ ALE LIMBAJULUI MYSQL................................................................77 Conectare si deconectare de la server.........................................................................77 Introducerea comenzilor MySQL.................................................................................77 Baze de date i tabele...................................................................................................78 Tipuri de date MySQL..................................................................................................80 Tipuri de date ir de caractere.....................................................................................81 Funcii utile..................................................................................................................82 Operatori......................................................................................................................83 Conversii de date..........................................................................................................86 Interogri MySQL........................................................................................................86 MYSQL, SISTEM DE BAZE DE DATE RELAIONAL...........................................................104 Selectarea datelor din mai multe tabele.....................................................................104 Relaionarea tabelelor ..............................................................................................106 CONECTAREA DIN PHP LA SERVERUL MYSQL..............................................................111 APLICAII.......................................................................................................................135

Partea a III-a PROGRAMARE WEB


n partea a treia vom vorbi despre modelul client server n baze de date. Vom studia serverul de baze de date MySQL, care va fi accesat prin intermediul limbajului PHP. Structura capitolelor este urmtoarea: n primul capitol vom face o introducere n limbajul HTML. Sunt prezentate cele mai importante etichete de marcaj fr detalii de design, iar n partea final sunt prezentate formularele. Acestea vor constitui interfaa de transmitere a datelor. n partea a doua vom descrie structurile de baz ale limbajului PHP, utilizat n special pentru crearea de pagini web dinamice i pentru crearea de interfee cu diferite servere (baze de date, e-mail). Avnd o sintax similar cu cea din limbajele C, Java si Perl, codul PHP este inclus n pagini HTML i interpretat de ctre server. Astfel vom scrie secvene de cod ce preiau date din formulare HTML. Aceste date pot fi prelucrate i stocate n fiiere sau trimise spre alte servere (de baze de date). Ultima parte vom prezenta serverul de baze de date MySQL. Comunicarea cu serverul se realizeaz prin intermediul scripturilor PHP.

n figura de mai jos am reprezentat principalele componente ale sistemului i am reprezentat prin sgei fluxurile de informaii.

Manual de informatic pentru clasa a XII-a

Cap. 1 Limbajul HTML


n acest capitol vom nva s crem o pagin HTML simpl. Vom nva s stabilim titlul documentului, s atam anteturi de diferite dimensiuni, s scriem ngroat, nclinat, subliniat. Vom utiliza liste , tablouri, imagini, legturi, iar la finalul capitolului vom construi formulare. Limbajul HTML (prescurtare de la HyperText Markup Language) debuteaz prin anii 1990 cu un sistem de documente hipertext denumit World-Wide Web (pagini web). Tot atunci apar si primele aplicaii capabile s redea coninutul acestor documente. Aceste aplicaii se numesc navigatoare pe internet (internet browser) De atunci dezvoltarea limbajului a fost continu i constant. Au aprut noi versiuni i standarde pentru limbaj, menite s dezvolte noi faciliti, i s asigure o corectitudine a comunicaiilor. O pagina web este o unitate de informaie numita document (fiier), disponibila pe (WWW) World Wide Web. Paginile de web sunt create utiliznd limbajul HTML care definete coninutul paginii de web: text, grafica, video, sunete. Acestea sunt fiiere cu extensia htm sau html. De obicei paginile web sunt stocate pe calculatoare dedicate, numite web servere, i sunt trimise si primite prin protocolul HTTP( un protocol client/server, prin care se face transferul fiierelor pe Internet). Browserul clientului primete pagina web, decodeaz limbajul si o afieaz pe ecran. Scopul primei pri a acestui capitol o reprezint redactarea unor pagini web, cu ajutorul unui editor de text, salvarea acestor documente n fiiere cu extensia html, precum i vizualizarea fiierelor cu ajutorul programelor de navigare pe Internet. n partea a doua a acestui capitol vom prezenta tehnici de trimitere a fiierelor html redactate pe calculatorul local, pe servere web i vizualizarea paginii web stocate pe server.

Crearea unei pagini HTML simple


Limbajul HTML permite redactarea de documente prin utilizarea unor reguli de descriere. Astfel, documentele HTML conin doar caractere text (din codul ASCII). Structura unui document i coninutul lui se stabilesc cu ajutorul unor elemente de marcaj. Acestea separ poriuni din document cu ajutorul unor etichete (tag-uri). Etichetele sunt delimitate de restul textului prin paranteze unghiulare. (ex: <b>) O etichet are n general urmtoarea structur: <eticheta [atribut = valoare]> </eticheta> In marea lor majoritate aceste etichete sunt pereche, una de deschidere <eticheta> i alta de nchidere </eticheta>. de exemplu:

5 <a href="http://www.edu.ro">Site</a>

Limbajul HTML

n exemplul de mai sus avem perechea de etichete <a> </a> ce specific o ancora (legtur) , iar href este un atribut cu valoarea http://www.edu.ro. Textul Site dintre etichete reprezint o legtur (hyperlink) spre o alt pagin, aa cum se vede n figur. Browserul ignora marcajele pe care nu le nelege si pe cele scrise greit. Structura general a unui document este urmtoarea: Cod HTML <HTML> <HEAD> <TITLE>Prima mea pagina WEB </TITLE> </HEAD> <BODY> Salut INTERNET! </BODY> </HTML> Vedere n Browser

Documentul este delimitat de perechea de etichete <HTML> </HTML>. Etichetele <HEAD> </HEAD> delimiteaz antetul documentului , iar etichetele <BODY> </BODY> delimiteaz corpul documentului. Antetul documentului poate conine informaii generale despre document, cum ar fi titlul documentului (afiat n bara de titlu a ferestrei navigatorului), iar corpul documentului poate conine text i elementele de marcaj. naintea antetului este util prezena unei declaraii legate de versiunea limbajului: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> n exemplul de mai sus versiunea utilizat este HTML4.01.

Introducerea textelor i formatarea acestora


Textele sunt structurate la nivelul paragrafelor (aliniatelor). n limbajul HTML delimitarea paragrafelor se face prin etichetele: <P>acesta este un paragraf </P> unde cele dou etichete <p> i </p> marcheaz nceputul respectiv sfritul paragrafului. Pentru alinierea textelor n cadrul paragrafelor vom utiliza atributul align: <P ALIGN=LEFT|CENTER|RIGHT>Paragraf aliniat</P> notaia LEFT|CENTER|RIGHT specifica selecia doar a unei opiuni. Pentru trecerea forat la linie nou se utilizeaz eticheta <BR> Eticheta <HR> traseaz o linie orizontal Pentru marcarea titlurilor (header) avem urmtoarele etichete, ce ne permit crearea unei ierarhii de titluri si sub-titluri:

6 <Hx> </Hx>

Manual de informatic pentru clasa a XII-a

Unde x=1..6 . Dimensiunea titlurilor este descresctoare de la H1 la H6. Dac vrem s scriem indici superiori sau indici inferiori vom utiliza etichetele: <sup>exponent</sup> <sub>indice</SUB> Exemple: Cod HTML <HTML> <HEAD> <TITLE>Prima mea pagina WEB </TITLE> </HEAD> <BODY> <h1> Header </h1> <h2> Header </h2> <h3> Header </h3> <h4> Header </h4> <h5> Header </h5> </BODY> </HTML> Vedere n browser

Stilul paragrafelor poate fi controlat prin perechi de etichete ce delimiteaz poriuni de text ngroate, nclinate, subliniate i zone de text preformatat (folosit n special la redactarea codului indentat n diferite limbaje de programare): Cod HTML <B> bold </B> <I> italic </I> <U> subliniat</U> <PRE> if(a<=b) { Min=a; </PRE> Vedere n browser

7 <P><B>ingrosate</B></P> <P><I>inclinate; italice</I> </P> <P><U>subliniat</U></P> <pre> a a a a a </pre>

Limbajul HTML

Pentru trecerea forat la rnd nou se utilizeaz eticheta: <BR> Atunci cnd vrem s trasm o linie orizontal utilizm eticheta <HR> Pentru a plasa un comentariu ce nu va fi afiat pe pagin, se utilizeaz etichetele: <!--comentariu ce nu va fi afisat--> Exemple de utilizare : Cod HTML <P>Exemplu<BR>de trecere fortata la rand nou</P> <HR SIZE=10 COLOR=RED> Vedere n browser

n redactarea paginilor web am observat c parantezele unghiulare < i > au semnificaii speciale n construcia etichetelor. Dac ns trebuie s introducem o parantez unghiular (sau un alt caracter) atunci vom utiliza caractere de nlocuire, numite caractere speciale. Un caracter special are trei pri: un prefix (&); caracterul (sau un #) si un numr si la sfrit un punct si o virgula (;). Cele mai ntlnite caractere speciale sunt: HTML &nbsp; &lt; &gt; Descriere spaiu liber mai mic dect mai mare dect < > Vedere BROWSER

Manual de informatic pentru clasa a XII-a

&sect; &copy; &reg;

seciune copyright marca nregistrat

Utilizarea listelor i tabelelor


Cele mai obinuite tipuri de liste sunt: Etichete utilizate <OL> </OL> <UL> </UL> <DL> </DL> Tip list Liste ordonate Listele neordonate Liste de definiii

n cadrul listelor ordonate i neordonate, itemii sunt precedai tag-ul <LI>. n listele de definiii termenii de definit sunt precedai de eticheta <DT>, iar definirea propriuzis este precedat de eticheta <DD>, aa cum reiese din exemplul de mai jos: Cod HTML <UL> <LI> elementul 1 <LI> elementul 2 <LI> elementul 3 </UL> Vedere n browser

<OL> <LI> elementul 1 <LI> elementul 2 <LI> elementul 3 </OL>

9 <DL> <DT>HTML</DT> <DD>Hyper Text Mark-up Language </DD> <DT>IP</DT> <DD>Internet Protocol</DD> </DL>

Limbajul HTML

Tabelele reprezint unul din instrumentele cele mai folosite pentru organizarea informaiilor n cadrul paginilor web. Astfel informaia ce urmeaz s fie prezentat poate fi structurat la nivelul liniilor i coloanelor tabelului. Descrierea n limbaj HTML a etichetelor ce marcheaz prezena unui tabel i specificarea principalelor elemente constituente si a atributelor acestora este prezentat succint n continuare: Etichete <TABLE></TABLE> <TABLE BORDER=?></TABLE> <TABLE CELLSPACING=?> <TABLE CELLPADDING=?> <TABLE WIDTH=?> <TABLE WIDTH="%"> <TR></TR> <TR ALIGN=LEFT|RIGHT| CENTER|MIDDLE|BOTTOM> <TD></TD> <TD ALIGN=LEFT|RIGHT| CENTER|MIDDLE|BOTTOM> <TD COLSPAN=?> <TD ROWSPAN=?> <TD WIDTH=?> <TD WIDTH="%"> <TD BGCOLOR="#$$$$$$"> Descriere Declararea unui tabel Atribut pentru borduri Spaierea dintre celule Spaierea dintre text i marginea celulei Limea tabelului n pixeli Limea tabelului n procente Delimitarea rndurilor Alinierea rndurilor Delimitarea celulelor Alinierea coninutului din celule Crearea unei celule prin unirea mai multor coloane Creeaz o celul prin unirea mai multor rnduri adiacente Limea dorit a unei celule exprimat n pixeli Limea dorit a unei celule exprimat n procente Culoarea din fundalul celulei n format

10

Manual de informatic pentru clasa a XII-a hexa RGB

<TH></TH> <TH ALIGN=LEFT|RIGHT| CENTER|MIDDLE|BOTTOM> <CAPTION></CAPTION> <CAPTION ALIGN=TOP|BOTTOM> Exemple: Cod HTML <table border="1"> <caption>Eticheta tabelului</caption> <tr> <th width="120"> Culoare </th> <th width="120">Valoare RGB</th> </tr> <tr><td>negru</td> <td>000000</td> </tr> <tr><td>alb</td> <td>FFFFFF</td> </tr> <tr><td>rou</td> <td>FF0000</td> </tr> </table> <table border=1> <tr><td>unu</td> <td>doi</td> <td>trei</td> </tr> <tr><td>a</td> <td colspan=2>b c </td> </tr> <tr><td colspan=2> 1 2 </td> <td> 3 </td> </tr> </table>

Antetul tabelului Alinierea antetului Eticheta tabelului Alinierea etichetei

Vedere n browser

11

Limbajul HTML

Introducerea imaginilor i stabilirea culorilor


Marea majoritate a paginilor web conin imagini. Prin aceasta coninutul textual este mult mbogit, paginile devin mai atractive, iar mesajul transmis este mai complet. Cu toate avantajele utilizrii imaginilor, exista i aspecte specifice pe care trebuie s le lum n considerare. Prezent imaginilor duce la mrirea timpului de ncrcare a paginii web n browserul utilizatorului. De aici rezult c va trebui s avem o ncrcare echilibrat, prin urmrirea dimensiunii paginii. De exemplu inserarea ntr-o pagin web a pozelor fcute cu o camer digital de mare rezoluie, unde imaginile au o dimensiune de civa MB, nu este o soluie eficient. n acest caz este necesar prelucrarea imaginii cu ajutorul unor programe de grafic prin care se urmrete reducerea dimensiunii imaginii (att ca rezoluie ct i ca spaiu ocupat). Principalele formate de imagini utilizate in paginile web sunt: JPEG (*.jpg sau *.jpeg), GIF (*.gif), BMP (*.bmp), PNG (*.png). n tabelul de mai jos vom prezenta etichetele utilizate pentru inserarea imaginilor: Etichete <IMG SRC="poza.jpg"> <IMG SRC="poza.jpg" WIDTH="100" HEIGHT="75" > <IMG SRC="poza.jpg" BORDER="2"> <IMG SRC="poza.jpg" ALT="sigla liceului> <IMG SRC=" poza.jpg " ALIGN = TOP | BOTTOM | MIDDLE | LEFT | RIGHT> Descriere Afiarea unei imagini Specificarea dimensiunilor Aplicarea unei borduri n jurul pozei Specificarea unui text alternativ n cazul n care poza nu poate fi afiat Alinierea pozei

n exemplul urmtor se insereaz o imagine (p1.jpg) de dimensiuni 90x54 pixeli, ncadrat de o bordur de 1 pixel. Programele de navigare care nu pot afia imagini vor afia textul tren. Cod HTML <BODY> <IMG SRC="p1.jpg" WIDTH="90" HEIGHT="54" ALT="tren" BORDER="1"> </BODY> Vedere n browser

Majoritatea documentelor web utilizeaz culori, att pentru fundal ct i pentru evidenierea anumitor zone. Culoarea este un atribut prezent n mai multe etichete. Pentru fundal atributul este : bgcolor iar valoarea poate fi o culoare specificat prin nume, de ex: RED sau n codificarea RGB (Red Green Blue)

12

Manual de informatic pentru clasa a XII-a

#FF0000. n aceast codificare se stabilete amestecul de RGB, unde fiecare culoare poate fi folosita n 256 de intensiti ( 0 ..255 sau hexa 00 .. FF) Din cele 6 cifre hexa primele dou stabilesc intensitatea de rou, urmtoarele doua cea de verde, iar ultimele dou, intensitatea de albastru. n tabelul de mai jos vom prezenta cteva din cele mai frecvente utilizri ale atributului de culoare: Eticheta <body bgcolor="#FF0000"> <table bgcolor="#FF0000"> Descriere Stabilete culoarea de fundal pentru ntreaga pagina Stabilete culoarea de fundal pentru tabel

Crearea legturilor
Legtura (link-ul) confer utilizatorului posibilitatea realizrii unei treceri de la o pagina la alta sau deplasarea (saltul) la o alt poziie n pagina curent. De obicei n reprezentarea grafic din browser, link-ul este marcat printr-o subliniere, iar atunci cnd poziia mouse-ului este deasupra, cursorul i schimb forma. Perechea de etichete ce delimiteaz un link este: <A HREF="resursa" > </A> Unde resursa reprezint localizarea resursei nlnuite prin link. Ea poate fi o pagin web i eventual o poziie n acea pagin. n tabelul urmtor sunt prezentate cteva exemple i completri cu atribute i valori. Eticheta <A HREF="produse.html>Produsele</A> <A HREF="produse.html TARGET=_blank>Produsele</A> Descriere Link ctre fiierul produse.html ce se va deschide n aceeai fereastr a navigatorului Link ctre fiierul produse.html ce va deschide o nou fereastr a navigatorului.

<A NAME="manuale">Lista manualelor</A> <A HREF="#manuale>Manuale</A>

Crearea unei ancore cu numele manuale n cadrul paginii curente Link intern, n aceeai pagin, la poziia unde a fost plasat ancora manuale Link ctre fiierul produse.html

<A HREF="produse.html#manuale>

13 Produsele </A>

Limbajul HTML la poziia la care este plasat ancora #manuale

Majoritatea editoarelor HTML au faciliti ce permit selectarea etichetelor si a atributelor specifice etichetei selectate. n exemplul de mai jos am selectat eticheta <a dup care editorul a afisat o list de atribute specifice etichetei. Din list am ales href, iar apoi editorul permite selectarea resursei prin Browse...

n acest mod editarea paginilor HTML la nivelul codului devine mult mai uoar din cauza mediului de editare care vine n ntmpinarea creatorului cu etichete i atribute corespunztoare contextului.

Crearea i utilizarea formularelor


Pn n acest moment creatorul paginii web utiliza n mod unidirecional fluxul de informaii: el realiza un coninut web pe care vizitatorii l recepionau. Paginile puteau fi stocate: pe calculatorul local sau pe un alt calculator din reeaua local prin partajarea de fiiere, ori pe un server web (caz n care paginile trebuiau n prealabil trimise pe serverul web). Acum vom prezenta mecanisme prin care putem face ca fluxul de informaie web s fie bidirecional. Mai precis, vom prezenta cum poate vizitatorul unei pagini web s trimit informaii ctre creatorul paginii web. Pentru a beneficia de o asemenea facilitate trebuie s utilizm un server de web. Acesta trebuie sa fie capabil sa recepioneze informaiile trimise de vizitatorul paginii i s le pun la dispoziia unor programe de prelucrare. Etichetele ce, delimiteaz zona de interactivitate sunt: <form name="" action="" method=""> name numele dat formularului action are ca valoare numele programului de prelucrare method stabilete mecanismul prin care datele introduse sunt trimise ctre server. Exist dou metode : GET utilizat n special pentru transmiterea unei cantiti reduse de date i POST pentru cantiti mai mari, unde datele sunt transmise separat. Datele concrete se introduc folosind eticheta input </form> Aceast zon se numete formular, iar atributele se refer la :

14

Manual de informatic pentru clasa a XII-a />

<input type= value= name=

Atributul type poate lua valorile: button | checkbox | file | password | radio | reset | submit | text. n continuare vom exemplifica fiecare atribut Cod HTML <input type="text" value="" size="20" maxlength="20" name="text1" /> <input type="password" name="parola"/> Text de tip parol <textarea name="arie_1" cols="25" rows="2">textul Dvs. </textarea> Arie de text <input type="radio" name="r1" /> Buton de tip radio <input name="chk1" type="checkbox"/> Buton de tip checkbox <input type="reset" value="Anulare" name="rst" /> Vedere n browser

se obine o zon unde se poate introduce un ir de maximum 20 de caractere

Buton ce terge toate datele introduce n formular

<input type="submit" value="Trimite" name="sbmt" />

Apsarea butonului iniiaz transferul tuturor datelor completate n formular ctre serverul web

<input type="file" name="fis1" /> Acest dialog se utilizeaz pentru selectarea fiierelor i transferul lor pe server (upload)

15

Limbajul HTML

n continuare vom exemplifica realizarea de formulare pentru colectarea datelor: Cod HTML <form action="program.php" method="post"> Nume: <input type="text" name="nume"><br> Prenume: <input type="text" name="prenume"><br> <input type="submit" value="Trimite"><br> <input type="reset" value="Anuleaza"> </form> . <form action="program.php" method="post"> Numele: <input type="text" name="nume"><br> Sexul: <br> Masculin <input type="radio" name="sex" value="m"> <br> Feminin <input type="radio" name="sex" value="f"><br> Domiciliul: <select name=sel> <option value="rural">Rural <option value="urban">Urban <option value="rezidential"> Rezidential</select><BR> Limbaje de programare invatate in scoala:<br>PASCAL <input type="checkbox" name="pas"><br> C/C++<input type="checkbox" Vedere n browser

16 name="cpp"><br> Java<input type="checkbox" name="jar"><br> Curriculum Vitae: <br><input type="file" name="file"><br> Comentarii:<br><textarea name="obs" rows="5" cols="30"></textarea><br> <input type="submit" value="Trimite"><br> <input type="reset" value="Sterge"><br> </form>

Manual de informatic pentru clasa a XII-a

Datele introduse n formular vor fi procesate de ctre un program scris n limbajul PHP. Acesta va prelua datele dintr-un vector i le va prelucra conform cerinelor specifice aplicaiei. Atributul name din tagul <input> este utilizat de ctre aplicaia PHP specificat n atributul action al formularului. Transmiterea datelor din formular ctre o aplicaie se face prin intermediul serverului web. De aceea aceste pagini trebuie stocate pe server. Salvarea pe server a paginilor se face cu acordul administratorului serverului. Practic trebuie copiate documentele web ntr-un anumit director pe un anumit disc al serverului. Exist att modalitatea local de copiere, ct i copierea prin intermediul reelei. Accesarea documentelor se va face prin intermediul adresei resursei: http://nume-server.domeniu/pagina-mea.html

Cadre
n realizarea paginilor WEB exist posibilitatea ncrcrii n fereastra navigatorului a mai multor pagini diferite, n zone diferite. Aceast tehnologie se bazeaz pe utilizarea cardelor. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"> <html> <head> <title>document cu cadre</title> </head> <frameset cols="80,*" frameborder="NO" border="0" framespacing="0"> <frame src="stang.html" name="leftFrame" scrolling="NO" noresize> <frame src="main.html" name="mainFrame"> </frameset>

17 <noframes><body> </body></noframes> </html>

Limbajul HTML

Sunt definite dou cadre pe coloane, unul de 80 puncte, iar cellalt ocup spaiul rmas liber. n cadrul din stnga se ncarc fiierul stang.html, iar n cel din dreapta fiierul main.html. O declaraie de forma: <frameset rows="150,*" frameborder="yes" border="1" bordercolor = "#CCCCCC" > definete dou cadre pe rnduri. Aceste declaraii se pot combina, ca n exemplul urmtor: <frameset rows="100,200,*" cols="150,350,*" frameborder="yes" border="1" bordercolor="#CCCCCC"> Aici sunt definite trei rnduri la 100, 200 de puncte, respectiv restul spaiului disponibil n pagin i trei coloane la 150, 350 puncte, respectiv restul spaiului disponibil. Avem n total 9 fiiere surs pentru cardele declarate. Utilizarea cadrelor permite crearea i actualizarea n mod independent a diferitelor zone din pagin. n general sunt utilizate: zona superioar pentru sigle i meniuri orizontale i zona din stnga pentru meniuri verticale. Rezumat Informaiile prezentate despre limbajul HTML sunt minimale pentru realizarea unei interfee WEB pentru interaciunea cu servere de baze de date. Exist multe etichete care marcheaz faciliti de formatare mult superioare celor prezentate. Sunt, ncepnd cu versiunea a 4-a a limbajului, tehnici prin care putem separa aspectul de coninut n cadrul unei pagini Web.

Aplicaii
1. Implementai toate exemplele prezentate pe parcursul capitolului. Creai fiiere separate pentru fiecare exemplu. Editai fiierele n editoare de text i salvai-le cu extensia htm sau html. 2. Deschidei un editor text (Notepad) . Creai un document html, n care s utilizai etichetele studiate. Tema documentului este Prezentarea liceului meu. Salvai fiierul cu extensia htm sau html (salvare in format text) Deschidei un browser i ncrcai n el fiierul salvat. 3. Cea mai bun metod pentru a nva const n vizitarea multor pagini. Deschidei o pagin i comentai aspecte legate de modul de realizare: aranjarea n pagin a coninuturilor, culorile alese, imaginile, uurina navigrii, etc. 4. Identificai aplicaii specializate n realizarea paginilor web. Familiarizai-va cu facilitile acestora. ncepei prin a citi documentaie, preri obiective pro i contra, vreunui produs. Dac descrierile i lista facilitailor v atrag spre un anumit produs testai versiunile demonstrative puse la dispoziie de ctre productor.

18

Manual de informatic pentru clasa a XII-a

5. Realizai formulare pentru colectarea datelor pentru organizarea unui concurs colar interjudeean n care voi trebuie s rezolvai problema cazrii. Identificai informaiile de care avei nevoie.

19

Limbajul PHP

Cap. 2 Limbajul PHP


Elemente de baz ale limbajului
Introducere
PHP (Hypertext Prepocessor) este un limbaj de programare orientat spre WEB ce permite dezvoltatorilor crearea de aplicaii cu coninut dinamic, care interacioneaz cu baze de date. PHP este un limbaj scriptic, coninut n paginile HTML, ce este interpretat de ctre server. Vizitatorul paginilor HTML primete n Browser numai codul interpretat, neavnd acces direct la scriptul PHP. Limbajul PHP poate fi utilizat n dou moduri: n interiorul paginilor WEB, sub forma unor secvene de cod delimitate de etichetele <?PHP i ?>, scrierea de scripturi pentru diferite scopuri, inclusiv acela de a genera coninut HTML. Una din cele mai frecvente utilizri este prelucrarea prin CGI (Common Gateway Interface) a datelor trimise prin formulare HTML. PHP permite scrierea scripturilor CGI, care s colecteze date i s genereze dinamic pagini web sau s trimit i s primeasc cookies. PHP pune la dispoziie un set de funcii care permit crearea fiierelor pe server. PHP ofer suport pentru lucrul cu baze de date MySql; se poate realiza o pagin web dinamic cu o baza de date este extrem de simplu.

Structura unui program PHP


Codul PHP este inclus ntre tag-urile speciale de nceput i de sfrit care permit utilizatorului s treac din "modul HTML" n "modul PHP. Structura general a unui script PHP este prezentat n exemplul urmtor: <html> <head> <title>Example</title> </head> <body> <?php echo "Acesta este primul meu script PHP"; ?> </body> </html>

20

Manual de informatic pentru clasa a XII-a

n exemplul de mai sus recunoatem structura general a unui fiier HTML. Aici observm integrarea codului PHP ntre etichetele <?PHP i ?> i afisarea unui mesaj cu ajutorul construciei echo ""; . Salvm acest program cu numele primul_script.php n rdcina serverului de web i pentru a-l accesa putem deschide un browser i tasta adresa: http://localhost/primul_script.php . n exemplul anterior serverul de web este tocmai calculatorul local, iar numele predefinit al acestuia este localhost.

Exist patru modaliti de a trece de la HTML la PHP, avnd posibilitatea de a utiliza urmtoarele etichete: <? i ?> <?php i ?> <% i %> <script language="php"> i </script>

n continuare vom utiliza etichetele <?php i ?>. Exemplu: <?php echo "Varianta utilizata pentru documente XML sau XHTML "; ?> ntr-un script PHP se poate ngloba i HTML aa cum se poate vedea n exemplul urmtor: <?php echo 'php cu <b>HTML</b> <br> <a href="primul_script.php"> Legatura catre primul meu program php</a>'; ?>

21

Limbajul PHP

Vocabularul limbajului
Vocabularul limbajului este format din: setul de caractere identificatori separatori comentarii Setul de caractere conine literele mici i mari ale alfabetului englez, cifrele de la 0 la 9 i caracterele speciale. Identificatorii sunt succesiuni de litere, cifre i caracterul de subliniere, primul caracter fiind diferit de cifr. Identificatorii desemneaz numele constantelor, variabilelor, funciilor utilizator. Exemple: _numa1, suma_cifrelor, calculeaza_maxim, _x, _y Cuvintele cheie ale limbajului sunt identificatori cu sens de sine stttor ce nu poate fi folosit n alt context. Exemple de cuvinte cheie n PHP: while, array, etc if,elseif ,for, foreach,

Separatori i comentarii
Separatorii Ca i n C sau Perl, separatorul de instruciuni ce se utilizeaz n PHP este punct i virgul. Nu este necesar utilizarea acestui separator dup ultima linie a unui bloc de instruciuni PHP deoarece nchiderea unei etichete implic sfritul instruciunii, deci implicit punct i virgul. Exemplu:

22 <?php echo "primul program PHP" ?> Comentarii

Manual de informatic pentru clasa a XII-a

Pentru ca un program s fie mai uor neles se folosesc comentariile. n PHP se utilizeaz comentariile ntlnite i n C, C++ i shell-urile UNIX. Acestea se plaseaz oriunde n program i pot fi scrise n dou feluri: pentru comentarii ce poate ocupa mai multe linii ale textului surs se utilizeaz comentariu ntre perechi de caractere '/*' i '*/' pentru comentariu scris pe o singur linie se utilizeaz caracterele '//' sau #. Aceste comentarii au valabilitate doar n blocul curent de cod Exemplu: <?php echo "test 1"; // primul test /* acesta este un comentariu structurat pe mai multe rnduri*/ echo "test 2"; echo "test3"; # al treilea test ?>

Afiarea datelor
Pentru afiarea datelor n browser se folosesc construciile speciale din PHP, echo i print. Construcia echo Aa cum am vzut din exemplele anterioare cu ajutorul construciei echo putem afia un text. Acesta poate fi delimitat de apostrofuri sau ghilimele, care se folosesc pereche "..." sau '...'; folosirea lor "...' sau '..." constituie o eroare. Concatenarea mai multor iruri de caractere se face cu ajutorul operatorului punct .. Exemplul 1. <?php echo "afisarea unui sir de caractere"; echo ("afisarea utilizand paranteze"); echo "<br> memory"." stick"; ?> Exemplul 2. <?php echo " Liceul "Grigore Moisil" " ; // conflict cu "" ?>

23 Construcia print

Limbajul PHP

Afiarea datelor cu print se realizeaz la fel ca i n cazul afirii cu echo. Exemplu: <?php print "mesaj1"; print("mesaj2"); // se pot utiliza parantezele print "este permisa structurarea unui mesaj <br> pe mai multe linii "; print "a=125"; // se va afisa a=125 ?>

Constante
n PHP se pot defini constante cu ajutorul funciei define(). Numele unei constante ncepe cu o liter sau caracterul de subliniere, urmat de o succesiune de litere, cifre i caracterul de subliniere. define("nume_constant", valoare); Observaii: constantele nu-i schimb valoarea pe parcursul programului constantele nu sunt precedate de semnul ($) constantele pot fi definite doar cu ajutorul funciei define(), n nici un caz printr-o simpl atribuire constantele pot defini doar valori ale tipurilor scalare (boolean, ntreg, real, string) Exemplu: <?php define ("a", "25"); define ("pi","3.1415926"); define ("data1"," 25-02-1997"); echo a+pi; // afiseaza 28.1415926 echo "data=".data1; ?> Constantele predefinite sunt: Constant __FILE__ __LINE__ Explicaie Se utilizeaz cu un fiier care a fost inclus sau solicitat; cnd numele fiierului inclus este dat; Numrul liniei din scriptul curent care este analizat. Se utilizeaz mpreun cu un fiier care a fost inclus sau solicitat, cnd poziia n fiierul inclus este dat;

24 PHP_VERSION PHP_OS TRUE FALSE E_ERROR E_WARNING E_PARSE

Manual de informatic pentru clasa a XII-a Un ir de caractere reprezentnd versiunea PHP utilizat; Numele sistemului de operare n care ruleaz PHP; O valoare adevrat; O valoare fals; Indic o eroare, alta dect o eroare de analizare, pentru care corectarea nu este posibil; Indic o situaie n care PHP tie c ceva este greit, dar continu oricum; Semnaleaz o sintax invalid corectarea nu este posibil; n fiierul script;

Variabile
n PHP, o variabil este definit cu ajutorul semnului dolar $ urmat de numele variabilei. Numele unei variabile este o succesiune de litere, cifre i caracterul de subliniere, primul caracter fiind obligatoriu liter sau caracterul de subliniere. Atribuirea de valori variabilelor se face cu ajutorul operatorului de atribuire = precizndu-se ntre apostrofuri sau ghilimele, expresia care se va atribui variabilei. $nume_variabila=' '; sau $nume_variabila=" "; Exemplu: <?php $a ='7'; $b ='5'; echo "a= $a si b= $b"; $c=$a+$b; echo " Suma= $c"; $x=5.76;$y=-7.45; echo "<br> produsul este ".$x*$y; ?>

Expresii
Cele mai simple construcii n PHP sunt expresiile. Constantele, variabilele, funciile sunt expresii. PHP este un limbaj orientat pe expresii n sensul c aproape orice este o expresie. Exemplu: <?php function maxim($a,$b) { if ($a>$b) return $a; else return $b;

25

Limbajul PHP

} // functiile sunt expresii $a=-135; //expresie constanta $b='Andrei'; //expresie constanta $c=-45.6678;// expresie constanta echo $a*4.75-($a++)*$c; //afisarea unei expresii matematice echo max($a-4,5*$c) // afisarea expresiei utilizand functia definita ?> Rezumat Scripturile PHP ruleaz pe server i au rolul de a prelucra datele transmise de utilizator de pe propriul calculator i a transmite prin intermediul unui browser, rezultatele prelucrrilor acestor date Un script PHP este delimitata de tag-uri speciale, de nceput i sfrit de program <? i ?> sau <?php i ?> sau <% i %> Afiarea datelor se face cu ajutorul construciilor echo i print Constantele se definesc cu ajutorul funciei define("nume_constant", valoare); Variabilele se pot defini cu ajutorul operatorului de atribuire utiliznd sintaxa $nume_variabila=valoare; Expresiile sunt o succesiune de operatori i operanzi(constante, variabile, funcii), legai ntre ei conform regulilor impuse de limbaj, n scopul efecturii anumitor operaii

Prelucrarea datelor printr-un formular


n capitolul anterior la paragraful Crearea i utilizarea formularelor am artat c eticheta form are atributele action i method: <FORM NAME="" ACTION="" METHOD=""> </FORM> Atributul action are ca valoare numele fiierului care prelucreaz datele introduse n formular atunci este apsat butonul: <INPUT TYPE="SUBMIT" VALUE="Send"> Atributul method indic modul de transmitere a datelor spre prelucrare pe server si poate avea valorile: POST atunci cnd datele nu sunt vizibile utilizatorului i GET cnd datele sunt trimise la adresa URL. Metoda POST este utilizat pentru transmiterea unei cantiti mai mari a datelor. n exemplele noastre vom utiliza metoda POST. Cmpurile din formular au atributul name. <INPUT TYPE= VALUE= NAME= /> Acest atribut o s l utilizm n continuare la identificarea datelor introduse n fiecare cmp al formularului:

26

Manual de informatic pentru clasa a XII-a

n continuare vom prezenta modul de preluare a diferitelor tipuri de informaii din formulare: a) preluarea valorii dintr-un control text Sa presupunem ca intr-un formular avem un cmp cu name="nume" si method="POST". Fiierul indicat de action va prelua datele introduse n cmpul "nume" astfel: $var = $_POST["nume"]; $_POST este o variabil predefinit a limbajului cu ajutorul creia se transfer datele dintr-un formular (via POST). Construcia : $_POST["nume"] indic coninutul cmpului din formular identificat prin nume Exemplu: formular cu un cmp si scriptul php de preluare a datelor Cod HTML / PHP <html> <head> <title>Prima mea pagina WEB </title> </head> <body> <form action="preia.php" method="POST"> Nume: <input type="text" name="nume"><br> <input type="submit" value="Trimite"> </form> </body> </html> preia.php <html> <head> <title>Raspuns</title> </head> <body> <?php $var=$_POST["nume"]; if($var!="") echo $numele; else echo "nu ai introdus numele"; ?> </body> </html> Vedere Browser

Prima instruciune $var=$_POST["nume"]; atribuie variabilei $var coninutul pe care l-am introdus n formular. Scriptul face i verificarea datelor introduse n

27

Limbajul PHP

cmpul de text. Dac utilizatorul nu a completat nimic, pagina afiat va conine textul nu ai introdus numele. Putem crea i verificri mai rafinate. De ex. if (($nume=="") || (strlen($nume)<3)) b)preluarea valorii unui control checkbox HTML / PHP <html><head> <title>Prima mea pagina WEB</title> </head><body> <form action="preia.php" method="POST"> <p>Limbajele cunoscute de Dvs. sunt:</p> PHP <input type="checkbox" name="php" ><br> MySQL <input type="checkbox" name="mysql"><br> HTML <input type="checkbox" name="html"><br> <input type="submit" value="Trimite"> </form> </body></html> <html><head> <title>Raspuns</title> </head> <body> <?php echo "Limbaje cunoscute :<br>"; if(isset($_POST['php'])) echo "Limbajul PHP <br>"; if(isset($_POST['mysql'])) echo "Limbajul MySql <br>"; if(isset($_POST['html'])) echo "Limbajul HTML <br>"; ?> </body></html> n exemplul de mai sus s-a folosit construcia isset() pentru verificarea seleciei efectuate. Dac nu s-a fcut nici o selecie atunci va fi afiat doar textul: "Limbaje cunoscute :" Browser

28

Manual de informatic pentru clasa a XII-a

c) preluarea valorii din butoane radio Cod HTML / PHP <html> <head> <title>Prima mea pagina WEB</title> </head> <body> <form action="preia.php" method="POST"> <p>Alege o culoare</p> Alb <input type="radio" name="color" value="alb"><br> Rosu <input type="radio" name="color" value="rosu"><br> Verde <input type="radio" name="color" value="verde"><br> <input type="submit" value="Trimite"> </form> </body> </html> <html> <head> <title>Raspuns</title> </head> <body> <?php if(isset($_POST["color"])) echo "Culoarea este: ". $_POST["color"]; else echo "NU ai ales nici o culoare"; ?> </body> </html> Vedere Browser

Acest exemplu este foarte asemntor cu cel precedent.

29 d) preluarea valorii unui control de tip select: <html> <head> <title>Prima mea pagina WEB</title> </head> <body> <form action="preia.php" method="POST"> <p>Selecteaza culoare :</p> <select name="color"> <option>rosu</option> <option>galben</option> <option>albastru</option> <option>alb</option> <option>negru</option> <option>gri</option> </select> <input type="submit" value="Trimite"> </form> </body> </html> <html> <head> <title>Raspuns</title> </head> <body> <?php echo "Culoarea aleasa: ". $_POST["color"]; ?> </body> </html>

Limbajul PHP

Deoarece implicit este aleas o valoare nu mai este necesar n acest caz verificarea efecturii unei alegeri ca i n cadrul controalelor radio sau a csuelor de validare. Versiunea prezentat permite selecia unic a unei valori din list.

30

Manual de informatic pentru clasa a XII-a

e)preluarea informaiei dintr-o zon de editare de text: <html> <head> <title>Prima mea pagina WEB</title> </head> <body> <form action="preia.php" method="POST"> Comentarii:<br> <textarea name="obs" rows="5" cols="30"></textarea><br> <input type="submit" value="Trimite"> </form> </body> </html> <html> <head> <title>Raspuns</title> </head> <body> <?php echo "mesajul trimis este:<br> ".$_POST["obs"]; ?> </body> </html> Folosind modelele anterioare putei prelua date si face verificarea pentru toate cmpurile formularului. Datele preluate pot fi eventual introduse intr-o baza de date sau prelucrate in vederea trimiterii prin email functie de cerinele aplicaiei. f) upload-ul fiierelor pe server Pe lng prelucrarea datelor transmise prin intermediul formularelor, este posibil trimiterea de fiiere pentru stocare pe server. Este necesar o minim verificare pentru a verifica upload-uri de fiiere nedorite pe server. Pentru upload formularul are un cmp de tip input cu type="file" iar eticheta form va are argumentul enctype="multipart/form-data". n urmtorul exemplu realizm un formular pentru upload de fiiere. Directorul n care se face upload-ul trebuie s permit operaia de write. Uneori, din motive de securitate operaia de scriere este interzis.

31 <html> <head> <title>Prima mea pagina WEB </title> </head> <body> <form action="preia.php" method="POST" enctype="multipart/form-data"> Fisier: <input type="file" name="fisier"><br> <input type="submit" value="Trimite"> </form> </body> </html> <html> <head> <title>Raspuns</title> </head> <body> <?php $dim=$_FILES["fisier"]["size"]; $nume=$_FILES["fisier"]["name"]; $nume_temporar = $_FILES["fisier"] ["tmp_name"]; $tip=$_FILES["fisier"]["type"]; if(($dim<1000000) && ($dim>0)){ move_uploaded_file($nume_temporar, "./u-f/".$nume); echo "Numele fisierului transmis: ".$nume."<br>"; echo "Dimensiune fisier transmis: ".$dim."<br>"; echo "Tip fisier: ".$tip.""; } echo('.'); ?> </body> </html> Rezumat

Limbajul PHP

Datele trimise prin formulare sunt preluate de ctre scripturi PHP prin intermediul variabiei globale $_POST["nume"], i atribuite unor variabile locale. n exemplele demonstrative datele introduse n formulare au fost reafiate ntr-o pagin de rspuns. Principalele cmpuri din formulare sunt: textbox, textarea, checkbox, radio buttons, select, hidden, password, files, reset, submit.

32

Manual de informatic pentru clasa a XII-a

Tipuri de date
n PHP tipurile de date le putem structura astfel: Tipuri simple boolean ntreg real ir de caractere Tipuri speciale resource NULL Pseudo tipuri mixt numr callback Tipuri structurate tablou obiect

Tipuri simple de date


Tipul boolean
Acest tip de date a fost introdus de la versiunea PHP 4. O expresie de tip boolean poate avea dou valori TRUE sau FALSE. Evaluarea valorii de adevr a expresiilor PHP se face la fel ca n C i Perl: orice valoare numeric diferit de zero este TRUE, zero este FALSE un ir vid este FALSE, orice alt ir este TRUE pentru tablouri i obiecte, orice valoare care nu conine elemente este considerat FALSE, altfel este considerat TRUE Exemplu: <?php $a =6 ; $b=7; if ($a<$b)==1) echo $a; else echo $b; ?> Conversia unui alt tip de date ctre tipul boolean. Conversia explicit a unei valori ctre tipul boolean se va face cu ajutorul operatorului de conversie explicit (bool) sau (boolean). n cazul conversiei ctre tipul boolean, urmtoarele valori sunt considerate echivalente cu valoarea FALSE: numrul ntreg(int) (zero)

33 numrul real (float) 0.0 (zero) irul de caractere(string) 0" un vector cu elemente(array) 0 un obiect(object)cu zero variabile membru tipul special NULL

Limbajul PHP

Tipul ntreg
Un numr ntreg poate fi reprezentat n sistem zecimal, hexazecimal (precedat de 0x), octal (precedat de 0). Exemplu: <?php $a = 1234; // Numar intreg in baza 10 $a = -123; // Numar intreg negativ $a = 0123; // Numar intreg in baza 8 $a = 0x12; // Numar intreg in baza 16 ?> Observaii: Dimensiunea numerelor ntregi este dependent reprezentarea este de obicei pe 32 de bii PHP nu identific tipul ntreg fr semn Conversia spre tipul ntreg Pentru conversia explicit se folosete operatorul (int) sau (integer). Se poate utiliza de asemenea conversia cu ajutorul funciei intval(); Conversia unei date de tip boolean spre un ntreg: FALSE este echivalent cu 0 (zero), i TRUE cu valoarea 1 (unu). Conversia unui numr real spre un ntreg se va face prin rotunjire spre zero. Exemplu: <?php echo (int) (3.14 * 10 ); // se va afisa 314 echo(int)true;//se va afisa 1 echo (int)(7<4);//se va afisa 0 ?> de platform,

Tipul real
Numerele reprezentate n virgul mobil (double) pot fi utilizate n oricare din sintaxele urmtoare: Exemplu: <?php $a = 1.234; $b = 1.2e3;

34 $c = 7E-10; ?> Observaie:

Manual de informatic pentru clasa a XII-a

Dimensiunea numerelor n virgul mobil este independent de platform; precizia uzual este de 14 cifre(reprezentare pe 64 de bii). Pentru o precizie mai mare n compararea valorilor n virgul mobil trebuie s utilizai funciile matematice de precizie arbitrar.

Tipul ir de caractere
Un ir de caractere este o succesiune de litere, numere, simboluri i spaii delimitate de dou ghilimele simple sau duble. Astfel irurile de caractere pot conine i nume de variabile. Exemplu <?php $ziua = 'Miercuri'; echo "$ziua avem curs de PHP"; echo "in fiecare zi de $ziua avem curs de PHP"; ?> Dac irul de caractere este delimitat de ghilimele atunci variabilele din interiorul irului vor fi evaluate i nlocuite prin valoarea lor. Ca i n C sau Perl, caracterul backslash (\) este utilizat pentru a proteja un caracter special. PHP permite includerea n iruri a unor caractere speciale, precum caracterele de salt la linie noua. \n - salt la linie nou \r sfrit de linie \t - caracter de tabulare pe orizontala \\ - backslash \$ - simbolul dolarului \" - ghilimele duble Exemplu: <?php $cuvant = 'ORAR'; $prima_litera = $cuvant[0]; $ultima_litera = $cuvant[3]; ?> Concatenarea irurilor de caractere se poate face prin utilizarea operatorul '.', operatorul '+' fiind impropriu pentru aceast operaie. Exemplu: <?php /* Asignarea unui sir */ $sir = " Maria merge la scoala "; /* Concatenarea sirului cu un text nou */

35 $sir ="Dimineata, ".$sir . " cu tramvaiul"; echo $sir; /* Variabilele dintr-un sir se pot evalua */ $a = 239;$b=-39; $sir = "<br> a= $a si b= $b "; echo $sir; /* Obtine primul caracter al sirului */ $prima_litera = $sir[0]; $a_doua_litera=$sir[1]; /* Obtine ultimul caracter al sirului */ $ultima_litera = $sir[ strlen( $sir) - 1]; ?>

Limbajul PHP

O alt metod de a delimita irurile este folosirea sintaxei doc '<<<'. Dup acest delimitator trebuie specificat un identificator, apoi irul de caractere propriuzis i, n ncheiere, acelai identificator care a precedat irul. $sir = <<< identificator // Identificatorul de inceput mai multe linii utilizand sintaxa heredoc. identificator; // Identificatorul de sfarsit Exemplu: $sir_2= <<< x Maria merge la scoala cu tramvaiul in fiecare dimineata x; echo $sir_2; Conversia irurilor de caractere Cnd un ir este evaluat ca valoare numeric, valoarea i tipul rezultat sunt decise dup cum urmeaz: irul va fi evaluat ca un double dac conine unul din caracterele '.', 'e' sau 'E', altfel va fi evaluat ca un ntreg; valoarea este dat de nceputul irului. Dac irul ncepe cu o dat numeric valid, aceasta va fi valoarea utilizat. Altfel valoarea va fi 0. dat numeric valid este format din semn (opional), una sau mai multe cifre (opional un punct zecimal), ncheiate eventual cu un exponent. Acest exponent ('e' sau 'E') este urmat de una sau mai multe cifre. Cnd prima expresie este un ir tipul variabilei va depinde de a doua expresie. Exemplu: <?php $a ="10.5"; echo $a*5; //se va afisa 52.5 $b = "1.74e2";

36

Manual de informatic pentru clasa a XII-a

echo $b+0.75; // se va afisa 174.75 $a= "-1000"; $b="-100"; echo $a+$b*10; // se va afisa -2000 ?> Funcii predefinite pentru prelucrarea irurilor de caractere strlen(sir) returneaz lungimea irului de caractere trim(sir) elimin spaiile albe dintr-un ir ltrim(sir) elimin spaiile albe din stnga irului rtrim(sir) elimin spaiile albe din dreapta irului strtolower(sir) convertete un ir la litere mici strtoupper(sir) convertete un ir la litere mari Exemplu: <?php $sir=" numele elevei este"; $nume=" Adriana Marcu "; $sir=ltrim($sir); $nume=strtoupper($nume); echo $sir.$nume; //se va afisa: numele elevei este ADRIANA MARCU ?> strpos (sir1,sir2,[poz_inceput]) caut dac sir2 este subir al lui sir1; n caz afirmativ returneaz poziia de nceput a acestuia, altfel returneaz FALSE strstr(sir1,sir2) caut sir2 in sir1; dac l gsete returneaz strcmp(si1,sir2) compar lexicografic dou iruri. Valoarea returnat este egal cu 0 dac irurile sunt egale, mai mic dect 0 dac sir1 < sir2, i mai mare ca 0 dac sir1>sir2. substr(sir,poz,[n])extrage un subir de n caractere, ncepnd de la poziia poz din sir1 str_replace(sir1,sir2,sir_initial) nlocuiete cu sir2, n sir_initial, apariia irului sir1 Exemplu: <?php $sir1=" Ana are mere si pere"; $sir2="are"; $sir3="NU are"; $p=strpos($sir1,$sir2); if ($p) { echo $p;//se va afisa 5 $sir_nou=str_replace($sir2,$sir3,$sir1);

37

Limbajul PHP

echo $sir_nou;// se va afisa Ana NU are mere si pere } else echo $sir2. " nu a fost gasit in ".$sir1; ?>

Tipuri structurate de date


Tipul tablou
PHP pune la dispoziie un tip optimizat de date definit ca tipul tablou care asigur faciliti multiple pentru definirea i prelucrarea tablourilor unidimensionale i multidimensionale. Despre toate vom vorbi ntr-un capitol separat, dup prezentarea structurilor de control ale limbajului.

Tipul obiect
O colecie de date i metode care utilizeaz aceste date definesc o clas. Datele unei clase sunt reprezentate prin variabile iar metodele sunt funciile membru ale clasei astfel definite. Un obiect este o instaniere a clasei din care face parte. Accesul la datele i metodele membre ale unei clase se face cu ajutorul operatorului ->. n PHP definirea unei clase face cu ajutorul tipul class. Exemplu: definirea unui obiect pentru afiarea unui mesaj <?php class mesaj { function afiseaza_mesaj() { echo 'Script PHP pentru definirea obiectelor '; } } $a = new mesaj; echo $a->afiseaza_mesaj(); ?>

38

Manual de informatic pentru clasa a XII-a

O variabil de un anumit tip poate fi convertit ntr-un obiect. Dac variabila respectiv este un obiect, atunci ea nu va fi modificat; n caz contrar, se va crea o nou instan a clasei, instan ce va conine o variabila membru numit scalar a crei valoare va fi cea a variabilei convertite Pentru conversii se va folosi instruciune de tipul : $obiect = (object) valoare $obiect->scalar; Exemplu: pentru clasa mesaj definit n exemplul anterior, vom converti variabila $b spre tipul obiect. <?php ... $b=(object)"Exemplu pentru conversia spre tipul obiect"; echo $b->scalar; ?>

39

Limbajul PHP

Tipuri speciale
Tipul resource
Variabilele de tip resource sunt folosite pentru pstrarea unor referine ctre anumite resurse externe cum ar fi conexiuni la baze de date, fiiere, etc. Resursele sunt create i utilizate de anumite funcii speciale. Nu se poate realiza conversia unui alt tip de date sper tipul resource.

Tipul NULL
Acest tip de date are o singur valoare i anume NULL. Valoarea NULL este atribuit oricrei variabile care nu a fost iniializat. Se consider c o variabil are tipul NULL dac: i s-a atribuit constanta NULL nu a fost iniializat; a fost resetat valoarea cu care a fost iniializat prin intermediul funciei unset(). Rezumat Natura datelor cu care putem lucra definete un tip de date Tipul unei date stabilete mulimea de valori, regulile de memorare i operaiile specifice ce se pot efectua asupra datelor de acest tip n PHP, tipurile de date predefinite se pot clasifica astfel: - tipuri simple: boolean, ntreg, real, ir de caractere - tipuri structurate: tablou, obiect - tipuri speciale: resource, NULL - pseudo tipuri: mixt, numr, callback ntre tipurile de date pot avea loc operaii de conversie de la un tip de dat spre alt tip de dat

Operatori
PHP pune la dispoziie un set de operatori, majoritatea fiind ntlnii n C/C++ i JavaScript. Prezentm n tabelul de mai jos precedena acestor operatori i modul n care acetia se asociaz. Operatorii New [ Asociativitatea nu are aceast proprietate stnga tablouri Tip

40 ++ -! ~ - (int) (float) (string) (array) (object) @ * / % + - . << >> < <= > >= == != === !== & ^ | && || ? : = += -= *= /= .= %= &= |= ^= <<= >>= and xor or ,

Manual de informatic pentru clasa a XII-a nu are aceast proprietate nu are aceast proprietate stnga stnga stnga nu are aceast proprietate nu are aceast proprietate stnga stnga stnga stnga stnga stnga dreapta stnga stnga stnga stnga aritmetic aritmetic / pentru iruri de caractere bii comparare comparare bii/ referin bii bii logic logic ternar atribuire logic logic logic incrementare/decrementa re

Operatori aritmetici
Operator + adunare scdere Explicaie $x+ $y Suma dintre $x i $y $x- $y

41 Diferena dintre $x i $y * nmulire / mprire % modulo $x* $y Produsul dintre $x i $y $x/ $y mprirea dintre $x% $y Restul mpririi dintre $x i $y

Limbajul PHP

Exemplu: <?php $x=48; $y=7; $S=$x+$y; $P=$x*$y; $xx=-$x; $rest=$xx%$y; echo "Suma =".$S."<br>"; echo $x."+".$y."=".$S."<br>"; echo $x." ".$y."=".$P."<br>"; echo $xx."%".$y"=".$rest."<br>"; ?> Observaii: Rezultatul expresiei ($x%$y) este negativ dac valoarea variabilei a este negativ Operatorul de mprire ('/') ntoarce o valoare ntreag dac cei doi operatori sunt ntregi (sau dac irurile sunt convertite la ntregi). Rezultatul operaiei de mprire, este un numr n virgul mobil dac unul din operanzi este numr cu virgul mobil Urmtorul exemplu este format din dou fiiere. Primul fiier afiseaz un formular, iar al doilea prelucreaza datele introduse n formular. <!-- fiserul formular.html --> <html><head> <title>Formular HTML de preluare de date</title> </head><body> <form name="forma1" action="executa1.php" method="post"> x=<input name="var1" type="text" value="0"><br> y=<input name="var2" type="text" value="0"><br> <input name="suma" type="submit" value="Suma"> <input name="produs" type="submit" value="Produs"> <input name="sterge" type="reset" value="Sterge"> <hr> </form> </body></html>

42

Manual de informatic pentru clasa a XII-a

<!-- fiserul executa1.php --> <html><head><title>prelucrarea formularului </title> </head> <body> <?php if (isset($_POST['suma'])) { $v1=$_POST['var1']; $v2=$_POST['var2']; $rezultat=$v1+$v2; echo "$v1+$v2=".$rezultat; } if (isset($_POST['produs'])) { $v1=$_POST['var1']; $v2=$_POST['var2']; $rezultat=$v1*$v2; echo "$v1*$v2=".$rezultat;

echo '<hr><a href="index1.html">revenire in formular </a>'; ?> </body></html> formular.html executa1.php

O alt variant de implementare este urmtoarea. Aici ntr-un singur fiier se i afieaz i prelucreaz formularul: <?php if (isset($_GET['suma'])||isset($_GET['produs'])) { $v1=$_GET['var1']; $v2=$_GET['var2']; } else { $v1=0; $v2=0; } ?>

43

Limbajul PHP

<html><head> <title>Formular HTML de prelucrare de date</title> </head><body> <form action="<?php echo $_SERVER['PHP_SELF']; ?>"> x=<input name="var1" type="text" value="<?php echo $v1; ?>" > <br> y=<input name="var2" type="text" value="<?php echo $v2; ?>" > <br> <input name="suma" type="submit" value="Suma"> <input name="produs" type="submit" value="Produs"> </form><hr> <?php

if } if

(isset($_GET['suma'])) { $rezultat=$v1+$v2; echo "$v1+$v2=".$rezultat; (isset($_GET['produs'])) { $rezultat=$v1*$v2; echo "$v1*$v2=".$rezultat;

} ?> </body></html>

Operatori de incrementare/decrementare
Operator ++ Preincrementare ++ Postincrementare -Predecrementare Explicaie ++$x Incrementeaz $x cu 1, apoi l returneaz $x++ Returneaz $x, apoi incrementeaz $x cu 1 --$x Decrementeaz $x cu 1, apoi l returneaz

44 -Postdecrementare $x--

Manual de informatic pentru clasa a XII-a

Returneaz $x, apoi decrementeaz $x cu 1

Exemplu: <?php $x = 8; $y = 5; echo $y++;//se va afisa 5 $x=$y+$x; echo "<br>".$x;//se va afisa 14 $y=($y++)*(--$x); echo "<br>".$x." ".$y;//se va afisa 13 si 78 ?>

Operatori de atribuire
Operatorul de atribuire simpl este '=' i are semnificaia atribuirii valorii expresiei din dreapta, variabilei din stnga (variabil simpl sau structurat). Exemplu: <?php $seria="BV"; $numarul=213446; $persoana="Alexandru Pop"; echo $persoana."are seria de buletin".$seria. "numarul". $numarul ?> Observaii.: n PHP4 este posibil i atribuirea prin referin, cu urmtoarea sintax $var1 = &$var2; aceast atribuire prin referin are semnificaia c cele dou variabile refer aceeai locaie de memorie iar modificarea uneia dintre ele o afecteaz i pe cealalt.

Operatori relaionali
n PHP exist urmtorii operatori aritmetici: Operator < (mai mic) (mai mic sau egal) > (mai mare) Exemplu $x < $y TRUE dac $x este mai mic strict dect $y $x $y TRUE dac $x este mai mic sau egal dect $y $x > $y

45

Limbajul PHP TRUE dac $x este mai mare strict dect $y

(mai mare sau egal)

$x $y TRUE dac $x este mai mare sau egal dect $y

Exemplu: <?php $x=25; $y=89; $raspuns=$x<$y; echo $x."<".$y."=".$raspuns."<br>"; //se va afia TRUE ?>

Operatori de egalitate
== Operator egal Exemplu $x == $y TRUE dac $x este egal cu $y $x === $y TRUE dac $x este egal cu $y i ei sunt de acelai tip $x != $y, x<>y TRUE dac $x este diferit de $y $x !== $y TRUE dac $x este diferit cu $y sau nu au acelai tip Exemplu: <?php $x=25; $y="25"; $z=sqrt(625); $raspuns_1=($x==$y); echo $raspuns_1;// se va afisa TRUE if ($x===$y) echo " x si y nu au acelasi tip"; else if ($x!==$z) { echo "x diferit de z"; /* se va afisa acest mesaj deoarece z este numar real si x este numar intreg*/ $z=5*5; echo ($x===$z);//se va afisa TRUE

=== identic != , <> diferit !==

46 } ?> Observaii:

Manual de informatic pentru clasa a XII-a

Dac vom compara un numr ntreg cu un ir de caractere atunci ir de caractere va fi convertit spre ntreg Dac vom compara dou iruri de caractere, ele vor fi comparate ca i ntregi Funcia var_dump() afieaz informaii referitoare la tipul i valorile variabilelor precizate ca parametri Exemplu: <?php $a= " Manual de PHP"; $b = -140.76 ; $c = true; var_dump($a); // se va afisa string(14) " Manual de PHP" echo "<br>"; var_dump($b); // se va afisa float(-140.76) echo "<br>"; var_dump($c); //se va afisa bool(true) var_dump(0 == "0"); // 0 == 0 se va afisa true var_dump("5" == "05"); // 1 == 1 se va afisa true ?>

Operatori pe bii
Operator & I (AND) | SAU (OR) ^ XOR ~ NOT << Deplasare la stnga Explicaie $x & $y Biii poziionai pe 1 n $x i n $y sunt poziionai la 1 n rezultat $x | $y Biii poziionai pe 1 n $x sau $y sunt poziionai la 1 n rezultat $x ^ $y Biii poziionai pe 1 n $x sau n $y sunt poziionai la 1 n rezultat ~ $x Biii care sunt poziionai pe 1 n $x vor fi poziionai pe 0 i viceversa $x << $y Deplaseaz biii din $x cu $y poziii spre stnga (fiecare pas nseamn multiplicare cu 2)

47 >> Deplasare la dreapta $x >> $y

Limbajul PHP

Deplaseaz biii din $x cu $y poziii spre dreapta (fiecare pas nseamn mprire cu 2)

Exemplu: <?php if( isset($_GET['si']) || isset($_GET['sau']) || isset($_GET['dedr'])) { $v1=(int)$_GET['var1'];$v2=(int)$_GET['var2']; }else { $v1=0; $v2=0; } ?> <html> <head> <title>Formular HTML de prelucrare de date</title> </head> <body> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get"> x=<input name="var1" type="text" value="<?php echo $v1; ?>" > <br> y=<input name="var2" type="text" value="<?php echo $v2; ?>" > <br> <input name="si" type="submit" value="& (and)"> <input name="sau" type="submit" value="| (or)"> <input name="dedr" type="submit" value=">> (rightshift)">

</form> <hr> <?php if (isset($_GET['si'])) { $rezultat=$v1&$v2; echo "$v1&$v2=".$rezultat; } if (isset($_GET['sau'])) { $rezultat=$v1|$v2; echo "$v1|$v2=".$rezultat; } if (isset($_GET['dedr'])) { $rezultat=$v1>>$v2;

48 }

Manual de informatic pentru clasa a XII-a echo "$v1>>$v2=".$rezultat;

?> </body> </html> Observaii n cazul n care parametrii din stnga i dreapta operatorului pe bii sunt iruri de caractere, operatorul pe bii va opera asupra codurilor ASCII ale acestor valori.

Operatori logici
Operator AND OR !NOT XOR Explicaie $x and $y Adevrat dac $x i $y sunt adevrate $x or $y Adevrat dac $x sau $y este adevrat ! $x Adevrat dac $x este fals $x xor $y Adevrat dac $x sau $y este adevrat , dar nu amndou n acelai timp && AND || OR $x && $y Adevrat dac $x i $y sunt adevrate $x || $y Adevrat dac $x sau $y este adevrat

Exemplu: <?php $x=0;$y=2*$x+5;$z=$x-3*$y; echo !$x; //se va afisa 1 echo $x || ($y+2); // se va afisa 1 ?>

Operatori pentru iruri de caractere


Exemplu: <?php $a = " Succes"; $b = $a ." la examen!";//$b contine sirul Succes la examen! echo $b;

49 $a = "<br> Succes"; $a.= " la examen!";// $a contine sirul Succes la examen! echo $a; ?>

Limbajul PHP

Operatorul condiional
Operatorul ternar ?: funcioneaz ca n C. expr1 ? expr2: expr3; Dac expr1 este adevrat atunci se evalueaz expr2, n caz contrar se evalueaz expr3. Exemplu: <?php $x=45;$y=$x-3; $x>2*$y ? $x++: $y--; echo "x=".$x."<br>"."y=".$y; ?>

Operatori de control al erorilor


PHP are un operator de control al erorilor i anume '@'. Cnd acest operator precede o expresie n PHP, orice eroare care poate fi generat va fi ignorat. Dac opiunea track_errors este activat, mesajele de eroare generate de expresie vor fi salvate n variabila global $php_errormsg. Coninutul acestei variabile se reactualizeaz automat la fiecare eroare. Exemplu: <?php $fisier = @file ('fisier inexistent') or die ("eroare la deschiderea fisierului:'$php_errormsg'" ); //inhiba afisarea mesajului de eroare ?>

Operatori de execuie
PHP are un operator de execuie '``' (backticks) care este diferit de ghilimelele simple. PHP va ncerca s execute coninutul dintre aceste ghilimele oblice ca o comand shell. Rezultatul va putea fi atribuit unei variabile. Exemplu: <?php $comanda = `dir /p`; echo "<pre> $comanda </pre>"; //vizualizarea continutului directorului curent ?> Rezumat Prioritatea operatorilor stabilete ordinea de efectuare a operaiilor

50

Manual de informatic pentru clasa a XII-a

Pentru operatorii care au aceeai prioritate, operaiile se efectueaz n funcie de asociativitatea operatorilor: de la dreapta la stnga sau de la stnga la dreapta Operatori aritmetici + adunare - scdere * nmulire / mprire % modulo Operatorul de atribuire = Operatori relaionali < (mai mic) <= (mai mic sau egal) > ( mai mare) >= (mai mare sau egal) Operatori de egalitate == egal === identic != , <>diferit !== diferit Operatori pe bii: &.|, ~ , NOT, << ,>> Operatori pe bii: AND, OR, !, NOT, XOR , &&, AND, OR Operatori de incrementare/decrementare pre/post incrementare++ pre/post-decrementare - Operatori de concatenare ., .= Operatorul ternar ?: Operatori de control al erorilor @ Operatori de execuie ``

Probleme propuse
1. Definii constanta PI i cu ajutorul ei calculai aria i perimetrul unui cerc de raz 120. 2. Afiai ctul i restul mpririi a dou numere naturale. 3. Afiai primii 5 multipli ai unui numr dat a, definit ca o constant . 4. Calculai suma, produsul i media aritmetic a trei numere reale date.

51

Limbajul PHP

5. Se citesc trei valori ntregi a,b,c. Sa se calculeze valoarea expresiilor: E1=a+b-c E2=3*E1*b E3=(a-E2)*(b-c) 6. Folosind operatorul condiional, s se calculeze maximul dintre numerele reale a, b si c. 7. Se dau 3 cuvinte c1, c2, c3. Afiai frazele formate din aceste cuvinte scrise n ordine, n toate modurile posibile. 8. Fiind dat un numr pozitiv care reprezint un an calendaristic s se verifice dac anul este bisect, conform calendarului gregorian. 9. ntr-o coal sunt n elevi , dintre care m sunt n clasa a-XII a. S se afieze procentual ci elevi din coal sunt n ultimul an de liceu. 10. Se citesc coordonatele a patru puncte P1, P2, P3, P4 din plan (abscisa si ordonata). S se afle lungimea segmentului determinat de punctele (P2,P4) i (P1,P3). Afiai care dintre cele dou segmente este mai mare. 11. Se d un unghi in secunde, s se transforme n grade, minute si secunde. 12. Se dau dou unghiuri adiacente, sa se calculeze unghiul complementar lor. 13. Ce va afia programul: <?php $x=4;$y=20; $z=($x<<3) XOR ($y>>2); echo $z; ?> 14. Se citesc de la tastatur a i b numere ntregi. Folosind operatorul condiional calculai maximul dintre (3*a-b) i (a%b+b/3) 15. Se consider a=8, b=7 i c=0, ce valoarea vor avea expresiile ? E1=a&b & (!c) E2=(!a)||(!c) E3=a||c; 16. Fie a=12 b=4 . Calculai i afiai la fiecare pas, valorile expresiilor urmtoare i noile valori ale lui a i b. (a++)+(b- -) (++a) - - a + - -b b= =a%3 b=(b++)*8 17. Considerm a=8, b=5 i x=1,y=2, z=3.Care este rezultatul obinut n urma evalurii expresiilor? E1=(a! =b)?(a++)%(--b) : a/b; E2=x+z%2+z/y+(z= =++y)*(x | | (y-1))

52

Manual de informatic pentru clasa a XII-a

Structuri de control
Structuri alternative
n PHP scripturile sunt o succesiune de instruciuni. O instruciune poate fi o instruciune vid, de atribuire, condiional, repetitiv sau un apel de funcie. Instruciunile pot fi grupate n blocuri de instruciuni delimitate de acolade, ' {}'.

Instruciunea if
Sintaxa: if (expresie) { list de instruciuni } Principiul de execuie: n urma evalurii expresiei, dac rezultatul acestei evaluri este TRUE, PHP va executa instruciunile din lista de instruciuni, iar dac este FALSE, blocul de instruciuni delimitate {} nu se vor executa. Exemplu: if ($x>100) echo $x." este mai mare decat 100"; Observaii: Instruciunile if pot fi imbricate pe oricte niveluri dorim obinndu-se o structur condiional extrem de flexibil. Dac dorim s executm dou instruciuni diferite n funcie de valoarea de adevr a unei expresii vom folosi o instruciune if-else if (expresie) { list de instruciuni_1 } else { list de instruciuni_2 } Exemplu: <?php $x=-17;$y=3*$x-2; if ($x>$y) echo $x." este mai mare decat ".$y; else echo $y." este mai mare decat ".$x; ?>

53

Limbajul PHP

n PHP, o alt variant a instruciunii ifelse poate fi utilizat sub forma ifelseif. Ca i else, instruciunea elseif extinde o instruciune if pentru a executa alte instruciuni n cazul n care expresia condiional din if este FALSE. Spre deosebire de else, instruciunea alternativ va fi executat doar dac expresia condiional din elseif este TRUE. Sintaxa: if (expresie) { list de instruciuni_1 } elseif (expresie) { list de instruciuni_2 } else { list de instruciuni_3 } Principiul de execuie: Se evalueaz (expresie), primul elseif care va fi evaluat la TRUE va fi executat. Observaii: Instruciunea poate fi scris i Comportamentul su va fi acelai n dou cuvinte: else if.

Instruciunile elseif se pot imbrica pe mai multe niveluri, dup un if iniial Exemplu: <html> <head> <title>Formular HTML de prelucrare de date</title> </head> <body> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get"> <p> alege materia preferata </p> Informatica <input type="checkbox" name="info"><br> Matematica <input type="checkbox" name="mate"><br> Fizica <input type="checkbox" name="fizica"><br> Chimia <input type="checkbox" name="chimie"><br> <input name="do" type="submit" value="Afiseaza"> </form> <hr>

54 <?php

Manual de informatic pentru clasa a XII-a

if } if } if } if

(isset($_GET['info'])) { echo "<p>Informatica</p>"; (isset($_GET['mate'])) { echo "<p>Matematica</p>"; (isset($_GET['fizica'])) { echo "<p>Fizica</p>"; (isset($_GET['chimie'])) { echo "<p>Chimie</p>";

} ?> </body></html>

Instruciunea switch
Sintaxa: switch (expresie) { case expresie_1: lista_instrcuiuni_1;break; case expresie_2: lista_instrcuiuni_2;break; ... case expresie_n: lista_instrcuiuni_n;break; [default:lista_instrcuiuni;] } Principul de execuie : se evalueaz expresie, dac n urma evalurii valoarea este egal cu expresie_i, se execut instruciunile specificate n lista de instruciuni asociat lista_instrcuiuni_i, altfel se execut numai lista de instruciuni specificat pe ramura default. Dac nu este specificat instruciunea

55

Limbajul PHP

break la sfritul unui bloc case, PHP va continua s execute instruciunile din urmtorul bloc case. Observaii: Expresia folosit n instruciunea switch este o expresie de tip ntreg i expresie_1,expresie_n sunt constante de tip ntreg. Alternativa default este facultativ Lista de instruciuni a unei constante case poate fi vid; n acest caz PHP va utiliza lista de instruciuni din case-ul urmtor n comanda switch, condiia este evaluat o singur dat i rezultatul este comparat cu fiecare constant case. ntr-o instruciune elseif, condiia este reevaluat. Dac condiia voastr este mai complicat dect o simpl comparaie sau apare ntr-o bucl, instruciunea switch se poate dovedi mai rapid. Exemplu: <?php $x=9; switch( $x) { case 100: echo $x ." este egal cu 100";break; case 1000:echo $x ." este egal cu 1000";break; case 10000:echo $x ." este egal cu 10000";break; case 1: case 3: case 5: case 7: case 9:echo $x ." este o cifra impara";break; case 0:echo $x ." este egal cu 0"; } ?>

Structuri repetitive
Instruciunea while
Sintaxa : while( expresie) { list_instruciuni } Principiul de execuie: se evalueaz expresia i atta timp ct rezultatul obinut n urma evalurii este TRUE, se execut instruciunile din corpul structurii repetitive. Ieirea din structura repetitiv are loc n momentul n care rezultatul obinut n urma evalurii expresiei este FALSE.

56 Observaii:

Manual de informatic pentru clasa a XII-a

Dac expresia while este FALSE n urma primei evaluri, lista de instruciuni nu va fi niciodat executat. Mai multe instruciuni pot fi executate ntr-o structur while grupndu-le ntre acolade pentru a forma un bloc Exemplu: <?php $x=1; while($x<100) { echo $x." "; $x=$x+2;// afisare numerelor impare mai mici decat 100 } ?>

Instruciunea do..while
Sintaxa : do { list_instruciuni } while( expresie); Principiul de execuie: se execut lista de instruciuni, apoi se evalueaz expresia i atta timp ct rezultatul obinut n urma evalurii este TRUE, se execut instruciunile din corpul structurii repetitive. Ca i n cazul structurii while, ieirea din structura repetitiv are loc n momentul n care rezultatul obinut n urma evalurii expresiei este FALSE. Observaii: Instruciunile din structura repetitiv do..while se execut cel puin o dat, chiar dac la prima evaluare a expresiei rezultatul este FALSE. Mai multe instruciuni pot fi executate ntr-o bucl while grupndu-le ntre acolade pentru a forma un bloc Exemplu: <?php $P=1;$i=2; do { $P=$P+$i;//calculul lui 17! $i++; } while($i<=17); echo "17!=".$P; ?>

57

Limbajul PHP

Instruciunea for
Sintax: for( expr1; expr2; expr3) { list_instruciuni } Execuia: se evalueaz (expr1) (executat) o singur dat, necondiionat, la intrarea n structura repetitiv. La nceputul fiecrei iteraii, expresia expr2 este evaluat. Dac rezultatul obinut n urma evalurii este TRUE, se execut instruciunile din lista de instruciuni. Dac rezultatul evalurii devine FALSE, structura repetitiv se oprete. La sfritul fiecrei iteraii, expresia expr3 este evaluat (executat). Observaii: Expresiile pot fi eventual vide. Dac expresia expr2 este vid, structura repetitiv este infinit Exemplu: Urmtoarele secvene echivalente afieaz numerele naturale mai mici dect 256 <?php for($i=1;$i<=256;$i++) echo $i; ?> <?php $i = 1; for(;;){ if($i>256) break; echo $i;$i++; } ?>

Instruciunea break
Instruciunea break permite ieirea dintr-o instruciune if, for, while sau switch. Instruciunea break accept un argument numeric opional care va indica numrul de instruciuni imbricate care trebuiesc ntrerupte. Exemplu: <?php $S=0; for ($i=20;$i<=100;$i++) { $S=$S+$i; if ($S>50)//iesire din structura repetiva break; echo $i."<br>"; } echo $S."<br>";//se va afisa 63=20+21+23

58

Manual de informatic pentru clasa a XII-a

Instruciunea continue
Instruciunea continue este utilizat ntr-o structur repetitiv pentru a realiza saltul peste instruciunile urmtoare pn la sfritul blocului; execuia iteraiei curente este ntrerup i se trece la execuia iteraiei urmtoare. Instruciunea continue accept un argument numeric opional care va indica cte bucle imbricate vor fi ignorate. Exemplu: <?php for ($i=20;$i<=100;$i++) { //afisarea numerelor impare din intervalul [20,100] if ($i%2==0) continue; echo $i."\t"; } ?> Rezumat Structuri de control: Structura alternativa este reprezentat de instruciunile: if, if..else, if..elseif, switch Structura repetitiv este reprezentat de instruciunile: while, do while, for Instruciunea break permite ieirea dintr-o structur alternativ sau repetitiv Instruciunea continue realizeaz saltul peste instruciunile urmtoare pn la sfritul blocului de instruciuni.

Probleme propuse
1. Pe baza unui meniu s se calculeze: suma, diferena, ctul i produsul pentru dou numere reale. 2. Cunoscnd ziua, luna i anul (date numerice) n care s-a nscut colegul vostru de banc, verificai dac aceste date sunt corecte i dac da afiai aceste date sub forma: an, denumire luna, zi. 3. S se calculeze expresia S=1!+2!+3!+...+78! 4. Se consider o succesiune de caractere de '1' i '0' din care primul caracter este '1'. Aceast secven este reprezentarea n baza 2 a unui numr natural. S se afieze acest numrul n baza 10. 5. Se citete un numr natural n. S se determine toate numerele care pot fi obinute prin permutri circulare mutnd ultima cifr pe prima poziie. 6. Se introduce un numr de la tastatur. S se afle numrul minim care se obine prin eliminarea unei singure cifre din numr. 7. Se citete un numr natural n. S se verifice i s se afieze un mesaj dac este numr prim, altfel s se afieze divizorii si proprii.

59

Limbajul PHP

8. S se afieze divizorii unui numr natural n. Numrai ci dintre divizorii si sunt numere prime. 9. S se determine cmmdc a n numere naturale citite 10. S se scrie un program care calculeaz suma a dou fracii ordinale 11. Se citete un numr natural. S se stabileasc dac acesta este un termen n irul Fibonacci. 12. S se afieze toate numerele din irul lui Fibonacci mai mici dect o valoare dat.

Tablouri
n PHP tablourile sunt de dou tipuri: tablouri indexate i tablouri asociative. Tablourile indexate sunt tablouri care folosesc indici numerici iar cele asociative folosesc indici de tip ir de caractere. n PHP tablourile nu se declar i se pot crea utiliznd funciile list() i array() sau, se pot seta explicit valorile fiecrui element al tabloului. n cele ce urmeaz vom prezenta crearea tablourilor prin setarea explicit a valorilor i prin crearea cu ajutorul construciei array().

Tablouri unidimensionale
n PHP, tablourile unidimensionale sunt tablouri simple(vectori) indexate sau asociative. Crearea tablourilor prin setarea explicit a valorilor Setarea explicit a valorilor unui vector presupune specificarea valorii atribuite fiecrui element, al crui indice este de asemenea precizat. Indicii pot fi numerici sau asociativi(iruri de caractere) iar valorile elementelor din vectori pot avea orice tip scalar(ntreg, boolean, ir de caractere). Sintaxa $identificator_vector[indice]=valoare; Exemplu: <?php // crearea unui vector indexat $a[1]=-7;$a[2]=-5; $a [3]=0; echo "Elementele vectorului "; for($i=1;$i<=3;$i++) // afisarea elementelor vectorului echo $a[$i]." "; //crearea unui vector asociativ $b["materia"]="informatica"; $b["limbajul"]="PHP"; $b["clasa"]="12B"; echo "<br>Elementele vectorului asociativ <br>"; echo $b["materia"].", ".$b["limbajul"].", ".$b["clasa"]; ?>

60 Observaii

Manual de informatic pentru clasa a XII-a

Pentru tablourile indexate, parcurgerea elementelor vectorului este natural i se face cu ajutorul unei variabile(variabila de ciclare) care va lua pe rnd valorile indicilor elementelor din tablou Pentru tablourile asociative, utilizarea indicilor de acest tip, creeaz probleme n parcurgerea elementelor deoarece numrul de componente este necunoscut, la fel ca i valorile variabilei de ciclare. $_GET[...] i $_POST[...] sunt tablouri asociative.

Instruciunea foreach
Aceast instruciune are rolul de a facilita parcurgerea unui vector indiferent de tipul acestuia, indexat sau asociativ. Sintaxa: foreach (identificator_vector as $valoare) instruciune; Exemplu: <?php $a[1]=-7;$a[2]=-5;$a[3]=0; echo "Elementele vectorului "; foreach ($a as $val) echo $val." ";// se va afisa: -7 -5 0 $b["materia"]="informatica"; $b["limbajul"]="PHP"; $b["clasa"]="12B"; echo "<br>Elementele vectorului asociativ <br>"; foreach ($b as $denumire) echo $denumire." ";// se va afisa: informatica PHP 12B ?> Aceast sintax se utilizeaz atunci cnd n parcurgerea tablourilor nu intervin i valorile indicilor. Pentru a accesa valorile indicilor elementelor din vector, se poate utiliza urmtoarea variant: foreach (identificator_vector as $indice => $valoare) instruciune; Exemplu: <?php for ($i=1;$i<=6;$i++) $a[$i]=2*$i;// se creeaza un vector cu 6 elemente echo "Elementele vectorului "; foreach ($a as $i=>$v) echo " a[".$i."]=".$v; // se va afisa a[1]=2 a[2]=4 a[3]=6 a[4]=8 a[5]=10 // a[6]=12 $b["materia"]="informatica"; $b["limbajul"]="PHP";

61 $b["clasa"]="12B"; echo "<br>Elementele vectorului asociativ <br>"; foreach ($b as $i=>$denumire) echo "<br>".$i."=".$denumire." "; // se va afisa: //materia=informatica // limbajul=PHP // clasa=12B ?> Crearea tablourilor prin construcia array() Sintaxa: $identificator_vector=array( [indice1=>]val_1, [indice2=>]val_2, ... [indice_n]=>val_n); Exemplu: <?php $a=array(1=>-7,2=>-5,3=>0); // crearea unui vector cu 3 elemente echo "Elementele vectorului "; foreach ($a as $i=>$v) echo $v." ";//afisarea elementelor vectorului $b=array( "materia"=>"informatica", "limbajul"=>"PHP", "clasa"=>"12B");//crearea vectorului asociativ echo "<br>Elementele vectorului asociativ <br>"; foreach ($b as $i=>$denumire) echo "<br>".$i."=".$denumire." "; // afisarea vectorului ?> Observaii

Limbajul PHP

Specificarea indicilor este opional. n cazul n care valorile indicilor nu sunt precizate, primul element al vectorului va avea implicit valoarea indicelui egal cu 0. $x=array("a","b","c"); echo $x[0]." ".$x[1]." ".$x[2];// se va afisa a b c n construirea vectorului cu array, perechile indice=>valoare pot fi precizate n orice ordine $a= array(7, 0, 1, 4 => 1, 3 => 1, 19, 5 => 13); Elementele din vector a cror indici nu au valori precizate, li se vor atribui valori n continuare, pornind de la ultimul indice fixat manual. $zile=array(1=>"Luni",2=>"Marti",

62

Manual de informatic pentru clasa a XII-a

"Miercuri","Joi","Vineri"); echo $zile[3]." ".$zile[4]." ".$zile[5]; // se va afisa Miercuri, Joi, Vineri

Tablouri multidimensionale
Tablourile multidimensionale sunt tablouri simple cu mai multe dimensiuni. n PHP, nu exist restricii n ceea ce privete natura elementelor i indicilor unui tablou multidimensional. n acest sens indicii asociativi i numerici se pot combina. Exemplu: crearea unui tablou bidimensional, ce memoreaz datele unor elevi <?php $a = array( 1 => array( "nume" => "Dragomir Alin", "clasa" => "12A", "media" => "7.50" ), 2 => array( "nume" => "Popescu Andrea", "clasa" => "11D", "media" => "9.90" ), 3 => array( "nume" => "Marin Iulia", "clasa" => "12B", "media" => "8.90" ) ); echo $a[2]["clasa"];// va afisa 11D echo $a[3]["nume"]." ".$a[3]["media"]; //va afisa Marin Iulia 8.90 ?> Exemplu: crearea i afiarea unei matrice ce memoreaz numere ntregi <?php for($i=1;$i<=5;$i++) for($j=1;$j<=4;$j++) $a[$i][$j]=abs($i-$j); for($i=1;$i<=5;$i++) { echo "<br>"; for($j=1;$j<=4;$j++) echo $a[$i][$j]." "; } ?>

63

Limbajul PHP

Funcii utile n prelucrarea tablourilor


funcia var_dump() afieaz numrul de elemente al unui vector, tipul i dimensiunea fiecrui element Exemplu: <?php $a = array(1,"Andrea",56.75); var_dump($a); // se va afisa //array(3) //{[0]=>int(1) // [1]=>string(7) "Andrea" // [2]=>float(56.75) } ?> funcia print_r() afieaz elementele vectorului Exemplu: <?php $a=array(5,-8,12,-3); print_r($a); // afiseaza //Array ([0] =>5 [1] =>-8 [2] =>12[3] => -3 ) ?> funcia count() numr elementele unui vector Exemplu: <?php $a=array(5,-8,12,-3,8,2); echo count($a);//se va afisa 6 ?> funcia unset() terge elementele vectorului Exemplu: <?php $a=array(5,-8,12,-3,8,2); unset($a[3]); //sterge elementul cu indicele 3 din matrice // se va sterge elementul -3 print_r($a); // Array ([0]=>5 [1]=>-8 [2]=>12 [4] =>8 [5]=>2) unset($a); //sterge intreaga matrice ?> funciile next(), current(), prev(), end() permit accesul la elementele unui vector Exemplu: <?php $a=array(5,-8,12,-3,8,2);

64 $b=current($a);// b=5 $c=next($a);// c=-8 $d=end($a)// d=2 ?>

Manual de informatic pentru clasa a XII-a

funcii specializate pentru sortarea vectorilor: sort() rsort() asort() ksort() usort() - sortare cresctoare dup valorile elementelor - sortare descresctoare dup valorile elementelor - sortare cresctoare cu pstrarea indicilor - sortare cresctoare dup valorile indicilor - sortare dup un anumit criteriu specificat prin intermediul unei funcii definite de utilizator

arsort() - sortare descresctoare cu pstrarea indicilor

uasort() - sortare de tip usort cu pstrarea indicilor uksort() - sortare de tip usort , dup valorile indicilor Exemplu: <?php $a=array(5,-8,12,-3,8,2); sort($a); print_r($a); //Array ( [0] => -8 [1] => -3 [2] => 2 [3] => 5 [4] => 8 [5] => 12 ) $b=array(5,-8,12,-3,8,2); asort($b);//sortare cu pastrarea indicilor print_r($b); //Array ( [1] => -8 [3] => -3 [5] => 2 [0] => 5 [4] => 8 [2] => 12 ) $c=array(4=>"Joi",1=>"Luni",3=>"Miercuri",2=>"Marti"); ksort($c);// sortare dupa indici print_r($c); //Array ( [1] => Luni [2] => Marti [3] => Miercuri [4] => Joi ) $a=array(5,-8,12,-3,8,2); arsort($a); //sortare descrescatoare dupa valorile elementelor print_r($a); //Array ( [2] => 12 [4] => 8 [0] => 5 [5] => 2 [3] => -3 [1] => -8 ) ?> funcii specializate pentru operaii specifice mulimilor array_intersect(tablou1, elementelor celor dou tablouri tablou2)realizeaz intersecia

65

Limbajul PHP

array_diff(tablou1,tablou2)- realizeaz diferena dintre mulimea elementelor primului tablou i mulimea elementelor celui de-al doilea tablou specificat ca parametru Exemplu <?php $a = array("LUNI","MARTI","VINERI"); $b = array("VINERI","JOI","MARTI","MIERCURI"); $c = array_intersect($a, $b); echo "<br> Intersectia este "; print_r($c); echo "<br> Diferenta este "; $d = array_diff($a, $b); print_r($d); ?> Rezumat n PHP tablourile sunt de dou tipuri: - tablouri indexate (indici numerici) - tablouri asociative(indici de tip ir de caractere) Valorile elementelor unui tablou pot fi de orice tip scalar (ntreg, boolean, ir de caractere) n PHP, nu exist restricii n ceea ce privete natura elementelor i indicilor unui tablou multidimensional. n acest sens indicii asociativi i numerici se pot combina. n PHP tablourile nu se declar i se pot crea utiliznd funciile list() i array() sau, se pot seta explicit valorile fiecrui element al tabloului

Probleme propuse
1. Memorai ntr-un vector numele, codul numeric personal, seria, numrul de buletin, strada , numrul strzii i localitatea unei persoane. Afiai pe cte un rnd de ecran fiecare element al vectorului. 2. Definii ntr-un tablou multidimensionale caracteristicile obiectelor dintrun depozit de marfa: denumire, cantitate, pre, numr de buci. 3. Memorai cu ajutorul unui tablou datele referitoare la medicamentele existente ntr-o farmacie, pentru fiecare medicament se va memora denumire, productor, pre, data expirrii, cantitate existent n stoc. 4. S se memoreze ntr-un vector primii 20 de termeni ai irului lui Fibonacci. 5. Cunoscnd primul termen i raia unei progresii aritmetice, generai ntrun tablou unidimensional primii 20 de termeni ai progresiei aritmetice definite de aceste dou valori date. 6. Memorai ntr-un tablou caracterele unui cuvnt. Verificai dac acest cuvnt are toate literele distincte.

66

Manual de informatic pentru clasa a XII-a

7. Se citesc dou mulimi A i B de numere reale (fiecare ntr-un vector de valori diferite). S se afieze mulimea U=AB (reuniunea mulimilor). I=AB (intersecia mulimilor). D=A\ B (diferena mulimilor). 8. S se memoreze pe linii i coloane, ntr-o matrice ptratic de dimensiune n, primele n2 numere naturale. 9. Memorai ntr-un tablou numele unor elevi. Sortai alfabetic elevii. 10. tergei dintr-un tablou unidimensional toate elementele care au indici impari. 11. S se ordoneze descresctor elementele de pe fiecare coloan a unei matrice. 12. S se elimine dintr-o matrice dat o anumit linie.

Funcii
Funciile definite de utilizator
n PHP, o funcie poate s conin orice cod PHP valid, chiar alte funcii i definiii de clase. O funcie poate fi definit de utilizator astfel: function nume_functie( $arg1, $arg2, ..., $argN) { ... return $retval; } n PHP3, funciile trebuie s fie definite nainte de a fi refereniate i nu se accept numr variabil de argumente n antetul funciilor, doar argumente implicite; n PHP4 nu exist o asemenea restricie. Exemplu: <?php function afisare($a) { echo $a; } afisare(6); afisare("Hello!"); afisare(45.78); ?>

Argumentul funciilor
Informaiile pot fi transmise funciilor printr-o list de argumente. n aceast list variabilele i/sau constantele sunt delimitate prin virgul. Exemplu <?php

67 function afisare_suma($a,$b) { echo $a+$b; } afisare_suma(6,20);//va afisa 26 afisare_suma(45.78,-50);//va afisa -4.22 ?>

Limbajul PHP

Transmiterea argumentelor
Transmiterea argumentelor se poate face prin valoare (implicit), prin referin i argumente cu valori implicite. Listele cu numr variabil de argumente sunt acceptate doar n versiunea PHP4. Implicit, argumentele funciilor sunt transmise prin valoare (n sensul c schimbarea valorii argumentului n interiorul funciei nu se reflect i n afara funciei). Un argument al unei funcii transmis prin referin, trebuie precedat de semnul '&' n definiia funciei. Exemplu: <?php function afisare($a,$b) { echo "<br> a=".$a." b=".$b; } function modific(&$a,$b) { $a++;$b--; afisare($a,$b);//va afisa 11 4 } $a=10;$b=5; afisare($a,$b);//va afisa 10 5 modific($a,$b); afisare($a,$b);//va afisa 11 5 ?>

Valorile returnate de funcii


Valorile sunt returnate folosind opional instruciunea return. Poate fi returnat orice tip de rezultat, inclusiv tablouri i obiecte. Exemplu: <?php function prim($a) { for($i=2;$i<=sqrt($a);$i++) if ($a%$i==0) return 0; return 1; } $a=10;$b=17;

68 echo prim($a);//va afisa 0 echo prim($b);// va afisa 1

Manual de informatic pentru clasa a XII-a

O funcie nu poate returna valori multiple, dar mai multe rezultate pot fi obinute prin returnarea unui tablou. Exemplu: <?php function calcule($a,$b,$c) { $S=$a+$b+$c; $P=$a*$b*$c; $Ma=(float)($a+$b+$c)/3; return array ($S,$P,$Ma); } $vector=calcule(10,7,-4); echo " Suma este ".$vector[0];// va afisa 13 echo " Produsul este ".$vector[1];// va afisa -280 echo " Media aritmetica este ".$vector[2];// va afisa ?> Rezumat n PHP o funcie poate fi definit conform sintaxei: function nume_functie( $arg1, $arg2, ..., $argN) { ... return $retval; } Transmiterea argumentelor se poate face prin valoare (implicit), prin referin. Argumentele transmise prin referin trebuie precedate de semnul &. Valorile sunt returnate cu ajutorul instruciunii return O funcie nu poate returna valori multiple, dar mai multe rezultate pot fi obinute prin returnarea unui tablou

4.33

Fiiere
n PHP, fiierele se creeaz n spaiu alocat pe server ceea ce presupune o facilitate n plus pentru gestionare a datelor trimise de cei care viziteaz un site. Operaiile efectuate asupra fiierelor sunt cunoscute: deschiderea/ nchiderea unui fiier, citirea coninutului unui fiier, adugare i scrierea datelor ntr-un fiier. n cele ce urmeaz vom prezenta principalele funcii necesare n prelucrarea fiierelor. fopen (nume_fisier,mod_acces) deschide fiierul indicat.

69 mod 'r' 'r+' 'w' Descriere

Limbajul PHP

Deschidere pentru citire, plaseaz pointerul de fiier la nceput. Deschidere pentru citire i scriere, plaseaz pointerul de fiier la nceput Deschidere doar pentru scriere; plaseaz pointerul de fiier la nceput. Dac fiierul exist coninutul su va fi rescris altfel fiierul se va crea. Deschidere pentru citire i scriere; plaseaz pointerul de fiier la nceput. Dac fiierul exist coninutul su va fi rescris altfel fiierul se va crea. Deschidere doar pentru scriere. Dac fiierul exist, plaseaz pointerul de fiier la sfrit altfel fiierul se va crea. Deschidere pentru citire i scriere. Dac fiierul exist, plaseaz pointerul de fiier la sfrit altfel fiierul se va crea.

'w+'

'a' 'a+'

fclose(identificator_fisier) nchide fiierul curent. fwrite(identificator_fisier, sir) scrie n fiier irul specificat. Dac scrierea nu se poate face, funcia returneaz -1, altfel returneaz dimensiunea n octei a fiierului scris fputs(identificator_fisier, sir) este un alias pentru funcia fwrite is_writable(identificator_fisier) returneaz TRUE dac se poate scrie n fiier i FALSE n caz contrar Exemplu: Scrierea datelor n fiier <?php $f = "date.out"; if (is_writable($f)) // verificarea accesului pentru scriere { echo "Avem acces pentru scriere"; $f=fopen("date.out","w"); if ($f) // verificarea deschiderii fiierului { echo "Fisierul poate fi deschis"; fwrite($f,"Scrierea datelor in fisier"); $a=6;$b=67; fputs($f,$a+$b);// scrie in fisier 73 fclose($f); } else echo "Fisierul nu poate fi deschis"; }

70 else ?>

Manual de informatic pentru clasa a XII-a

echo "Nu se poate scrie in fisier";

Exemplu: Scrierea unei matrice n fiier <?php $f = "matrice.txt"; $f=fopen("matrice.txt","w"); for($i=1;$i<=5;$i++) { fwrite($f,"\n"); for($j=1;$j<=5;$j++) { fwrite($f,$i+$j);fwrite($f, " } } fclose($f); ?>

");

fread(identificator_fisier, nr_octeti) citete din fiier un numr specificat de octei filesize(identificator_fisier) returneaz dimensiunea n octei a fiierului specificat sau FALSE n caz de eroare is_readable(identificator_fisier) returneaz TRUE dac fiierul poate fi accesat pentru citire i FALSE n caz contrar Exemplu: <?php $f = "matrice.txt"; $f=fopen("matrice.txt","r"); //deschiderea fiierului creat anterior $trei_numere=fread($f,8); echo "primele trei numere din fisier sunt ".$trei_numere; ?> fgetc(identificator_fisier) returneaz un caracter citit din fiier sau FALSE n cazul n care s-a ajuns la sfritul de fiier fgets(identificator_fisier,dim) returneaz un ir de maxim dim-1 octei citii din fiierul indicat. Citirea se ncheie cnd au fost citii dim-1 octei, cnd se citete new line (este inclus n valoarea returnat) sau EOF. Dac apare o eroare la citire returneaz FALSE feof(identificator_fisier)returneaz TRUE dac pointerul de fiier este poziionat pe EOF sau n caz de eroare, altfel returneaz FALSE. Exemplu: <?php $f = "matrice.txt"; $f=fopen("matrice.txt","r");

71 if ($f) { while(!feof($f)) { $linie=fgets($f,100); // citirea unei linii din matrice echo "<br> s-a citit din fisier".$linie; } fclose($f); } else echo "fisier inexistent"; ?>

Limbajul PHP

copy(fisier_sursa, fisier_destinatie) funcia copiaz un fiier surs ntr-un fiier destinaie. Returneaz TRUE dac copierea s-a realizat cu succes i FALSE n caz contrar. Exemplu: <?php $f = "matrice.txt"; $g = "matrice2.txt"; if (!copy($f, $g)) echo "eroare la copiere"; else echo "copierea s-a efectuat cu succes"; ?> fseek(identificator_fisier,valoare,poziie_start) poziioneaz indicatorul de fiier la valoarea(numr de octei) specificat. Specificatorul poziie_start poate lua urmtoarele valori: SEEK_SET SEEK_CUR SEEK_END Exemplu: Urmtorul exemplu prezint un formular pentru up-load de fisiere: Poziionarea pointerului se face relativ la nceputul fiierului Poziionarea pointerului se face relativ la poziia curent Poziionarea pointerului se face relativ la sfritul fiierului

72

Manual de informatic pentru clasa a XII-a

<html><head> <title>..::INFORMATICA::..</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head><body> <div align="center"> <!-- begin tabel cu form--> <form action="f-u.php" method="post" enctype="multipart/formdata"> <TABLE width="100%" align=center> <TBODY> <tr><td> <div align="center">Trimite solutiile tale </div> </td></tr> <tr><td> <div align="center">&nbsp;Numele <select name="nume"> <option value="">..</option> <option value="popa">POPA</option> <option value="radu">RADU</option> <option value="vasile">VASILE</option> </select> </div> </td></tr> <tr><td> <div align="center">&nbsp;fisier 1: <input name="userfile[]" type="file" size="50"> <br> &nbsp;fisier 2: <input name="userfile[]" type="file" size="50"> </div> </td></tr> <tr><td> <div align="center"> <input name="submit" type="submit" value="Trimite Fisierele"></div> </td></tr> </TBODY> </TABLE> <!-- end tabel cu form--> </form> </div> <hr > </body> </html> Scriptul de prelucrare a formularului este: <html> <head> <title>Rezultat Upload Fisiere</title>

73

Limbajul PHP

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head><body > <?php $dir_up="/up/"; $nume=$_POST["nume"]; $fis1=$dir_up.$nume."/".$_FILES['userfile']['name'][0]; $fis2=$dir_up.$nume."/".$_FILES['userfile']['name'][1]; if($nume!="") { if(@move_uploaded_file($_FILES['userfile']['tmp_name'][0], $fis1)) echo "<div align='center'><h3>fisierul ". $_FILES['userfile']['name'][0]." s-a copiat cu succes! </h3></div>"; if(@move_uploaded_file($_FILES['userfile']['tmp_name'][1], $fis2)) echo "<div align='center'><h3>fisierul ". $_FILES['userfile']['name'][1]." s-a copiat cu succes! </h3></div>"; }else echo "<div align='center'><h3>NU ai ales numele </h3></div>"; ?> </body></html> Rezumat Limbajul PHP conine funcii pentru gestiunea fiierelor. Principalele funcii sunt: - deschiderea unui fiier: fopen() folosind ca moduri de acces r,r+,w,w+,a,a+ - nchiderea unui fiier: fclose() - citirea coninutului unui fiier : fgetc,fgets,fread - adugare i scrierea datelor ntr-un fiier: fwrite, fputs Alte funcii necesare n prelucrarea is_writable(), is_readable() fiierelor: feof(), fseek(),

Probleme propuse
1. Memorai ntr-un fiier primele 100 de numere naturale prime. 2. Se d fiierul numere.txt, care conine numere naturale, cte un numr pe linie. S se creeze fiierul prime.txt, care s conin numerele prime din fiierul iniial, scrise pe o singur linie i desprite printr-un spaiu. 3. Un fiier conine pe mai multe linii, numere ntregi desprite prin spaii. S se scrie la sfritul fiierului, media lor aritmetic.

74

Manual de informatic pentru clasa a XII-a

4. Un fiier text conine pe prima linie un numr natural n reprezentnd numrul de elemente ale unui ir, iar pe urmtoarele dou linii, cte n numere ntregi desprite prin spaii. S se scrie la sfritul fiierului, un al treilea ir coninnd produsul elementelor de acelai rang din cele dou iruri. 5. Se citesc dintr-un fiier text, date referitoare la crile existente ntr-o bibliotec titlul, numele autorului i anul apariiei. Datele referitoare la o carte se afl pe o linie din fiier. a. afiai pe ecran toate crile din bibliotec i precizai care este numrul acestora b. tergei din fiier ultimele k cri memorate 6. S se verifice identitatea coninutului a dou fiiere text. Dac nu sunt identice, s se afieze primele dou linii din cele fiiere, care nu coincid. 7. S se creeze un fiier text care s conin pe fiecare linie, numele unei ri i culorile coninute de drapelul su. S se scrie ntr-un alt fiier, pe o singur linie i desprite prin spaiu, numele tuturor rilor din fiierul iniial, care conin n drapelul lor, o culoare citit de la tastatur. 8. Fiind date dou fiiere text, s se creeze un al treilea fiier intercalnd una cte una, liniile celor dou fiiere iniiale. 9. S se compare dou fiiere text cu numr egal de linii i s se afieze cte linii distincte sunt n cele dou fiiere. 10. S se numere i s se afieze cuvintele care apar ntr-un fiier text, precum i numrul de apariii al fiecrui cuvnt. 11. Se d un fiier text. S se creeze un nou fiier text care s conin cuvintele din primul fiier i frecvena lor de apariie, n ordine alfabetic. 12. Se consider un fiier text. S se creeze un alt fiier text care s conin numerele liniilor din fiierul iniial, care conin primul cuvnt memorat n fiierul dat. 13. S se copieze fiierul text text1.txt, din rdcina discului D, n fiierul text text2.txt, din directorul curent de lucru, caracter cu caracter. 14. S se numere apariiile unui cuvnt, ntr-un fiier text dat. 15. Afiai ntr-un fiier text, o matrice cu 10 linii i 10 coloane, care are pe linia i i pe coloana i, toate elementele egale cu i+1.

Aplicaii
Pentru urmtoarele probleme realizai formulare de colectare a informaiilor, preluai datele din formular cu ajutorul unui script PHP i afiai-le pe ecran n form tabelar. Coloana din stnga va conine numele cmpurilor iar n coloana din dreapta valorile introduse. 1. Realizai un formular pentru colectarea datelor legate de personalul unei firme. Se vor reine urmtoarele informaii: codul angajatului, numele, funcia. locul de munca, salariul.

75

Limbajul PHP

2. Pentru participarea la un concurs naional de comunicri, organizatorii au pregtit un formular on-line de nregistrare. El permite introducerea urmtoarelor informaii:: numele, coala, localitatea, seciunea la care particip, sexul, parola. 3. O firm ce recepioneaz produse de la diveri furnizori, are o aplicaie de eviden orientat spre web. Astfel o pagin permite nregistrarea urmtoarelor date: numele furnizorului, denumirea produsului, tipul mrfii (alimente, buturi, cafea igri), cantitate, pre. 4. Realizai un formular pentru introducerea urmtoarelor date legate de o persoan: cod, numele, funcie, stare civila. adresa studii (generale, liceale, superioare, doctorale),

5. Realizai un formular pentru introducerea urmtoarelor date informaii despre o bibliotec: nume, carte, autor, editura, an apariie, starea crii (nesatisfctoare, satisfctoare, buna, foarte buna), nr. exemplare disponibile. 6. Pentru evidena medicamentelor dintr-o farmacie, se utilizeaz formulare. Pentru introducerea de noi medicamente, formularul conine: denumirea medicamentului, unitate de msur(comprimate, fiole, grame, mililitrii), denumirea productorului, temperatura de pstrare, eliberare fr reet (da/nu) .

76

Manual de informatic pentru clasa a XII-a

Cap. 3 Serverul MySql


Capitolul de fa i propune prezentarea noiunilor de baz pentru lucrul cu serverul de baze de date MySQL, fiind prezentate exemple edificatoare pentru o ct mai bun nsuire a cunotinelor.

Ce este MySQL?
MySQL este la ora actual cel mai popular sever de baze de date de tip Open Source, datorit faptului c este uor de folosit, are o fiabilitate ridicat i un timp de rspuns rapid. Fiind un produs Open Source, MySQL este un server de baze de date gratuit pentru scopuri didactice i personale, pltindu-se licen doar n cazul n care serverul este folosit n produse software ce urmeaz a fi comercializate. Aplicabilitatea serverului MySQL este vast, fiind folosit cu succes att n aplicaii simple cu un numr mic de nregistrri n baza de date, ct i n aplicaii complexe cu mai multe baze de date i sute de milioane de nregistrri. MySQL este un server de baze de date puternic din punct de vedere al portabilitii putnd fi instalat att pe platforme Windows ct i pe platforme Linux. i Macintosh. Ultimele versiuni i mbuntiri pot fi descrcate gratuit de pe site-ul www.mysql.com, tot de pe acest site se acceseaz forumul de discuii, lucru foarte important pentru aflarea rspunsurilor la multe ntrebri i nedumeriri aprute de-a lungul utilizrii serverului. Avantaje Principalele avantaje care determin utilizarea serverului MySQL sunt: scalabilitate i fiabilitate performane ridicate uor de utilizat suport pentru tranzacii larg utilizare n aplicaii web securizarea datelor portabilitate (platform Windows, Linux, Macintosh) Open Source suport tehnic pre mic comparativ cu alte produse, gratuit pentru scopuri necomerciale Observnd raportul calitate/pre i studiile de specialitate comparativ cu alte servere de baze de date putem spune ca serverul MySQL este una dintre cele mai bune soluii de pe pia pentru aplicaiile mici i mijlocii. Serverul MySQL este rapid, uor de utilizat, oferind performane ridicate la pre sczut, fiind chiar gratuit pentru scopuri didactice i necomerciale.

77

Serverul MySQL

Elemente de baz ale limbajului MySQL


n prima parte a acestui subcapitol va fi prezentat n amnunt modul de lucru cu serverul MySQL, ct i noiunile elementare necesare nelegerii sistemelor de baze de date n general. n a doua parte vor fi prezentate instruciuni / comenzi SQL, de fapt principalele unelte n programarea cu bazele de date.

Conectare si deconectare de la server


Pentru a putea lucra cu serverul MySQL i pentru a putea avea acces la resursele acestuia, nti de toate utilizatorul va trebui s se autentifice cu contul i parola primit de la administratorul serverului. Pentru conectare se va introduce urmtoarea comand de la prompterul sistemului de operare: mysql h host -u utilizator p host reprezint adresa calculatorului din reeaua local sau din internet unde este instalat serverul MySQL. De exemplu: localhost (dac serverul este instalat pe acelai calculator cu cel de pe care se face conectarea) sau 127.0.0.1 (adresa calculatorului local), 192.168.0.150 (conectare la un server aflat n reeaua local), conectare.ro/servermysql (conectare prin internet) utilizator reprezint contul cu care se face conectarea la server n urma introducerii acestei comenzi, utilizatorul va fi ntrebat de parol, apoi dac contul i parola sunt corecte se va face conectarea la server, intrnd n mediul de programare prin apariia prompterului de comenzi MySQL: Welcome to the MySQL monitor.Commands end with ; or \g. Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> Dac serverul MySQL este instalat pe acelai calculator de pe care se ncearc conectarea se poate observa c opiunea h host se poate omite, serverul ncercnd implicit conectarea la localhost. Deconectarea de la serverul MySQL se face simplu introducnd urmtoarea comand la prompterul MySQL: mysql> QUIT, prsindu-se astfel mediul de programare MySQL prin dispariia prompterului mysql> i apariia liniei de comand a sistemului de operare.

Introducerea comenzilor MySQL


Dup conectarea la server i apariia prompterului, serverul ateapt comenzi de la utilizator, majoritatea acestora terminndu-se cu semnul ; (punct i virgul). De exemplu pentru aflarea versiunii serverului MySQL se va introduce urmtoarea comand: mysql> SELECT VERSION();

78

Manual de informatic pentru clasa a XII-a

Serverul va afia urmtorul rezultat: +---------------------+ | version() | +---------------------+ | 5.0.27-community-nt | +---------------------+ 1 row in set (0.33 sec) Dac terminatorul ; este omis, serverul ateapt continuarea comenzii pe linia urmtoare afind prompterul: ->, pn cnd se va introduce terminatorul. Exist totui cteva comenzi cum ar fi comanda QUIT care nu necesit terminator, n cazul acesta serverul executnd comanda fr a mai afia prompterul de continuare a comenzii. Pentru afiarea datei si orei curente se va introduce urmtoarea comand: mysql> SELECT now(); rezultat MySQL: +---------------------+ | now() | +---------------------+ | 2007-02-07 18:16:48 | +---------------------+ 1 row in set (0.14 sec) Se poate observa c serverul MySQL nu face diferen dac comenzile sunt introduse cu litere mici sau litere mari. Rezultatul executrii comenzilor de ctre server are urmtoarea form: prima linie comanda ce a fost executat urmtoarele linii rezultatul propriu-zis ultima linie numrul de linii pe care este afiat rezultatul i timpul necesar execuiei comenzii

Baze de date i tabele


Bazele de date SQL pot fi imaginate ca structuri de date complexe, care pe lng structurarea i stocarea informaiei ofer posibilitatea implementrii de ctre sistemele de baze de date a diferitor metode de inserare, modificare, tergere, cutare pentru un lucru optim cu cantiti mari de date. Structura arborescent a serverului MySQL, este prezentat n Fig. 3.1:

79

Serverul MySQL

Fig. 3.1 Astfel, Serverul MySQL poate deine una sau mai multe baze de date, iar fiecare baz de date poate deine unul sau mai multe tabele. La rndul lor, tabelele vor deine nregistrri, acestea reprezentnd informaia propriu-zis ce este stocat, pe cnd bazele de date i tabelele sunt structurile de date necesare organizrii informaiei. Un tabel SQL poate fi imaginat ca un tabel cu linii si coloane, coloanele definind tipul informaiei ce urmeaz a fi stocate, iar liniile reprezentnd nregistrrile. Pentru o mai bun nelegere a acestor structuri de baze de date i tabele i a utilitii acestora n practic se prezint urmtorul exemplu: Problem: Se dorete a se ine evidena elevilor i profesorilor dintr-un anumit liceu. Pentru fiecare profesor se vor nregistra urmtoarele informaii: nume, prenume, vechime. Pentru fiecare elev se vor nregistra: nume, prenume, vrsta i clasa. Rezolvare: Observm c pentru profesori i elevi avem de nregistrat date diferite (vechime pentru profesori, respectiv vrsta i clasa pentru elevi) i n consecin vom avea dou tipuri de date diferite: tipul profesor i tipul elev. Acestora le vom asocia cte un tabel MySQL astfel: tipului profesor i vom asocia tabelul [Profesori], iar tipului elev i vom asocia tabelul [Elevi](parantezele drepte vor fi folosite pentru notarea tabelelor MySQL). Tabelul [Profesori] va avea trei coloane /cmpuri: Nume, Prenume i Vechime, iar tabelul [Elevi] va avea patru coloane /cmpuri: Nume, Prenume, Vrsta i Clasa. Pentru exemplificare vom lua ca exemplu tabelele prezentate n Fig. 3.2

80

Manual de informatic pentru clasa a XII-a

Num e 1 2 3 .. . Pop Radu Albu ...

Prenume Raul Cristian Roberto ...

Vechime 30 15 20 ... 1 2 3 ...

Num e Pasc Pop Vlad ...

Prenume Doru Simion Alex ...

Vrsta 15 16 15 ...

Cls 9 10 9 ...

[Elevi] [Profesori]

Fig. 3.2 Se vor putea face urmtoarele operaii cu nregistrrile / liniile tabelelor: adugare, modificare, tergere, cutare. Realiznd aceste operaii se va putea ine cu uurin evidena profesorilor i elevilor dintr-un anumit liceu. Dar dac se dorete a se ine evidena profesorilor i elevilor din toate liceele dintr-un anumit ora? Doar lucrul cu aceste tabele nu va fi suficient datorit faptului c nu se va tii din ce liceu face parte un anumit profesor sau elev. S ne aducem aminte de structura arborescent de baze de date i tabele MySQL. Vom putea defini astfel cte o baz de date MySQL pentru fiecare liceu n parte, fiecare baz de date coninnd dou tabele, unul pentru profesori i altul pentru elevi.

Tipuri de date MySQL


Asemenea limbajelor de programare, i sistemele de baze de date, n cazul nostru serverul MySQL pune la dispoziia utilizatorului tipuri de date de diferite categorii: numerice, dat, or, ir de caractere. Pentru fiecare coloan /cmp a unui tabel va fi specificat tipul de dat potrivit, n funcie de acesta se vor putea face operaii caracteristice.

Tipuri de date ntregi


BIT [(M)] 1<=M<=64, reprezint o valoare ntreag pe M bii. Dac M este omis, atunci implicit valoarea sa este 1. TINYINT [UNSIGNED] are valori n intervalul [-128,127] dac termenul opional UNSIGNED este omis, altfel are valori n intervalul [0,255] BOOL sau BOOLEAN are valorile 0 pentru fals i 1 pentru adevrat SMALLINT [UNSIGNED] are valori cu semn n [-32768, 32767] i fr semn n intervalul [0, 65535] intervalul

81

Serverul MySQL [-

MEDIUMINT [UNSIGNED] are valori cu semn n intervalul 8388608, 8388607] i fr semn n intervalul [0, 16777215]

INT [UNSIGNED] sau INTEGER are valori cu semn n intervalul [2147483648, 2147483647] i fr semn n intervalul [0, 4294967295] BIGINT [UNSIGNED] are valori cu semn n intervalul [-9223372036854775808, 9223372036854775807] i fr semn n intervalul [0, 18446744073709551615]

Tipuri de date reale


FLOAT[(M,D)] [UNSIGNED] are valori cu semn n intervalul [-3.402823466E+38, -1.175494351E-38] i fr semn n intervalul [1.175494351E-38, 3.402823466E+38] i 0. M reprezint numrul de cifre zecimale, iar D reprezint numrul de cifre de dup virgul DOUBLE[(M,D)] [UNSIGNED] are valori cu semn n intervalul [1.7976931348623157E+308,-2.2250738585072014E-308], fr semn n intervalul [2.2250738585072014E-308, 1.7976931348623157E+308] i 0. DECIMAL[(M[,D])] [UNSIGNED] numr fix de cifre zecimale M i numr fix de cifre decimale D. M<=65, D<=30.

Tipuri de date de tip dat i or


DATE formatul este YYYY-MM-DD (sau AAAA-LL-ZZ adic an-lunzi) i intervalul ntre '1000-01-01' i '9999-12-31' DATETIME formatul este YYYY-MM-DD HH:MM:SS (sau AAAA-LLZZ OO:MM:SS adic an-lun-zi or-minut-secund) i intervalul ntre '1000-01-01 00:00:00' i '9999-12-31 23:59:59' TIMESTAMP asemntor cu tipul DATETIME este utilizat pentru marcarea automat de ctre serverul MySQL a momentului n care se adaug sau se modific anumite nregistrri. TIME formatul este HH:MM:SS (sau OO:MM:SS adic or-minutsecund) i intervalul ntre '-838:59:59' i '838:59:59'

Tipuri de date ir de caractere


CHAR (M) ir de caractere avnd lungimea maxima 255 de caractere VARCHAR (M) ir de caractere folosit pentru dimensiuni mai mari de 255 de caractere BINARY (M) asemntor cu tipul CHAR fiind diferit prin faptul c memoreaz i caractere binare

82

Manual de informatic pentru clasa a XII-a

VARBINARY (M) asemntor cu tipul VARCHAR fiind diferit prin faptul c memoreaz i caractere binare BLOB, MEDIUMBLOB, LONGBLOB stocheaz respectiv 2^32-1 octei 2^16-1, 2^24-1,

TEXT, MEDIUMTEXT, LONGTEXT stocheaz texte de urmtoarele dimensiuni: 2^16-1, 2^24-1, respectiv 2^32-1 octei.

Funcii utile
Serverul MySQL pune la dispoziia utilizatorului o serie de funcii matematice regsite n majoritatea limbajelor de programare. n capitolul de fa vom aminti doar principalele funcii.

Funcii matematice
ABS(X) modulul lui X SIN(X), COS(X), ASIN(X), ACOS(X), ATAN(X), ATAN2(X) CEIL(X), FLOUR(X) rotunjiri ale lui X FORMAT(X,D) formateaz X cu D cifre decimale TRUCATE(X,D) truncheaz numrul real X la D cifre decimale MOD(N,M) restul mpririi lui N la M POW(X,Y) X la puterea Y RAND() numr aleator ntre 0 i 1

Funcii pentru lucrul cu iruri de caractere


LEFT(S,N) returneaz primele N caractere ale irului S RIGHT(S,N) returneaz ultimele N caractere ale irului S ASCII (C) returneaz codul ASCII al caracterului C CHAR(N1, N2,) returneaz un ir de caractere avnd primul caracter, caracterul cu codul ASCII N1, al doilea caracter, caracterul cu codul ASCII N2, LENGTH (S) returneaz lungimea irului de caractere S LOWER(S), UCASE(S) transform tot irul de caractere S n caractere mici i respectiv caractere mari LTRIM(S), RTRIM(S) elimin spaiile la stnga i respectiv la dreapta din irul de caractere S INSTR(S,T) returneaz poziia la care se gsete irul de caractere T n S CONCAT(X, S1, S2, ...) returneaz irul de caractere rezultat n urma concatenrii irurilor S1, S2, ..., avnd ca delimitator X

83

Serverul MySQL

Funcii pentru lucrul cu tipul dat


CURDATE(), CURTIME() data i timpul curent NOW(), SYSDATE() returneaz data i ora curent n formatul 'YYYY-MM-DD HH:MM:SS' YEAR(D) returneaz anul corespunztor datei D MONTH(D) returneaz luna corespunztoare datei D DAY(D) returneaz ziua corespunztoare datei D DAYOFYEAR(D), DAYOFMONTH(D), DAYOFWEEK(D) returneaz numrul zilei datei D n cadrul anului, lunii i respectiv a sptmnii HOUR(T) returneaz ora corespunztoare lui T MIN(T) returneaz minutul corespunztor lui T SECOND(T) returneaz secunda corespunztoare lui T DATE_ADD(D, INTERVAL E U), DATE_SUB(D, INTERVAL E U) adaug / scade datei D, E uniti de tipul U (DAY, MONTH, YEAR, MIN, SECOND, HOUR,)

Operatori
Principalii operatorii MySQL sunt prezentai n urmtoarea list n ordine cresctoare a prioritilor, pe fiecare linie fiind niruii operatorii cu acelai grad de prioritate: ||, OR, XOR (operatori logici) &&, AND (operatori logici) NOT (operator logic) BETWEEN (operator de comparare) =, <=>, >=, >, <=, <, <>, !=, IN, IS comparare) | (OR pe bii) & (AND pe bii) <<, >> (deplasare la stnga, respectiv la dreapta) -, + *, /, DIV, %, MOD ^ (XOR pe bii) Pentru exemplificare vom folosi instruciunea SELECT prezentat pe larg n unul din capitolele urmtoare. mysql> SELECT 3 AND 0, 3 AND 1, 3 OR 0, 3 OR 1, 3 XOR 0, 3 XOR 1; AND, OR, XOR operatori logici (operatori de

84 rezultat:

Manual de informatic pentru clasa a XII-a

+---------+---------+--------+--------+---------+---------+ | 3 AND 0 | 3 AND 1 | 3 OR 0 | 3 OR 1 | 3 XOR 0 | 3 XOR 1 | +---------+---------+--------+--------+---------+---------+ | 0 | 1 | 1 | 1 | 1 | 0 | +---------+---------+--------+--------+---------+---------+

Comanda: mysql> SELECT NOT 4, NOT 0; NOT logic are ca rezultat: +-------+-------+ | NOT 4 | NOT 0 | +-------+-------+ | 0 | 1 | +-------+-------+ Observm c valorile diferite de 0 sunt tratate ca i propoziii adevrate (valoare 1), iar valoarea 0 ca i propoziie fals (valoare 0), rezultatele obinute corespunznd regulilor logicii matematice. mysql> SELECT 3 & 4; & - AND pe bii rezultat: +-------+ | 3 & 4 | +-------+ | 0 | +-------+ 3 = 011 (baza 2), 4 = 100 (baza 2) 011 && 100 = 000 (baza 2) = 0 (baza 10) mysql> SELECT 3 | 4; - OR pe bii rezultat: +-------+ | 3 | 4 | +-------+ | 7 | +-------+ 3 = 011 (baza 2), 4 = 100 (baza 2) 011 | 100 = 111 (baza 2) = 7 (baza 10) mysql> SELECT 2 ^ 4; - XOR pe bii rezultat: +-------+ | 2 ^ 4 | +-------+ | 6 |

85 +-------+ 2= 010 (baza 2), 4 = 100 (baza 2) 010 | 100 = 110 (baza 2) = 6 (baza 10)

Serverul MySQL

mysql> SELECT 1=0, '0'=0, '0.0'=0, '.01'=0.01; - operator de testare a egalitii rezultat: +-----+-------+---------+------------+ | 1=0 | '0'=0 | '0.0'=0 | '.01'=0.01 | +-----+-------+---------+------------+ | 0 | 1 | 1 | 1 | +-----+-------+---------+------------+ mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL, -> NULL = NULL; - operator de testare a egalitii rezultat: +---------+---------------+------------+-------------+ | 1 <=> 1 | NULL <=> NULL | 1 <=> NULL | NULL = NULL | +---------+---------------+------------+-------------+ | 1 | 1 | 0 | NULL | +---------+---------------+------------+-------------+ mysql> SELECT 1 < 2, 1 > 2, 1<=2, 1 >= 2, 1 !=2, 1 <> 2, . . . .-> 1 != 1; rezultat:
+-------+-------+------+--------+-------+--------+-------+ | 1 < 2 | 1 > 2 | 1<=2 | 1 >= 2 | 1 !=2 | 1 <> 2 | 1 !=1 | +-------+-------+------+--------+-------+--------+-------+ | 1 | 0 | 1 | 0 | 1 | 1 | 0 | +-------+-------+------+--------+-------+--------+-------+

mysql> SELECT 2 IN (1,2,5), 3 IN (1,2,5), 2 IS NULL; primii doi operatori testeaz dac un element se gsete ntr-o anumit mulime, iar al treilea dac o expresie are valoarea NULL. rezultat: +--------------+--------------+-----------+ | 2 IN (1,2,5) | 3 IN (1,2,5) | 2 IS NULL | +--------------+--------------+-----------+ | 1 | 0 | 0 | +--------------+--------------+-----------+ mysql> SELECT 2 BETWEEN 1 AND 5, 6 BETWEEN 1 AND 5; testeaz dac un element se gsete ntre dou elemente rezultat:

86

Manual de informatic pentru clasa a XII-a

+-------------------+-------------------+ | 2 BETWEEN 1 AND 5 | 6 BETWEEN 1 AND 5 | +-------------------+-------------------+ | 1 | 0 | +-------------------+-------------------+ mysql> SELECT 2 * 3 / 6 + 4 - 2, 7 % 3, 7 DIV 3; rezultat: +-------------------+-------+---------+ | 2 * 3 / 6 + 4 - 2 | 7 % 3 | 7 DIV 3 | +-------------------+-------+---------+ | 3.0000 | 1 | 2 | +-------------------+-------+---------+

Conversii de date
Important n lucrul cu bazele de date este oferirea de ctre server a mai multor posibiliti de formatare a datelor i de conversie a acestora dintr-un tip de dat ntr-altul. Serverul MySQL pune la dispoziia utilizatorul mai multe metode de conversie ntre toate tipurile de date. Sintaxa CAST (expresie as tip) sau CONVERT(expresie, tip) expresie expresia ce urmeaz a fi convertit tip unul dintre urmtoarele tipuri de dat la care se face conversia: BINARY[(N)] CHAR[(N)] DATE DATETIME DECIMAL SIGNED [INTEGER] TIME UNSIGNED [INTEGER] -> CONVERT('2007-01-01',DATETIME); rezultat:
+--------------------------+--------------------------------+ | CONVERT('12.3', DECIMAL) | CONVERT('2007-01-01',DATETIME) | +--------------------------+--------------------------------+ | 12.30 | 2007-01-01 00:00:00 | +--------------------------+--------------------------------+

mysql> SELECT CONVERT('12.3', DECIMAL),

Interogri MySQL
Interogrile sau comenzile MySQL reprezint unealta prin care se pot realiza anumite operaii asupra bazelor de date cum ar fi: selectarea unei anumite baze de

87

Serverul MySQL

date, mentenana tabelelor (adugare, modificare, tergere), cutri n funcie de diferii parametrii, sortri, listri, etc. n capitolul de fa vor fi prezentate interogri simple cu exemplificri bogate pentru a se demonstra utilitatea lor n aplicaii.

Crearea, tergerea i selectarea bazelor de date


Aflarea numelui bazelor de date deja existente pe server se va face prin introducerea urmtoarei comenzi: mysql> SHOW DATABASES; rezultat: +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | +--------------------+ Se poate observa ca exist doar trei baze de date pe server, de fapt sunt cele create implicit la instalarea serverului MySQL.

Crearea bazelor de date


Crearea unei noi baze de date se poate face cu ajutorul comenzii CREATE DATABASE nume_db; De exemplu pentru crearea unei baze de date pentru un anumit liceu, vom introduce comanda: mysql> CREATE DATABASE Liceul_Info;

tergerea bazelor de date


tergerea unei baze de date se face cu ajutorul comenzii DROP DATABASE nume_db; Exemplu: mysql> DROP DATABASE Liceul_Info; Dac nume_db nu exist, atunci serverul va returna un mesaj de eroare corespunztor.

Selectarea unei baze de date


Pentru a lucra cu o anumit baz de date se va introduce comanda USE nume_db; dup cum urmeaz: mysql> USE Liceul_Info; Dup ce a fost selectat o anumit baz de date, aceasta va deveni baza de date curent i se va putea lucra cu tabelele acesteia fr a meniona ulterior numele bazei de date de care aparin, serverul MySQL cunoscnd apartenena acestora la baza de date curent. Pentru a modifica date din alt baz de date de pe server, va trebui s fie nti selectat, cu observaia c doar o singur baz de date poate si curent (activ) la un moment dat.

88

Manual de informatic pentru clasa a XII-a

Crearea, modificarea i tergerea tabelelor


Crearea unui tabel n cadrul unei baze de date se va face cu comanda CREATE TABLE, dup ce n prealabil a fost selectat baza de date de care va fi legat tabelul cu ajutorul comenzii USE nume_db;

Sintaxa creare tabel


CREATE nume_tabel (nume_camp tip_data [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY]|[PRIMARY KEY] [COMMENT 'comentariu'], ...) mysql> USE Liceul_Info; mysql> CREATE TABLE Profesori(Nume VARCHAR(20), Prenume -> VARCHAR(20), Vechime INT); mysql> CREATE TABLE Elevi(Nume VARCHAR(20), Prenume -> VARCHAR(20), Varsta INT, Clasa INT); Comanda CREATE TABLE definete structura unui tabel, prin definirea numelui cmpurilor i a tipurilor de date aferente. Alegerea tipurilor de date trebuie fcut cu mare grij pentru ca datele introduse s nu depeasc dimensiunile cmpurilor i totodat dimensiunile cmpurilor s nu fie prea mari raportate la datele introduse pentru a nu se ncrca serverul inutil. Vizualizarea tuturor tabelelor din baza de date curent, se va face prin comanda SHOW TABLES; mysql> SHOW TABLES; rezultat: +-----------------------+ | Tables_in_liceul_info | +-----------------------+ | elevi | | profesori | +-----------------------+ Dac se dorete vizualizarea cmpurilor unui tabel, aceasta se poate face uor prin introducerea comenzii DESCRIBE nume_tabel; mysql> DESCRIBE Elevi; rezultat: +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | Nume | varchar(20) | YES | | NULL | | | Prenume | varchar(20) | YES | | NULL | | | Varsta | int(11) | YES | | NULL | | | Clasa | int(11) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ Observm c pe lng numele cmpului i a tipului de dat, serverul MySQL reine i ali parametrii:

89

Serverul MySQL

NULL indic dac cmpul respectiv accept valori NULL (cu alte cuvinte dac se accept neintroducerea de date n cmpul respectiv) KEY indic dac cmpul respectiv este sau nu cheie primar sau secundar. Acest aspect va fi discutat n unul din capitolele urmtoare DEFAULT indic valoarea implicit pe care o asigneaz serverul MySQL unui cmp n cazul n care nici o valoare nu este introdus AUTO_INCREMENT indic dac cmpul respectiv se autoincrementeaz la fiecare nou inserare COMMENT/EXTRA observaii

Sintaxa modificare tabel


ALTER TABLE nume_tabel ADD [CAMP] nume_camp tip_data [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY]|[PRIMARY] KEY] [COMMENT 'comentariu'] [FIRST | AFTER nume_camp] | MODIFY [CAMP] nume_camp tip_data [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY]|[PRIMARY] KEY] [COMMENT 'comentariu'] [FIRST | AFTER nume_camp] | DROP [CAMP] nume_camp Clauza ALTER TABLE este util pentru adugarea de noi cmpuri ntr-un tabel, pentru modificarea structurii unui tabel prin schimbarea numelui cmpurilor i eventual a tipurilor de date i pentru eliminarea din structura tabelului a unor cmpuri nefolositoare. Pentru adugarea unui nou cmp pentru reinerea adresei n tabelul [Elevi] definit mai sus vom folosi urmtoarea comand: mysql> ALTER TABLE Elevi ADD Adresa VARCHAR(30) NOT NULL -> AFTER Prenume; Pentru a modifica tipul de dat i poziia cmpului n cadrul tabelului putem folosi urmtoarea comand: mysql> ALTER TABLE Elevi MODIFY Adresa VARCHAR(40) FIRST; tergerea cmpului adres se va face astfel: mysql> ALTER TABLE Elevi DROP Adresa;

Sintaxa tergere tabel


DROP TABLE nume_tabel tergerea unui tabel se face asemntor cu tergerea unei baze de date cu ajutorul comenzii DROP TABLE. Aceast comand trebuie folosit cu mare atenie ca i comanda DROP DATABASE pentru c toate nregistrrile din respectivul tabel vor fi pierdute. Rezumat Bazele de date pot fi create i terse utiliznd instruciunile CREATE DATABASE i

90

Manual de informatic pentru clasa a XII-a

DROP DATABASE Pentru selectarea bazei de date curente se va folosi instruciunea USE n mod asemntor bazelor de date, tabelele pot fi ntreinute cu ajutorul instruciunilor CREATE TABLE, ALTER TABLE i DROP TABLE Inserarea datelor ntr-un tabel. Instruciunea INSERT Adugarea de informaii n baza de date, se face prin inserarea de noi nregistrri n tabele cu ajutorul comenzii INSERT. Comanda INSERT trebuie s respecte structura tabelului definit n prealabil prin comanda CREATE TABLE, n caz contrar serverul MySQL va returna un mesaj de eroare. Dac un anumit cmp permite valori NULL, atunci se poate omite introducerea de valori pentru respectivul cmp. Sintaxa INSERT [INTO] nume_tabel [(nume_camp,...)] VALUES ({expresie | DEFAULT},...),(...),... Plecnd de la tabelul [Profesori] definit mai sus, vom aduga o nou nregistrare (un profesor) astfel: mysql> INSERT INTO Profesori VALUES('Pop', 'Raul', 30); rezultat: Query OK, 1 row affected (0.49 sec) Introducem nc doi profesori: mysql> INSERT INTO Profesori VALUES('Radu', 'Cristian', 15); mysql> INSERT INTO Profesori VALUES('Albu', 'Roberto', 20);, apoi vom vizualiza datele introduse cu ajutorul instruciunii SELECT, prezentat n subcapitolul urmtor. Un procedeu des ntlnit n lucrul cu bazele de date este folosirea cmpurilor care se autoincrementeaz pentru ca fiecare nregistrare s dein un parametru unic de identificare. Pentru exemplificare vom considera tabelul [Profesori] creat anterior i i vom modifica structura astfel: mysql> ALTER TABLE Profesori ADD Id INT AUTO_INCREMENT -> KEY FIRST; n urma executrii acestei comenzi, un nou cmp Id de tip ntreg i care se autoincrementeaz va fi introdus naintea primului cmp a tabelului [Profesori]. Observm c insernd noi nregistrri cu ajutorul instruciunii INSERT INTO, fr a insera explicit valori n cmpul Id, acesta se autoincrementeaz implicit. Chiar dac n tabel existau nregistrri naintea introducerii cmpului Id n structura sa, acestea vor fi populate cu valori incrementate n ordinea n care au fost inserate n tabel. mysql> INSERT INTO Profesori (Nume, Prenume, Vechime) -> VALUES('Popescu', 'Dorel', 20);

91

Serverul MySQL

Se observ c pentru a nu introduce valoarea cmpului Id care se autoincrementeaz, trebuie specificate cmpurile pentru care se introduc date: (Nume, Prenume, Vechime).

Selectarea datelor dintr-un tabel. Instruciunea SELECT


Pentru a utiliza informaiile stocate ntr-o anumit baz de date, vom avea nevoie s extragem acele date, iar aceasta se va face cu ajutorul comenzii SELECT. Aceast comand este complex, n capitolul de fa fiind prezentate doar principalele sale opiuni. Sintaxa SELECT [ALL | DISTINCT ] expresie, ... [FROM nume_tabel [WHERE conditie] [GROUP BY {nume_camp | expresie} [ASC | DESC], ... ] [ORDER BY {nume_camp | expresie} [ASC | DESC], ...] Selectarea tuturor cmpurilor dintr-un tabel se face astfel: SELECT * FROM nume_tabel; Considerm tabelul [Profesori] n care s-au adugat trei nregistrri (vezi subcapitolul anterior). Pentru vizualizarea tuturor nregistrrilor vor scrie urmtoarea comand: mysql> SELECT * FROM Profesori; rezultat: +------+----------+---------+ | Nume | Prenume | Vechime | +------+----------+---------+ | Pop | Raul | 30 | | Radu | Cristian | 15 | | Albu | Roberto | 20 | +------+----------+---------+ Dac se dorete vizualizarea nregistrrilor distincte, se va folosi clauza DISTINCT. S presupunem c n tabelul [Profesori] exist mai muli profesori cu numele de familie Pop, atunci urmtoarea comand : SELECT DISTINCT NUME FROM Profesori va returna doar o singur nregistrare avnd numele Pop.

Clauza WHERE
Dac nu se dorete selectarea tuturor nregistrrilor /liniilor unui tabel, ci doar a anumitor nregistrri, atunci instruciunii SELECT i va fi adugat clauza WHERE urmat de condiia necesar. Pentru exemplul prezentat mai sus, dac

92

Manual de informatic pentru clasa a XII-a

dorim vizualizarea doar a profesorilor a cror nume de familie din punct de vedere alfabetic sunt naintea literei R, vom scrie urmtoarea instruciune: mysql> SELECT * FROM Profesori WHERE Nume<'R'; rezultat: +------+---------+---------+ | Nume | Prenume | Vechime | +------+---------+---------+ | Pop | Raul | 30 | | Albu | Roberto | 20 | +------+---------+---------+ Se observ c nregistrarea avnd nscris Radu n cmpul nume a fost exclus. Condiiile specificate dup clauza WHERE pot fi de asemenea complicate folosind operatorii AND, OR i NOT. mysql> SELECT * FROM Profesori WHERE Nume<'R' AND Vechime>20; rezultat: +------+---------+---------+ | Nume | Prenume | Vechime | +------+---------+---------+ | Pop | Raul | 30 | +------+---------+---------+ Pn acum am folosit instruciunea SELECT pentru filtrarea nregistrrilor dintr-un tabel dup anumite criterii, serverul MySQL returnnd toate cmpurile. Dac se dorete returnarea de ctre server doar a anumitor cmpuri, dup instruciunea SELECT n loc de * se vor enumera cmpurile dorite separate prin virgul. mysql> SELECT Nume, Prenume FROM Profesori; rezultat: +------+----------+ | Nume | Prenume | +------+----------+ | Pop | Raul | | Radu | Cristian | | Albu | Roberto | +------+----------+ Putem filtra liniile i cmpurile unui tabel prin combinarea clauzei WHERE cu specificarea cmpurilor dorite: mysql> SELECT Nume, Prenume FROM Profesori WHERE Vechime>=20; rezultat: +------+---------+ | Nume | Prenume | +------+---------+ | Pop | Raul | | Albu | Roberto | +------+---------+

93

Serverul MySQL

Clauza ORDER BY
Observm c nregistrrile returnate n urma executrii instruciunii SELECT sunt returnate n ordinea n care au fost introduse n tabel. Pentru ca instruciunea SELECT s returneze nregistrrile ntr-o anumit ordine (cresctoare sau descresctoare), se va folosi clauza ORDER BY nume_col_1, nume_col_2, ...,nume_col_n [ASC/DESC]; Dac se omite opiunea [ASC/DESC], atunci serverul MySQL seteaz implicit opiunea ASC. Pentru a verifica funcionalitatea clauzei ORDER BY vom introduce nc o nregistrare n tabelul [Profesori]: mysql> INSERT INTO Profesori VALUES('Pop', 'Dan', 30); Ordonarea nregistrrilor dup cmpul Nume se va face astfel: mysql> SELECT * FROM Profesori ORDER BY Nume; rezultat: +------+----------+---------+ | Nume | Prenume | Vechime | +------+----------+---------+ | Albu | Roberto | 20 | | Pop | Raul | 30 | | Pop | Dan | 30 | | Radu | Cristian | 15 | +------+----------+---------+ Observm c ordonarea doar dup cmpul Nume nu este suficient pentru c Pop Raul i Pop Dan nu sunt ordonai alfabetic. Nu avem dect s adugm i cmpul Prenume dup cmpul Nume n cadrul clauzei ORDER BY. mysql> SELECT * FROM Profesori ORDER BY Nume, Prenume; rezultat: +------+----------+---------+ | Nume | Prenume | Vechime | +------+----------+---------+ | Albu | Roberto | 20 | | Pop | Dan | 30 | | Pop | Raul | 30 | | Radu | Cristian | 15 | +------+----------+---------+ Afiarea profesorilor n ordine descresctoare a vechimii se face n felul urmtor: mysql> SELECT * FROM Profesori ORDER BY Vechime DESC; rezultat: +------+----------+---------+ | Nume | Prenume | Vechime | +------+----------+---------+ | Pop | Raul | 30 | | Pop | Dan | 30 |

94 | Albu | Roberto | 20 | | Radu | Cristian | 15 | +------+----------+---------+

Manual de informatic pentru clasa a XII-a

Clauza LIKE
Pe lng clauzele prezentate mai sus, serverul MySQL permite cutarea n anumite cmpuri dup valori care se ncadreaz n anumite abloane. Aceasta se face cu ajutorul clauzei LIKE n continuarea clauzei WHERE. n definirea abloanelor se folosete - pentru nlocuirea unui singur caracter i % pentru nlocuirea unui ir de caractere de lungime minim zero i fr limit maxim. De exemplu pentru cutarea tuturor profesorilor ale cror nume ncep cu litera P, vom folosi urmtoarea comand: mysql> SELECT * FROM Profesori WHERE Nume LIKE 'P%'; rezultat: +------+---------+---------+ | Nume | Prenume | Vechime | +------+---------+---------+ | Pop | Raul | 30 | | Pop | Dan | 30 | +------+---------+---------+ Pentru gsirea acelor profesori a cror nume sau prenume conine litera o, vom folosi i operatorul OR: mysql> SELECT * FROM Profesori WHERE Nume LIKE '%o%' OR -> Prenume LIKE '%o%'; rezultat: +------+---------+---------+ | Nume | Prenume | Vechime | +------+---------+---------+ | Pop | Raul | 30 | | Albu | Roberto | 20 | | Pop | Dan | 30 | +------+---------+---------+ Dac se dorete gsirea acelor profesori a cror nume are exact patru caractere, se va scrie urmtoarea comand: mysql> SELECT * FROM Profesori WHERE Nume LIKE '____'; rezultat: +------+----------+---------+ | Nume | Prenume | Vechime | +------+----------+---------+ | Radu | Cristian | 15 | | Albu | Roberto | 20 | +------+----------+---------+

Clauza COUNT

95

Serverul MySQL

De multe ori n lucrul cu bazele de date este nevoie s se cunoasc numrul de nregistrri dintr-un anumit tabel. Aflarea numrului tuturor nregistrrilor se face cu ajutorul clauzei COUNT(*). Pentru aflarea numrul de profesori nregistrai n tabelul [Profesori] se va introduce comanda: mysql> SELECT COUNT(*) FROM Profesori; rezultat: +----------+ | COUNT(*) | +----------+ | 4 | +----------+

- patru profesori.

Clauza GROUP BY
Aceast clauz este folosit pentru realizarea unor calcule sau filtre pentru anumite cmpuri ale unui tabel. Sintaxa SELECT col1, col2, ... coln, functie_agregat (expresie) FROM tabel WHERE conditie GROUP BY col, col2, ... coln; Funcia agregat este o funcie simpl cum ar fi : SUM, MAX, MIN, COUNT, AVG realiznd anumite calcule doar pentru cmpurile menionate dup clauza GROUP BY. De exemplu pentru a afla ci profesori cu acelai nume exist n tabelul [Profesori], vom folosi urmtoarea comand: mysql> SELECT Nume, COUNT(*) FROM Profesori GROUP BY Nume; rezultat: +------+----------+ | Nume | COUNT(*) | +------+----------+ | Albu | 1 | - un profesor cu numele Albu | Pop | 2 | - doi profesori cu numele Pop | Radu | 1 | - un profesor cu numele Radu +------+----------+ Plecnd de la structura tabelului [Elevi] avnd urmtoarele cmpuri: Nume, Prenume, Data naterii, Sex, Clasa, Media la romn, Media la matematic, Media la informatic i urmtoarele nregistrri:
+-----------+----------+---------------+------+-------+-------+--------+--------+ | Nume | Prenume | Data_nasterii | Sex | Clasa | M_Rom | M_Mate | M_Info | +-----------+----------+---------------+------+-------+-------+--------+--------+ | Pasc | Doru | 1988-02-15 | M | 12 | 6.62 | 9.71 | 9.31 | | Pop | Simion | 1990-10-12 | M | 10 | 8.49 | 8.11 | 8.24 | | Blaj | Daniela | 1991-07-05 | F | 9 | 8.6 | 7.44 | 9.28 | | Vlad | Alex | 1991-01-02 | M | 9 | 7.53 | 8.86 | 9.71 | | Paul | Cristina | 1989-11-07 | F | 11 | 9.87 | 8.98 | 8.7 |

96

Manual de informatic pentru clasa a XII-a

| Danieliuc | Dan | 1989-03-18 | M | 11 | 8.76 | 8.33 | 8.39 | +-----------+----------+---------------+------+-------+-------+--------+--------+

Pentru a afla media la informatic pe fiecare clas (9, 10, 11, 12) vom folosi urmtoarea comand: mysql> SELECT Nume, Prenume, Clasa, TRUNCATE(AVG(M_info),2) -> FROM Elevi GROUP BY Clasa; rezultat: +------+----------+-------+-------------------------+ | nume | prenume | clasa | truncate(avg(M_info),2) | +------+----------+-------+-------------------------+ | Blaj | Daniela | 9 | 9.49 | | Pop | Simion | 10 | 8.23 | | Paul | Cristina | 11 | 8.54 | | Pasc | Doru | 12 | 9.31 | +------+----------+-------+-------------------------+ Observm c s-a folosit funcia TRUNCATE pentru rotunjirea mediei aritmetice cu dou zecimale i funcia agregat AVG pentru calcularea mediei. Datorit faptului c dup clauza GROUP BY s-a introdus doar cmpul Clasa, serverul MySQL va returna cte o linie pentru fiecare clas diferit, funcia AVG returnnd media pe clase la informatic (calculeaz media ntre mediile tuturor elevilor din aceeai clas). O alt modalitate de calcul a mediilor pe clase se poate face folosind funciile agregat SUM i COUNT: mysql> SELECT nume, prenume, clasa, TRUNCATE (SUM(M_info)/ -> COUNT(*), 2) FROM Elevi GROUP BY clasa; Pentru aflarea celei mai mici i celei mai mari medii la informatic, matematic i respectiv romn pentru fiecare clas, vom folosi urmtoarea comand: mysql> SELECT Nume, Prenume, MIN(M_Mate), MAX(M_Mate), -> MIN(M_Info), MAX(M_Info) FROM Elevi GROUP BY Clasa; rezultat:
+------+----------+-------------+-------------+-------------+-------------+ | Nume | Prenume | MIN(M_Mate) | MAX(M_Mate) | MIN(M_Info) | MAX(M_Info) | +------+----------+-------------+-------------+-------------+-------------+ | Blaj | Daniela | 7.44 | 8.86 | 9.28 | 9.71 | | Pop | Simion | 8.11 | 8.11 | 8.24 | 8.24 | | Paul | Cristina | 8.33 | 8.98 | 8.39 | 8.7 | | Pasc | Doru | 9.71 | 9.71 | 9.31 | 9.31 | +------+----------+-------------+-------------+-------------+-------------+

Clauza AS
Uneori cnd n cadrul instruciunii SELECT se realizeaz anumite calcule sau formatri, serverul MySQL afieaz ca i cap de tabel exact expresia introdus. De exemplu pentru urmtoarea comand: mysql>SELECT Nume, Prenume, ....->TRUNCATE(SUM(Vechime)/COUNT(*),0) ->FROM Profesori GROUP BY Nume;

97

Serverul MySQL

serverul MySQL va afia: +------+----------+-----------------------------------+ | Nume | Prenume | TRUNCATE(SUM(Vechime)/COUNT(*),0) | +------+----------+-----------------------------------+ | Albu | Roberto | 21 | | Pop | Raul | 32 | | Radu | Cristian | 16 | +------+----------+-----------------------------------+ n primul rnd pentru a evita un cap de tabel aa de mare i n al doilea rnd pentru a putea folosi rezultatul respectiv ca i un cmp a tabelului n alte comenzi imbricate(se va studia n capitolele urmtoare), n cadrul comenzii de mai sus, dup expresia TRUNCATE(SUM(Vechime)/COUNT(*),0) se va introduce clauza AS nume_alias; avnd ca rezultat crearea unui alias pentru respectivul cmp. mysql> SELECT Nume,Prenume, -> TRUNCATE(SUM(Vechime)/COUNT(*),0) -> AS Medie FROM Profesori GROUP BY Nume; rezultat: +------+----------+-------+ | Nume | Prenume | Medie | +------+----------+-------+ | Albu | Roberto | 21 | | Pop | Raul | 32 | | Radu | Cristian | 16 | +------+----------+-------+ Rezumat Instruciunea SELECT este utilizat pentru extragerea datelor din tabele Se pot selecta toate nregistrrile sau doar anumite nregistrri cu ajutorul clauzei WHERE Se pot selecta toate cmpurile sau doar anumite cmpuri din tabel Cu ajutorul clauzei ORDER BY se pot sorta nregistrrile din tabel dup cmpurile indicate Clauza LIKE permite cutarea anumitor date printre nregistrri Se pot defini aliasuri pentru cmpuri cu ajutorul clauzei AS

Probleme rezolvate
Problema 1. S se creeze tabelul [Elevi] n cadrul bazei de date Liceul_info, avnd urmtoarele cmpuri: nume, prenume, data_nasterii, sex, clasa. Selectarea bazei de date Liceul_info: mysql> use Liceul_info; Crearea tabelului: mysql> CREATE TABLE Eleve(Nume VARCHAR(20), Prenume

98

Manual de informatic pentru clasa a XII-a

-> Data_nasterii DATE, Sex CHAR(1), Clasa INT); Problema 2. S se realizeze urmtoarele: a) s se insereze n tabelul creat la problema 1, minim cinci nregistrri diferite, b) s se selecteze toate nregistrrile c) s se selecteze doar bieii de clasa a zecea i a unsprezecea d) s se sorteze alfabetic toi elevii n funcie de clas e) s se tearg elevii de clasa a noua i a zecea a) Inserarea elevilor: mysql> INSERT INTO Elevi VALUES -> '1988-02-15','M',12); mysql> INSERT INTO Elevi VALUES -> '1990-10-12','M',10); mysql> INSERT INTO Elevi VALUES -> '1991-07-05','F',9); mysql> INSERT INTO Elevi VALUES -> '1991-01-02','M',9); mysql> INSERT INTO Elevi VALUES -> '1989-11-07','F',11); mysql> INSERT INTO Elevi VALUES -> '1989-03-18','M',11); b) Selectarea tuturor nregistrrilor: mysql> SELECT * FROM Elevi; rezultat: +-----------+----------+---------------+------+-------+ | Nume | Prenume | Data_nasterii | Sex | Clasa | +-----------+----------+---------------+------+-------+ | Pasc | Doru | 1988-02-15 | M | 12 | | Pop | Simion | 1990-10-12 | M | 10 | | Blaj | Daniela | 1991-07-05 | F | 9 | | Vlad | Alex | 1991-01-02 | M | 9 | | Paul | Cristina | 1989-11-07 | F | 11 | | Danieliuc | Dan | 1989-03-18 | M | 11 | +-----------+----------+---------------+------+-------+ c) Selectarea bieilor de clasa a zecea i a unsprezecea: mysql> SELECT * FROM Elevi WHERE Sex='M' AND Clasa>9 -> AND Clasa<12; rezultat: +-----------+---------+---------------+------+-------+ | Nume | Prenume | Data_nasterii | Sex | Clasa | +-----------+---------+---------------+------+-------+ | Pop | Simion | 1990-10-12 | M | 10 |

('Pasc', 'Doru', ('Pop', 'Simion', ('Blaj', 'Daniela', ('Vlad', 'Alex', ('Paul', 'Cristina', ('Danieliuc', 'Dan',

99

Serverul MySQL

| Danieliuc | Dan | 1989-03-18 | M | 11 | +-----------+---------+---------------+------+-------+ d) Sortarea alfabetic pe clase: mysql> SELECT * FROM Elevi ORDER BY Clasa, Nume, Prenume; rezultat: +-----------+----------+---------------+------+-------+ | Nume | Prenume | Data_nasterii | Sex | Clasa | +-----------+----------+---------------+------+-------+ | Blaj | Daniela | 1991-07-05 | F | 9 | | Vlad | Alex | 1991-01-02 | M | 9 | | Pop | Simion | 1990-10-12 | M | 10 | | Danieliuc | Dan | 1989-03-18 | M | 11 | | Paul | Cristina | 1989-11-07 | F | 11 | | Pasc | Doru | 1988-02-15 | M | 12 | +-----------+----------+---------------+------+-------+ d) tergerea elevilor de clasa a noua i a zecea mysql> DELETE FROM Elevi WHERE Clasa<=10

Probleme propuse
Problema 1. Plecnd de la tabelul [Elevi], avnd urmtoarele cmpuri: Nume, Prenume, Localitate, Data_nasterii, Sex, clasa, Medie_Info, Medie_Mate, Medie_Romana, s se realizeze urmtoarele: a) s se insereze n tabel minim zece nregistrri diferite, b) s se selecteze cte un elev din fiecare localitate c) s se selecteze cte un elev din fiecare localitate, elevul fiind primul n ordine alfabetic dintre toi elevii din aceeai localitate d) s se sorteze toi elevii descresctor n funcie de media la informatic i cresctor alfabetic e) s se sorteze descresctor toi elevii n funcie de media la cele trei materii f) s se numere ci elevi provin din fiecare localitate Problema 2. Plecnd de la tabelul [Animale], avnd urmtoarele cmpuri: Nume, Rasa, SubRasa, Sex, NumarPicioare, TipHrana(ierbivore, carnivore, omnivore), s se realizeze urmtoarele: a) s se insereze n tabel minim zece nregistrri diferite, b) s se selecteze grupat toate animalele din aceeai ras n ordine descresctoare a numrului de picioare c) s se selecteze toate animalele de sex masculin care au in componenta numelui it (sau alt ir de caractere ce se regsete cel puin o dat n componena numelui) d) s se sorteze toate animalele cresctor n funcie de ras, descresctor n funcie de sub ras, omind pe cele ierbivore

100

Manual de informatic pentru clasa a XII-a

e) s se numere cate animale sunt din fiecare ras i cte animale din fiecare subras f) s se numere cate animale sunt din fiecare ras i cte animale din fiecare subras Problema 3. Plecnd de la tabelul [Orase], avnd urmtoarele cmpuri: NumeOras, Judet, NumarLocuitori, Suprafaa, TempMinimaVara(grade C), TempMinimaIarna(grade C),TempMaximaVara(grade C), TempMaximaIarna(grade C), s se realizeze urmtoarele: a) s se insereze n tabel minim zece nregistrri diferite, b) s se selecteze cte un ora din fiecare jude i anume cel care are suprafaa cea mai mare c) s se caute oraele dup un anumit ablon dat (se va alege unul oarecare) d) s se afieze temperatura minim i maxim (iarna/vara) pentru ara respectiv e) s se afieze temperatura medie (iarna/vara) pentru fiecare jude f) s se transforme temperaturile n grade Fahrenheit (C * 1.8 +32)

Modificarea datelor dintr-un tabel. Instruciunea UPDATE


Modificarea nregistrrilor unui tabel se face cu instruciunea UPDATE. Ca i n cazul instruciunii SELECT, n capitolul de fa vor fi prezentate doar principalele sale opiuni prin exemplificare. Sintaxa UPDATE nume_tabel SET nume_camp1=expr1 [, nume_camp2=expr2 ...] [WHERE conditie] [ORDER BY ...] [LIMIT numar_linii] Dup cum se poate observa din sintaxa instruciunii, clauza WHERE nu este obligatorie, prin omiterea ei, modificndu-se toate nregistrrile unui tabel fr a se pune nici o condiie. De exemplu dac se dorete creterea cu un an a vechimii tuturor profesorilor din tabelul [Profesori], se va introduce urmtoarea comand: mysql> UPDATE Profesori SET Vechime=Vechime+1; n exemplul de mai sus s-a modificat un singur cmp dintre toate nregistrrile. Instruciunea UPDATE permite de asemenea i modificarea mai multor cmpuri n acelai timp. S presupunem c tabelul [Profesori] mai are definit un cmp Grad reprezentnd gradul didactic al profesorului, atunci dac pe lng creterea vechimii profesorului cu un an, se dorete i avansarea sa n grad, se va folosi urmtoarea comand: mysql> UPDATE Profesori SET Vechime=Vechime+1, Grad=Grad-1 -> WHERE Grad<>1;

101

Serverul MySQL

Condiia Grad<>1 a fost folosit pentru c gradul cel mai nalt este gradul 1, iar profesorii care deja dein acest grad nu mai pot fi avansai. Asemenea instruciunii SELECT, condiiile de dup clauza WHERE, pot fi orict de complicate, sintaxa fiind identic cu cea prezentat n capitolul anterior.

Clauza LIMIT
Aceast clauz este util n cazurile n care se dorete modificarea doar a primelor numar_linii nregistrri. Dac n cadrul instruciunii UPDATE se folosete clauza WHERE, atunci prin utilizarea clauzei LIMIT se vor modifica doar primele numar_linii nregistrri care ndeplinesc condiia indicat. De exemplu, presupunem c selectnd toate nregistrrile din tabelul [Profesori] vom obine urmtorul rezultat: +------+----------+---------+------+ | Nume | Prenume | Vechime | Grad | +------+----------+---------+------+ | Pop | Raul | 32 | 2 | | Radu | Cristian | 16 | 2 | | Albu | Roberto | 21 | 2 | | Pop | Dan | 32 | 2 | +------+----------+---------+------+ Pentru a-i crete n grad doar pe primii doi profesori n ordine alfabetic vom folosi urmtoarea comand: mysql> UPDATE Profesori SET Grad=Grad-1 WHERE Grad<>1 -> ORDER BY Nume, Prenume ASC LIMIT 2; rezultat: +------+----------+---------+------+ | Nume | Prenume | Vechime | Grad | +------+----------+---------+------+ | Pop | Raul | 32 | 2 | | Radu | Cristian | 16 | 2 | | Albu | Roberto | 21 | 1 | | Pop | Dan | 32 | 1 | +------+----------+---------+------+ Se observ c doar doi dintre profesori au fost avansai n grad, aceti profesori fiind i primii doi n ordine alfabetic.

tergerea datelor dintr-un tabel. Instruciunea DELETE


tergerea nregistrrilor unui tabel se face cu instruciunea DELETE, aceast instruciune semnnd foarte mult la sintax cu instruciunea UPDATE. Singura deosebire este c o nregistrare este tears n ntregime, pe cnd modificarea se putea face i doar pentru anumite cmpuri, nu numai pentru ntreaga nregistrare. Sintaxa DELETE FROM nume_tabel

102 [WHERE conditie] [ORDER BY ...] [LIMIT numar_linii]

Manual de informatic pentru clasa a XII-a

De exemplu, pentru tergerea profesorilor cu numele de familie Pop din tabelul [Profesori] se va folosi urmtoarea comand: mysql> DELETE FROM Profesori WHERE Nume='Pop'; rezultat: Query OK, 2 rows affected (0.03 sec) Clauzele ORDER BY i LIMIT se folosesc exact cum au fost prezentate n capitolul anterior. Pentru tergerea tuturor nregistrrilor dintr-un tabel se va omite clauza WHERE: mysql> DELETE FROM Profesori; Rezumat Instruciunea UPDATE permite modificarea datelor dintr-un tabel Cu ajutorul clauzei LIMIT se pot modifica un numr stabilit de nregistrri pornind de la prima nregistrare Clauzele WHERE i ORDER BY se folosesc n mod identic dup cum a fost descris la instruciunea SELECT Instruciunea DELETE este identic din punct de vedere al sintaxei cu instruciunea UPDATE, singura diferen fiind c se terg date, nu se modific

Problem rezolvat
Pornind de la structura tabelului [Profesori] coninnd urmtoarele cmpuri: nume, prenume, localitate, data_nasterii, sex, clasa, varsta, varsta_scoala, s se realizeze urmtoarele: a) s se insereze n tabelul creat la problema 1, minim cinci nregistrri diferite, b) s se completeze cmpul varsta n funcie de anul curent i data naterii c) s se completeze cmpul varsta_scoala cu vrsta la care a fost dat la coal respectivul elev. a) Inserarea elevilor: mysql> INSERT INTO Elevi VALUES ('Pasc', 'Doru', -> '1988-02-15','M',12,0,0); mysql> INSERT INTO Elevi VALUES ('Pop', 'Simion', -> '1990-10-12','M',10,0,0); mysql> INSERT INTO Elevi VALUES ('Blaj', 'Daniela', -> '1991-07-05','F',9,0,0); mysql> INSERT INTO Elevi VALUES ('Vlad', 'Alex', -> '1991-01-02','M',9,0,0); mysql> INSERT INTO Elevi VALUES ('Paul', 'Cristina', -> '1989-11-07','F',11,0,0);

103

Serverul MySQL

mysql> INSERT INTO Elevi VALUES ('Danieliuc', 'Dan', -> '1989-03-18','M',11,0,0); b) Modificarea cmpului varsta: mysql> UPDATE Elevi SET varsta=(YEAR(CURDATE()) YEAR -> (data_nasterii)) - (RIGHT(CURDATE(),5) < RIGHT -> (data_nasterii,5)); rezultat: +-----------+----------+---------------+--------+ | Nume | Prenume | Data_nasterii | Varsta | +-----------+----------+---------------+--------+ | Pasc | Doru | 1988-02-15 | 19 | | Pop | Simion | 1990-10-12 | 16 | | Blaj | Daniela | 1991-07-05 | 15 | | Vlad | Alex | 1991-01-02 | 16 | | Paul | Cristina | 1989-11-07 | 17 | | Danieliuc | Dan | 1989-03-18 | 17 | +-----------+----------+---------------+--------+ c) Vrsta la care au fost dai la scoal: mysql> UPDATE Elevi SET varsta_scoala=varsta-clasa; rezultat:
+-----------+----------+-------+--------+---------------+ | nume | prenume | clasa | varsta | varsta_scoala | +-----------+----------+-------+--------+---------------+ | Pasc | Doru | 12 | 19 | 7 | | Pop | Simion | 10 | 16 | 6 | | Blaj | Daniela | 9 | 15 | 6 | | Vlad | Alex | 9 | 16 | 7 | | Paul | Cristina | 11 | 17 | 6 | | Danieliuc | Dan | 11 | 17 | 6 | +-----------+----------+-------+--------+---------------+

Probleme propuse
Problema 1. Plecnd de la tabelul [Profesori], avnd urmtoarele cmpuri: id (cmp de tip AUTO_INCREMENT), nume, prenume, grad, vechime, salariu, s se realizeze urmtoarele: a) s se insereze n tabel minim zece nregistrri diferite, b) s se introduc aleator salarii pentru fiecare profesor cu valori intre 1000 i 2000 RON folosind funcia RAND(), c) s se mreasc salariul profesorilor de gradul nti cu 10%, iar celor de gradul doi cu 5%. d) s se adauge un nou cmp n tabel anul_angajrii e) s se completeze cmpul creat la punctul d) pentru fiecare nregistrare n funcie de data curent i cmpul vechime

104

Manual de informatic pentru clasa a XII-a

f) s se tearg maxim 2 profesori a cror vechime depete 40 de ani Problema 2. Plecnd de la tabelul [Orase], avnd urmtoarele cmpuri: NumeOras, Judet, NumarLocuitori, Suprafaa, TempMinimaVara(grade C), TempMinimaIarna(grade C),TempMaximaVara(grade C), TempMaximaIarna(grade C), s se realizeze urmtoarele: a) s se insereze n tabel minim zece nregistrri diferite, b) s se modifice suprafaa fiecrei localiti astfel nct s corespund unei proporii de 1 locuitor pe 50 metri ptrai c) s se modifice temperaturile din grade C n grade F d) pentru primele 5 orae n ordine alfabetic s se creasc numrul populaiei cu 3% e) s se adauge dou cmpuri n tabel TempMedieIarna i TempMedieVara f) s se populeze cele dou cmpuri create la punctual e) g) s se tearg informaiile din cmpurile TempMedieIarna i TempMedieVara i apoi s se tearg cmpurile din tabel

MySQL, sistem de baze de date relaional


Selectarea datelor din mai multe tabele
n capitolul anterior au fost selectate date doar dintr-un anumit tabel la un moment dat. n practic acest lucru este rar ntlnit pentru c datele de obicei sunt diseminate n mai multe tabele. Strngerea datelor necesare din mai multe tabele ale aceleiai baze de date se va face tot cu ajutorul comenzii SELECT, cu o mic deosebire, i anume folosirea alias-urilor pentru tabele n mod identic cu folosirea alias-urilor pentru cmpuri. Pentru exemplificare vom lua dou tabele [Elevi] i [Catalog], avnd urmtoarea structur: [Elevi] +---------------+-------------+------+ | Field | Type | Null | +---------------+-------------+------+ | Nume | varchar(20) | YES | | Prenume | varchar(20) | YES | | Data_nasterii | date | YES | | Sex | char(1) | YES | | Clasa | int(11) | YES | +---------------+-------------+------+ [Catalog] +---------+----------------+------+ | Field | Type | Null | +---------+----------------+------+

105 | Nume | varchar(20) | YES | | Prenume | varchar(20) | YES | | M_Rom | float unsigned | YES | | M_Mate | float unsigned | YES | | M_Info | float unsigned | YES | +---------+----------------+------+

Serverul MySQL

Structura tabelului [Catalog] este simpl, cu scop pur didactic, pentru fiecare elev reinndu-se doar o medie la romn, una la matematic i una la informatic. Se pune problema afirii numelui i prenumelui tuturor elevilor, a clasei i mediilor corespunztoare. Observm c nu putem extrage toate aceste informaii dintr-un singur tabel. n consecin vom folosi ambele tabele [Elevi] i [Catalog] cu ajutorul clauzei alias AS: mysql> SELECT e.Nume, e.Prenume, e.Clasa, c.M_Rom, c.M_Mate, -> c.M_Info FROM Elevi as e, Catalog as c WHERE -> e.Nume=c.Nume AND e.Prenume=c.Prenume; rezultat:
+-----------+----------+-------+-------+--------+--------+ | Nume | Prenume | Clasa | M_Rom | M_Mate | M_Info | +-----------+----------+-------+-------+--------+--------+ | Pasc | Doru | 12 | 6.62 | 9.71 | 9.31 | | Pop | Simion | 10 | 8.49 | 8.11 | 8.24 | | Blaj | Daniela | 9 | 8.6 | 7.44 | 9.28 | | Vlad | Alex | 9 | 7.53 | 8.86 | 9.71 | | Paul | Cristina | 11 | 9.87 | 8.98 | 8.7 | | Danieliuc | Dan | 11 | 8.76 | 8.33 | 8.39 | +-----------+----------+-------+-------+--------+--------+

Analiznd comanda de mai sus, observm dou noi elemente: utilizarea aliasurilor de tabel (Elevi as e e reprezentnd aliasul tabelului [Elevi] i c aliasul tabelului [Catalog]) utilizarea aliasurilor de tabel naintea numelor cmpurilor pentru a indica tabelul din care face parte cmpul respectiv ( e.Nume, e.Prenume, e.Clasa, c.M_Rom, c.M_Mate, c.M_Info) Folosind sintaxa de mai sus, pot fi selectate orict de multe cmpuri din orict de multe tabele cu o singur condiie: comanda introdus s fie corect din punct de vedere sintactic. Un alt element important, dar nu esenial n construirea selectrii multiple este corectitudinea condiiilor de dup clauza WHERE. Chiar dac comanda introdus este corect din punct de vedere sintactic, nefolosirea unor condiii adecvate va duce la un rezultat cu date redundante. (S se ncerce rularea comenzii de mai sus fr clauza WHERE). Dup cum am precizat la nceputul acestui paragraf, structurile celor dou tabele [Elevi] i [Catalog] sunt pur didactice, incorecte din punct de vedere al normalizrii. Cu toate acestea, ne permit exemplificarea unor instruciuni imbricate. S presupunem c mai muli elevi au fost introdui n tabelul [Elevi].

106

Manual de informatic pentru clasa a XII-a

Pentru consistena informaiilor, toi elevii care exist n tabelul [Elevi] i nu exist n tabelul [Catalog] vor trebui introdui i n acesta din urm. S introducem trei noi elevi n tabelul [Elevi]: mysql>INSERT INTO Elevi(Nume, Prenume) VALUES('Zmeu','Ion'); mysql>INSERT INTO Elevi(Nume, Prenume) VALUES('Radu','Dan'); mysql>INSERT INTO Elevi(Nume, Prenume) VALUES('Gorea','Ion'); Pentru a copia n tabelul [Catalog] toi elevii din tabelul [Elevi] care nu se gsesc n tabelul [Catalog] vom folosi urmtoarea comand: mysql> INSERT INTO Catalog (nume, prenume) SELECT nume, -> prenume FROM Elevi WHERE (nume, prenume) NOT IN -> (SELECT nume, prenume FROM Catalog); rezultat: Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 +-----------+----------+-------+--------+--------+ | Nume | Prenume | M_Rom | M_Mate | M_Info | +-----------+----------+-------+--------+--------+ | Pasc | Doru | 6.62 | 9.71 | 9.31 | | Pop | Simion | 8.49 | 8.11 | 8.24 | | Blaj | Daniela | 8.6 | 7.44 | 9.28 | | Vlad | Alex | 7.53 | 8.86 | 9.71 | | Paul | Cristina | 9.87 | 8.98 | 8.7 | | Danieliuc | Dan | 8.76 | 8.33 | 8.39 | | Zmeu | Ion | NULL | NULL | NULL | | Radu | Vasile | NULL | NULL | NULL | | Gorea | Ionut | NULL | NULL | NULL | +-----------+----------+-------+--------+--------+

Relaionarea tabelelor
n capitolul de fa se vor prezenta metode de creare a cheilor primare i secundare i metode de relaionare a tabelelor cu ajutorul serverului MySQL, fr a insista asupra prii teoretice de normalizare a tabelelor (parte prezentat n capitolele anterioare).

Cheie primar
Pentru a respecta regulile normalizrii bazelor de date, fiecare tabel trebuie s conin cel puin un cmp, prin care s se identifice n mod unic fiecare nregistrare din respectivul tabel. Cmpul sau cmpurile care vor identifica n mod unic nregistrrile formeaz aa zisa cheie primar a tabelului. Pe lng faptul c respect restriciile impuse de normalizare, principalul scop al cheii primare este c ajut serverul MySQL s execute rapid anumite cutri n tabele, nregistrrile fiind indexate dup aceast cheie primar. Plecnd de la sintaxa creri unui tabel: CREATE nume_tabel

107

Serverul MySQL

(nume_camp tip_data [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY]|[PRIMARY KEY] [COMMENT 'comentariu'], ...) vom folosi clauza PRIMARY KEY dup definirea numelui cmpului i tipului de dat. Pentru exemplificare vom crea tabelul [Angajati] avnd urmtoarele cmpuri: Id(cheie primar), Nume, Prenume, Vechime. mysql> CREATE TABLE Angajati (Id INT, PRIMARY KEY(Id), Nume -> VARCHAR(20), Prenume VARCHAR(20), Vechime INT); mysql> DESCRIBE Angajati; rezultat: +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | Id | int(11) | NO | PRI | 0 | | | Nume | varchar(20) | YES | | NULL | | | Prenume | varchar(20) | YES | | NULL | | | Vechime | int(11) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ Se observ c serverul MySQL seteaz automat cmpului Id opiunea NULL = NO, iar opiunea KEY=PRI. Pentru a testa dac ntr-adevr serverul MySQL ine cont de unicitatea cmpului Id, vom ncerca introducerea a dou nregistrri cu acelai Id. mysql> INSERT INTO Angajati (Id, Nume, Prenume, Vechime) -> VALUES (1, 'Albu', 'Roberto', 4); rezultat: Query OK, 1 row affected (0.03 sec) mysql> INSERT INTO Angajati (Id, Nume, Prenume, Vechime) -> VALUES (1, 'Pop', 'Raoul',2); rezultat: ERROR 1062 (23000): Duplicate entry '1' for key 1 Se confirm faptul c serverul MySQL verific unicitatea cmpului cheie primar. Pentru a folosi o cheie primar multipl format din mai multe cmpuri, sintaxa este identic. De aceast dat vom exemplifica pe o structur a tabelului [Angajati] dup cum urmeaz: Nume, Prenume, Vechime . n acest caz cheia primar va fi format din cmpurile Nume i Prenume presupunnd c nu exist doi angajai cu acelai nume i prenume. mysql> CREATE TABLE Angajati (Nume VARCHAR(20), -> Prenume VARCHAR(20), Vechime INT, -> PRIMARY KEY (Nume, Prenume)); mysql> DESCRIBE Angajati; rezultat: +---------+-------------+------+-----+---------+-------+

108

Manual de informatic pentru clasa a XII-a

| Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | Nume | varchar(20) | NO | PRI | | | | Prenume | varchar(20) | NO | PRI | | | | Vechime | int(11) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ Se observ c serverul MySQL a setat ambelor cmpuri Nume i Prenume, opiunile NULL=NO i KEY=PRI. De obicei n lucrul cu bazele de date, se folosesc ID-uri unice (chei primare) de tip AUTO_INCREMENT. Marele avantaj este c utilizatorul nu va introduce i nu va modifica cheile primare, lsnd aceasta n seama serverului MySQL evitnd astfel problemele de duplicitate (introducerea de nregistrri cu aceeai cheie primar genernd eroare dup cum s-a observat din exemplul anterior).

Cheie extern
Cheia extern sau cheia strin asigur o structur nchegat a bazelor de date prin definirea unor constrngeri legate de relaionarea corect tabelelor. Utiliznd aceste constrngeri programatorul unei aplicaii cu baze de date va evita introducerea de nregistrri inconsistente relativ la relaionarea tabelelor, serverul MySQL atenionnd prin returnarea unei erori. Un alt avantaj oferit de aceste constrngeri pentru programatori este simplitatea codului prin renunarea la verificrile de consisten a datelor, aceasta realizndu-se pe partea de server. Sintaxa FOREIGN KEY [id] (index_nume_camp, ...) REFERENCES nume_tabel (index_nume_camp, ...) [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}] [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}] RESTRICT, NO ACTION comanda DELETE sau UPDATE nu se execut asupra cheii primare dac exist valori ale cheii externe n tabelul referit CASCADE terge sau modific nregistrrile din tabelul printe ct i nregistrrile aferente din tabelul copil SET NULL - terge sau modific nregistrrile din tabelul printe ct i seteaz pe NULL cheile externe din tabelul copil Pentru exemplificare vom considera tabelul [Elevi] cu structura : Id (cheie primar), Nume, Prenume i tabelul [Catalog] cu structura: Id (cheie extern), M_Rom, M_Mate, M_Info. Se va folosi urmtoarea constrngere: mysql> ALTER TABLE Catalog ADD FOREIGN KEY (Id) REFERENCES -> Elevi (Id) ON DELETE CASCADE ON UPDATE CASCADE; Dac se va terge o nregistrare din tabelul [Elevi], atunci se va terge i nregistrarea aferent din tabelul [Catalog]: DELETE FROM Elevi WHERE Id=5; Dac se introduce o nou nregistrare n tabelul [Catalog] cu un Id inexistent n tabelul printe [Elevi], serverul MySQL va returna eroare:

109 mysql> INSERT INTO Catalog VALUES(7,7.7,8.8,9.9);

Serverul MySQL

rezultat: ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`liceul_info/catalog`, CONSTRAINT `catalog_ibfk_1` FOREIGN KEY (`ID`) REFERENCES `elevi` (`Id`) ON DELETE CASCADE ON UPDATE CASCADE) tergerea unei constrngeri va face dup urmtoare sintax: ALTER TABLE nume_tabel DROP FOREIGN KEY symbol_cheie; Serverul MySQL atribuie fiecrei constrngeri un aa numit simbol. Pentru a afla numele acestui simbol se va folosi comanda: mysql> SHOW CREATE TABLE nume_tabel; Folosirea acestor constrngeri este util n aplicaiile mari n care integritatea datelor este esenial. Singurul dezavantaj este c datorit acestor constrngeri este ncetinit viteza de lucru a serverului MySQL crescnd numrul de verificri. Dac consistena datelor este rezolvat prin alte metode de programare, din anumite motive cunoscute de programator, atunci utilizarea acestor constrngeri devine redundant.

Clauza JOIN
Aceast clauz este utilizat cnd se dorete selectarea anumitor date din tabele relaionate. Scopul ei este s ofere utilizatorului posibilitatea de a lucra cu date complementare din mai multe tabele relaionate. Sintaxa nume_tabel1 [INNER | LEFT | RIGHT] JOIN nume_tabel2 ON conditie Clauza JOIN are trei opiuni importante INNER, LEFT i RIGHT folosite des n lucrul cu tabelele relaionate i avnd urmtoarea nsemntate: INNER realizeaz produsul cartezian ntre nregistrrile din nume_tabel1 i nume_tabel2. Cu alte cuvinte, fiecrei nregistrri din primul tabel i se vor ataa toate nregistrrile aferente din al doilea tabel conform condiiei de dup clauza ON LEFT selecteaz doar acele nregistrri din primul tabel care nu au nici o nregistrare corespondent n al doilea tabel RIGHT analog cu LEFT De exemplu pentru selectarea numelui i prenumelui elevilor din tabelul [Elevi] mpreun cu notele aferente din tabelul [Catalog] relaionat dup cmpul ID, vom scrie urmtoarea comand: mysql> SELECT e.Nume, e. Prenume, c.M_Rom, c.M_Mate, c.M_Info -> FROM Elevi as e INNER JOIN Catalog as c ON e.Id=c.Id; rezultat: +------+----------+-------+--------+--------+

110

Manual de informatic pentru clasa a XII-a

| Nume | Prenume | M_rom | M_Mate | M_Info | +------+----------+-------+--------+--------+ | Pasc | Doru | 6.62 | 9.71 | 9.31 | | Pop | Simion | 8.49 | 8.11 | 8.24 | | Blaj | Daniela | 8.6 | 7.44 | 9.28 | | Paul | Cristina | 9.87 | 8.98 | 8.7 | +------+----------+-------+--------+--------+ Rezumat MySQL este un sistem de baze de date relaional Definirea cheilor de relaionare primare i secundare se face cu ajutorul clauzelor PRIMARY KEY i FOREIGN KEY Constrngerile de cheie extern sunt utile pentru verificarea consistenei datelor pe partea de server i nu de ctre programator Selectarea anumitor date din tabelele relaionate se face cu ajutorul clauzei JOIN

Probleme propuse
Problema 1. Se dau patru tabele dup cum urmeaz: [Comanda]: IdComanda (cheie primar), Denumire, Valoare, Data [Produs] : IdProdus (cheie primar), TipProdus (cheie extern), Nume, Valoare [ProdusComanda] : IdPC (cheie primar), IdProdus (cheie extern), IdComana (cheie extern), NrBucati [TipuriProduse] : TipProdus (cheie primar), Descriere S se realizeze urmtoarele: a) s se creeze relaionarea ntre tabelele [Comanda] i [Produs] b) s se creeze relaionarea ntre tabelele [Comanda],[Produs] i [ProdusComanda] c) s se introduc minim cinci nregistrri n fiecare tabel conform relaionrilor d) s se ncerce introducerea de date inconsistente din punct de vedere al relaionrii e) pentru fiecare comand s se afieze numele produsului, descrierea sa i valoarea produsului n funcie de cantitatea comandat f) pentru primele dou comenzi s se creasc preul produselor aferente cu 5% g) pentru comenzile a cror dat se afl intr-un anumit interval (la alegere) s se seteze la 0 valoarea produselor aferente din tabelul [Produs], apoi s se creasc cu 1 numrul de buci din produsele aferente n tabelul [ProdusComanda]. h) s se tearg nregistrrile din toate tabelele n ordinea permis de relaionare

111 i) s se tearg relaionrile dintre tabele Problema 2. Se dau dou tabele dup cum urmeaz:

Serverul MySQL

[Angajati]: IdAngajat (cheie primar), Nume, Prenume, Vechime [Salarii] : IdAngajat (cheie primar i extern), Luna (cheie primar) , Valoare [TipuriProduse] : TipProdus (cheie primar), Descriere S se realizeze urmtoarele: a) s se creeze relaionarea ntre tabelele [Angajati] i [Salarii] b) s se introduc minim cinci nregistrri n fiecare tabel conform relaionrilor d) s se ncerce introducerea de date inconsistente din punct de vedere al relaionrii e) pentru fiecare angajat s se afieze numele i salariul de pe ultima lun f) pentru primii trei angajai n ordinea descresctoare a vechimii s se creasc salariul cu 10%. g) s se afieze angajaii n ordine alfabetic mpreun cu salariul mediu pe anul respectiv (se va ine cont de data curent) h) s se tearg nregistrrile din toate tabelele n ordinea permis de relaionare i) s se tearg relaionrile dintre tabele

Conectarea din PHP la serverul MySQL


Operaiile pe care trebuie s o efectum pentru conectarea la serverul MySql sunt: autentificarea utilizatorului pe server prin nume i parol, iar n final selectarea bazei de date. Pentru eficientizarea procesului vom salva secvena de autentificare i o vom apela de cte ori va fi necesar. Conectarea la server i la o baz de date Fiier de conexiune: connect.php <?php $link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); if (!$link) { die('Conexiune esuata ' . mysql_error()); } // selectarea bazei de date curente $db_selected = mysql_select_db('baza1', $link); if (!$db_selected) { die ('Baza de date baza1 nu poate fi accesata : ' . mysql_error()); } ?>

112

Manual de informatic pentru clasa a XII-a

Funcia utilizat mysql_connect()permite conectarea la baza de date. Ea are ca parametrii: numele serverului MySql, numele utilizatorului si parola acestuia. Funcia returneaz un identificator al conexiunii n caz de succes, sau FALSE dac conexiunea nu a avut loc. Construcia die() permite explicarea eecului conexiunii. Funcia mysql_select_db() selecteaz baza de date curent, i are ca parametrii numele bazei de date si identificatorul conexiunii la serverul MySQL. In mod similar, dac baza de date nu poate fi accesat se va afia mesajul coninut de die(). nchiderea conexiunii se face folosind funcia mysql_close() avnd ca argument identificatorul de acces la serverul MySQL. mysql_close($link); Datele din fiierul connect.php trebuie modificate dup situaia concret existent. tergerea bazei de date se realizeaz astfel: <?php include "connect.php"; $sql = 'DROP DATABASE baza1'; if (mysql_query($sql, $link)) { echo "Baza de date baza1 a fost stearsa \n"; } else { echo "Eroare la stergerea bazei de date: ' . mysql_error() . "\n"; } ?> Crearea tabelelor Bazele de date sunt formate din tabele. Fiecare tabel are un nume. Vom crea un tabel cu numele de Profesori ce are ca cmpuri numele, prenumele i vechimea. Secvena PHP este urmtoarea: <?php include "connect.php"; $result = mysql_query('CREATE TABLE Profesori(Nume VARCHAR(20), Prenume VARCHAR(20), Vechime INT);'); if (!$result) { die('Tabelul Profesori nu a fost creat: ' . mysql_error()); } ?> tergerea tabelelor $result = mysql_query(DROP TABLE nume_tabel); if (!$result) {

113

Serverul MySQL

die('Tabelul nume_tabel nu a putut fi sters: ' . mysql_error()); } Inserarea nregistrrilor: Funcia mysql_query() este utilizat pentru interogarea unei baze de date. Ea are doi parametrii: irul ce reprezint interogarea i eventual identificatorul conexiunii (identificatorul de acces la baza de date). n continuare vom da un exemplu prin care prin intermediul unui formular se preiau valori ce vor fi stocate n tabelul Profesori din exemplul precedent: Formularul va arta ca n figura urmtoare:

Codul Html este: <html><head> <title>Introducere date</title> </head><body> <form name="insereaza" action="in.php" method="post"> Numele:<input name="nume" type="text" value=""><br> Prenumele:<input name="prenume" type="text" value=""><br> Vechimea:<input name="vechime" type="text" value=""><br> <input type="submit" value="Send"> <input type="reset" value="Reset"> </form> </body></html> Iar scriptul in.php ce figureaz n atributul action al etichetei form din codul de mai sus este listat n continuare: <html><head> <title>rezultat</title> </head><body> <?php include "connect.php"; $nume=$_POST['nume']; $prenume=$_POST['prenume']; $vechime=$_POST['vechime']; $query="INSERT INTO Profesori (Nume, Prenume, Vechime) VALUES ('$nume','$prenume','$vechime')"; if (!mysql_query($query)) { die(mysql_error()); } else { echo "datele au fost introduse";

114 } mysql_close($link); ?> </body></html>

Manual de informatic pentru clasa a XII-a

n cazul n care operaia se termin cu succes n browser se va ncrca aceast pagin interpretat prima dat de ctre serverul de web de catre interpretorul php, iar codul html rezultat va fi interpretat de catre browser i se va afisa un mesajul de mai jos:.

Extragerea informaiilor Construcia SELECT este utilizat ca argument pentru funcia mysql_query() pentru a extrage anumite informaii din tabelul Profesori ai bazei de date baza1. Interogarea pentru selectarea datelor din tabel este: $result=mysql_query("SELECT * FROM Profesori"); Comanda mysql_fetch_row() este utilizat ntr-o bucl pentru a afia fiecare rnd din tabel, aa cum se poate observa n exemplul urmtor: <html><head> <title>afisare</title> </head><body> <?php include "connect.php"; $query="select * from Profesori"; $result=mysql_query($query); if (!$result) { die(mysql_error()); } else { echo "<table border=1>"; echo "<tr><td>Nume</td><td>Prenume</td><td>Vechime</td></tr>"; while ($row=mysql_fetch_row($result)){ echo "<tr><td>$row[0]</td><td>$row[1]</td><td>$row[2]</td></tr>"; } echo "</table>"; echo "Numar inregistrari selectate = ".mysql_num_rows($result); } mysql_close($link); ?> </body></html> Rezultatul n navigatorul utilizatorului va fi un tabel ce pe prima linie conine numele cmpurilor tabelei, iar n continuare datele corespunztoare extrase din tabel, aa cum reiese din figura urmtoare:

115

Serverul MySQL

Pe ultima linie avem un mesaj legat de numrul nregistrrilor afiate. Aceasta s-a realizat cu apelul funciei: mysql_num_rows(...) cu parametrul $result. Cutarea nregistrrilor n exemplul urmtor vom cuta o nregistrare sau mai multe n tabel. Formularul este prezentat n continuare: <html> <head><title>Cautare</title> </head> <body> <b>Cautare profesor</b> <form method="POST" action="afis.php"> Numele cautat: <input type="text" name="numec"><br> <input type="submit" value="Trimite"> </form> </body> </html>

Din acest formular este preluat numele profesorului. Pentru cutarea lui n tabel utilizm scriptul afis.php : <html><head> <title>afisare</title> </head><body> <?php include "connect.php";

116

Manual de informatic pentru clasa a XII-a

$numec=$_POST['numec']; $query="select * from Profesori WHERE nume='$numec'"; $result=mysql_query($query); if (!$result) { die(mysql_error()); } else { echo "<table border=1>"; echo "<tr><td>Nume</td><td>Prenume</td><td>Vechime</td></tr>"; while ($row=mysql_fetch_row($result)){ echo "<tr><td>$row[0]</td><td>$row[1]</td><td>$row[2]</td></tr>"; } echo "</table>"; } echo Numar inregistrari selectate = . mysql_num_rows($result); mysql_close($link); ?> </body> </html> n cazul exemplului nostru rezultatul cutrii este afiat n continuare:

n continuare vom prezenta un exemplu de interogare folosind doua cmpuri obligatorii <html><head><title>Cautare</title></head> <body> <b>Cautare</b> <form method="POST" action="afis.php"> Numele cautat: <input type="text" name="nume1"><br> Prenumele cautat: <input type="text" name="prenume1"><br> <input type="submit" value="Send"> </form> </body> </html> Codul PHP este urmtorul: <?php include "connex.php"; $nume1=$_POST['nume1']; $prenume1=$_POST['prenume1'];

117

Serverul MySQL

$sql=mysql_query("SELECT * FROM Profesori WHERE nume='$nume1' && prenume='$prenume1'"); echo "<table border=1>"; echo "<tr><td>Nume</td><td>Prenume</td><td>Vechime</td></tr>"; while ($row=mysql_fetch_row($sql)) { echo "<tr><td>$row[0]</td><td>$row[1]</td><td>$row[2]</td></tr>"; } echo "</table>"; mysql_close($link); ?> Actualizarea nregistrrilor (clauza UPDATE) Putem modifica valoarea unei nregistrri (sau a mai multora) atunci cnd este ndeplinit o anumit condiie. n acest caz interogarea este: $query="UPDATE Profesori SET nume='$nume_nou', prenume='$prenume_nou' WHERE vechime='$valoare' "; i va fi aplicat ca argument funciei mysql_query(). tergerea nregistrrilor tergerea poate fi fcut cu sintaxa: $query=DELETE FROM Profesori WHERE varsta>='$id' Ca i n celelalte exemple irul $query este argumentul funciei mysql_query(). Este recomandat ca dup fiecare selecie a unor nregistrri din cadrul tabelei prin instruciunea SQL SELECT s se foloseasc instruciunea mysql_free_result. Aceasta permite eliberarea resurselor asociate variabilei $result. mysql_free_result($result);

Aplicaie : magazin virtual n continuare vom prezenta o aplicaie complex care gestioneaz operaiile de baz ce au loc ntr-un magazin virual. Operaiile implementate permit administrarea produselor, nregistrarea comenzilor i administrarea acestora. Aceast aplicaie utilizeaz o baz de date numit magazin , ce conine trei tabele: comanda, detalii_comanda i produse. Tabelele se creaz cu comenzile: CREATE TABLE `comanda` ( `id_comanda` int(10) unsigned NOT NULL auto_increment, `data` datetime NOT NULL, `descriere` varchar(100) NOT NULL, PRIMARY KEY (`id_comanda`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

118

Manual de informatic pentru clasa a XII-a

CREATE TABLE `detalii_comanda` ( `id_detaliu` int(10) unsigned NOT NULL auto_increment, `id_comanda` int(10) unsigned NOT NULL, `id_produs` int(10) unsigned NOT NULL, `cantitate` int(11) NOT NULL, PRIMARY KEY (`id_detaliu`), KEY `id_comanda` (`id_comanda`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; CREATE TABLE `produse` ( `id_produs` int(10) unsigned NOT NULL auto_increment, `descriere` varchar(100) NOT NULL, `pret` decimal(14,2) NOT NULL, PRIMARY KEY (`id_produs`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; Interfaa aplicaiei este ilustrat n imaginile de mai jos:

119

Serverul MySQL

Fiierul index este urmtorul: <html><head> <title>Magazin virtual</title> </head> <frameset cols="200,*" rows="*"> <frame frameborder="1" src="meniu.php" name="meniu" /> <frame frameborder="0" src="produse.php" name="princ"/> </frameset></html> Fiierul meniu.php este urmtorul: <html><head> <title>Meniu</title> </head><body> <div align="center">Meniul principal</div> <br><br> <div align="center"><a href="produse.php" target="princ">Administrare produse</a></div> <br>

120

Manual de informatic pentru clasa a XII-a

<div align="center"><a href="comanda.php" target="princ">Comanda noua</a></div> <br> <div align="center"><a href="lista_comenzi.php" target="princ">Administrare comenzi</a></div> </body></html> Fiierul produse.php este urmtorul: <?php include_once("include/config.inc.php");?> <?php //testam daca s-a apasat butonul Adauga sau Modifica if(isset($_POST["descriere"]) && isset($_POST["pret"])){ $lcDescriere = mysql_real_escape_string(trim($_POST["descriere"])); //se recomanda folosirea functiilor speciale de tip "mysql_real_escape_string" pentru a preveni eventualele fenomene de tip "sql injection" $lnPret = (float)$_POST["pret"]; //se recomanda folosirea operatorilor de casting pentru a fi siguri ca in variabila finala vom avea o valoare numerica if(isset($_POST["id_produs"])) $lnIdProdus = (integer)$_POST["id_produs"]; else $lnIdProdus = 0; if(strlen($lcDescriere) && $lnPret > 0){ //ambele campuri sunt obligatorii if($lnIdProdus > 0){ //inseamna ca a fost apasat butonul Modifica $lcTextQuery = "UPDATE produse SET descriere = '". $lcDescriere."', pret = ".$lnPret." WHERE id_produs = ". $lnIdProdus; mysql_query($lcTextQuery) or die(mysql_error()); } else{ //inseamna ca s-a apasat butonul Adauga $lcTextQuery = "INSERT INTO produse SET descriere = '". $lcDescriere."', pret = ".$lnPret; mysql_query($lcTextQuery) or die(mysql_error()); }} header("Location: produse.php"); //fortez o reincarcare a paginii exit;} if(isset($_GET["id_produs"]) && isset($_GET["comanda"])){

121 //in aceasta ramura sa ajunge daca: //1. S-a ales un produs pentru a fi modificat //2. S-a ales un produs pentru a fi sters $lnIdProdus = (integer)$_GET["id_produs"];

Serverul MySQL

if($lnIdProdus > 0 && $_GET["comanda"]=='modif'){ // 1. incarc datele produsului selectat $lcTextQuery = "SELECT * FROM produse WHERE id_produs = ".$lnIdProdus; $lrQueryRes = mysql_query($lcTextQuery) or die(mysql_error()); if(mysql_num_rows($lrQueryRes)==1){ $laRes = mysql_fetch_array($lrQueryRes); $lnFormIdProdus = $laRes["id_produs"]; $lcFormDescriere = $laRes["descriere"]; $lnFormPret = $laRes["pret"]; }} if($lnIdProdus > 0 && $_GET["comanda"]=='sterg'){ // 2. sterg produsul selectat $lcTextQuery = "DELETE FROM produse WHERE id_produs = ". $lnIdProdus; mysql_query($lcTextQuery) or die(mysql_error()); header("Location: produse.php"); //fortez o reincarcare a paginii exit; }}?> <html><head> <title>Produse</title> </head><body> <div align="center">Administrare produse</div><br><br> <div align="left"> <?php if(isset($lnFormIdProdus)) echo "Modificare produs:"; else echo "Adaugare produs nou:"?> </div><br> <form name="frm_prod" method="post" action="produse.php"> <?php if(isset($lnFormIdProdus)) {?> <input type="Hidden" name="id_produs" value="<?php if(isset($lnFormIdProdus)) echo $lnFormIdProdus?>"> <?php }?>

122

Manual de informatic pentru clasa a XII-a

<table border="1" cellpadding="7"> <tr><td>Descriere:</td> <td><input type="Text" name="descriere" size="60" maxlength="100"<?php if(isset($lcFormDescriere)) {?> value="<?php echo $lcFormDescriere?>"<?php }?>></td> </tr><tr> <td>Pret:</td> <td><input type="Text" name="pret" size="15" maxlength="15"<? php if(isset($lnFormPret)) {?> value="<?php echo $lnFormPret? >"<?php }?>></td> </tr><tr> <td colspan="2" align="center"><input type="Submit" value="<? php if(isset($lnFormIdProdus)) echo "Modifica"; else echo "Adauga"?>"></td> </tr></table></form> <hr> <br> <div align="left">Produse existente:</div> <br> <?php //iau din baza de date produsele existente $lcTextQuery = "SELECT * FROM produse ORDER BY descriere"; $lrQueryRes = mysql_query($lcTextQuery) or die(mysql_error()); // verific daca am cel putin un produs in baza de date if(mysql_num_rows($lrQueryRes)){ //daca capul de tabel si datele primite?> <table border="1" cellpadding="5"> <tr bgcolor="#dfdfdf"> <td align="center">Optiuni</td> <td align="center">Cod produs</td> <td align="center">Descriere</td> <td align="center">Pret</td> </tr> <?php //parcurg datele primite while($laRes = mysql_fetch_array($lrQueryRes)){?> <tr><td align="center"><a href="produse.php?id_produs=<?php echo $laRes["id_produs"]?>&comanda=sterg">Sterge</a></td> <td align="center"><?php echo $laRes["id_produs"]?></td> <td align="left"><a href="produse.php?id_produs=<?php $laRes["id_produs"]?>&comanda=modif"> <?php echo htmlentities($laRes["descriere"])?></a></td> <td align="right"><?php echo $laRes["pret"]?></td> echo da atunci afisez

123 </tr><?php }?> </table> <?php }

Serverul MySQL

//daca nu am nici un produs in baza de date afisez un mesaj corespunzator else echo "Nu am nici un produs in baza de date!";?> </body></html> Fiierul config.inc.php conine datele de identificare: <? //detaliile referitoare la conexiunea cu serverul de baza de date $lcMysqlServer = "localhost"; $lcMysqlUser = "root"; $lcMysqlPassword = "abc123"; $lcMysqlDatabase = "magazin"; $gnDbConn = mysql_connect($lcMysqlServer, $lcMysqlUser, $lcMysqlPassword) or die("Eroare de conectare la serverul de baze de date! : ".mysql_error()); mysql_select_db($lcMysqlDatabase) or die("Eroare la selectarea bazei de date ".$lcMysqlDatabase."! : ".mysql_error()); ?> Fiirul comanda.php: <?php include_once("include/config.inc.php");?> <?php //daca s-a apasat butonul Adauga produs if(isset($_POST["id_produs"])){ $lnIdProdus = (integer)$_POST["id_produs"]; // avem 2 cazuri: 1. cand se adauga pt prima data un produs la o comanda noua // 2. cand se adauga un produs la o comanda deja creata if(!isset($_POST["id_comanda"])){ //cazul 1. //mai intai se creaza comanda $lcTextQuery = "INSERT INTO comanda SET data = NOW() "; mysql_query($lcTextQuery) or die(mysql_error()); $lnIdComanda = mysql_insert_id(); //se adauga produsul in lista $lcTextQuery = "INSERT INTO detalii_comanda SET id_comanda = ".$lnIdComanda.", id_produs = ".$lnIdProdus.", cantitate = 1 "; mysql_query($lcTextQuery) or die(mysql_error()); } else { //cazul 2. $lnIdComanda = (integer)$_POST["id_comanda"]; //verificam mai intai daca produsul nu mai este deja in lista de produse alese

124

Manual de informatic pentru clasa a XII-a

$lcTextQuery = "SELECT id_detaliu FROM detalii_comanda WHERE id_comanda = ".$lnIdComanda." AND id_produs = ".$lnIdProdus." LIMIT 1 "; $lrQueryRes = mysql_query($lcTextQuery) or die(mysql_error()); if(mysql_num_rows($lrQueryRes)){ //daca exista deja atunci incrementam cantitatea $laRes = mysql_fetch_array($lrQueryRes); $lnIdDetaliu = $laRes["id_detaliu"]; $lcTextQuery = "UPDATE detalii_comanda SET cantitate = cantitate + 1 WHERE id_detaliu = ".$lnIdDetaliu; mysql_query($lcTextQuery) or die(mysql_error()); } else { //daca nu mai este in lista atunci adaugam o linie noua in detalii_comanda $lcTextQuery = "INSERT INTO detalii_comanda SET id_comanda = ".$lnIdComanda.", id_produs = ".$lnIdProdus.", cantitate = 1 "; mysql_query($lcTextQuery) or die(mysql_error()); } } } //daca s-a apasat butonul Modifica de la descriere comanda if(isset($_POST["id_comanda"]) && isset($_POST["descriere"])) { $lcDescriere = mysql_real_escape_string(trim($_POST["descriere"])); //se recomanda folosirea functiilor speciale de tip "mysql_real_escape_string" pentru a preveni eventualele fenomene de tip "sql injection" $lnIdComanda = (integer)$_POST["id_comanda"]; if(strlen($lcDescriere) && $lnIdComanda > 0){ $lcTextQuery = "UPDATE comanda SET descriere = '". $lcDescriere."' WHERE id_comanda = ".$lnIdComanda; mysql_query($lcTextQuery) or die(mysql_error()); } } //daca s-a apasat pe modificarea unei cantitati a unui produs if(isset($_GET["id_comanda"]) && isset($_GET["id_produs"]) && isset($_GET["cant"])){ $lnIdComanda = (integer)$_GET["id_comanda"]; $lnIdProdus = (integer)$_GET["id_produs"]; $lnCant = (integer)$_GET["cant"]; //avem 2 cazuri: 1. cand cant > 0 => modificam cantitatea // 2. cand cant = 0 => stergem produsul din lista

125

Serverul MySQL

if($lnIdComanda > 0 && $lnIdProdus > 0 && $lnCant > 0) { //cazul 1. $lcTextQuery = "UPDATE detalii_comanda SET cantitate = ".$lnCant." WHERE id_comanda = ".$lnIdComanda." AND id_produs = ".$lnIdProdus; mysql_query($lcTextQuery) or die(mysql_error()); } if($lnIdComanda > 0 && $lnIdProdus > 0 && $lnCant == 0){ //cazul 2. $lcTextQuery = "DELETE FROM detalii_comanda WHERE id_comanda = ".$lnIdComanda." AND id_produs = ".$lnIdProdus; mysql_query($lcTextQuery) or die(mysql_error()); //trebuie verificat daca nu cumva a fost sters ultimul produs din aceasta comanda $lcTextQuery = "SELECT id_detaliu FROM detalii_comanda WHERE id_comanda = ".$lnIdComanda; $lrQueryRes = mysql_query($lcTextQuery) or die(mysql_error()); if(!mysql_num_rows($lrQueryRes)){ //daca nu mai exista nici un produs atunci stergem si comanda $lcTextQuery = "DELETE FROM comanda WHERE id_comanda = ".$lnIdComanda; mysql_query($lcTextQuery) or die(mysql_error()); header("Location: comanda.php"); //fortez o reincarcare a paginii exit; } } } ?> <html> <head> <title>Comanda noua</title> </head> <body> <div align="center">Comanda noua</div> <br><br> <?php if(isset($lnIdComanda)){ //iau din baza de date detaliile despre aceasta comanda $lcTextQuery = "SELECT descriere, DATE_FORMAT(data, '%d%m-%Y') as data_com FROM comanda WHERE id_comanda = ". $lnIdComanda; $lrQueryRes = mysql_query($lcTextQuery) or die(mysql_error()); $laRes = mysql_fetch_array($lrQueryRes);?>

126

Manual de informatic pentru clasa a XII-a

<form name="frm_descr" method="post" action="comanda.php"> <input type="Hidden" name="id_comanda" value="<?php echo $lnIdComanda;?>"> <table> <tr> <td>Id comanda:</td> <td><?php echo $lnIdComanda;?></td> </tr> <tr> <td>Data comanda:</td> <td><?php echo $laRes["data_com"];?></td> </tr> <tr> <td>Descriere comanda:</td> <td> <input type="Text" name="descriere" size="60" maxlength="100" value="<?php echo $laRes["descriere"];?>">&nbsp;&nbsp; <input type="Submit" value="Modifica"> </td> </tr> </table> </form> <?php } else echo "O comanda devine valida in momentul in care are cel putin un produs in lista!"?> <hr> <form name="frm_comanda" method="post" action="comanda.php"> <?php if(isset($lnIdComanda)){?><input type="Hidden" name="id_comanda" value="<?php echo $lnIdComanda;?>"><?php }? > <div align="left"> Adauga produs la comanda:&nbsp; <?php //iau din baza de date produsele existente $lcTextQuery = "SELECT * FROM produse ORDER BY descriere"; $lrQueryRes = mysql_query($lcTextQuery) or die(mysql_error()); // verific daca am cel putin un produs in baza de date if(mysql_num_rows($lrQueryRes)){ //daca da atunci afisez selectul si datele primite?> <select name="id_produs"> <?php //parcurg datele primite while($laRes = mysql_fetch_array($lrQueryRes)){?> <option value="<?php echo $laRes["id_produs"]? >"><?php echo htmlentities($laRes["descriere"])?> (<?php echo $laRes["pret"]?>)</option>

127

Serverul MySQL

<?php }?> </select> &nbsp;<input type="Submit" value="Adauga"> <?php } //daca nu am nici un produs in baza de date afisez un mesaj corespunzator else echo "Nu am nici un produs in baza de date!";?> </div> </form> <?php if(isset($lnIdComanda)){?> <hr> <br> <div align="left">Produse alese:</div> <br> <?php //iau din baza de date produsele existente la comanda respectiva $lcTextQuery = "SELECT t1.cantitate, t2.* FROM detalii_comanda AS t1 LEFT JOIN produse AS t2 ON t2.id_produs = t1.id_produs WHERE t1.id_comanda = ". $lnIdComanda." AND t2.pret IS NOT NULL ORDER BY t2.descriere"; $lrQueryRes = mysql_query($lcTextQuery) or die(mysql_error()); // verific daca am cel putin un produs in baza de date if(mysql_num_rows($lrQueryRes)){ //daca da atunci afisez capul de tabel si datele primite?> <table border="1" cellpadding="5"> <tr bgcolor="#dfdfdf"> <td align="center">Cod produs</td> <td align="center">Descriere</td> <td align="center">Pret</td> <td align="center">Cantitate</td> </tr> <?php //parcurg datele primite while($laRes = mysql_fetch_array($lrQueryRes)){?> <tr> <td align="center"><?php echo $laRes["id_produs"]?></td> <td align="left"><?php echo htmlentities($laRes["descriere"])?></td> <td align="right"><?php echo $laRes["pret"]? ></td> <td align="right"> <select name="cant_<?php echo $laRes["id_produs"]?>" onchange="javascript: _cant_go('<?php echo $laRes["id_produs"]?>', '<?php echo $lnIdComanda?>')">

128

Manual de informatic pentru clasa a XII-a

<?php for ($j=0;$j<(20+ $laRes["cantitate"]);$j++){?> <option value="<?php echo $j?>" <?php if($laRes["cantitate"]==$j) echo 'selected="selected"'?>><? php echo$j?></option> <?}?> </select> </tr> <?php }?> </table> <?php } //daca nu am nici un produs in baza de date afisez un mesaj corespunzator else echo "Nu am nici un produs in baza de date!";?> <?php }?> <script> function _cant_go(id_produs, id_comanda){ var str = 'comanda.php?id_produs=' + id_produs + '&id_comanda=' + id_comanda + '&cant=' + eval('document.getElementById("cant_'+id_produs+'").options[d ocument.getElementById("cant_'+id_produs+'").selectedIndex].v alue'); //alert(str); location.href = str; } </script> </body> </html> Fiierul lista_comenzi.php <?php include_once("include/config.inc.php");?> <?php // stergere comanda if(isset($_GET["id_comanda"]) && isset($_GET["comanda"])){ $lnIdComanda = (integer)$_GET["id_comanda"]; if($lnIdComanda > 0 && $_GET["comanda"]=='sterg'){ $lcTextQuery = "DELETE FROM comanda WHERE id_comanda = ".$lnIdComanda; mysql_query($lcTextQuery) or die(mysql_error()); $lcTextQuery = "DELETE id_comanda = ".$lnIdComanda; FROM detalii_comanda WHERE

mysql_query($lcTextQuery) or die(mysql_error()); header("Location: lista_comenzi.php"); //fortez o reincarcare a paginii exit;

129 }}?> <html><head> <title>Lista comenzi</title> </head><body>

Serverul MySQL

<div align="center">Administrare comenzi</div><br> <?php //iau din baza de date comenzile existente $lcTextQuery = "SELECT t1.id_comanda, DATE_FORMAT(t1.data, '%d-%m-%Y') as data_com, IF(LENGTH(t1.descriere)=0, '(lipsa descriere)',t1.descriere) AS descriere, (SELECT COUNT(t2.id_detaliu) FROM detalii_comanda AS t2 WHERE t2.id_comanda = t1.id_comanda) AS cate_distincte, (SELECT SUM(t2.cantitate) FROM detalii_comanda AS t2 WHERE t2.id_comanda = t1.id_comanda) AS cate_total FROM comanda AS t1"; $lcTextQuery .= " ORDER BY t1.data DESC"; $lrQueryRes = mysql_query($lcTextQuery) or die(mysql_error()); // verific daca am cel putin o comanda in baza de date if(mysql_num_rows($lrQueryRes)){ //daca capul de tabel si datele primite?> <table border="1" cellpadding="5"> <tr bgcolor="#dfdfdf"> <td align="center">Optiuni</td> <td align="center">Id comanda</td> <td align="center">Data</td> <td align="center">Descriere</td> <td align="center">Produse distincte</td> <td align="center">Total produse</td> </tr> <?php //parcurg datele primite while($laRes = mysql_fetch_array($lrQueryRes)){?> <tr> <td align="center"> <a href="lista_comenzi.php?id_comanda= <?php echo $laRes["id_comanda"]?>&comanda=sterg">Sterge</a></td> <td align="center">&nbsp;<?php echo $laRes["id_comanda"]?></td> <td align="center">&nbsp;<?php echo $laRes["data_com"]? ></td> da atunci afisez

130

Manual de informatic pentru clasa a XII-a

<td align="left">&nbsp; <a href="lista_comenzi_fisa.php? id_comanda=<?php echo $laRes["id_comanda"]?>"><?php echo htmlentities($laRes["descriere"])?></a></td> <td align="center">&nbsp;<?php echo $laRes["cate_distincte"]?> </td> <td align="center">&nbsp;<?php echo $laRes["cate_total"]?></td> </tr><?php }?> </table> <?php } //daca nu am nici o comanda in baza de date afisez un mesaj corespunzator else echo "Nu am nici o comanda in baza de date!";?> <script> function _data_go(){ var str = 'lista_comenzi.php?&data=' + eval('document.getElementById("data").options[document.getEle mentById("data").selectedIndex].value'); //alert(str); location.href = str;} </script> </body></html> i n final fiierul lista_comenzi_fisa.php <?php include_once("include/config.inc.php");?> <?php //daca s-a apasat butonul Adauga produs if(isset($_POST["id_produs"]) && isset($_POST["id_comanda"])) { $lnIdProdus = (integer)$_POST["id_produs"]; $lnIdComanda = (integer)$_POST["id_comanda"]; //verificam mai intai daca produsul nu mai este deja in lista de produse alese $lcTextQuery = "SELECT id_detaliu FROM detalii_comanda WHERE id_comanda = ".$lnIdComanda." AND id_produs = ". $lnIdProdus." LIMIT 1 "; $lrQueryRes = mysql_query($lcTextQuery) or die(mysql_error()); if(mysql_num_rows($lrQueryRes)){ //daca exista deja atunci incrementam cantitatea $laRes = mysql_fetch_array($lrQueryRes); $lnIdDetaliu = $laRes["id_detaliu"]; $lcTextQuery = "UPDATE detalii_comanda SET cantitate = cantitate + 1 WHERE id_detaliu = ".$lnIdDetaliu; mysql_query($lcTextQuery) or die(mysql_error());

131

Serverul MySQL

} else { //daca nu mai este in lista atunci adaugam o linie noua in detalii_comanda $lcTextQuery = "INSERT INTO detalii_comanda SET id_comanda = ".$lnIdComanda.", id_produs = ".$lnIdProdus.", cantitate = 1 "; mysql_query($lcTextQuery) or die(mysql_error()); } } //daca s-a apasat butonul Modifica de la descriere comanda if(isset($_POST["id_comanda"]) && isset($_POST["descriere"])) { $lcDescriere = mysql_real_escape_string(trim($_POST["descriere"])); //se recomanda folosirea functiilor speciale de tip "mysql_real_escape_string" pentru a preveni eventualele fenomene de tip "sql injection" $lnIdComanda = (integer)$_POST["id_comanda"]; if(strlen($lcDescriere) && $lnIdComanda > 0){ $lcTextQuery = "UPDATE comanda SET descriere = '". $lcDescriere."' WHERE id_comanda = ".$lnIdComanda; mysql_query($lcTextQuery) or die(mysql_error()); } } //daca s-a apasat pe modificarea unei cantitati a unui produs if(isset($_GET["id_comanda"]) && isset($_GET["id_produs"]) && isset($_GET["cant"])){ $lnIdComanda = (integer)$_GET["id_comanda"]; $lnIdProdus = (integer)$_GET["id_produs"]; $lnCant = (integer)$_GET["cant"]; //avem 2 cazuri: 1. cand cant > 0 => modificam cantitatea // 2. cand cant = 0 => stergem produsul din lista if($lnIdComanda > 0 && $lnIdProdus > 0 && $lnCant > 0) { //cazul 1. $lcTextQuery = "UPDATE detalii_comanda SET cantitate = ".$lnCant." WHERE id_comanda = ".$lnIdComanda." AND id_produs = ".$lnIdProdus; mysql_query($lcTextQuery) or die(mysql_error()); } if($lnIdComanda > 0 && $lnIdProdus > 0 && $lnCant == 0){ //cazul 2. $lcTextQuery = "DELETE FROM detalii_comanda WHERE id_comanda = ".$lnIdComanda." AND id_produs = ".$lnIdProdus; mysql_query($lcTextQuery) or die(mysql_error()); //trebuie verificat daca nu cumva a fost sters ultimul produs din aceasta comanda

132

Manual de informatic pentru clasa a XII-a

$lcTextQuery = "SELECT id_detaliu FROM detalii_comanda WHERE id_comanda = ".$lnIdComanda; $lrQueryRes = mysql_query($lcTextQuery) or die(mysql_error()); if(!mysql_num_rows($lrQueryRes)){ //daca nu mai exista nici un produs atunci stergem si comanda $lcTextQuery = "DELETE FROM comanda WHERE id_comanda = ".$lnIdComanda; mysql_query($lcTextQuery) or die(mysql_error()); header("Location: lista_comenzi.php"); //fortez o reincarcare a paginii exit; } } } if(isset($_GET["id_comanda"])) $lnIdComanda = (integer)$_GET["id_comanda"]; ?> <html> <head> <title>Lista produse comanda</title> </head> <body> <div align="center">Lista produse comanda</div> <br> <div align="right"> <a href="lista_comenzi.php">Inapoi la lista de comenzi</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;</div> <?php if(isset($lnIdComanda)){ //iau din baza de date detaliile despre aceasta comanda $lcTextQuery = "SELECT descriere, DATE_FORMAT(data, '%d%m-%Y') as data_com FROM comanda WHERE id_comanda = ". $lnIdComanda; $lrQueryRes = mysql_query($lcTextQuery) or die(mysql_error()); $laRes = mysql_fetch_array($lrQueryRes);?> <form name="frm_descr" method="post" action="lista_comenzi_fisa.php"> <input type="Hidden" name="id_comanda" value="<?php echo $lnIdComanda;?>"> <table> <tr> <td>Id comanda:</td> <td><?php echo $lnIdComanda;?></td>

133

Serverul MySQL

</tr> <tr> <td>Data comanda:</td> <td><?php echo $laRes["data_com"];?></td> </tr> <tr> <td>Descriere comanda:</td> <td> <input type="Text" name="descriere" size="60" maxlength="100" value="<?php echo $laRes["descriere"];?>">&nbsp;&nbsp; <input type="Submit" value="Modifica"> </td> </tr> </table> </form> <?php } else echo "O comanda devine valida in momentul in care are cel putin un produs in lista!"?> <hr> <form name="frm_comanda" method="post" action="lista_comenzi_fisa.php"> <?php if(isset($lnIdComanda)){?><input type="Hidden" name="id_comanda" value="<?php echo $lnIdComanda;?>"><?php }? > <div align="left"> Adauga produs la comanda:&nbsp; <?php //iau din baza de date produsele existente $lcTextQuery = "SELECT * FROM produse ORDER BY descriere"; $lrQueryRes = mysql_query($lcTextQuery) or die(mysql_error()); // verific daca am cel putin un produs in baza de date if(mysql_num_rows($lrQueryRes)){ //daca da atunci afisez selectul si datele primite?> <select name="id_produs"> <?php //parcurg datele primite while($laRes = mysql_fetch_array($lrQueryRes)){?> <option value="<?php echo $laRes["id_produs"]? >"><?php echo htmlentities($laRes["descriere"])?> (<?php echo $laRes["pret"]?>)</option> <?php }?> </select> &nbsp;<input type="Submit" value="Adauga"> <?php } //daca nu am nici un produs in baza de date afisez un mesaj corespunzator else echo "Nu am nici un produs in baza de date!";?>

134 </div> </form>

Manual de informatic pentru clasa a XII-a

<?php if(isset($lnIdComanda)){?> <hr> <br> <div align="left">Produse alese:</div> <br> <?php //iau din baza de date produsele existente la comanda respectiva $lcTextQuery = "SELECT t1.cantitate, t2.* FROM detalii_comanda AS t1 LEFT JOIN produse AS t2 ON t2.id_produs = t1.id_produs WHERE t1.id_comanda = ". $lnIdComanda." AND t2.pret IS NOT NULL ORDER BY t2.descriere"; $lrQueryRes = mysql_query($lcTextQuery) or die(mysql_error()); // verific daca am cel putin un produs in baza de date if(mysql_num_rows($lrQueryRes)){ //daca da atunci afisez capul de tabel si datele primite?> <table border="1" cellpadding="5"> <tr bgcolor="#dfdfdf"> <td align="center">Cod produs</td> <td align="center">Descriere</td> <td align="center">Pret</td> <td align="center">Cantitate</td> </tr> <?php //parcurg datele primite while($laRes = mysql_fetch_array($lrQueryRes)){?> <tr> <td align="center"><?php echo $laRes["id_produs"]?></td> <td align="left"><?php echo htmlentities($laRes["descriere"])?></td> <td align="right"><?php echo $laRes["pret"]? ></td> <td align="right"> <select name="cant_<?php echo $laRes["id_produs"]?>" onchange="javascript: _cant_go('<?php echo $laRes["id_produs"]?>', '<?php echo $lnIdComanda?>')"> <?php for ($j=0;$j<(20+ $laRes["cantitate"]);$j++){?> <option value="<?php echo $j?>" <?php if($laRes["cantitate"]==$j) echo 'selected="selected"'?>><? php echo$j?></option> <?}?> </select> </tr>

135

Serverul MySQL

<?php }?> </table> <?php } //daca nu am nici un produs in baza de date afisez un mesaj corespunzator else echo "Nu am nici un produs in baza de date!";?> <?php }?> <script> function _cant_go(id_produs, id_comanda){ var str = 'lista_comenzi_fisa.php?id_produs=' + id_produs + '&id_comanda=' + id_comanda + '&cant=' + eval('document.getElementById("cant_'+id_produs+'").options[d ocument.getElementById("cant_'+id_produs+'").selectedIndex].v alue'); //alert(str); location.href = str; } </script> </body> </html> Rezumat Pentru accesul la serverul MySQL i gestiunea bazelor de date limbajul PHP dispune defuncii specializate: mysql_connect() pentru conextare la server, mysql_select_db() pentru selectarea bazei de date mysql_query() pentru realizarea interogrilor mysql_close() pentru nchiderea conexiunii mysql_fetch_row() preia nregistrrile una cte una

Aplicaii
1. Creai o tabel care s conin cmpurile: nume, prenume, adresa, ora, i jude. Implementai practic o aplicaie care s realizeze urmtoarele operaii: inserai prin intermediul unui formular noi nregistrri n tabel afiai n browser toi utilizatorii care sunt din Bucureti afiai n browser toi utilizatorii care sunt dintr-un jude care ncepe cu litera T realizai un formular care s tearg din baza de date anumite nregistrri

2. Tabela Profesori a fost creat cu urmtoarea comand: CREATE TABLE Profesori(Nume VARCHAR(20), Prenume VARCHAR(20), Vechime INT);

136

Manual de informatic pentru clasa a XII-a

SELECT SELECT INSERT SELECT SELECT SELECT SELECT SELECT '%o%'; SELECT

Realizai urmtoarele interogri n tabela Profesori: * FROM Profesori WHERE Nume<'R'; Nume, Prenume FROM Profesori WHERE Vechime>=20; INTO Profesori VALUES('Pop', 'Dan', 30); * FROM Profesori ORDER BY Nume; * FROM Profesori ORDER BY Nume, Prenume; * FROM Profesori ORDER BY Vechime DESC; * FROM Profesori WHERE Nume LIKE 'P%'; * FROM Profesori WHERE Nume LIKE '%o%' OR Prenume LIKE * FROM Profesori WHERE Nume LIKE '____'; Creai pentru fiecare interogare o interfa web corespunztoare.

3. Creai tabelul FILME care cuprinde principalele producii cinematografice din secolul XX, cu urmtoarea structur: Nume_film CHAR(30) Gen ara An Regizor CHAR (20) CHAR (10) SMALLINT CHAR (20) creai o interfa web pentru introducerea de noi filme afiai filmele produse n Romnia ntr-un anumit an care sunt filmele de un anumit gen produse n Romnia ? creai un nou fiier cu lista filmelor regizate de un anumit regizor.

4. Biroul de vnzri al unei uniti utilizeaz urmtorul tabel Clienti Nrcrt Client Adresac Denp Data CHAR(5) CHAR(20) CHAR(5) DATE - nume client - denumire produs - data livrarii CHAR(40) - adresa client

Cant_livrata SMALLINT s se afieze cantitatea livrata unui client (citit dintr-un formular) dintr-un anumit produs (citit dintr-un formular) s se afieze produsele livrate in ultimele 10 zile

5. Pentru a realiza monografia liceului se folosete tabelul Absolventi, ce are structura: Nume CHAR(20)

137 Promotia Clasa Diriginte SMALLINT CHAR(1) CHAR(20)

Serverul MySQL

Studii superioare CHAR(1) Se cer urmtoarele situaii: afiarea elevilor unei promoii urmate de afiarea numrului de elevi ai promoiei respective afiarea elevilor unei clase dintr-o promoie afiarea tuturor elevilor ce au avut un anume profesor ca diriginte.

6. S se scrie o aplicaie care realizeaz asistena computerizat a unei olimpiade colare (faza naional) Fiecare participant trebuie s se nscrie n momentul sosirii, datele fiind pstrate n tabelul Participanti Numele Judetul Scoala Clasa Punctaj1 Punctaj2 Total CHAR(20) CHAR(10) CHAR(20) SMALLINT SMALLINT SMALLINT SMALLINT

n cadrul olimpiadei sunt 2 probe, notate cu 100 puncte fiecare. Punctajele vor fi depuse n cmpurile Punctaj1 si Punctaj2 (iniial nule) iar cmpul Total conine punctajul obinut la ambele probe (iniial 0). s se afieze concurenii n ordine alfabetic i pe clase (nume, judet) s se introduc punctajele obinute de toi candidaii i s se calculeze cmpul Total s se afieze clasamentul pentru o clas, n ordinea descresctoare a punctajului total (nume,total puncte, judet).

7. O agenie care se ocup cu plasarea omerilor n noi locuri de munc utilizeaz tabelul Someri, i are urmtoarea structur: Nume Sex CHAR(20) CHAR(1) CHAR(10) SMAALINT Data nasterii DATA Specialitatea Ani de munca Studii

CHAR(1)

138

Manual de informatic pentru clasa a XII-a cu

Pentru studii se folosete convenia: fr studii -1 , cu studii medii 2, studii superioare 3. s se afieze toate persoanele cu studii medii pe sexe

s se afieze persoanele cu o anumit specialitate, cu cel puin zece ani de munca i cu vrsta sub 45 ani. dintr-o

8. Se d un tabel care s conin informaii despre mijloacele fixe societate comerciala: Denumire Nr_inventar An_fabricatie Valoare_initiala Valoare_ramasa CHAR(20) INT SMAALINT INT INT

Durata_functionare(in ani) SMALLINT

S se realizeze o interfa web care s realizeze ntreinerea tabelului (adugare, tergere si modificare). Valoare rmas se calculeaz cu formula: val_ramasa= val_initiala - (val_initiala/durata_fuctionare) * (an_fabricatie an curent - 1).