Você está na página 1de 61

INTRODUCERE...........................................................................................................................................3 I.1. INTRODUCERE.................................................................................................................................5 I.1.1 Internet-ul.....................................................................................................................................5 I.1.2. Aplicaii pentru Internet..............................................................................................................6 I.1.3 DNS...............................................................................................................................................7 I.1.4. Intranets i Extranets...................................................................................................................8 I.2.

WEB SERVERS I WEB APPLICATION SERVERS.............................................................................................8 I.2.1. Servere Web.................................................................................................................................8 I.2.2. Pagini Web...................................................................................................................................9 I.2.3. Browsere Web..............................................................................................................................9 I.3. PAGINI WEB STATICE I DINAMICE............................................................................................................9 I.3.1. HTML...........................................................................................................................................9 I.3.2. JavaScript..................................................................................................................................10 I.3.3. Alte Tehnologii pe parte de Client.............................................................................................10 I.3.4. URL-uri......................................................................................................................................11 I.3.5. Avantajul Paginilor Web Dinamice...........................................................................................11 I.3.6. nelegerea Aplicatiilor Web......................................................................................................12 II. INTRODUCERE N PHP.....................................................................................................................13 II.1. NOIUNI FUNDAMENTALE.......................................................................................................................13 II.1.1. Ce este PHP?............................................................................................................................13 II.1.2. Ce poate face PHP?.................................................................................................................14 II.2. ELEMENTE DE BAZ ALE SINTAXEI...........................................................................................................16 II.2.1. Ieirea din modul HTML..........................................................................................................16 II.2.2. Separarea instruciunilor.........................................................................................................17 II.2.3. Comentariile.............................................................................................................................18 II.3. TIPURI DE DATE....................................................................................................................................18 II.4 VARIABILE............................................................................................................................................19 II.4.1 Noiuni de baz..........................................................................................................................19 II.4.2 Variabile predefinite .................................................................................................................19 II.4.3. PHP Superglobals....................................................................................................................20 II.4.4. Folosirea variabilelor statice..................................................................................................21 II.4.5. Variabile din afara mediului PHP...........................................................................................22 II.4.6. Cookie-uri HTTP......................................................................................................................23 III. BAZE DE DATE I SQL.....................................................................................................................24 III.1. CONCEPTE ALE BAZELOR DE DATE RELAIONALE.......................................................................................24 III.1.1. Structura unei baze de date relaionale..................................................................................24 III.1.2. Normalizarea tabelelor...........................................................................................................25 III.1.3. Structured Query Language....................................................................................................25 III.2. IMPLEMENTAREA UNEI BAZE DE DATE......................................................................................................26 III.2.1. Proiectarea unei baze de date.................................................................................................26 III.2.2. Modelare E-R..........................................................................................................................26 III.2.3. Identificarea coloanelor..........................................................................................................26 III.2.4. Gruparea coloanelor n entiti.............................................................................................27 III.2.5. Identificarea cheilor primare..................................................................................................27 III.2.6. Identificarea cheilor externe...................................................................................................27 III.2.7. Rafinarea modelelor E-R .......................................................................................................28 IV. MYSQL.................................................................................................................................................29 IV.1. INTRODUCERE N MYSQL....................................................................................................................29 IV.2. CARACTERISTICILE DE BAZ ALE MYSQL..............................................................................................29 IV.2.1. Componente interne i portabilitate........................................................................................29 IV.2.2. Tipuri de coloane....................................................................................................................30 IV.2.3. Comenzi i funcii ...................................................................................................................30

IV.2.4. Securitate.................................................................................................................................30 IV.2.5. Scalabilitate i limite...............................................................................................................31 IV.2.6. Conectivitate ...........................................................................................................................31 IV.2.7. Localizare ...............................................................................................................................31 IV.2.8. Clieni i unelte........................................................................................................................31 IV.3. FUNDAMENTE MYSQL........................................................................................................................32 IV.3.1. Conectarea i deconectarea de la server................................................................................32 IV.3.2. Introducerea interogrilor......................................................................................................32 IV.3.3. Crearea i utilizarea unei baze de date...................................................................................34 IV.3.4. Crearea i selectarea unei baze de date..................................................................................34 IV.3.5. Crearea tabelelor....................................................................................................................35 V. APLICAIE...........................................................................................................................................37 V.1. DESCRIEREA SITE-ULUI..........................................................................................................................37 V.1.1. Structura site-ului.....................................................................................................................37 V.1.2. Utilizarea template-urilor i a Style Sheet-urilor.....................................................................38 V.1.3. Crearea bazei de date MySQL..................................................................................................39 V.2. UTILIZAREA BAZELOR DE DATE MYSQL ................................................................................................41 V.2.1. Conectarea la serverul MySQL ...............................................................................................42 V.2.2. Selectarea bazei de date...........................................................................................................43 V.2.3. Detectarea apariiei erorilor....................................................................................................43 V.2.4. Eliminarea mesajelor de eroare...............................................................................................44 V.2.5. nchiderea conexiunii cu serverul MySQL...............................................................................44 V.2.6. Executarea interogrilor UPDATE, INSERT i DELETE.......................................................44 V.2.7. Funcia mysql_query()..............................................................................................................44 V.2.8. Verificarea interogrilor care nu returneaz rnduri de table................................................45 V.2.9. Utilizarea coloanelor de tabel cu auto-incrementare..............................................................45 V.2.10. Prelucrarea rezultatelor interogrilor SELECT ...................................................................45 V.1.11. Lucrul cu seturi de rezultate...................................................................................................46 V.2.12. Obinerea numrului coloanelor unui set de rezultate...........................................................47 V.2.13. Obinerea numelui unei coloane din setul de rezultate.........................................................47 V.2.14. Obinerea lungimii unei coloane dintr-un set de rezultate....................................................47 V.2.15. Obinerea indicatorilor MySQL asociai unei coloane a setului de rezultate .......................47 V.2.16. Obinerea tipului MySQL al unei coloane din setul de rezultate...........................................48 V.2.17. Determinarea tabelului MySQL asociat unei coloane din setul de rezultate.........................48 V.2.18. binerea structurii complete a setului de rezultate ................................................................48 V.2.19. Accesul non-secvenial la coloanele unui set de rezultate.....................................................49 V.3. IMPLEMENTAREA FUNCIONALITILOR PRINCIPALE.....................................................................................49 V.3.1. nregistrarea noilor membrii....................................................................................................50 V.3.2. Cutarea membrilor.................................................................................................................53 V.3.3. Afiarea mebrilor......................................................................................................................55 V.3.4. Upload-ul fiierelor..................................................................................................................57 V.3.5. Managementul sesiunilor de lucru...........................................................................................58

INTRODUCERE
Dezvoltarea rapid din ultima perioad a resurselor software i hardware din domeniul tehnologiei informaiei are meritul de a oferi o mai bun comunicare i un acces mult mai rapid la toate categoriile de informaii. Acest lucru se poate observa foarte uor datorit sistemului World Wide Web, cu ajutorul cruia, printr-un simplu click de mouse se poate naviga prin miile de resurse informaionale din ntreaga lume. Aceast lucrare prezint o aplicaie ce const ntr-un site dinamic, construit utiliznd tehnologiile PHP i MySQL. Acest site reprezint o implementare Web a unei agenii matrimoniale. Utilizatorii se nregistreaz i i pot introduce anumite informaii personale. Se permite, de asemenea, cutarea n baza de date asociat, folosind anumite criterii. Cutarea i vizualizarea mebrilor nregistrai nu este permis dect membrilor site-ului, pentru aceasta fiind implementat un mecanism de logare. Este implementat, de asemenea i mecanismul de trimitere de e-mail ctre adresele membrilor i de upload de fiiere pe server. Lucrarea este structurat n cinci capitole, primele patru constnd n prezentarea principalelor noiuni i concepte folosite n realizarea aplicaiei, iar ultimul capitol reprezint descrierea plicaiei i modul n care aceasta a fost realizat. Capitolul 1 Internet-ul reprezint o scurt introducere a principalelor noiuni legate de Internet. Sunt explicate noiuni ca Internet, protocolale, aplicaii pentru internet, DNS, intrenet i extranet, web servers i web application servers, pagini web statice i dinamice, limbaje de markup i scripting, HTML, JavaScript, PHP. Capitolul 2 Introducere n PHP reprezint o descriere a principalelor noiuni legate de acest limbaj. Este descris modul de includere a codului PHP n cadrul codului HTML, sunt prezentate tipurile de date pe care acest limbaj le suport i tipurile de variabile care pot fi utilizate. Capitolul 3 Baze de date i SQL prezint noiunile de baz legate de bazele de date relaionale i este descris pe scurt principalul limbaj de interogri folosit n prezent, SQL. De asemenea, este prezentat modul de creare a unei baze de date relaionale i sunt definite noiuni ca: relaie , cheie primar, cheie extern, normalizarea tabelelor. Capitolul 4 MySQL reprezint o introducere n acest sistem de gestiune a bazelor de date realionale. Sunt prezentate principalele caracteristici i faciliti oferite de acesta. De asemenea, este prezentat modul de utilizare a MySQL, 3

conectarea i deconectarea de la server, crearea i selectarea bazelor de date, crearea tabelelor i intoducerea interogrilor. Capitolul 5 Aplicaie reprezint descrierea aplicaiei. Implementarea acestui site a fost realizat folosind limbajul de server side scripting PHP datorit felxibilitii acestuia i a faptului c poate fi folosit gratuit, fr restricii. De asemenea, a fost ales sistemul de gestiune a bazelor de date relaioale MySQL datorit faptului c i acesta poate fi folosit gratuit i este Open Source i este cel mai potrivit produs pentru accesarea i administrarea bazelor de date prin Internet. Interfaa grafic a aplicaiei a fost construit pe baza unui template, pe care toate paginile site-ului l folosesc pentru a pstra acelai layout pe ntregul site. De asemenea, pentru setarea modalitilor de afiare a diferitelor elemente HTML, pentru alegerea stilului site-ului s-a folosit un fiier .css, acesta putnd fi modificat sau nlocuit i ntregul site i schimb automat nfisarea. Prin combinarea acestor dou produse, PHP i MySQL, aplicaia realizat este foarte flexibile, putndu-se aduga noi funcionaliti dac este necesar.

I. INTERNET-UL
I.1. INTRODUCERE
Majoritatea site-urilor web sunt constituite din informaii statice, dar Webul este un mediu puternic i este capabil de mult mai mult i ofer caracteristici precum: pagini Web dinamice, conectare la baze de date, pagini personalizate pentru utilizatori, colecii i prelucrri sofisticate ale datelor, interaciuni de pot electronic, interfee pentru utilizatori bogate i atrgtoare. I.1.1 Internet-ul Internet-ul este nconjurat de foarte mult ambiguitate i confuzie dar, n cteva cuvinte, poate fi definit ca cea mai mare reea din lume. Majoritatea reelelor din prezent sunt reele locale (Local Area Networks LANs) i sunt formate dintr-un grup de calculatoare aflate relativ aproape unul de cellalt i conectate prin echipamente hardware speciale i cabluri. Unele calculatoare ndeplinesc rolul de clieni (cunoscute, de obicei, sub denumirea de workstations) iar altele sunt servere. Toate aceste calculatoare pot comunica ntre ele pentru a schimba informaii. O reea mai mare, care se ntinde pe mai multe locaii geografice este, de obicei, folosit de marile companii care au sedii n mai multe localiti. Fiecare dintre locaii are propriul su LAN, care leag calculatoarele locale. Aceste LANuri, la rndul lor, sunt interconectate prin intermediul unor medii speciale de comunicare. Legturile pot fi de la legturi de tip dial-up prin modem, pn la legturi de mare vitez T1 sau T3 sau legturi prin fibr optic. Grupul complet al LAN-urilor interconectate se numete Wide Area Network (WAN). WAN-urile se folosesc pentru a conecta locaii diferite ale unei companii. Dac s-ar dori conectarea tuturor calculatoarelor de oriunde s-ar ncepe prin rularea unor backbones de viteze foarte mari, conexiuni capabile s transmit cantiti mari de date, ntre locaii strategice probabil mari orae sau ri diferite. Aceste backbones ar fi asemntoare autostrzilor de mare vitez i pe multe benzi dintre ri. Ar trebui definit o toleran la erori pentru a face aceste backbones complet redundante, astfel nct dac vreo conexiune se ntrerupe, ar mai fi disponibil cel puin o alt modalitate de a a atinge o destinaie specific. Mai departe, ar fi create mii de legturi locale care ar conecta fiecare ora la backbone prin conexiuni mai puin rapide. S-ar permite WAN-urilor i LAN5

urilor companiilor i chiar i utilizatorilor individuali cu modem-uri pentru dialup s se conecteze la aceste puncte de acces locale. Unele calculatoare ar putea fi conectate tot timpul, n timp ce altele s-ar putea conecta doar la nevoie. S-ar crea apoi un limbaj comun de comunicare astfel ca fiecare calculator conectat la aceast reea s poate comunica cu oricare altul. i n final ar trebui definit o schem pentru a putea identifica n mod unic fiecare calculator conectat la reea. Acest lucru va asigura faptul c informaia trimis unui anumit calculator va ajunge la destinaia dorit. Cu toate c aceasta este o descriere simplificat, este exact modul n care Internet-ul a fost realizat i lucreaz. Backbone-urile de mari viteze exist ntr-adevr. Majoritatea sunt deinute de marile companii de telecomunicaii. Punctele de acces locale, cunoscote sub numele de POP (Points of Presence) aparin companiilor telefonice, de cablu i furnizorilor locali de Internet (ISPs Internet Service Providers) Limbajul comun este IP Internet Protocol, dar termenul de limbaj este impropriu. Un protocol reprezint o mulime de reguli ce guverneaz comportamentul n anumite situaii. Protocoalele permit realizarea comunicrii fr ntreruperi i fr s apar nenelegri. IP este protocolul folosit pentru comunicarea prin Internet, deci fiecare calculator trebuie s ruleze o copie a acestui protocol. Identificatorii unici sunt adresele IP. Fiecare calculator, sau host, conectat la Internet are o adres IP unic. Aceste adrese sunt formate din patru seturi de numere separate prin punct de exemplu 208.193.16.100. Unele calculatoare au adrese fixe (sau statice), n timp ce altele au adrese alocate dinamic, de fiecare dat cnd este stabilit o conexiune. Indiferent de modul n care este este obinut o adres IP, oricare dou calculatoare conectate la Internet nu vor putea folosi aceeai adres IP n acelai timp. I.1.2. Aplicaii pentru Internet Internet-ul n sine este o masiv reea de comunicaii i ofer foarte puin majoritii utilizatorilor, din acest motiv au fost necesari 20 de ani pentru ca Internet-ul s devin fenomenul din prezent. Internet-ul a fost ridicat la rangul de Information Superhighway i aceast analogie este destul de precis. Autostrzile nu sunt aa de atractive precum locurile n care se poate ajunge cltorind pe ele i acest lucru este valabil i pentru Internet. Ceea ce face Internet-ul aa de atrgtor sunt aplicaiile care ruleaz pe baza sa i ceea ce poate fi realizat cu ajutorul acestora. Cea mai cunoscut aplicaie din prezent este World Wide Web. Muli oameni confund Internet-ul cu World Wide Web, lucru complet greit. 6

Toate aplicaiile pentru Internet folosesc protocolul IP pentru a comunica. Informaia transmis de aceste aplicaii este mprit n pachete, mici blocuri de date, care sunt trimise unei adrese IP destinaie. Aplicaia de la captul cellalt proceseaz informiile primate. Cteva din aplicaiile pentru Internet sunt: - Email SMTP (Simple Mail Transfer Protocol) este cel mai cunoscut mechanism de transmitere a mesajelor de pot electronic, iar POP (Post Office Protocol) este interfaa cea mai utilizat pentru accesarea mesajelor. - FTP File Transfer Protocol este folosit pentru trasferul fiierelor ntre calculatoare. - IRC Internet Relay Chat permite susinerea de conferine n timp real, bazate pe text, prin Internet. - NFS Network File System este folosit pentru a partaja fiiere ntre diferite calculatoare. - Newsgroups liste de discuii bazate pe thread-uri. - Telnet folosit pentru conectarea la un calculator de la distan. - VPN Virtual Private Networks permite accesul sigur al reelelor private la Internet. - WWW World Wide Web. I.1.3 DNS Adresele IP reprezint singurul mod de a specifica n mod unic un host. Cnd se dorete comunicarea cu un alt host un server de Web, de exemplu trebuie specificat adresa IP a acestuia. Dar, dup cum se tie, foarte rar se specific direct adresa IP, ci se specific un hostname. Mecanismul care asociaz hostname-urile cu adresele IP se numete DNS (Domain Name Service). Cnd se specific o adresa, cum ar fi www.yahoo.com, browser-ul trimite un o cerere de tip address resolution ctre un server DNS, cernd acestuia adresa IP asociat numelui specificat. Serverul DNS va returna adresa IP actual i browser-ul o va folosi pentru a comunica direct cu acel host. Nu este obligatorie folosirea unui server DNS, utilizatorii ar putea specifica direct adresa IP a hostului cu care doresc s comunice, dar sunt cteva motive pentru care acest lucru nu se face: - Adresele IP sunt greu de reinut i pot fi uor scrise greit. - Adresele IP se pot schimba. - Adresele IP trebuie s fie unice, dar numele DNS nu. - Un singur host, cu o singur adres IP, poate avea mai multe nume DNS.

I.1.4. Intranets i Extranets Un intranet nu este nimic mai mult dect un Internet privat. Cu alte cuvinte, este o reea privat, de obicei un LAN sau WAN, care permite folosirea aplicaiilor Internet-based ntr-un mediu sigur i privat. Ca i pe Internet-ul public, intranet-urile pot gzdui servere de Web, servere FTP sau orice alte servicii bazate pe IP. Un extranet este o reea de tip intranet care conecteaz mai multe site-uri sau organizaii folosind tehnologii legate de intranet. Multe extranet-uri, de fapt, folosesc Intranet-ul ca backbone i utilizeaz tehnici de criptare pentru a asigura securitatea datelor transmise prin reea. Cele dou lucruri care deosebesc intranet-urile i extranet-urile de Internet sunt cine le poate accesa i de unde pot fi accesate. Dac o aplicaie poate rula pe Internet, atunci va rula cu siguran i pe in intranet sau extranet.

I.2. Web Servers i Web Application Servers


I.2.1. Servere Web World Wide Web este construit pe baza unui protocol numit Hypertext Transfer Protocol (HTTP). HTTP este un protocol mic i rapid care se potrivete foarte bine sistemelor informatice multimedia i distribuite i salturilor ntre siteuri. Web-ul const n pagini cu informaii de pe gazde care ruleaz software de tip server Web. Gazda este de multe ori identificat cu serverul Web, lucru care nu este corect. Serverul Web este un software, nu calculatorul n sine. Un Web server este un program care furnizeaz pagini Web la cerere. Cnd un utilizator de la o adres IP specific solicit un anumit fiier, serverul Web ncearc s obin acel fiier i s-l trimit napoi utilizatorului. Fiierul solicitat poate fi codul surs HTML al unei pagini Web, o imagine GIF, un fiier Flash, un document XML, sau un fiier AVI. Browserul Web este cel care determin ceea ce trebuie cerut, nu serverul Web. Serverul doar proceseaz cererea. Conexiunile la serverele de Web se stabilesc pe msur ce sunt necesare. Dac este cerut o pagin de la un server Web, o conexiune IP este stabilit prin Internet ntre gazda solicitant i gazda pe care ruleaz serverul Web. Pagina Web cerut este transmis prin acea conexiune, iar aceasta este ntrerupt de ndat ce pagina este primit. Dac pagina primit conine referine la alte informaii ce 8

trebuie descrcate (de exemplu, imagini GIF sau JPG), fiecare va fi obinut folosind o nou conexiune. Pe un acelai host pot rula mai multe aplicaii de Internet, de exemplu un server Web, un server FTP, un server DNS i un server de mail SMTP POP3 pot rula n acelai timp. Fiecrui server i este atribuit un port pentru a asigura c fiecare server va rspunde numai cererilor din partea clienilor corespunztori. Majoritatea serverelor folosesc un set de porturi predefinite. Serverele Web folosesc de obicei portul 80, dar acesta poate fi schimbat. Pot fi instalate pe porturi nestandard pentru a fi ascunse, i de asemenea, pot fi instalate mai multe servere Web pe un singur calculator asociindu-le porturi diferite. I.2.2. Pagini Web Informaiile din World Wide Web sunt stocate n pagini. O pagin poate conine oricare din urmtoarele: text, header-e, liste, meniuri, tabele, formulare, elemente grafice, script-uri, stiluri (style sheets), obiecte multimedia. Paginile Web sunt realizate folosind o serie de tehnologii pe partea de client i sunt procesate i afiate de ctre browsere.

I.2.3. Browsere Web Browserele web sunt programe client folosite pentru a accesa site-uri i pagini Web. Sarcina unui browser este de a procesa paginile Web primite i de a le prezenta utilizatorului. Browser-ul ncearc s afieze grafice, tabele, formulare, text formatat i orice conine pagina. Cele mai cunoscute browsere web din prezent sunt Netscape Navigator i Internet Explorer.

I.3. Pagini Web Statice i Dinamice


I.3.1. HTML Paginile Web sunt fiiere cu simplu text costruite folosind limbajul Hypertext Markup Language (HTML). Acesta este implementat ca o mulime de 9

tag-uri uor de nvat. Autorii paginilor Web folosesc aceste tag-uri pentru a marca paginile de text, iar browserele le folosesc pentru a randa i afia informaiile pentru a putea fi vizualizate. Paginile Web pot s conin legturi hypertext la alte pagini. I.3.2. JavaScript HTML este un limbaj de markup. El permite crearea layout-ului paginilor i a formularelor, dar nimic mai mult. Pentru a se construi interfee intuitive i sofisticate este necesar i un limbaj de scripting la nivel de client. Scripting-ul permite scrierea de cod (mici programe) care ruleaz n cadrul browserului. Cel mai cunoscut limbaj de scripting pe parte de client este JavaScript, care este suportat (mau mult sau mai puin) de aproape orice browser existent. Folosind JavaScript se poate realiza: validarea formularelor, animarea textului i a imaginilor, crearea de meniuri drop-down i a controalelor de navigare, se pot efectua procesri de baz numerice sau asupra textelor i multe altele. Scripting-ul permite programatorilor s detecteze i s proceseze evenimentele. De exemplu, o pagin care se ncarc, un formular trimis, micarea pointer-ului mouse-ului asupra unei imagini sunt toate evenimente, iar script-urile pot fi executate automat de browser atunci cnd aceste evenimente au loc. Script-urile pot fi incluse n codul HTML sau pot fi stocate n fiiere externe i legate n interiorul codului HTML. I.3.3. Alte Tehnologii pe parte de Client Majoritatea browserelor noi permit folosirea i a altor tehnologii, dintre care cele mai importante sunt: - CSS (Cascading Style Sheets) ofer o modalitate de a separa prezentarea de coninut astfel nct ambele s poat fi refolosite i modificate cu uurin. - DHTML (Dynamic HTML) o combinaie de HTML, script-uri i CSS care folosite mpreun, pot realiza interfee pentru utilizator foarte atractive i interactive. - Appleturi Java mici programe care ruleaz n browser. - Macromedia Flash o tehnologie inclus n 98% din browserele existente, care ofer un mecanism pentru crearea unor interfee atractive i portabile.

10

I.3.4. URL-uri Piesa care leag ntre ele serverele Web, browserele Web i paginile Web este URL-ul. Fiecare pagin din World Wide Web are o adres care este introdus n browser pentru a-i indica acestuia s ncarce pagina respectiv. Aceste adrese se numesc Uniform Resource Locators (URLs) i sunt constituite din ase pri, astfel: - Protocol protocolul care va fi folosit pentru a obine obiectul. De obicei acesta este http pentru obiecte din World Wide Web. Dac protocolul este specificat, atunci acesta trebuie urmat de semnele ://. - Host serverul Web de la care vor fi obinute obiectele. Acesta poate fi specificat ca un nume DNS sau ca o adres IP. - Port portul calculatorului gazd pe care ruleaz serverul Web. Dac este omis, atunci se folosete portul implicit, iar dac este specificat, numrul portului trebuie precedat de semnul :. - Path calea ctre fiierul care se dorete a fi primit sau scriptul care trebuie executat. - File numele fiierului cerut. - Query String parametrii opionali pentru script. Dac este specificat, atunci trebuie precedat de semnul ?. I.3.5. Avantajul Paginilor Web Dinamice Paginile dinamice sunt ceea ce d via Web-ului. Paginile statice sunt formate din text, imagini i tag-uri HTML pentru formatare. Aceste pagini sunt create i ntreinute manual, astfel c dac informaiile se modific i pagina trebuie modificat. Aceasta implic ncrcarea paginii ntr-un editor, realizarea modificrilor, reformatarea textului dac este necesar i apoi salvarea fiierului. Aceste operaii necesit foarte mult timp dac numrul paginilor care trebuie actualizate este mare. Paginile dinamice conin foarte puin text. n schimb extrag informaiile necesare din alte aplicaii. Paginile dinamice pot comunica cu bazele de date, foi de calcul tabelar, sisteme de gestiune a bazelor de date client-server i multe alte aplicaii. Crearea paginilor Web dinamice permite crearea de aplicaii puternice, care pot include caracteristici precum urmtoarele: - interogarea aplicaiilor de baze de date existente pentru obinerea datelor - crearea de interogri dinamice care faciliteaz obinerea n mod flexibil a datelor 11

execuia procedurilor stocate execuia codului condiional on-the-fly pentru a personaliza rspunsurile n funcie de situaiile specifice sporirea capabilitilor formularelor HTML standard prin folosirea unor funcii de validare popularea n mod dinamic a elementelor din formulare personalizarea modului de afiare a informaiilor legate de dat, timp i moned folosind funcii de formatare uurarea crerii aplicaiilor de introducere a datelor prin wizards generarea automat de email site-uri comerciale i couri electronice de cumprturi i multe altele

I.3.6. nelegerea Aplicatiilor Web Browserele Web trimit cereri ctre serverele Web, iar acestea le ndeplinesc trimit napoi informaiite cerute ctre browser. Aceste informaii sunt de obicei fiiere HTML, ca i alte tipuri de fiiere. i cam att este ceea ce fac serverele Web. Ele sunt de fapt aplicaii destul de simple stau i ateapt cererile pe care le ndeplinesc de ndat ce le primesc. Serverele Web nu permit interaciunea cu bazele de date, nu permit personalizarea paginilor Web, nu permit procesarea rezultatelor trimiterii unui formular de ctre utilizator. Un Web application Server este un software care extinde serverul Web, permindui acestuia s fac lucrurile pe care nu le poate face singur. Cnd un server Web primete o cerere de la un browser, el cerceteaz acea cerere pentru a determina dac este o simpl pagin Web sau o pagin care necesit prelucrri suplimentare de ctre un web application server. Acest lucru l realizeaz prin cecetarea extensiei sau a tipului MIME. Dac tipul MIME indic o pagin Web simpl, atunci serverul web ndeplinete cererea i trimite fiierul ctre browserul clinet nemodificat. Dar dac tipul MIME indic faptul c fiierul cerut necesit procesarea de ctre un web application server, atunci web serverul trimite fiierul ctre web application server-ul corespunztor i trimite browserului rezultatul pe care l primete de la web application server. Cu alte cuvinte web application serverele sunt preprocesoare pentru pagini. Acestea proceseaz pagina cerut nainte ca aceasta s fie trimis napoi la client.

12

II. INTRODUCERE N PHP


PHP, acronim care provine din "PHP: Hypertext Preprocessor", este un limbaj de scripting utilizat pe scar larg, realizat i distribuit n sistem Open Source, care este special realizat pentru a dezvolta aplicaii web, prin integrarea codului PHP n documente HTML. Sintaxa sa provine din C, Java i Perl i este uor de nvat. Scopul principal al limbajului este acela de a scrie rapid pagini web dinamice, dar cu PHP se pot realiza mult mai multe. PHP este una dintre cele mai interesante tehnologii existente n prezent. Deoarece mbin caracteristici dintre cele mai complexe cu simplitatea n utilizare, PHP a devenit rapid un instrument de frunte pentru dezvoltarea aplicaiilor n Web. Totui, spre deosebire de alte instrumente populare pentru dezvoltarea aplicaiilor Web, cum este Perl, PHP este un limbaj de programare comod pentru nceptori, chiar i pentru cei care nu au mai desfurat activiti de programare n trecut. Ca i alte limbaje de scripting pentru Web, PHP v permite s furnizai un coninut Web dinamic, adic un coninut Web care se modific automat de la o zi la alta sau chiar de la un minut la altul. Coninutul Web este un element important n susinerea traficului unui sit Web; de regul, vizitatorii nu vor mai reveni la o pagin Web care conine aceleai informaii ca i cele prezentate la ultima vizit. Pe de alt parte, siturile Web frecvent actualizate pot atrage cantiti enorme de trafic. Mai mult, spre deosebire de limbajele de scripting, precum JavaScript, PHP ruleaz pe serverul Web, nu n browserul Web. n consecin, PHP poate obine accesul la fiiere, baze de date i alte resurse inaccesibile programului JavaScript. Acestea constituie bogate surse de coninut dinamic, care atrag vizitatorii.

II.1. Noiuni Fundamentale


II.1.1. Ce este PHP? Spre deosebire de un script scris n alte limbaje cum ar fi Perl sau C n loc de a scrie un program cu o mulime de comenzi pentru a produce un HTML, folosind PHP se poate scrie un script HTML, ca cel de mai jos, ce include cod pentru a realiza ceva. Codul PHP este delimitat de coduri de start i de sfrit ce permit intrarea i ieirea din "modul PHP". <html> 13

<head> <title>Exemplu</title> </head> <body> <?php echo "Salut, sunt un script PHP!"; ?> </body> </html> Diferena dintre PHP i altceva cum ar fi JavaScript este acela c PHP este executat pe server pe cnd JavaScript este executat pe calculatorului clientului (de browserul Web). Pentru un script similar celui de mai jos sus pe un server, clientul ar primi doar rezultatele scriptului ce este rulat, fr a vedea n nici un fel codul din spatele acestuia. Se poate chiar configura serverul de web ca acesta s proceseze toate fisierele HTML cu PHP i astfel nu exit nici o metod ca un utilizator s stie defapt ce exist n fiiere. II.1.2. Ce poate face PHP? Cu PHP se poate face orice. PHP este n principal axat pe partea de scripting ce ruleaz pe server, deci poate face orice face i un program CGI, cum ar fi colectarea de date de la formulare, generarea de coninut dinamic sau trimitere i primire de cookie-uri. Dar PHP poate face mult mai multe. Exist trei domenii principale unde sunt folosite scripturile PHP. - Scripturi ce ruleaza pe server. Acesta este cel mai tradiional i cel mai important pentru PHP. Este nevoie de trei lucrui pentru a face s mearg: interpretorul PHP (CGI sau modul de server), un server web i un browser web. E nevoie ca serverul de web s fie pornit, cu o conexiune PHP instalat. Se poate accesa rezultatul programelor PHP cu un browser prin intermediul serverului de web. - Scripting in linie de comand. Se poate face ca PHP s ruleze fr a fi nevoie de server i de browser, ci doar de interpretorul PHP. Aceast metod este ideal pentru script-urile ce se vor a fi executate de regul folosind cron (task scheduler n Windows), sau sarcini simple de procesare a textelor. - Scrierea de aplicaii ce ruleaz de partea clientului n mod grafic (GUI). Probabil c PHP nu este limbajul cel mai bun de a scrie aplicaii cu ferestre pentru Windows sau alte sisteme de operare, dar dac este bine cunocut i se dorete folosirea unor faciliti avansate ale PHP-ului n aplicaiile ce ruleaz de partea clientului, se poate totui folosi PHP-GTK pentru a scrie 14

astfel de programe. De asemenea, exist posibilitatea de a scrie aplicaii ce ruleaz pe platforme diferite folosind aceast metod. PHP-GTK este o extensie a PHP-ului, nedisponibila n distribuia principal de PHP. PHP poate fi folosit pe aproape toate marile sisteme de operare, incluznd Linux, multe variante de Unix (incluznd HP-UX, Solaris i OpenBSD), Microsoft Windows, Mac OS X, RISC OS, probabil i altele. PHP are de asemenea suport pentru majoritatea serverelor de web din prezent. Acestea includ serverele Apache, Microsoft Internet Information Server, Personal Web Server, Netscape i iPlanet, serverul Oreillz Website Pro, Caudium, Xitami, OmniHTTPd, i multe atele. Pentru majoritatea serverelor PHP are un modul, iar pentru celelalte suport standardul CGI, PHP putnd s lucreze ca un procesor CGI. Deci, cu PHP, exist libertatea de a alege un sistem de operare i un server de web. Chiar mai mult, exist posibilitatea de a alege programarea procedural sau programarea orientat obiect, sau chiar sa se combine acestea. Cu toate acestea, nu orice facilitate a standardului POO este prezent n versiunea curent a PHP-ului, multe librrii de cod i aplicaii mari (incluznd i librria PEAR) sunt scrise folosind doar cod POO. Cu PHP programatorul nu este limitat s scoat rezultat HTML. Posibilitile PHP-ului includ afiarea de imagine, fiiere PDF i chiar filmulee Flash (folosind librriile libswf i Ming) toate generate instant. Se poate de asemeanea ca rezultatul s fie orice fiier text, cum ar fi XHTML sau orice alte fiiere XML. PHP poate genera autmoat aceste fiiere i s le salveze n sistemul de fiiere n loc s le afieze, formnd un cache de partea serverului pentru coninutul dinamic. Una dintre cele mai puternice i importante faciliti n PHP este suportul su pentru o gam larga de baze de date. Scrierea une pagini de web ce interacioneaza cu o baz de date este incredibil de simpl. PHP suport i ODBC, standardul Open Database Connection, deci se poate conecta la orice alt baz de date ce suporta acest standard mondial. PHP are deasemeanea suport pentru a conversa cu alte servicii folosind protocoale cum ar fi LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (pe Windows) i multe altele. Se pot, de asemenea, deschide socket-uri de reea i se poate interaciona ntre aproape toate limbajele de programare Web. PHP are suport pentru instanierea obiectelor Java i utilizarea lor ntr-un mod transparent ca obiecte PHP. Se pot de asemenea folosi extensii CORBA pentru a accesa obiecte aflate la distan. PHP are capabiliti extrem de folositoare pentru procesarea textului, de la POSIX Extins sau expresii regulare Perl, pn la parsarea documentelor XML. Pentru parsarea i accesarea documentelor XML, suport standardele SAX i DOM. 15

Folosind PHP n domeniul comerului electronic, sunt foarte folositoare pentru programul tu de plai online funcii de plat Cybercash, CyberMUT, VeriSign Payflow Pro i CCVS. n cele din urm, dar nu ultimul rnd, PHP are i alte extensii interesante, cum ar fi funcii ale motorului de cutare mnoGoSearch, funcii pentru accesarea IRC-ului, multe utilitare de compresie (gzip, bz2), conversie de calendar, traducere...

II.2. Elemente de baz ale sintaxei


II.2.1. Ieirea din modul HTML Cnd PHP interpreteaz un fiier trece prin textul acestuia pn cnd ntlnete unul din tag-urile speciale care i spun s porneasc interpretarea textului ca fiind cod PHP. Mai departe, parser-ul execut tot codul ntlnit, pn la ntlnirea unui tag PHP de nchidere, care anun trecerea normal prin text, din nou. Acest mecanism permite nglobarea codului PHP n interiorul codului HTML: tot ceea ce este n afara tag-urilor PHP este lsat nemodificat, n timp ce tot ceea ce este n interior este interpretat ca fiind cod. Exist patru categorii de tag-uri care pot fi folosite pentru a marca bolcurile de cod PHP. Dintre acestea, doar dou (<?php. . .?> i <script language="php">. . .</script>) sunt ntotdeauna disponibile. Cu toate ca tagurile n format scurt i cele de tip ASP par a fi convenabile, ele nu sunt la fel de portabile ca cele n format lung. De asemenea, dac se dorete includerea codului PHP n XML sau XHTML, este necesar s se foloseasc tag-urile n forma <? php. . .?> pentru a corespunde standardului XML Cele patru tipuri de tag-uri sunt: 1. <?php echo("if you want to serve XHTML or XML documents, do like this\n"); ?> 2. <? echo ("this is the simplest, an SGML processing instruction\n"); ?> <?= expression ?> This is a shortcut for "<? echo expression ?>" 3. <script language="php"> echo ("some editors (like FrontPage) don't like processing instructions"); </script> 4. <% echo ("You may optionally use ASP-style tags"); %> 16

<%= $variable; # This is a shortcut for "<% echo . . ." %> Prima variant, <?php. . .?>, este metoda preferat deoarece permite folosirea PHP-ului n cod corform standardului XML, cum ar fi XHTML. Cea de-a doua variant nu este ntotdeauna posibil. Tag-urile prescurtate pot fi folosite doar dac au fost activate. Acest lucru poate fi fcut prin intermediul funciei short_tags() (numai n PHP3), prin activarea opiunii short_open_tag n fiierul de configurare, sau prin compilarea scripturilor folosind opiunea enable-short-tags. Chiar dac este implicit activat n fiierul php.ini, folosirea tag-urilor prescurtate nu este recomandat. Cea de-a patra variant poate fi folosit numai dac tag-urile de tip ASP au fost activate folosind setarea asp_tags din fiierul de configurare. PHP permite folosirea unor structuri ca cea de mai jos: <?php if ($expression) { ?> <strong>This is true.</strong> <?php } else { ?> <strong>This is false.</strong> <?php } ?> Aceasta funcioneaz exact cum este de ateptat, deoarece cnd PHP ntlnete tag-ul de nchidere ?> ncepe afiarea a ceea ce ntlnete pn la apariia unui alt tag de start. n cazul blocurilor mari de text, ieirea din modul PHP este n general mai eficient dect trimiterea textului folosind echo() sau print(). II.2.2. Separarea instruciunilor Instruciunile sunt separate la fel ca n C sau Perl fiecare instruciune este terminat cu un semn punct i virgul. Tag-ul de nchidere implic i sfritul instruciunii, deci urmtoarele dou exemple sunt echivalente: 17

<?php echo "This is a test"; ?> <?php echo "This is a test" ?> II.2.3. Comentariile PHP suport comentarii de tip 'C', 'C++' i Unix shell. De exemplu: <?php echo "This is a test"; // This is a one-line c++ style comment /* This is a multi line comment yet another line of comment */ echo "This is yet another test"; echo "One Final Test"; # This is shell-style style comment ?> Comentariul pe o sigur linie, de fapt realizeaz comentarea codului pn la sfritul liniei curente sau pn la terminarea blocului curent PHP, oricare din aceste dou cazuri apare primul.

II.3. Tipuri de date


PHP suport opt tipuri primitive de date. Patru tipuri scalare: - boolean . integer - float (numere n virgul mobil, sau double) - string Dou tipuri compuse: - array - obiect Dou tipuri speciale: - resource - NULL

18

Tipul unei variabile, de obicei nu este stabilit de programator, ci este decis la rulare de PHP, n funcie de contextul n care acea variabil este folosit.

II.4 Variabile
II.4.1 Noiuni de baz n PHP variabilele sunt reprezentate folosind un semn dollar urmat de numele variabilei. Numele variabilelor sunt case-sensitive. n PHP3 variabilele sunt ntotdeauna atribuite prin valoare. Cu alte cuvinte, atunci cnd o expresie este atribuit unei variabile, ntreaga valoare a expresiei originale este copiat n variabila destinaie. Aceasta nseamn c, de exemplu, dup atribuirea valorii unei variabile alteia, schimbarea uneia dintre aceste variabile nu are nici un efect asupra celeilalte. PHP4 ofer i un alt mod de a atribui valori valiabilelor: prin referin. Aceasta nseamn c noua variabil refer (devine un alias pentru, sau indic ctre) variabila original. Schimbri n variabila nou o afecteaz i pe cea iniial, i invers. Aceasta nseamn de asemenea c nu sunt realizate copii i astfel atribuirea se realizeaz mai rapid. Pentru a realiza o atribuire prin referin trebuie doar ataat un ampersand(&) la nceputul variabilei care va fi atribuit (variabila surs), ca n exemplul urmtor: <?php $foo = 'Bob'; to $foo $bar = &$foo; $bar = "My name is $bar"; echo $bar; echo $foo; ?> // Assign the value 'Bob' // Reference $foo via $bar. // Alter $bar... // $foo is altered too.

II.4.2 Variabile predefinite PHP furnizeaz un numr larg de variabile predefinite. Multe din aceste variabile, nu pot fi documetate complet deoarece sunt dependente de serverul pe care ruleaz, de versiunea i setarea acestuia precum i de ali factori. 19

Unele din aceste variabile nu vor fi folosite cnd PHP ruleaz n linie de comand. II.4.3. PHP Superglobals $GLOBALS Conine o referin la fiecare variabil care este n mod curent valabil n scopul global al script-ului. Cheile acestui ir sunt numele variabilelor globale. $_SERVER Reprezint variabilele setate de serverul de web sau legate direct de mediul de execuie al scriptului curent. $_GET Reprezint variabilele oferite scritpt-ului direct prin HTTP GET. Analog vechiului ir $HTTP_GET_VARS (care nc este valabil, dar depreciat). $_POST Reprezint variabilele oferite scritpului direct prin HTTP POST. Analog vechiului ir $HTTP_POST_VARS (care nc este valabil, dar depreciat). $_COOKIE Reprezint variabilele oferite scritpului direct prin HTTP. Analog vechiului ir $HTTP_COOKIE_VARS (care nc este valabil, dar depreciat). $_FILES Reprezint variabilele oferite scritpului prin upload-ul de fiiere folosind modul POST din HTTP. Analog vechiului ir $HTTP_POST_FILES (care nc este valabil, dar depreciat). $_ENV Reprezint variabilele oferite scritpt-ului prin mediu. Analog vechiului ir $HTTP_ENV_VARS (care nc este valabil, dar depreciat). $_REQUEST Reprezint variabilele oferite scritpt-ului prin mecanismele de input GET, POST, i COOKIE, deci care nu pot fi de ncredere. $_SESSION Reprezint variabilele registrate unei sesiuni a script-ului. Analog vechiului ir $HTTP_SESSION_VARS (care nc este valabil, dar depreciat). 20

II.4.4. Folosirea variabilelor statice O important caracteristic a scope-ului variabilei o reprezint variabila static. O variabil static exist n scope-ul funciei locale, dar nu i pierde valoarea cnd execuia programului prsete acest scope. S considerm urmtorul exemplu: <?php function Test () { $a = 0; echo $a; $a++; } ?> Aceast funcie este destul de nefolositoare deoarece de fiecare dat este apelat s seteze valorea 0 variabilelei $a i s printeze "0". Instruciunea $a++ care incrementeaz variabila nu servete nici unui scop deoarce, de ndat ce funcia iese, variabila dispare. Pentru folosirea unei funcii de numrare care nu va mai pierde numratoarea curent, variabiala $a este declarat static. <?php function Test() { static $a = 0; echo $a; $a++; } ?> Astfel, de fiecare dat cnd funcia Test() este apelat, aceasta va afia valoarea variabilei $a i o va incrementa. Variabilele statice ofer, de asemenea, un mod de a lucra cu funciile recursive. O funcie recursiv este o funcie care se autoapeleaz. Trebuie avut grij la scrierea unei funcii recursive, deoarece este posibil realizarea unei recursii infinite. Trebuie asigurat un mod de a termina recursia. Urmtoarea funcie recursiv simpl numr pn la 10, folosind variabila static $count pentru a tii cnd s se opreasc: <?php function Test() { 21

static $count = 0; $count++; echo $count; if ($count < 10) { Test (); } $count--; } ?> II.4.5. Variabile din afara mediului PHP Formulare HTML (GET i POST) Cnd un formular este trimis unui scrip PHP, informaiile din acel formular sunt automat transmise scriptului PHP. Sunt mai multe modaliti de a accesa informaia, de exemplu: <form action="foo.php" method="POST"> Name: <input type="text" name="username"><br> Email: <input type="text" name="email"><br> <input type="submit" name="submit" value="Submit me!"> </form> n funcie de setrile i preferinele particulare, sunt multe modaliti de a accesa datele din formulare HTML. Cteva exemple: <?php // Available since PHP 4.1.0 print $_POST['username']; print $_REQUEST['username']; import_request_variables('p', 'p_'); print $p_username; // Available since PHP 3. As of PHP 5.0.0, these long predefined // variables can be disabled with the register_long_arrays directive. 22

print $HTTP_POST_VARS['username']; // Available if the PHP directive register_globals = on. As of // PHP 4.2.0 the default value of register_globals = off. // Using/relying on this method is not preferred. ?> print $username;

Folosirea unui formular de tip GET este similar, cu deosebirea c se va folosi variabila predefinit GET n schimb. GET se poate folosi i pentru extragerea informiilor din QUERY_STRING (informaiile de dup semnul ? din URL). De exemplu, URL-ul http://www.example.com/test.php?id=3 conine date GET care sunt accesibile prin $_GET['id']. II.4.6. Cookie-uri HTTP PHP ofer un suport transparent pentru Cookies. Cookie-urile reprezint un mecanism pentru stocarea datelor n browser i astfel se pot identifica utilizetoriicare revin pe o anumit pagin. Cookie-urile se pot seta folosind funcia setcookie(). Cookie-urile fac parte din header-ul HTTP, deci funcia setcookie() trebuie apelat nainte de trimiterea oricrui coninut ctre browser. Informaiile de tip Cookie sun apoi stocate n array-urile corespunztoare, cum ar fi $_COOKIE, $HTTP_COOKIE_VARS ca i n $_REQUEST. Dac se dorete atribuire unor valori multiple unei singure variabile Cookie, aceasta poate fi tratat ca un array. De exemplu: <?php setcookie("MyCookie[foo]", +3600); setcookie("MyCookie[bar]", +3600); ?> "Testing "Testing 1", 2", time() time()

Aceasta va crea dou variabile cookie separate, cu toate c MyCookie va fi un singur array.

23

III. BAZE DE DATE I SQL


III.1. Concepte ale bazelor de date relaionale
III.1.1. Structura unei baze de date relaionale O baz de date este o colecie de date organizat astfel nct acestea s poat fi uor gsite i actualizate. O baz de date conine toate informaiile necesare despre obiectele ce intervin ntr-o mulime de aplicaii, relaiile logice ntre aceste informaii i tehnicile de prelucrare corespunztoare. n bazele de date are loc o integrare a datelor, n sensul c mai multe fiiere sunt privite n ansamblu, eliminndu-se pe ct posibil informaiile redundante. De asemenea, se permite accesul simultan la aceleai date, situate n acelai loc, sau distribuite spaial, a mai multor persoane de pregtiri diferite, fiecare cu stilul personal de lucru. Sistemul de programe care permite construirea unei baze de date, introducerea informaiilor n bazele de date i dezvoltarea de aplicaii privind bazele de date se numete Sistem de Gestiune a Bazelor de Date (SGBD). Un SGBD d posibilitatea utilizatorului s aib acces la date folosind un limbaj de nivel nalt, apropiat de modul obinuit de exprimare, pentru a obine informaii, utilizatorul fcnd abstractie de algoritmii aplicai pentru selecionarea datelor implicate i a modului de memorare a lor. SGBD-ul este o interfa ntre utilizatori i sistemul de operare. Sistemele de baze de date au n vedere mai multe tipuri de structuri de reprezentare a informaiilor la nivel logic i de operare cu ele dintre acestea, modelul relaional fiind cel mai folosit. Acest model a fost dezvoltat de un matematician de la IBM, E.F. Codd, prin anii 1960, iar bazele de date organizate be baza acestui model se numesc baze de date relaionale. Un model relaional de baze de date cuprinde trei componente principale: - Structura datelor - prin definirea unor domenii i a relaiilor n-are. - Integritatea datelor - prin impunerea unor restricii. - Prelucrarea datelor - prin operaii din algebra relaional sau calculul relaional. Modelul relaional se bazeaz pe noiunea matematic de relaie, aa cum este definit n teoria mulimilor, i anume ca o submulime a produsului cartezian a unei liste finite de mulimi numite domenii. Elementele unei relaii se numesc tupluri, iar numrul de domenii din produsul cartezian se numete aritatea relaiei. De obicei relaiile sunt reprezentate sub forma unor tabele n care fiecare rnd reprezint un tuplu i fiecare coloan reprezint valorile tuplurilor dintr-un 24

domeniu dat al produsului cartezian. Coloanelor i, respectiv, domeniilor corespunztoare lor li se asociaz nume intitulate atribute. Accesul la informaii se face pe baza cheilor. O cheie este o coloan (sau un grup de coloane) care identific n mod unic un rnd dintr-un tabel. III.1.2. Normalizarea tabelelor Pentru a deosebi anumite caliti specifice ale unor relaii, s-au fcut mai multe clasificri, dintre acestea, cea mai frecvent utilizat fiind clasificarea n forme normale. Se spune c o relaie (un tabel) este ntr-o form normal particular dac satisface o mulime dat de constrngeri. Transformarea unei relaii ntr-o mulime de relaii de un anumit tip se numete normalizare. Exist cinci forme normale, primele trei au fost definite de Codd, iar a patra i a cincea au fost definite de Fagin. Principalele scopuri urmrite n procesul de normalizare sunt: eliminarea unor redundane, evitarea unor anomalii de reactualizare, realizarea unui proiect care s reprezinte ct mai fidel modelul real (uor de neles i eventual de modificat), stabilirea unor constrngeri de integritate simple i altele. III.1.3. Structured Query Language SQL (Structured Query Language) este un limbaj relaional de cereri care formeaz nucleul multor sisteme de gestiune a bezelor de date. SQL a fost dezvoltat de IBM n anii '70 - '80 i standardizat la sfritul anilor '80. n ciuda simplitii sale, SQL este un limbaj foarte puternic, care poate obine accesul la date stocate n mai multe tabele, poate filtra datele dorite i poate sorta, rezuma i afia rezultatele. n general, nu se pot anticipa toate modalitile n care utilizatorii pot dori s obin acces la date i s le vizualizeze. Ca atare, nu se pot scrie programe de aplicaie care s satisfac fiecare potenial necesitate de informaii. Este aproape sigur c vor aprea unele cereri de date neprevzute (sau ad-hoc). Utiliznd SQL, este posibil accesul la datele stocate ntr-o baz de date relaional fr a scrie un program de aplicaie, permind frecvent evitarea ntrzierilor i a costurilor implicate de programarea personalizat. Astfel, bazele de date relaionale permit satisfacerea tuturor cererilor ad-hoc de informaii, care ar rmne fr rspuns n alte situaii. n funcie de ntrebuinarea sa, SQL poate fi mprit n trei componente: - DDL - Data Definition Language folosit pentru a crea bazele de date. - DML - Data Manipulation Language - folosit la actualizarea datelor. 25

- DQL - Data Query Language - folosit pentru extragerea informaiilor din baze de date.

III.2. Implementarea unei baze de date


III.2.1. Proiectarea unei baze de date Un instrument frecvent utilizat de proiectare a bazelor de date const din procedeul cunoscut sub numele de modelare entitate-relaie sau modelare E-R. n contextul modelrii E-R, o entitate este similar cu un tabel relaional, cu alte cuvinte, conine date care descriu un set de individualiti corelate. Modelarea ER este un proces n cadrul cruia coloanele, entitile i relaiile ntre entiti sunt descoperite i organizate. Un model E-R poate fi rafinat cu uuin, pentru a genera o structur a unei baze de date, care poate fi transformat ntr-o baz de date relaional efectiv. III.2.2. Modelare E-R Procesul de modelare E-R cost n patru faze principale: Identificarea coloanelor. Gruparea coloanelor n entiti. Identificarea cheilor primare. Identificarea cheilor externe

1. 2. 3. 4.

III.2.3. Identificarea coloanelor Prima operaie din cadrul procesului de modelare E-R este identificarea coloanelor. Coloanele nregistreaz o singur caracteristic a unei entiti. n ncercarea de identificare a coloanelor n general este util s se rspund la unele ntrebri conexe, cum sunt urmtoarele: - Care sunt deciziile pe care sistemul trebuie s le ia sau s le susin? - Care sunt operaiile pe care sistemul trebuie s le execute sau s le susin? - Care sunt datele necesare pentru a lua aceste decizii i pentru a efectua aceste operaii? 26

III.2.4. Gruparea coloanelor n entiti De obicei este evident c unele coloane sunt corelate, n sensul c fac referire la un anumit set de individualiti corelate. Ca atare, aceste coloane pot fi grupate pentru a forma o entitate. Uneori o coloan dat este corelat cu mai multe entiti; n acest caz, coloana poate aprea de mai multe ori pe list. III.2.5. Identificarea cheilor primare Fiecare entitate va deveni un tabel relaional i ca atare va trebui s aib o cheie primar. Se examineaz fiecare entitate pentru a determina dac una dintre coloanele sale asociate are o valoare unic pentru fiecare din apariiile entitii. Dac o asemenea coloan exist, aceasta va fi identificat drept cheie primar a entitii. Se pot gasi unele entitai care nu conin nici o coloan adecvat pentru rolul de cheie primar. ntr-o asemenea situaie se poate cuta o serie de coloane care au o valoare combinat unic. Dac se descoper o asemenea serie, se poate identifica drept cheie primar compus a entitaii. S-ar putea s nu se descopere nici o coloan sau serie de coloane care s identifice n mod unic fiecare apariie a unei entitai. n acest caz, se creeaz o coloan nou, care va conine o identificare artificial unic, i se identific noua coloan ca fiind cheia primar a entitaii. Se poate folosi o identificare artificial unic chiar i atunci cnd una sau mai multe coloane pot servi drept cheie primar. Astfel, se evit problemele care apar cnd identificatori presupui unici se dovedesc a nu fi unici. III.2.6. Identificarea cheilor externe Operaia final i cea mai dificil din cadrul activitaii de modelare E-R o constituie identificarea cheilor externe. Acestea sunt pur i simplu coloane ale caror valori sunt corelate cu acelea ale valorilor cheilor primare ale unei entiti oarecare. Procesul de identificare a cheilor externe const n compararea coloanelor cu cheile primare i, pentru fiecare combinaie posibil, n raspunsul la ntrebarea: Exist o relaie ntre valoarea acestei coloane i valoarea acestei chei primare?.

27

III.2.7. Rafinarea modelelor E-R Ultima operie de finee aplicat unui model E-R, dup normalizarea bazei de date, const n specificarea unui tip de date pentru fiecare coloan. Majoritatea bazelor de date relaionale accept urmatoarele tipuri de date generale: - caracter - ntreg - zecimal - dat i or - binar

28

IV. MySQL
IV.1. Introducere n MySQL
MySQL este un sistem de getiune a bazelor de date. Mai mult chiar, MySQL este un sistem de gestiune a bezelor de date relaionale i este distribuit n regim Open Source. MySQL software is Open Source. Aceasta nseamn c MySQL poate fi descrcat de pe Internet, poate fi folosit fr a plti ceva i, dac se dorete, codul surs poate fi studiat i I se pot aduce modificri necesare. Serverul de baze de date MySQL este foarte rapid, fiabil i uor de utilizat. Iniial a fost dezvoltat pentru a manipula baze de date de dimensiuni mari mult mai rapid dect soluiile existente. Conectivitatea sa, viteza i securitatea fac ca Serverul MySQL s fie potrivit pentru accesarea bazelor de date prin Internet.

Why use the MySQL Database Server?


MySQL Database Software este un sistem client/server ce const ntr-un server MySQL multithreaded care suport diferite programe client i biblioteci, unelte

administrative i o gam larg de interfee pentru programarea aplicaiilor (Application Programming Interfaces APIs)

IV.2. Caracteristicile de baz ale MySQL


IV.2.1. Componente interne i portabilitate Cteva dintre caracteristicile de baz ale MySQL sunt: Scris n C i C++ Testat cu o gam larg de compilatoare diferite Funcioneaz pe diferite platforme Dispune de API pentru C, C++, Eiffel, Java, Perl, PHP, Pyton, Ruby i Tcl Complet multi-threaded folosind thread-uri de kernel. Acest lucru nseamn c poate lucra cu uuin pe mai multe procesoare dac sunt disponibile Ofer motoare tranzacionale i non-tranzacionale de stocare a datelor Un sistem de alocare a memoriei foarte rapid i bazat pe thread-uri Join-uri ale tabelelor foarte rapide Folosete tabele temporare stocate n memorie

29

Funciile SQL sunt implementate folosind o bibliotec de clase optimizat i sunt foarte rapide. De obicei, nu are loc alocare a memoriei dup iniializarea interogrilor. Serverul este disponibil ca program separat ce poate fi folosit ntr-un mediu de reea de tip client/server. De asemenea, este disponibil i ca bibliotec ce poate fi inclus n aplicaii de sine stttoare

IV.2.2. Tipuri de coloane

MySQL dispune de multe tipuri de date pentru coloane: numere ntregi de 1,2,3,4 i 8 bytes lungime cu/fr semn, FLOAT, DOUBLE, CHAR, VARCHAR, TEXT, BLOB, DATE, TIME, DATETIME, TIMESTAMP, YEAR, SET, ENUM, i tipuri

geometrice OpenGIS nregistrri cu lungime fix i cu lungime variabil

IV.2.3. Comenzi i funcii Suport complet pentru operatori i funcii n clauzele SELECT i WHERE ale interogrilor. Suport pentru clauzele GROUP BY i ORDER BY, i pentru funcii de grup (COUNT(), COUNT(DISTINCT ...), AVG(), STD(), SUM(), MAX(), MIN(), i GROUP_CONCAT()). Suport pentru LEFT OUTER JOIN and RIGHT OUTER JOIN. Suport pentru alias-uri de tabele i coloane. DELETE, INSERT, REPLACE i UPDATE returneaz numrul de rnduri modificate. Comanda SHOW specific pentru MzSQL poate fi folosit pentru a obine informaii despre bazele de date, tabele i indeci. Numele funciilor nu intr n conflict cu numele tabelelor sau ale coloanelor. ntr-o acceai interogare se pot folosi tabele din baze de date diferite

IV.2.4. Securitate Un sistem de privilegii i parole foarte flexibil i sigur care permite verificarea pe baza host-ului. 30

Parolele sunt sigure deoarece tot traficul legat de parole este criptat cnd are loc conectarea la server.

IV.2.5. Scalabilitate i limite Manipuleaz baze de date de dimensiuni mari. MzSQL este folosit cu baze de date care conin 50 de milioane de nregistrri. Sunt permii pn la 32 de indeci pentru un tabel. Fiecare index poate consta din una pn la 16 coloane sau pri de coloane.

IV.2.6. Conectivitate Clienii se pot conecta la serverul MySQL folosind socket-uri TCP/IP pe orice platform. Interfaa Connector/ODBC ofer suport MySQL pentru programe client care folosesc conexiuni ODBC (Open DataBase Conectivity). Interfaa Connector/JDBC ofer suport MySQL pentru programe client Java care folosesc conexiuni JDBC (Java DataBase Conectivity).

IV.2.7. Localizare Serverul poate s prezinte mesaje de eroare clienilor n multe limbi. Suport complet pentru diferit seturi de caractere. Toate datele sunt salvate folosind un set de caractere specificat. Toate comparaiile pentru coloane de tip ir obinuit de caractere sunt caseinsensitive. Sortarea este realizat n concordan cu setul de caractere ales.

IV.2.8. Clieni i unelte Serverul MySQL are suport inclus pentru instruciuni SQL care verific, optimizeaz i repar tabelele. Aceste instruciuni sunt disponibile n linia de comand prin intermediul clientului mysqlcheck. 31

Toate programele MySQL pot fi invocate cu opiunea help sau -? Pentru a obine suport online.

IV.3. Fundamente MySQL


IV.3.1. Conectarea i deconectarea de la server Pentru a realiza conectarea la server trebuie specificat un nume de utilizator i, de cele mai multe ori, o parol. Dac serverul ruleaz pe un alt calculator trebuie specificat i un hostname. Conectarea se realizeaz astfel: shell> mysql -h host -u user -p Enter password: ********
unde host i user reprezint hostname-ul unde ruleaz serverul MySQL i respectiv numele unui cont MySQL, iar ******** reprezint parola care trebuie introdus. Dac conectarea se realizeaz cu succes n continuare sunt afiate informaii introductive, urmate de prompt-ul mysql>

shell> mysql -h host -u user -p Enter password: ******** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 25338 to server version: 4.0.14-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> Aceasta nseamn c mysql este gata pentru a primi comenzile introduse. Deconectarea de la serverul MySQL se poate realiza oricnd prin introducerea comenzii QUIT (sau \a) la prompt-ul mysql.
mysql> QUIT bye

IV.3.2. Introducerea interogrilor 32

Urmtoarea comand este o interogare simpl care cere serverului informaii precum versiunea curent i data curent:
mysql> SELECT VERSION(), CURRENT_DATE; +--------------+--------------+ | VERSION() | CURRENT_DATE | +--------------+--------------+ | 3.22.20a-log | 1999-03-19 | +--------------+--------------+ 1 row in set (0.01 sec) mysql>

Aceast interogare ilustreaz cteva lucruri despre mysql n mod normal, o comand const ntr-o declaraie SQL urmat de semnul puct i virgul. Ct se lanseaz o comand, mysql o trimite serverului spre execuie i afieaz rezultatele, apoi afieaz din nou prompt-ul mysql> pentru a indica c este gata s accepte alte comenzi. Mysql afieaz rezultatul interogrilor ntr-o form tabelar. Prima linie conine etichetele coloanelor, iar liniile urmtoare sunt rezultatele interogrii. Mysql afieaz i numrul de rnduri returnate i ct timp a fost necesar pentru execuia interogrii

Pe o singur linie pot fi introduse mai mule comenzi, separate cu cte un semn punct i virgul, de exemplu:
mysql> SELECT VERSION(); SELECT NOW(); +--------------+ | VERSION() | +--------------+ | 3.22.20a-log | +--------------+ +---------------------+ | NOW() | +---------------------+ | 1999-03-19 00:15:33 | +---------------------+

O comand nu trebuie neaprat s fie introdus pe o singur linie, de exemplu:


mysql> SELECT -> USER()

33

-> , -> CURRENT_DATE; +--------------------+--------------+ | USER() | CURRENT_DATE | +--------------------+--------------+ | joesmith@localhost | 1999-03-18 | +--------------------+--------------+

Prompt-ul se schimb din mysql> n -> dup introducerea primei linii a unei interogri pe mai multe linii. Aceasta indic faptul c respectiva interogare este incomplet i mysql ateapt introducerea restului interogrii. Se poate ntrerupe introducerea unei interogri pe linii multiple folosind simbolurile \c
mysql> SELECT -> USER() -> \c mysql>

IV.3.3. Crearea i utilizarea unei baze de date Pentru a vedea bazele de date existente pe un server se folosete comanda SHOW:
mysql> SHOW DATABASES; +----------+ | Database | +----------+ | mysql | | test | | tmp | +----------+

Baza de date mysql este necesa deoarece descrise privilegiile de acces ale utilizatorilor, iar baza de date test este oferit, de obicei, ca mediu de test pentru utilizatori. Dac baza de date test exist, aceasta ar putea fi accesat astfel:
mysql> USE test Database changed

IV.3.4. Crearea i selectarea unei baze de date 34

Comanda pentru a crea o nou baz de date este CREATE DATABASE, de exemplu:
mysql> CREATE DATABASE menagerie;

Crearea unei baze de date nu implic i selectarea acesteia pentru utilizare, aceasta trebuie selectat folosind comanda USE:
mysql> USE menagerie Database changed

Selectarea bazei de date pe care se dorete s se lucreze se poate realiza i n momentul desciderii unei sesiuni mysql, la conectarea la server, astfel:
shell> mysql -h host -u user -p menagerie Enter password: ********

IV.3.5. Crearea tabelelor Dup ce a fost creat, o baz de date nu conine nici un table, dup cum se poate observa introducnd comanda SHOW TABLES: mysql> SHOW TABLES; Empty set (0.00 sec) Pentru a crea un tabel se folosete comanda CREATE TABLE, de exemplu:
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);

Acum comanda SHOW TABLES va avea urmtorul rezultat:


mysql> SHOW TABLES; +---------------------+ | Tables in menagerie | +---------------------+ | pet | +---------------------+

35

Pentru a vedea detaliile unui tabel se folosete comanda DESCRIBE:


mysql> DESCRIBE pet; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | name | varchar(20) | YES | | NULL | | | owner | varchar(20) | YES | | NULL | | | species | varchar(20) | YES | | NULL | | | sex | char(1) | YES | | NULL | | | birth | date | YES | | NULL | | | death | date | YES | | NULL | | +---------+-------------+------+-----+---------+-------+

36

V. APLICAIE
V.1. Descrierea site-ului
n cadrul acestei aplicaii prin combinarea a PHP MySQL s-a dorit realizarea unui site dinamic care d posibilitatea vizitatorilor si s-i gseac perechea potrivit. Site-ul reprezint implementarea Web a unei agenii matrimoniale. Utilizatorii se pot nregistra, pentru a-i introduce mai multe date personale. Pot vizualiza informaiile celorlai membrii i cuta anumite persoane n funcie de ccriteriil selectate. Aplicaia implementeaz i unele funcionaliti avansate, cum ar fi trimiterea automat de e-mail ctre adresele specificate de utilizatori i ncarcarea de fiiere pe server. V.1.1. Structura site-ului Pentru o mai bun organizare a aplicaiei fiierele au fost incluse, pe ct posibil, n directoare cu denumiri semnificative. Astfel, directorul images conine toate imaginile incluse n paginile site-ului, n directorul photos sunt stocate fotografiile membrilor nregistrai. Directorul templates conine fiierele .php folosite ca template pentru toate paginile din site, iar directorul styles conine fiierele .css (Cascading Style Sheet) folosite pentru realizarea layout-ului siteului. n directorul functions sunt coninute fiiere .php care vor fi incluse n alte fiiere i n ele sunt definite mai multe funcii utile. Paginile principale ale aplicaiei sunt urmtoarele: index.php, members.php, register.php, search.php, contact.php i about.php. Astfel, index.php reprezint pagina home a site-ului, paginile contact.php i about.php conin informaii despre autorul aplicaiei i, respectiv, modul de contactare a acestuia. Pagina register.php conine un formular html pe care utilizatorii trebuie s-l completeze pentru a se putea nregistra ca membrii ai site-ului. Dac formularul este completat corect i nregistrarea este realizat cu succes iar utilizatorului i este prezentat un mesaj sugestiv i este trimis un e-mail ctre adresa specificat de acesta, respectiv, dac nregistrarea eueaz, este afiat un mesaj de eroare corespunztor. Pagina members.php conine lista tuturor membrilor nregistrai, cu cteva informaii reprezentative pentru fiecare i cu legturi ctre paginile personale care conin informaii detaliate ale acestora. Pagina search.php cuprinde un formular html care permite cutarea n baza de date folosind mai multe criterii. Rezultatele cutrii sunt afiate n pagina 37

search_results.php, avnd acelai layout ca i pagina member_details.php, pagina cu informaii detaliate despre fiecare membru. V.1.2. Utilizarea template-urilor i a Style Sheet-urilor Pentru pstrarea aceluiai layout pentru toate paginile, ca i pentru a-l putea modifica sau nlocui cu uurin, paginile au fost implementate pe baza unui fiier folosit ca template, cruia i-a fost ataat un fiier .css. Fiierul template folosit pe care este structurat site-ul conine un tabel format din trei rnduri ce ndeplinesc rolurile de header, content i footer. Partea de header const ntr-un nou tabel, care la rndul su conine trei rnduri, folosite pentru titlu, bar de meniu i bara de stare. Titlul va fi setat pentru fiecare pagin care implementeaz acest template. Bara de meniuri este realizat prin includerea fiierului menubar.php, iar bara de stare este implementat n fiierul statusbar.php. Partea de content va fi, de asemenea, setat separat pentru fiecare fiier al site-ului. Partea de footer implementat n fiierul footer.php conine informaii de tip Copyright. Codul complet al fiierului template.php este prezentat n continuare: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>template</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <link href="styles(css)/style.css" rel="stylesheet" type="text/css"> </head> <body> <table width="800" align="center"> <tr> <td> <table width="100%" align="center"> <tr> <td align="center">title</td> </tr> <tr> <td><?php include "menubar.php"; ?></td> 38

></td>

</tr> <tr> <td><?php include "statusbar.php"; ?

</tr> </table> </td> </tr> <tr> <td align="center">content</td> </tr> <tr> <td> <?php include "footer.php"; ?> </td> </tr> </table> </body> </html> Fiierul .css conine declaraiile de stil pentru elementele HTML folosite n cadrul paginilor. Acestea pot fi cu uurin modificate i, datorit faptului c acest Style Sheet este aplicat tuturor paginilor, ntregul layout al site-ului este modificat automat. V.1.3. Crearea bazei de date MySQL Pentru stocarea informaiilor despre membrii aplicaiei s-a folosit o baz de date MySQL. Aceasta este format din patru tabele, i anume members, care conine informaiile despre membrii, languages, care conine o list a limbilor pe care utilizatorii le pot selecta, spokenlanguages, care reprezint legturile dintre fiecare membru i limbile cunoscute de acesta i photos, care conine informaiile despre fotografiile mebrilor, maximum cinci fotografii pentru fiecare membru. Structura tabelului members, cel mai complex dintre tabele bazei de date folosite, este descris n figura urmtoare, precum i tabelele languages, spokenlanguages i photos:

39

40

V.2. Utilizarea bazelor de date MySQL

PHP include o bibliotec de funcii care furnizeaz o interfa cu sistemul MySQL de gestiune a bazelor de date. Folosind aceste funcii, un program PHP 41

poate obine accesul la datele rezidente ntr-o baz de date MySQL i le poate modifica. Majoritatea interaciunilor cu o baz de date se desfoar dup un model secvenial simplu: 1. Se deshide o conexiune cu serverul MySQL. 2. Se specific baza de date la care se va obine accesul. 3. Se emit interogri SQL, se obine accesul la rezultatele interogrilor i se execut operaii non-SQL. 4. Se nchide conexiunea cu serverul MySQL. V.2.1. Conectarea la serverul MySQL Pentru a se realiza conectarea la un server MySQL, se invoc funcia mysql_connect(), a crei sintax este urmtoarea: mysql_connect(nume_gazda, nume_utilizator, parola) unde nume_gazda este numele gazdei pe care ruleaz serviciul MySQL, nume_utilizator este identificatorul de utilizator MySQL care va fi folosit, iar parola este parola MySQL asociat identificatorului de utilizator. Funcia returneaz false n caz de eec, iar n caz contrar returneaz o valoare, denumit identificator de legtur, care servete ca instrument de manipulare pentru accesul la serverul MySQL. Se poate omite numele gazdei, identificatorul de utilizator i parola, sau toate cele trei argumente. Dac se procedeaz astfel, vor fi luate n considerare, n mod prestabilit, urmtoarele valori: -numele gazdei: localhost -identificatorul de utilizator: identificatorul de utilizator al procesului server MySQL -parol: o parola vid n realizarea acestui site, conectarea la serverul MySQL a fost posibil folosind funcia connectdb(), implementat n fiierul connection.php, inclus n directorul functions, astfel : <?php function connectdb(){ $server=mysql_connect("localhost","root",""); //.. } ?>

42

V.2.2. Selectarea bazei de date Dup ce programul a obinut o conexiune cu serverul MySQL, programul poate specifica baza de date la care va avea acces. Pentru aceasta, se invoc funcia mysql_select_db(), care are urmtoarea form mysql_select_db(baza_de_date) unde baza_de_date este un ir care conine numele bazei de date la care urmeaz a se obine acces. Funcia returneaz true dac poate obine accesul la baza de date, respectiv false n caz contrar. Selectarea bazei de date a fost implementat tot n funcia connectdb() prezentat mai sus, astfel: $db=mysql_select_db("adylic"); V.2.3. Detectarea apariiei erorilor Biblioteca MySQL din PHP furnizeaz dou funcii de verificare a erorilor, i anume mysql_errno() i mysql_error(). Fiecare funcie returneaz un rezultat care reflect eroarea, dac exist, asociat celei mai recente operaii cu MySQL. Dac programul execut o secven de operaii MySQL, iar prima operaie genereaz o eroare, informaiile despre erorile respective sunt pierdute n momentul iniierii celei de a doua operaii. Nici una din cele dou funcii nu necesit argumente. Functia mysql_errno() returneaz un cod numeric de eroare, n timp ce funcia mysql_error() returneaz o descriere textual a erorii. Dac nu s-a produs nici o eroare, codul numeric al erorii este zero i descrierea are ca valoare un ir vid. Informaiile de eroare sunt disponibile numai dac este activ o conexiune cu serverul MySQL, deci nu se poate folosi nici una dintre aceste funcii pentru a raporta erorile asociate funciei mysql_connect(). Incluznd i mecanismul de detectare a erorilor, funcia connectdb() arat astfel : <?php function connectdb(){ $server=mysql_connect("localhost","root",""); $db=mysql_select_db("adylic"); if(mysql_errno()) die("nu s a conectat"); } ?> 43

V.2.4. Eliminarea mesajelor de eroare Numeroase funcii PHP pot produce erori sau mesaje de avertizare, dar PHP furnizeaz funcia error_reporting(), care permite eliminarea mesajelor nedorite. Funcia are urmtoarea form: error_reporting (masca) unde masca specific tipul mesajelor care vor fi raportate. Dac se specifica zero ca valoare a atributului masca, nu va fi raportat nici un mesaj. Dac se specifica E_ALL ca valoare a atributului masca, vor fi raportate toate mesajele. V.2.5. nchiderea conexiunii cu serverul MySQL Pentru a nchide o conexiune cu serverul MySQL se invoca funcia mysql_close(). Funcia returneaz true n caz de reusit; n caz contrar returneaz false. n general nu este necesar invocarea funciei mysql_close(), deoarece PHP nchide automat conexiunile deschise cu bazele de date atunci cnd un script i ncheie execuia. V.2.6. Executarea interogrilor UPDATE, INSERT i DELETE Din punctul de vedere al limbajului PHP, exist dou categorii de interogri SQL: Interogrile SELECT, care returneaz rnduri ale unui tabel. Interogrile UPDATE, INSERT i DELETE, care nu returneaz rnduri ale unui tabel. Ambele categorii de interogri sunt emise folosind funcia mysql_query(), dar verificarea i prelucrarea celor dou categorii de rezultate ale interogrilor sunt procese destul de diferite. V.2.7. Funcia mysql_query() Funcia mysql_query() execut o interogare specificat. Funcia are urmtoarea form: 44

mysql_query(interogare) unde interogare este un ir care conine intergoarea care urmeaz a fi executat. Funcia returneaz true dac serverul a reuit s execute interogarea; n caz contrar, returneaz false. V.2.8. Verificarea interogrilor care nu returneaz rnduri de table Pentru a verifica dac o interogare UPDATE, INSERT sau DELETE a avut efectul dorit, se poate folosi funcia mysql_affected_rows(), care returneaz numrul rndurilor afectate de interogarea cea mai recent. Functia are urmtoarea form: mysql_affected_rows() n cazul n care cea mai recent interogare UPDATE, INSERT sau DELETE a euat, funcia returneaz valoarea -1. V.2.9. Utilizarea coloanelor de tabel cu auto-incrementare Pentru a preciza c MySQL va repartiza o valoare secvenial unic n coloana care servete drept cheie primar a tabelului, se poate folosi indicatorul AUTO_INCREMENT. Cnd se insereaz un rind ntr-un tabel se poate folosi funcia mysql_insert_id() pentru a determina valoarea cheii primare atribuite de MySQL. Funcia are forma: mysql_insert_id() i returneaz valoarea zero dac interogarea precedent nu a generat o valoare AUTO_INCREMENT. Ca atare, funcia trebuie apelat la puin timp dup interogarea care a inserat rndul din tabel, astfel nct o interogare ulterioar s nu modifice rezultatul.

V.2.10. Prelucrarea rezultatelor interogrilor SELECT Spre deosebire de interogrile UPDATE, INSERT i DELETE, interogrile SELECT returneaz rnduri de tabel ca rezultate. Rndurile unui 45

tabel sunt incluse ntr-o structur de date numit set de rezultate. Prelucrarea setului de rezultate returnat de o interogare SELECT implic parcurgerea prin iteraie a rndurilor setului de rezultate. O modalitate de parcurgere iterativ a rndurilor unui set de rezultate const n obinerea numrului de rnduri, urmat de deplasarea prin iteraie, folosind numrul de rnduri ca limit pentru o instruciune for. Pentru a obine valoarea numrului de rnduri, se invoc funcia mysql_rows(), transfernd ca argument valoarea returnat de funcia mysql_query(). Funcia mysql_fetch_row() se poate folosi pentru a obine urmtorul rnd din secvena setului de rezultate. Totui, funcia mysql_fetch_row() returneaz true dac un set de rezultate conine rnduri neprelucrate, respectiv false n caz contrar. Ca atare, n general este preferabil s se omit apelarea funciei mysql_num_rows() i s sa se foloseasc n schimb o instruciune while. Valoarea returnat de funcia mysql_fetch_row() reprezint un tablou alctuit din toate coloanele rndului curent din tabel. Tabloul folosete indexuri ntregi, unde valoarea primului index este egal cu zero. Pentru a prelucra coloanele stocate n tablou, se folosete o instruciune foreach, care elimin necesitatea existenei unui index explicit al buclei. Daca se dorete obinerea accesului la valoarea unei anumite coloane, se poate face referire la elementul din tablou folosind un index. De exemplu, dac rezultatul funciei mysql_fetch_row() este stocat n variabila $rind, se poate obine acces la prima coloan din setul de rezultate folosind sintaxa $rind[0], la a dou coloan folosind sintaxa $rind[1], etc. Pentru a obine rndurile tabelului se paote folosi mysql_fetch_array(), care returneaz un tablou asociativ. Valorile indecilor din tablou le reprezint numele coloanelor din setul de rezultate. Ca i funcia mysql_fetch_row(), funcia mysql_fetch_array() returneaz false dac nu mai exist rnduri n setul de rezultate. V.1.11. Lucrul cu seturi de rezultate Biblioteca de funcii MySQL a limbajului PHP include un set de funcii prin care se pot obine informaii despre un set de rezultate, inclusiv: Numrul coloanelor din setul de rezultate. Numrul fiecrei coloane. Lungimea fiecrei coloane. Indicatorii MySQL asociai coloanei. Tipul MySQL al fiecrei coloane. Numele tabelului MySQL care conine coloana, dac este cazul. 46

De asemenea, biblioteca furnizeaz o funcie care permite obinerea accesului n mod non-secvenial la rndurile din setul de rezultate, prin specificarea numrului unui rnd. V.2.12. Obinerea numrului coloanelor unui set de rezultate Pentru a obine numrul coloanelor dintr-un set de rezultate se invoc funcia mysql_num_fields(), transfernd ca argument valoarea returnat de funcia mysql_query(). V.2.13. Obinerea numelui unei coloane din setul de rezultate Funcia mysql_field_name() returneaz numele coloanei din setul de rezultate avnd valoarea indexului dat ca argument al funciei. Indexul asociat cu prima coloan este 0, indexul asociat celei de a doua coloane este 1, etc. V.2.14. Obinerea lungimii unei coloane dintr-un set de rezultate Funcia mysql_field_len() returneaz lungimea maxim a coloanei dintr-un set de rezultate, avnd valoarea indexului dat ca argument al funciei. Indexul asociat primei coloane este 0, indexul asociat celei de a doua coloane este 1 etc. V.2.15. Obinerea indicatorilor MySQL asociai unei coloane a setului de rezultate Funcia mysql_field_flags() returneaz indicatorii SQL asociai colaonei din setul de rezultate al crei index este dat ca argument al funciei. Indexul asociat primei coloane este 0, indexul asociat celei de a doua coloane este 1, etc. Funcia mysql_field_flags() raporteaz urmtorii indicatori : AUTO_INCREMENT BINARY BLOB ENUM MULTIPLE_KEY 47

NOT_NULL PRIMARY_KEY TIMESTAMP UNIQUE_KEY UNSIGNED ZEROFILL Dac la o coloan sunt asociai mai multi indicatori, fiecare indicator este separat de vecinii si prin intermediul unui singur spatiu. V.2.16. Obinerea tipului MySQL al unei coloane din setul de rezultate Funcia mysql_field_type() returneaz tipul MySQL al unei coloane al carei index este dat ca argument al funciei. Indexul asociat primei coloane este 0, indexul asociat celei de a doua coloane este 1, etc. V.2.17. Determinarea tabelului MySQL asociat unei coloane din setul de rezultate Funcia mysql_field_table() returneaz tabelul MySQL, dac exist, asociat coloanei din setul de rezultate al crei index este dat de argumentul funciei. Indexul asociat primei coloane este 0, indexul asociat celei de a doua coloane este 1, etc. n cazul n care coloana conine o valoare calculat sau dac respectiva coloan nu este asociata n alt mod cu un tabel MySQL, funcia returneaza un ir vid. V.2.18. binerea structurii complete a setului de rezultate Funcia mysql_fetch_field() returneaz un obiect ale crui proprieti conin o varietate de informaii cu privire la coloana unui set de rezultate. Proprietiile sunt urmtoarele: blob are valorea 1 n cazul n care coloana este de tip BLOB max_length lungimea maxim a coloanei; multiple_key are valoarea 1 n cazul n care coloana este o cheie nonunic name numele coloanei 48

not_null are valoarea 1 n cazul n care coloana nu poate conine valoarea NULL numeric are valoarea 1 n cazul n care coloana este numeric primary_key are valoarea 1 n cazul n care coloana este o cheie primar table numele tabelului MySQL cruia i aparine coloana type tipul MySQL al coloanei unique_key are valoarea 1 n cazul n care coloana este o cheie unic unsigned are valoarea 1 n cazul n care coloana este de tip UNSIGNED zerofill are valoarea 1 n cazul n care coloana este completat cu zerouri Funcia mysql_fetch_field() preia dou argumente: valoarea returnat de funcia mysql_query() i indexul coloanei din setul de rezultate care va fi descris. Ca de obicei, indexul asociat primei coloane este 0, indexul asociat celei de a doua coloane este 1, etc. V.2.19. Accesul non-secvenial la coloanele unui set de rezultate Funciile mysql_fetch_row() i mysql_fetch_array() returneaz, n general rndurile dintr-un set de rezultate n mod secvenial. Totui, funcia mysql_data_seek() permite obinerea accesului la rndurile unui set de rezultate ntr-o manier non-secvenial. Funcia are forma : mysql_data_seek(rezultat, numar_rind) unde rezultat este valoarea returnat de funcia mysql_query(), iar numar_rind este indexul rndului la care dorii s obtinei accesul. Primul rnd al setului de rezultate este numerotat cu 1, al doilea cu 2 etc. Funcia returneaz true dac execuia reuete, respectiv false n caz contrar. O invocare ulterioar a funciei mysql_fetch_row() sau a funciei mysql_fetch_array() va returna rndul din poziia specificat a setului de rezultate.

V.3. Implementarea funcionalitilor principale


49

V.3.1. nregistrarea noilor membrii Pentru nregistrarea unui nou membru n baza de date a aplicaiei, utilizatorul trebuie s completeze formularul din pagina register.php. Acesta sunt cuprinde toate cmpurile din tabelul members al bazei de date, precum i o list cu toate nregistrrile din tabelul languages, pentru ca utilizatorul s poat selecta limbile cunoscute. Toate cmpurile sunt obligatorii, unele au furnizate valori implicite, iar pentru cele care necesit ndeplinirea anumitor condiii pentru a putea fi valide a fost realizat o funcie JavaScript. Aceasta realizeaz validarea datelor introduse n formular nainte ca cererea s fie trimis spre procesare serverului. Cmpurile de tip select din formular trebuie s aib valori care sunt obinute din valorile posibile ale anumitor coloane de tip enum din baza de date, iar acestea sunt obinute prin apelarea funciei showenumvalues($col), definit n fiierul showenumvalues.php, inclus n directorul functions, funcie care este implementat astfel: <?php function showenumvalues($col){ $column=$col; $query="SHOW COLUMNS FROM members LIKE '{$column}'"; $result=mysql_query($query); if(mysql_num_rows($result)>0){ $row=mysql_fetch_row($result); $options=explode("','",preg_replace("/(enum|set)\ ('(.+?)'\)/","\\2",$row[1])); } foreach($options as $val){ echo '<option value="'. $val.'">'.$val.'</option>'; } } ?> Aceast funcie este apelat n fiierul register.php pentru diferite valori ale parametrului $col, de exemplu: <?php showenumvalues("haircolor"); ?> 50

Dac datele au fost completate corect, formularul este trimis spre procesare. De acest lucru se ocup fiierul register_action.php. Se ncearc inserarea elementelor din formular folosind o interogare de tip insert i prin apelul funciei mysql_query. Dac inserarea eueaz este afiat un mesaj de eroare i utilizatorului i este oferit posibilitatea de a se ntoarce n pagina cu formularul de nregistrare. Dac nregistrarea are loc cu succes, n continuare se introduc n tabelul languages limbile specificate de utilizator, este trimis un e-mail informativ ctre adresa specificat de acesta i i se ofer posibilitatea de a trece ntr-o nou pagin n care i poate upload-a pn la maximum cinci fotografii personale. Tot acum este creat pe server un director al crui nume este format din stringul member_ concatenat cu id-ul noului membru introdus n baza de date, director ce va fi folosit pentru stocarea fotografiilor membrului respectiv. Pentru a nu permite execuia interogrilor din pagina register_action.php n cazul n care aceasta ar fi introdus direct n bara de adres a browser-ului, ntreg codul este cuprins ntr-o instruciune if n care se verific dac a fost apsat butonul sumbit din formularul de nregistrare astfel: if(isset($_POST["submit"])){ //. } Pentru introducerea datelor din formular n baza de date, acestea sunt reinute n prealabil n variabile php corespunztore: $haircolor=$_POST["haircolor"]; $eyescolor=$_POST["eyescolor"]; $smoker=$_POST["smoker"]; $maritalstatus=$_POST["maritalstatus"]; $kids=$_POST["kids"]; $kidslivingwith=$_POST["kidslivingwith"]; $religion=$_POST["religion"]; $education=$_POST["education"]; $occupation=$_POST["occupation"]; $income=$_POST["income"]; $city=$_POST["city"]; $state=$_POST["state"]; $country=$_POST["country"]; $hobby=$_POST["hobby"]; $personaldescription=$_POST["personaldescription"]; $relationship=$_POST["relationship"]; $person=$_POST["person"]; apoi are loc crearea string-ului care va fi folosit n funcia mysql_query: 51

$insert="INSERT INTO members(name, gender, email, password, birthdate, precisedate, birthplace, height, weight, haircolor, eyescolor, smoker, maritalstatus, kids, kidslivingwith, religion, education, occupation, income, city, state, country, hobby, presentation, relationship, person) VALUES ('". $name."', '".$gender."', '".$email."', '". $password."', '". $birthdate."', '".$precisedate."', '". $birthplace."', ". $height.", ".$weight.", '".$haircolor."', '". $eyescolor."', '".$smoker."', '". $maritalstatus."', ". $kids.", ".$kidslivingwith.", '".$religion."', '". $education."', '".$occupation."', ".$income.", '". $city."', '".$state."', '".$country."', '". $hobby."', '". $personaldescription."', '".$relationship."', '". $person."')"; i se continu cu execuia interogrii i a celorlali pai necesari, n funcie de rezulatul acesteia: $result=mysql_query($insert); if(mysql_affected_rows()!=1){ $message="<br><center>Registration failed</center><br>". "<center>Click the <i>back</i> button to try again! </center>"; } else{ $newid = mysql_insert_id(); if(isset($_POST["languages"])){ $languages=$_POST["languages"]; for($i=0;$i<count($languages);$i++){ $insert2="INSERT INTO spokenlanguages VALUES(". $newid.",".$languages[$i].")"; $result2=mysql_query($insert2); } } chdir('photos'); $dir = 'member_'.$newid; 52

mkdir($dir); $message="<center>Congratulations! You have been succesfully registered!</center><br>". '<center>You can upload up to <b>5</b> photos <a href="upload.php?id='. $newid.'">here</a></center><br><br>'; mailto($email,$password); } Pentru realizarea trimiterii automate de e-mail a fost realizat funcia mailto($to, $pass), implementat n fiierul mail.php din directorul functions. Aceast funcie primete ca parametrii adresa de e-mail a noului membru nregistrat i parola introdus de acesta i trimite la acea adres un e-mail informativ, folosind funcia PHP mail, astfel: <?php function mailto($to,$pass){ $TO=$to; $FROM = "bobeanul@yahoo.com"; $SUBJECT = "Welcome to my agency"; $HEADER = "MIME-Version: 1.0\r\n"; $HEADER = $HEADER . "Content-type: text/html; charset=iso-8859-1\r\n"; $HEADER = $HEADER . "From: " . $FROM . "\r\n"; $MESSAGE = 'Thank you for your registration at '. '<a href="http://www.bobeanu.as.ro">my agency</a>.<br>'. 'You can login to your personal page using this e-mail address and the password you specified:<br>'. 'Your password is: '.$pass; mail($TO, $SUBJECT, $MESSAGE, $HEADER); } ?> V.3.2. Cutarea membrilor Pentru cutarea n baza de date a fost creat pagina search.php care conine un formular n care utilizatorul poate specifica creiteriile de cutare. Aplicaia 53

permite cutarea membrilor folosind orice combinaie a urmtoarelor coloane din tabelul members: name, gender, height, weight, haircolor, eyescolor, maritalstatus, smoker, country. Dup introducerea informaiilor dorite pentru cutare, formularul este trimis spre procesare ctre pagina search_result.php. Aceasta include fiierul find.php, din directorul functions, n care este definit funcia find(). Aceasta primete ca parametrii toate variabilele din formularul de cutare i, n fucie de valorile acestora, formeaz stringul care va fi folosit n interogare, astfel: <?php function find($name, $gender, $height, $weight, $haircolor, $eyescolor, $maritalstatus, $smoker, $country){ $query="SELECT $gender."' "; * FROM members WHERE gender='".

";

if($name!="") $query=$query." AND name LIKE '%".$name."%'

if($height!=0) $query=$query." AND height=".$height; if($weight!=0) $query=$query." AND weight=".$weight; if($haircolor!="") $query=$query." AND haircolor='". $haircolor."'"; if($eyescolor!="") $query=$query." AND eyescolor='". $eyescolor."'"; if($maritalstatus!="") $query=$query." AND maritalstatus='". $maritalstatus."'"; if($smoker!="") $query=$query." AND smoker='".$smoker."'"; if($country!="") $query=$query." AND country='".$country."'"; $query=$query." ORDER BY name"; } ?> return $query;

54

n pagina search_results are loc apelul metodei find folosind datele introduse n formular i se execut interogarea respectiv. Rezultatele cutrii sunt prezentate ntr-un tabel, cte o nregistrare pe fiecare linie, cuprinznd cteva detalii pentru fiecare membru gsit, i cu lkegturi ctre paginile cu detalii despre fiecare. <?php $findresults=find($_POST["name"], $_POST["gender"], $_POST["height"], $_POST["weight"], $_POST["haircolor"], $_POST["eyescolor"], $_POST["maritalstatus"], $_POST["smoker"], $_POST["country"]); $result=mysql_query($findresults); echo "<table><tr><td>Name</td> <td>Gender</td> <td>Height</td> <td>Weight</td> <td>Haircolor</td>". "<td>Eyescolor</td> <td>Marital Status</td> <td>Smoker</td> <td>Country</td>"; while($row=mysql_fetch_array($result)){ ?> <tr> <td><?php echo $row["name"]; ?></td> <td><?php echo $row["gender"]; ?></td> <td><?php echo $row["height"]; ?></td> <td><?php echo $row["weight"]; ?></td> <td><?php echo $row["haircolor"]; ?></td> <td><?php echo $row["eyescolor"]; ?></td> <td><?php echo $row["maritalstatus"]; ?></td> <td><?php echo $row["smoker"]; ?></td> <td><?php echo $row["country"]; ?></td> </tr> <?php }?> </table> V.3.3. Afiarea mebrilor Pentru afiarea tuturor membrilor nregistrai n baza de date exist dou legturi specificate n fiierul menubar.php, respectiv pentru Men i Women. Ambele legturi indic, ns, ctre aceeai pagin, i anume members.php, dar care primete diferite valori pentru atributul detip URL gender. Astfel, pentru 55

Men legtura se face ctre pagina members.php?gender=male, i respectiv, pentru Women, legtura este ctre members.php?gender=female. n pagina members.php, construit pe baza templeate-ului, informaiile sunt prezentate sub forma unui tabel care conine pe fiecare linie cteva infoormaii semnificative pentru fiecare membru i legtura ctre pagina detaliat a acestuia. nainte de afiarea informaiilor are loc o verificare a valorii parametrului gender din URL i se formeaz astfel interogarea corespunztoare: <table> <tr> <td>Name</td> <td>Gender</td> <td>Height</td> <td>Weight</td> <td>Haircolor</td> <td>Eyescolor</td> <td>Marital status</td> <td>Smoker</td> <td>Country</td> </tr> <?php if(isset($_GET["gender"])){ $query="SELECT * FROM members WHERE gender='". $_GET['gender']. "' ORDER BY NAME "; $result=mysql_query($query); while($row=mysql_fetch_array($result)){ ?> <tr> <td><?php echo $row["name"]; ?></td> <td><?php echo $row["gender"]; ?></td> <td><?php echo $row["height"]; ?></td> <td><?php echo $row["weight"]; ?></td> <td><?php echo $row["haircolor"]; ?></td> <td><?php echo $row["eyescolor"]; ?></td> <td><?php echo $row["maritalstatus"]; ?></td> <td><?php echo $row["smoker"]; ?></td> <td><?php echo $row["country"]; ?></td> </tr> <?php } } ?> </table> 56

V.3.4. Upload-ul fiierelor Dup ce s-a nregistrat, unui membru i se d posibilitatea de a ncrca pe server maximum cinci fotografii personale. Acest lucru este implementat n fiierul upload.php. Acest fiier are ca parametru de tip URL id-ul noului membru nregistrat, pentru a putea determina n care subdirector din directorul photos s salveze fotografiile. Pagina upload.php cost ntr-un formular HTML cu cinci elemente input de tip file. Pagina de aciune a acestui formular este setat ca fiind tot upload.php. La accesarea paginii are loc o verificare dac a fost apsat butonul de Submit, adic dac au fost selectate fiierele pentru upload. n caz afirmativ, se ncearc upload-ul fiierelor pe server i, n acelai timp, are loc i trecerea informaiilor corespunztoare n baza de date. La final, este setat o variabil php numit $succes, a crei valoare va fi afiat opentru a furniza utilizatorului informaii referitoare la succesul sau eecul upload-ului. Mecanismul de upload este implementat astfel: <?php $id=$_GET["id"]; if(isset($_POST["submit"])){ if(!empty($_FILES["photos"])){ //$status="not ok"; chdir('photos'); chdir("member_".$id); $uploaddir="C:\Inetpub\wwwroot\licady\photos\member_". $id; for($i=0;$i<count($_FILES["photos"]);$i+ +){ if (move_uploaded_file($_FILES["photos"]["tmp_name"][$i], $uploaddir . '/' . $_FILES["photos"]["name"][$i])) { $status="ok"; $query_del = "DELETE FROM photos WHERE memberid = ".$id." AND photonr = ". ($i+1); $result_del = mysql_query($query_del);

57

$query="INSERT INTO photos VALUES(".$id.", ".($i+1).", '".$_FILES["photos"] ["name"][$i]."')"; $result=mysql_query($query); } } } } ?> V.3.5. Managementul sesiunilor de lucru Pentru managementul utizatorilor care logai pe site, PHP ofer mecanismul variablelor din scope-ul $_SESSION. Pagina login.php realizeaz logarea unui utilizator. ntr-un formular HTML acesta trebuie s introduc adresa de e-mail i parola pe care a ales-o n momentul crerii contului. Acest formular este trimis spre prelucrare tot ctre pagina login.php. La nceputul fiierului are loc o verificare dac a fost apsat butonul de login i n caz afirmativ se preiau informaiile introduse n formular i se verific dac acestea corespund uneia i numai uneia dintre nregistrrile din tabelul members. Dac este gsit o asemenea nregistrare, sunt setate variabilele username i userid din scopul $_SESSION i fiierul statusbar.php i modific coninutul pentru a afia faptul c utilizatorul a fost recunoscut i logat n sistem: <?php if(isset($_POST["submit"])){ $email=$_POST["email"]; $password=$_POST["password"]; $login="SELECT * FROM members WHERE email='". $email."' AND password='".$password."'"; $result=mysql_query($login); if($result && mysql_num_rows($result)==1){ $row=mysql_fetch_array($result); $_SESSION['username']=$row['name']; $_SESSION['userid']=$row['id']; } else{ $error=1; } } 58

?> n caz contrar, este setat o variabil php numit $error i este afiat un mesaj de eroare, iar utilizatorul poate ncerca din nou. Fiierul statusbar.php este cel care realizeaz afiarea, sub bara de meniu a informaiilor legate de starea utilizatorului. Dup ce utilizatorul este recunoscut i este afiat un link prin care poate accesa pagina logout.php, prin care se poate deconecta, iar dac nici un utilizator nu este conectat, este afiat o legtur ctre pagina login.php. <table width="800"> <tr> <td align="left"> <?php if(isset($_SESSION['username']) && isset($_SESSION['userid'])) echo "Welcome, ".$_SESSION['username']."!"; else echo "Welcome, Visitor!"; ?></td> <td align="right"> <?php if(isset($_SESSION['username']) && isset($_SESSION['userid'])) echo '<a href="logout.php">Logout</a>'; else echo '<a href="login.php">Login</a>'; ?></td> </tr> </table> Toate paginile folosite pentru navigare n cadrul site-ului trebuie s apeleze funcia session_start(). Aceasta permite determinarea strii utilizatorului: conectat sau neconectat. Anumite pagini ale site-ului permit accesul numai pentru utilizatorii conectai. Pentru aceasta, respectivele pagini trebuie s realizeze o verificare a variabilelor din scope-ul $_SESSION, iar n cazul n care utilizatorul nu este conectat, este redirectat ctre pagina login.php, astfel: session_start(); if( !isset($_SESSION['username'])|| isset($_SESSION['userid']) ){ header("Location: login.php"); } Pagina logout.php realizeaz distrugerea variabilelor din scope-ul $_SESSION, i redirectarea ctre pagina de start a site-ului, index.php, astfel: 59

<?php session_start(); if( isset($_SESSION['username']) && isset($_SESSION['userid']) ){ unset($_SESSION['username']); unset($_SESSION['userid']); header("Location: index.php"); } ?>

60

CONCLUZIE

61

Você também pode gostar