. Aplicatie Informatica Privind Construirea Unui Site Dinamic

INTRODUCERE

Dezvoltarea rapidă din ultima perioadă a resurselor software și hardware din domeniul tehnologiei informației are meritul de a oferi o mai bună comunicare și un acces mult mai rapid la toate categoriile de informații. Acest lucru se poate observa foarte ușor datorită sistemului World Wide Web, cu ajutorul căruia, printr-un simplu click de mouse se poate naviga prin miile de resurse informaționale din întreaga lume.

Această lucrare prezintă o aplicație ce constă într-un site dinamic, construit utilizând tehnologiile PHP și MySQL. Acest site reprezintă o implementare Web a unei agenții matrimoniale. Utilizatorii se înregistrează și își pot introduce anumite informații personale. Se permite, de asemenea, căutarea în baza de date asociată, folosind anumite criterii. Căutarea și vizualizarea mebrilor înregistrați nu este permisă decât membrilor site-ului, pentru aceasta fiind implementat un mecanism de logare. Este implementat, de asemenea și mecanismul de trimitere de e-mail către adresele membrilor și de upload de fișiere pe server.

Lucrarea este structurată în cinci capitole, primele patru constând în prezentarea principalelor noțiuni și concepte folosite în realizarea aplicației, iar ultimul capitol reprezintă descrierea plicației și modul ăn care aceasta a fost realizată.

Capitolul 1 – Internet-ul reprezintă o scurtă introducere a principalelor noțiuni legate de Internet. Sunt explicate noțiuni ca Internet, protocolale, aplicații 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 noțiuni 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ă noțiunile de bază legate de bazele de date relaționale și este descris pe scurt principalul limbaj de interogări folosit în prezent, SQL. De asemenea, este prezentat modul de creare a unei baze de date relaționale și sunt definite noțiuni ca: relație , cheie primară, cheie externă, normalizarea tabelelor.

Capitolul 4 – MySQL reprezintă o introducere în acest sistem de gestiune a bazelor de date realționale. Sunt prezentate principalele caracteristici ți facilități oferite de acesta. De asemenea, este prezentat modul de utilizare a MySQL, conectarea și deconectarea de la server, crearea și selectarea bazelor de date, crearea tabelelor și intoducerea interogărilor.

Capitolul 5 – Aplicație reprezintă descrierea aplicației. Implementarea acestui site a fost realizată folosind limbajul de server side scripting PHP datorită felxibilității acestuia și a faptului că poate fi folosit gratuit, fără restricții. De asemenea, a fost ales sistemul de gestiune a bazelor de date relațioale 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.

Interfața grafică a aplicației a fost construită pe baza unui template, pe care toate paginile site-ului îl folosesc pentru a păstra același layout pe întregul site. De asemenea, pentru setarea modalităților de afișare a diferitelor elemente HTML, pentru alegerea stilului site-ului s-a folosit un fișier .css, acesta putând fi modificat sau înlocuit și întregul site își schimbă automat înfățișsarea.

Prin combinarea acestor două produse, PHP și MySQL, aplicația realizată este foarte flexibile, putându-se adăuga noi funcționalități dacă este necesar.

I. INTERNET-UL

I.1. INTRODUCERE

Majoritatea site-urilor web sunt constituite din informații statice, dar Web-ul 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, colecții și prelucrări sofisticate ale datelor, interacțiuni de poștă electronică, interfețe pentru utilizatori bogate și atrăgătoare.

I.1.1 Internet-ul

Internet-ul este înconjurat de foarte multă ambiguitate și confuzie dar, în câteva cuvinte, poate fi definit ca cea mai mare rețea din lume. Majoritatea rețelelor din prezent sunt rețele locale (Local Area Networks – LANs) și sunt formate dintr-un grup de calculatoare aflate relativ aproape unul de celălalt și conectate prin echipamente hardware speciale și cabluri. Unele calculatoare îndeplinesc rolul de clienți (cunoscute, de obicei, sub denumirea de workstations) iar altele sunt servere. Toate aceste calculatoare pot comunica între ele pentru a schimba informații.

O rețea mai mare, care se întinde pe mai multe locații geografice este, de obicei, folosită de marile companii care au sedii în mai multe localități. Fiecare dintre locații are propriul său LAN, care leagă calculatoarele locale. Aceste LAN-uri, la rândul lor, sunt interconectate prin intermediul unor medii speciale de comunicare. Legăturile pot fi de la legături de tip dial-up prin modem, până la legături de mare viteză T1 sau T3 sau legături prin fibră optică. Grupul complet al LAN-urilor interconectate se numește Wide Area Network (WAN). WAN-urile se folosesc pentru a conecta locații 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ă cantități mari de date, între locații strategice – probabil mari orașe sau țări diferite. Aceste backbones ar fi asemănătoare autostrăzilor de mare viteză și pe multe benzi dintre țări.

Ar trebui definită o toleranță la erori pentru a face aceste backbones complet redundante, astfel încât dacă vreo conexiune se întrerupe, ar mai fi disponibilă cel puțin o altă modalitate de a a atinge o destinație specifică.

Mai departe, ar fi create mii de legături locale care ar conecta fiecare oraș la backbone prin conexiuni mai puțin rapide. S-ar permite WAN-urilor și LAN-urilor companiilor și chiar și utilizatorilor individuali cu modem-uri pentru dial-up 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ă rețea 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 rețea. Acest lucru va asigura faptul că informația trimisă unui anumit calculator va ajunge la destinația 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-adevăr. Majoritatea sunt deținute de marile companii de telecomunicații.

Punctele de acces locale, cunoscote sub numele de POP (Points of Presence) aparțin 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 mulțime de reguli ce guvernează comportamentul în anumite situații. Protocoalele permit realizarea comunicării fără întreruperi și fără să apară neînțelegri. 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ă când este stabilită o conexiune. Indiferent de modul în care este este obținută o adresă IP, oricare două calculatoare conectate la Internet nu vor putea folosi aceeași adresă IP în același timp.

I.1.2. Aplicații pentru Internet

Internet-ul în sine este o masivă rețea de comunicații și oferă foarte puțin majorității 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ă. Autostrăzile nu sunt așa de atractive precum locurile în care se poate ajunge călătorind pe ele și acest lucru este valabil și pentru Internet. Ceea ce face Internet-ul așa de atrăgător sunt aplicațiile care rulează pe baza sa și ceea ce poate fi realizat cu ajutorul acestora.

Cea mai cunoscută aplicație din prezent este World Wide Web. Mulți oameni confundă Internet-ul cu World Wide Web, lucru complet greșit.

Toate aplicațiile pentru Internet folosesc protocolul IP pentru a comunica. Informația transmisă de aceste aplicații este împărțită în pachete, mici blocuri de date, care sunt trimise unei adrese IP destinație. Aplicația de la capătul celălalt procesează informțiile primate.

Câteva din aplicațiile pentru Internet sunt:

Email – SMTP (Simple Mail Transfer Protocol) este cel mai cunoscut mechanism de transmitere a mesajelor de poștă electronică, iar POP (Post Office Protocol) este interfața cea mai utilizată pentru accesarea mesajelor.

FTP – File Transfer Protocol este folosit pentru trasferul fișierelor între calculatoare.

IRC – Internet Relay Chat permite susținerea de conferințe în timp real, bazate pe text, prin Internet.

NFS – Network File System este folosit pentru a partaja fișiere între diferite calculatoare.

Newsgroups – liste de discuții bazate pe thread-uri.

Telnet – folosit pentru conectarea la un calculator de la distanță.

VPN – Virtual Private Networks permite accesul sigur al rețelelor private la Internet.

WWW – World Wide Web.

I.1.3 DNS

Adresele IP reprezintă singurul mod de a specifica în mod unic un host. Când se dorește 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 numește DNS (Domain Name Service). Când se specifică o adresa, cum ar fi www.yahoo.com, browser-ul trimite un o cerere de tip address resolution către un server DNS, cerând 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 câteva motive pentru care acest lucru nu se face:

Adresele IP sunt greu de reținut și pot fi ușor scrise greșit.

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 decât un Internet privat. Cu alte cuvinte, este o rețea privată, de obicei un LAN sau WAN, care permite folosirea aplicațiilor Internet-based într-un mediu sigur și privat. Ca și pe Internet-ul public, intranet-urile pot găzdui servere de Web, servere FTP sau orice alte servicii bazate pe IP.

Un extranet este o rețea de tip intranet care conectează mai multe site-uri sau organizații 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 rețea.

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 aplicație 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 otocol numit Hypertext Transfer Protocol (HTTP). HTTP este un protocol mic și rapid care se potrivește foarte bine sistemelor informatice multimedia și distribuite și salturilor între site-uri.

Web-ul constă în pagini cu informații 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. Când un utilizator de la o adresă IP specifică solicită un anumit fișier, serverul Web încearcă să obțină acel fișier și să-l trimită înapoi utilizatorului. Fișierul solicitat poate fi codul sursă HTML al unei pagini Web, o imagine GIF, un fișier Flash, un document XML, sau un fișier 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 măsură 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ă conține referințe la alte informații ce trebuie descărcate (de exemplu, imagini GIF sau JPG), fiecare va fi obținută folosind o nouă conexiune.

Pe un același host pot rula mai multe aplicații de Internet, de exemplu un server Web, un server FTP, un server DNS și un server de mail SMTP POP3 pot rula în același timp. Fiecărui server îi este atribuit un port pentru a asigura că fiecare server va răspunde numai cererilor din partea clienților corespunzători.

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

Informațiile din World Wide Web sunt stocate în pagini. O pagină poate conține oricare din următoarele: 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 afișate de către 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ă afișeze grafice, tabele, formulare, text formatat și orice conține 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 fișiere cu simplu text costruite folosind limbajul Hypertext Markup Language (HTML). Acesta este implementat ca o mulțime de tag-uri ușor de învățat. Autorii paginilor Web folosesc aceste tag-uri pentru a marca paginile de text, iar browserele le folosesc pentru a randa și afișa informațiile pentru a putea fi vizualizate. Paginile Web pot să conțină legături 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 interfețe 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 puțin) 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 procesări 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, mișcarea pointer-ului mouse-ului asupra unei imagini sunt toate evenimente, iar script-urile pot fi executate automat de browser atunci cînd aceste evenimente au loc.

Script-urile pot fi incluse în codul HTML sau pot fi stocate în fișiere 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 conținut astfel încât ambele să poată fi refolosite și modificate cu ușurință.

DHTML (Dynamic HTML) – o combinație de HTML, script-uri și CSS care folosite împreună, pot realiza interfețe 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 interfețe atractive și portabile.

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 părți, astfel:

Protocol – protocolul care va fi folosit pentru a obține 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 obținute 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 folosește portul implicit, iar dacă este specificat, numărul portului trebuie precedat de semnul :.

Path – calea către fișierul care se dorește a fi primit sau scriptul care trebuie executat.

File – numele fișierului cerut.

Query String – parametrii opționali 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 întreținute manual, astfel că dacă informațiile se modifică și pagina trebuie modificată. Aceasta implică încărcarea paginii într-un editor, realizarea modificărilor, reformatarea textului dacă este necesar și apoi salvarea fișierului. Aceste operații necesită foarte mult timp dacă numărul paginilor care trebuie actualizate este mare.

Paginile dinamice conțin foarte puțin text. În schimb extrag informațiile necesare din alte aplicații. Paginile dinamice pot comunica cu bazele de date, foi de calcul tabelar, sisteme de gestiune a bazelor de date client-server și multe alte aplicații.

Crearea paginilor Web dinamice permite crearea de aplicații puternice, care pot include caracteristici precum următoarele:

interogarea aplicațiilor de baze de date existente pentru obținerea datelor

crearea de interogări dinamice care facilitează obținerea în mod flexibil a datelor

execuția procedurilor stocate

execuția codului condițional on-the-fly pentru a personaliza răspunsurile în funcție de situațiile specifice

sporirea capabilităților formularelor HTML standard prin folosirea unor funcții de validare

popularea în mod dinamic a elementelor din formulare

personalizarea modului de afișare a informațiilor legate de dată, timp și monedă folosind funcții de formatare

ușurarea creării aplicațiilor de introducere a datelor prin wizards

generarea automată de email

site-uri comerciale și coșuri electronice de cumpărături

și multe altele

I.3.6. Înțelegerea Aplicatiilor Web

Browserele Web trimit cereri către serverele Web, iar acestea le îndeplinesc – trimit înapoi informațiite cerute către browser. Aceste informații sunt de obicei fișiere HTML, ca și alte tipuri de fișiere.

Și cam atât este ceea ce fac serverele Web. Ele sunt de fapt aplicații destul de simple – stau și așteaptă cererile pe care le îndeplinesc de îndată ce le primesc. Serverele Web nu permit interacțiunea cu bazele de date, nu permit personalizarea paginilor Web, nu permit procesarea rezultatelor trimiterii unui formular de către utilizator.

Un Web application Server este un software care extinde serverul Web, permițânduți acestuia să facă lucrurile pe care nu le poate face singur.

Când un server Web primește o cerere de la un browser, el cercetează acea cerere pentru a determina dacă este o simplă pagină Web sau o pagină care necesită prelucrări suplimentare de către 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 îndeplinește cererea și trimite fișierul către browserul clinet nemodificată. Dar dacă tipul MIME indică faptul că fișierul cerut necesită procesarea de către un web application server, atunci web serverul trimite fișierul către web application server-ul corespunzător și trimite browserului rezultatul pe care îl primește 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.

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 aplicații web, prin integrarea codului PHP în documente HTML. Sintaxa sa provine din C, Java și Perl și este ușor de învățat. 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 aplicațiilor în Web. Totuși, spre deosebire de alte instrumente populare pentru dezvoltarea aplicațiilor Web, cum este Perl, PHP este un limbaj de programare comod pentru începători, chiar și pentru cei care nu au mai desfășurat activități de programare în trecut.

Ca și alte limbaje de scripting pentru Web, PHP vă permite să furnizați un conținut Web dinamic, adică un conținut Web care se modifică automat de la o zi la alta sau chiar de la un minut la altul. Conținutul Web este un element important în susținerea traficului unui sit Web; de regulă, vizitatorii nu vor mai reveni la o pagină Web care conține aceleași informații ca și cele prezentate la ultima vizită. Pe de altă parte, siturile Web frecvent actualizate pot atrage cantități 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 obține accesul la fișiere, baze de date și alte resurse inaccesibile programului JavaScript. Acestea constituie bogate surse de conținut dinamic, care atrag vizitatorii.

II.1. Noțiuni 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 mulțime 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 sfârșit ce permit intrarea și ieșirea din "modul PHP".

<html>

<head>

<title>Exemplu</title>

</head>

<body>

<?php

echo "Salut, sunt un script PHP!";

?>

</body>

</html>

Diferența dintre PHP și altceva cum ar fi JavaScript este acela că PHP este executat pe server pe când 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, fără 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 fișiere.

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 conținut 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 tradițional ș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 fără 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 aplicații ce rulează de partea clientului în mod grafic (GUI). Probabil că PHP nu este limbajul cel mai bun de a scrie aplicații cu ferestre pentru Windows sau alte sisteme de operare, dar dacă este bine cunocut și se dorește folosirea unor facilități avansate ale PHP-ului în aplicațiile ce rulează de partea clientului, se poate totuși folosi PHP-GTK pentru a scrie astfel de programe. De asemenea, există posibilitatea de a scrie aplicații ce rulează pe platforme diferite folosind această metodă. PHP-GTK este o extensie a PHP-ului, nedisponibila în distribuția principală de PHP.

PHP poate fi folosit pe aproape toate marile sisteme de operare, incluzând Linux, multe variante de Unix (incluzând 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 putând 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 librării de cod și aplicații mari (incluzând și librăria PEAR) sunt scrise folosind doar cod POO.

Cu PHP programatorul nu este limitat să scoată rezultat HTML. Posibilitățile PHP-ului includ afișarea de imagine, fișiere PDF și chiar filmulețe Flash (folosind librăriile libswf și Ming) toate generate instant. Se poate de asemeanea ca rezultatul să fie orice fișier text, cum ar fi XHTML sau orice alte fișiere XML. PHP poate genera autmoat aceste fișiere și să le salveze în sistemul de fișiere în loc să le afișeze, formând un cache de partea serverului pentru conținutul dinamic.

Una dintre cele mai puternice și importante facilități în PHP este suportul său pentru o gamă larga de baze de date. Scrierea une pagini de web ce interacționeaza 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 rețea și se poate interacționa între aproape toate limbajele de programare Web. PHP are suport pentru instanțierea 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 capabilități extrem de folositoare pentru procesarea textului, de la POSIX Extins sau expresii regulare Perl, până la parsarea documentelor XML. Pentru parsarea și accesarea documentelor XML, suportă standardele SAX și DOM.

Folosind PHP în domeniul comerțului electronic, sunt foarte folositoare pentru programul tău de plați online funcții de plată Cybercash, CyberMUT, VeriSign Payflow Pro și CCVS.

În cele din urmă, dar nu ultimul rând, PHP are și alte extensii interesante, cum ar fi funcții ale motorului de căutare mnoGoSearch, funcții pentru accesarea IRC-ului, multe utilitare de compresie (gzip, bz2), conversie de calendar, traducere…

II.2. Elemente de bază ale sintaxei

II.2.1. Ieșirea din modul HTML

Când PHP interpretează un fișier trece prin textul acestuia până când întâlnește unul din tag-urile speciale care îi spun să pornească interpretarea textului ca fiind cod PHP. Mai departe, parser-ul execută tot codul întâlnit, până la întâlnirea 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 lăsat 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 tag-urile î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 dorește 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:

<?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"); %>

<%= $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 făcut prin intermediul funcției short_tags() (numai în PHP3), prin activarea opțiunii short_open_tag în fișierul de configurare, sau prin compilarea scripturilor folosind opțiunea enable-short-tags. Chiar dacă este implicit activată în fișierul 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 fișierul 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 funcționează exact cum este de așteptat, deoarece când PHP întâlnește tag-ul de închidere ?> începe afișarea a ceea ce întâlnește până la apariția unui alt tag de start. În cazul blocurilor mari de text, ieșirea din modul PHP este în general mai eficientă decât trimiterea textului folosind echo() sau print().

II.2.2. Separarea instrucțiunilor

Instrucțiunile sunt separate la fel ca în C sau Perl – fiecare instrucțiune este terminată cu un semn punct și virgulă.

Tag-ul de închidere implică și sfârșitul instrucțiunii, deci următoarele două exemple sunt echivalente:

<?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 până la sfârșitul liniei curente sau până 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

Tipul unei variabile, de obicei nu este stabilit de programator, ci este decis la rulare de PHP, în funcție de contextul în care acea variabilă este folosită.

II.4 Variabile

II.4.1 Noțiuni 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 cînd o expresie este atribuită unei variabile, întreaga valoare a expresiei originale este copiată în variabila destinație. 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ă către) variabila originală. Schimbări în variabila nouă o afectează și pe cea inițială, ș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 atașat un ampersand(&) la începutul variabilei care va fi atribuită (variabila sursă), ca în exemplul următor:

<?php

$foo = 'Bob'; // Assign the value 'Bob' to $foo

$bar = &$foo; // Reference $foo via $bar.

$bar = "My name is $bar"; // Alter $bar…

echo $bar;

echo $foo; // $foo is altered too.

?>

II.4.2 Variabile predefinite

PHP furnizează un număr 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 alți factori.

Unele din aceste variabile nu vor fi folosite când PHP rulează în linie de comandă.

II.4.3. PHP Superglobals

$GLOBALS

Conține 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 execuție 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 fișiere 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).

II.4.4. Folosirea variabilelor statice

O importantă caracteristică a scope-ului variabilei o reprezintă variabila statică. O variabilă statică există în scope-ul funcției locale, dar nu își pierde valoarea când execuția programului părăsește acest scope. Să considerăm următorul exemplu:

<?php

function Test () {

$a = 0;

echo $a;

$a++;

} ?>

Această funcție este destul de nefolositoare deoarece de fiecare dată este apelată să seteze valorea 0 variabilelei $a și să printeze "0".

Instrucțiunea $a++ care incrementează variabila nu servește nici unui scop deoarce, de îndată ce funcția iese, variabila dispare. Pentru folosirea unei funcții de numărare care nu va mai pierde număratoarea curentă, variabiala $a este declarată statică.

<?php

function Test()

{

static $a = 0;

echo $a;

$a++;

}

?>

Astfel, de fiecare dată când funcția Test() este apelată, aceasta va afișa valoarea variabilei $a și o va incrementa.

Variabilele statice oferă, de asemenea, un mod de a lucra cu funcțiile recursive. O funcție recursivă este o funcție care se autoapelează. Trebuie avută grijă la scrierea unei funcții recursive, deoarece este posibilă realizarea unei recursii infinite. Trebuie asigurat un mod de a termina recursia. Următoarea funcție recursivă simplă numără până la 10, folosind variabila statică $count pentru a știi când să se oprească:

<?php

function Test()

{

static $count = 0;

$count++;

echo $count;

if ($count < 10) {

Test ();

}

$count–;

}

?>

II.4.5. Variabile din afara mediului PHP

Formulare HTML (GET și POST)

Când un formular este trimis unui scrip PHP, informațiile din acel formular sunt automat transmise scriptului PHP. Sunt mai multe modalități de a accesa informația, 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 funcție de setările și preferințele particulare, sunt multe modalități de a accesa datele din formulare HTML. Câteva 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.

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 informțiilor din QUERY_STRING (informațiile de după semnul ? din URL). De exemplu, URL-ul http://www.example.com/test.php?id=3 conține 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 funcția setcookie(). Cookie-urile fac parte din header-ul HTTP, deci funcția setcookie() trebuie apelată înainte de trimiterea oricărui conținut către browser. Informațiile de tip Cookie sun apoi stocate în array-urile corespunzătoare, cum ar fi $_COOKIE, $HTTP_COOKIE_VARS ca și în $_REQUEST.

Dacă se dorește atribuire unor valori multiple unei singure variabile Cookie, aceasta poate fi tratată ca un array. De exemplu:

<?php

setcookie("MyCookie[foo]", "Testing 1", time()+3600);

setcookie("MyCookie[bar]", "Testing 2", time()+3600);

?>

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

III. BAZE DE DATE ȘI SQL

III.1. Concepte ale bazelor de date relaționale

III.1.1. Structura unei baze de date relaționale

O bază de date este o colecție de date organizată astfel încât acestea să poată fi ușor găsite și actualizate. O bază de date conține toate informațiile necesare despre obiectele ce intervin într-o mulțime de aplicații, relațiile logice între aceste informații și tehnicile de prelucrare corespunzătoare. În bazele de date are loc o integrare a datelor, în sensul că mai multe fișiere sunt privite în ansamblu, eliminându-se pe cât posibil informațiile redundante. De asemenea, se permite accesul simultan la aceleași date, situate în același loc, sau distribuite spațial, a mai multor persoane de pregătiri diferite, fiecare cu stilul personal de lucru.

Sistemul de programe care permite construirea unei baze de date, introducerea informațiilor în bazele de date și dezvoltarea de aplicații privind bazele de date se numește 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 obișnuit de exprimare, pentru a obține informații, utilizatorul făcând abstracțtie de algoritmii aplicați pentru selecționarea 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 informațiilor la nivel logic și de operare cu ele dintre acestea, modelul relațional 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 relaționale.

Un model relațional de baze de date cuprinde trei componente principale:

– Structura datelor – prin definirea unor domenii și a relațiilor n-are.

– Integritatea datelor – prin impunerea unor restricții.

– Prelucrarea datelor – prin operații din algebra relațională sau calculul relațional.

Modelul relațional se bazează pe noțiunea matematică de relație, așa cum este definită în teoria mulțimilor, și anume ca o submulțime a produsului cartezian a unei liste finite de mulțimi numite domenii. Elementele unei relații se numesc tupluri, iar numărul de domenii din produsul cartezian se numește aritatea relației.

De obicei relațiile sunt reprezentate sub forma unor tabele în care fiecare rând reprezintă un tuplu și fiecare coloană reprezintă valorile tuplurilor dintr-un domeniu dat al produsului cartezian. Coloanelor și, respectiv, domeniilor corespunzătoare lor li se asociază nume intitulate atribute.

Accesul la informații se face pe baza cheilor. O cheie este o coloană (sau un grup de coloane) care identifică în mod unic un rând dintr-un tabel.

III.1.2. Normalizarea tabelelor

Pentru a deosebi anumite calități specifice ale unor relații, s-au făcut mai multe clasificări, dintre acestea, cea mai frecvent utilizată fiind clasificarea în forme normale. Se spune că o relație (un tabel) este într-o formă normală particulară dacă satisface o mulțime dată de constrângeri. Transformarea unei relații într-o mulțime de relații de un anumit tip se numește 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 urmărite în procesul de normalizare sunt: eliminarea unor redundanțe, evitarea unor anomalii de reactualizare, realizarea unui proiect care să reprezinte cât mai fidel modelul real (ușor de înțeles și eventual de modificat), stabilirea unor constrângeri de integritate simple și altele.

III.1.3. Structured Query Language

SQL (Structured Query Language) este un limbaj relațional 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 sfârșitul anilor '80.

În ciuda simplității sale, SQL este un limbaj foarte puternic, care poate obține accesul la date stocate în mai multe tabele, poate filtra datele dorite și poate sorta, rezuma și afișa rezultatele.

În general, nu se pot anticipa toate modalitățile în care utilizatorii pot dori să obțină acces la date și să le vizualizeze. Ca atare, nu se pot scrie programe de aplicație care să satisfacă fiecare potențială necesitate de informații. Este aproape sigur că vor apărea unele cereri de date neprevăzute (sau ad-hoc).

Utilizând SQL, este posibil accesul la datele stocate într-o bază de date relațională fără a scrie un program de aplicație, permițând frecvent evitarea întârzierilor și a costurilor implicate de programarea personalizată. Astfel, bazele de date relaționale permit satisfacerea tuturor cererilor ad-hoc de informații, care ar rămâne fără răspuns în alte situații.

În funcție de întrebuințarea sa, SQL poate fi împărțit în trei componente:

– DDL – Data Definition Language – folosit pentru a crea bazele de date.

– DML – Data Manipulation Language – folosit la actualizarea datelor.

– DQL – Data Query Language – folosit pentru extragerea informațiilor 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-relație sau modelare E-R. În contextul modelării E-R, o entitate este similară cu un tabel relațional, cu alte cuvinte, conține date care descriu un set de individualități corelate. Modelarea E-R este un proces în cadrul căruia coloanele, entitățile și relațiile între entități sunt descoperite și organizate. Un model E-R poate fi rafinat cu ușuință, pentru a genera o structură a unei baze de date, care poate fi transformată într-o bază de date relațională efectivă.

III.2.2. Modelare E-R

Procesul de modelare E-R costă în patru faze principale:

Identificarea coloanelor.

Gruparea coloanelor în entități.

Identificarea cheilor primare.

Identificarea cheilor externe

III.2.3. Identificarea coloanelor

Prima operație din cadrul procesului de modelare E-R este identificarea coloanelor. Coloanele înregistrează o singură caracteristică a unei entități. În încercarea de identificare a coloanelor în general este util să se răspundă la unele întrebări conexe, cum sunt următoarele:

Care sunt deciziile pe care sistemul trebuie să le ia sau să le susțină?

Care sunt operațiile pe care sistemul trebuie să le execute sau să le susțină?

Care sunt datele necesare pentru a lua aceste decizii și pentru a efectua aceste operații?

III.2.4. Gruparea coloanelor în entități

De obicei este evident că unele coloane sunt corelate, în sensul că fac referire la un anumit set de individualități corelate. Ca atare, aceste coloane pot fi grupate pentru a forma o entitate. Uneori o coloană dată este corelată cu mai multe entități; în acest caz, coloana poate apărea de mai multe ori pe listă.

III.2.5. Identificarea cheilor primare

Fiecare entitate va deveni un tabel relațional ș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 aparițiile entității. Dacă o asemenea coloană există, aceasta va fi identificată drept cheie primară a entității.

Se pot gaăsi unele entitați care nu conțin nici o coloană adecvată pentru rolul de cheie primară. Într-o asemenea situație se poate căuta o serie de coloane care au o valoare combinată unică. Dacă se descoperă o asemenea serie, se poate identifica drept cheie primară compusă a entitații.

S-ar putea să nu se descopere nici o coloană sau serie de coloane care să identifice în mod unic fiecare apariție a unei entitaăți. În acest caz, se creează o coloană nouă, care va conține o identificare artificială unică, și se identifică noua coloană ca fiind cheia primară a entitații.

Se poate folosi o identificare artificială unică chiar și atunci când una sau mai multe coloane pot servi drept cheie primară. Astfel, se evită problemele care apar când identificatori presupuși unici se dovedesc a nu fi unici.

III.2.6. Identificarea cheilor externe

Operația finală și cea mai dificilă din cadrul activitații 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 entități oarecare. Procesul de identificare a cheilor externe constă în compararea coloanelor cu cheile primare și, pentru fiecare combinație posibilă, în raspunsul la întrebarea: “Există o relație între valoarea acestei coloane și valoarea acestei chei primare?”.

III.2.7. Rafinarea modelelor E-R

Ultima operție de finețe aplicată unui model E-R, după normalizarea bazei de date, constă în specificarea unui tip de date pentru fiecare coloană.

Majoritatea bazelor de date relaționale acceptă urmatoarele tipuri de date generale:

caracter

întreg

zecimal

dată și oră

binar

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 relaționale și este distribuit în regim Open Source.

MySQL software is Open Source. Aceasta înseamnă că MySQL poate fi descărcat de pe Internet, poate fi folosit fără a plăti ceva și, dacă se dorește, codul sursă poate fi studiat și I se pot aduce modificări necesare.

Serverul de baze de date MySQL este foarte rapid, fiabil și ușor de utilizat. Inițial a fost dezvoltat pentru a manipula baze de date de dimensiuni mari mult mai rapid decât soluțiile 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 interfețe pentru programarea aplicațiilor (Application Programming Interfaces – APIs)

IV.2. Caracteristicile de bază ale MySQL

IV.2.1. Componente interne și portabilitate

Câteva dintre caracteristicile de bază ale MySQL sunt:

Scris în C și C++

Testat cu o gamă largă de compilatoare diferite

Funcționează 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 ușuință pe mai multe procesoare dacă sunt disponibile

Oferă motoare tranzacționale și non-tranzacționale de stocare a datelor

Un sistem de alocare a memoriei foarte rapid și bazat pe thread-uri

Join-uri ale tabelelor foarte rapide

Folosește tabele temporare stocate în memorie

Funcțiile SQL sunt implementate folosind o bibliotecă de clase optimizată și sunt foarte rapide. De obicei, nu are loc alocare a memoriei după inițializarea interogărilor.

Serverul este disponibil ca program separat ce poate fi folosit într-un mediu de rețea de tip client/server. De asemenea, este disponibil și ca bibliotecă ce poate fi inclusă în aplicații de sine stătătoare

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/fără semn, FLOAT, DOUBLE, CHAR, VARCHAR, TEXT, BLOB, DATE, TIME, DATETIME, TIMESTAMP, YEAR, SET, ENUM, și tipuri geometrice OpenGIS

Înregistrări cu lungime fixă și cu lungime variabilă

IV.2.3. Comenzi și funcții

Suport complet pentru operatori și funcții în clauzele SELECT și WHERE ale interogărilor.

Suport pentru clauzele GROUP BY și ORDER BY, și pentru funcții 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ă numărul de rânduri modificate.

Comanda SHOW specifică pentru MzSQL poate fi folosită pentru a obține informații despre bazele de date, tabele și indecși.

Numele funcțiilor nu intră în conflict cu numele tabelelor sau ale coloanelor.

Într-o acceași 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.

Parolele sunt sigure deoarece tot traficul legat de parole este criptat când 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 conțin 50 de milioane de înregistrări.

Sunt permiși până la 32 de indecși pentru un tabel. Fiecare index poate consta din una până la 16 coloane sau părți de coloane.

IV.2.6. Conectivitate

Clienții se pot conecta la serverul MySQL folosind socket-uri TCP/IP pe orice platformă.

Interfața Connector/ODBC oferă suport MySQL pentru programe client care folosesc conexiuni ODBC (Open DataBase Conectivity).

Interfața 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 clienților în multe limbi.

Suport complet pentru diferit seturi de caractere.

Toate datele sunt salvate folosind un set de caractere specificat. Toate comparațiile pentru coloane de tip șir obișnuit de caractere sunt case-insensitive.

Sortarea este realizată în concordanță cu setul de caractere ales.

IV.2.8. Clienți și unelte

Serverul MySQL are suport inclus pentru instrucțiuni SQL care verifică, optimizează și repară tabelele. Aceste instrucțiuni sunt disponibile în linia de comandă prin intermediul clientului mysqlcheck.

Toate programele MySQL pot fi invocate cu opțiunea –help sau -? Pentru a obține 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 afișate informații 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 oricând prin introducerea comenzii QUIT (sau \a) la prompt-ul mysql.

mysql> QUIT

bye

IV.3.2. Introducerea interogărilor

Următoarea comandă este o interogare simplă care cere serverului informații 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ă câteva lucruri despre mysql

În mod normal, o comandă constă într-o declarație SQL urmată de semnul puct și virgulă.

Cât se lansează o comandă, mysql o trimite serverului spre execuție și afișează rezultatele, apoi afișează din nou prompt-ul mysql> pentru a indica că este gata să accepte alte comenzi.

Mysql afișează rezultatul interogărilor într-o formă tabelară. Prima linie conține etichetele coloanelor, iar liniile următoare sunt rezultatele interogării.

Mysql afișează și numărul de rânduri returnate și cît timp a fost necesar pentru execuția interogării

Pe o singură linie pot fi introduse mai mule comenzi, separate cu câte 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 neapărat să fie introdusă pe o singură linie, de exemplu:

mysql> SELECT

-> USER()

-> ,

-> CURRENT_DATE;

+–––––––+–––––+

| USER() | CURRENT_DATE |

+–––––––+–––––+

| joesmith@localhost | 1999-03-18 |

+–––––––+–––––+

Prompt-ul se schimbă din mysql> în -> după introducerea primei linii a unei interogări pe mai multe linii. Aceasta indică faptul că respectiva interogare este incompletă și mysql așteaptă introducerea restului interogării.

Se poate întrerupe introducerea unei interogări 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 folosește 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

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 dorește 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 conține nici un table, după cum se poate observa introducând comanda SHOW TABLES:

mysql> SHOW TABLES;

Empty set (0.00 sec)

Pentru a crea un tabel se folosește 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 următorul rezultat:

mysql> SHOW TABLES;

+–––––––+

| Tables in menagerie |

+–––––––+

| pet |

+–––––––+

Pentru a vedea detaliile unui tabel se folosește 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 | |

+–––+––––-+––+––+–––+––-+

V. APLICAȚIE

V.1. Descrierea site-ului

În cadrul acestei aplicații prin combinarea a PHP MySQL s-a dorit realizarea unui site dinamic care dă posibilitatea vizitatorilor săi să-și găseacă perechea potrivită. Site-ul reprezintă implementarea Web a unei agenții matrimoniale. Utilizatorii se pot înregistra, pentru a-și introduce mai multe date personale. Pot vizualiza informațiile celorlați membrii și căuta anumite persoane în funcție de ccriteriil selectate.

Aplicația implementează și unele funcționalități avansate, cum ar fi trimiterea automată de e-mail către adresele specificate de utilizatori și încarcarea de fișiere pe server.

V.1.1. Structura site-ului

Pentru o mai bună organizare a aplicației fișierele au fost incluse, pe cât posibil, în directoare cu denumiri semnificative. Astfel, directorul images conține toate imaginile incluse în paginile site-ului, în directorul photos sunt stocate fotografiile membrilor înregistrați. Directorul templates conține fișierele .php folosite ca template pentru toate paginile din site, iar directorul styles conține fișierele .css (Cascading Style Sheet) folosite pentru realizarea layout-ului site-ului. În directorul functions sunt conținute fișiere .php care vor fi incluse în alte fișiere și în ele sunt definite mai multe funcții utile.

Paginile principale ale aplicației sunt următoarele: 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 conțin informații despre autorul aplicației și, respectiv, modul de contactare a acestuia. Pagina register.php conține 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 către adresa specificată de acesta, respectiv, dacă înregistrarea eșuează, este afișat un mesaj de eroare corespunzător. Pagina members.php conține lista tuturor membrilor înregistrați, cu câteva informații reprezentative pentru fiecare și cu legături către paginile personale care conțin informații detaliate ale acestora. Pagina search.php cuprinde un formular html care permite căutarea în baza de date folosind mai multe criterii. Rezultatele căutării sunt afișate în pagina search_results.php, având același layout ca și pagina member_details.php, pagina cu informații detaliate despre fiecare membru.

V.1.2. Utilizarea template-urilor și a Style Sheet-urilor

Pentru păstrarea aceluiași layout pentru toate paginile, ca și pentru a-l putea modifica sau înlocui cu ușurință, paginile au fost implementate pe baza unui fișier folosit ca template, căruia i-a fost atașat un fișier .css.

Fișierul template folosit pe care este structurat site-ul conține un tabel format din trei rânduri ce îndeplinesc rolurile de header, content și footer. Partea de header constă într-un nou tabel, care la rândul său conține trei rânduri, 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 fișierului menubar.php, iar bara de stare este implementată în fișierul statusbar.php. Partea de content va fi, de asemenea, setată separat pentru fiecare fișier al site-ului. Partea de footer implementată în fișierul footer.php conține informații de tip Copyright.

Codul complet al fișierului 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>

</tr>

<tr>

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

</tr>

</table>

</td>

</tr>

<tr>

<td align="center">content</td>

</tr>

<tr>

<td>

<?php

include "footer.php";

?>

</td>

</tr>

</table>

</body>

</html>

Fișierul .css conține declarațiile de stil pentru elementele HTML folosite în cadrul paginilor. Acestea pot fi cu ușurință 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 informațiilor despre membrii aplicației s-a folosit o bază de date MySQL. Aceasta este formată din patru tabele, și anume members, care conține informațiile despre membrii, languages, care conține o listă a limbilor pe care utilizatorii le pot selecta, spokenlanguages, care reprezintă legăturile dintre fiecare membru și limbile cunoscute de acesta și photos, care conține informațiile 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 următoare, precum și tabelele languages, spokenlanguages și photos:

V.2. Utilizarea bazelor de date MySQL

PHP include o bibliotecă de funcții care furnizează o interfață cu sistemul MySQL de gestiune a bazelor de date. Folosind aceste funcții, un program PHP poate obține accesul la datele rezidente într-o bază de date MySQL și le poate modifica.

Majoritatea interacțiunilor cu o bază de date se desfășoară după un model secvențial simplu:

Se deshide o conexiune cu serverul MySQL.

Se specifică baza de date la care se va obține accesul.

Se emit interogări SQL, se obține accesul la rezultatele interogărilor și se execută operații non-SQL.

Se închide conexiunea cu serverul MySQL.

V.2.1. Conectarea la serverul MySQL

Pentru a se realiza conectarea la un server MySQL, se invocă funcția mysql_connect(), a cărei sintaxă este următoarea:

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. Funcția returnează false în caz de eșec, iar în caz contrar returnează o valoare, denumită identificator de legătură, care servește 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, următoarele 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 funcția connectdb(), implementată în fișierul connection.php, inclus în directorul functions, astfel :

<?php

function connectdb(){

$server=mysql_connect("localhost","root","");

//…..

}

?>

V.2.2. Selectarea bazei de date

După ce programul a obținut o conexiune cu serverul MySQL, programul poate specifica baza de date la care va avea acces. Pentru aceasta, se invocă funcția mysql_select_db(), care are următoarea formă

mysql_select_db(baza_de_date)

unde baza_de_date este un șir care conține numele bazei de date la care urmează a se obține acces. Funcția returnează true dacă poate obține accesul la baza de date, respectiv false în caz contrar.

Selectarea bazei de date a fost implementată tot în funcția connectdb() prezentată mai sus, astfel:

$db=mysql_select_db("adylic");

V.2.3. Detectarea apariției erorilor

Biblioteca MySQL din PHP furnizează două funcții de verificare a erorilor, și anume mysql_errno() și mysql_error(). Fiecare funcție returnează un rezultat care reflectă eroarea, dacă există, asociată celei mai recente operații cu MySQL. Dacă programul execută o secvență de operații MySQL, iar prima operație generează o eroare, informațiile despre erorile respective sunt pierdute în momentul inițierii celei de a doua operații.

Nici una din cele două funcții nu necesită argumente. Functia mysql_errno() returnează un cod numeric de eroare, în timp ce funcția 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.

Informațiile de eroare sunt disponibile numai dacă este activă o conexiune cu serverul MySQL, deci nu se poate folosi nici una dintre aceste funcții pentru a raporta erorile asociate funcției mysql_connect().

Incluzând și mecanismul de detectare a erorilor, funcția connectdb() arată astfel :

<?php

function connectdb(){

$server=mysql_connect("localhost","root","");

$db=mysql_select_db("adylic");

if(mysql_errno())

die("nu s a conectat");

}

?>

V.2.4. Eliminarea mesajelor de eroare

Numeroase funcții PHP pot produce erori sau mesaje de avertizare, dar PHP furnizează funcția error_reporting(), care permite eliminarea mesajelor nedorite. Funcția are următoarea 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 funcția mysql_close(). Funcția returnează true în caz de reusită; în caz contrar returnează false. În general nu este necesară invocarea funcției mysql_close(), deoarece PHP închide automat conexiunile deschise cu bazele de date atunci când un script își încheie execuția.

V.2.6. Executarea interogărilor UPDATE, INSERT și DELETE

Din punctul de vedere al limbajului PHP, există două categorii de interogări SQL:

Interogările SELECT, care returnează rânduri ale unui tabel.

Interogările UPDATE, INSERT și DELETE, care nu returnează rânduri ale unui tabel.

Ambele categorii de interogări sunt emise folosind funcția mysql_query(), dar verificarea și prelucrarea celor două categorii de rezultate ale interogărilor sunt procese destul de diferite.

V.2.7. Funcția mysql_query()

Funcția mysql_query() execută o interogare specificată. Funcția are următoarea formă:

mysql_query(interogare)

unde interogare este un șir care conține intergoarea care urmează a fi executată. Funcția returnează true dacă serverul a reușit să execute interogarea; în caz contrar, returnează false.

V.2.8. Verificarea interogărilor care nu returnează rânduri de table

Pentru a verifica dacă o interogare UPDATE, INSERT sau DELETE a avut efectul dorit, se poate folosi funcția mysql_affected_rows(), care returnează numărul rândurilor afectate de interogarea cea mai recentă. Funcțtia are următoarea formă:

mysql_affected_rows()

În cazul în care cea mai recentă interogare UPDATE, INSERT sau DELETE a eșuat, funcția returnează valoarea -1.

V.2.9. Utilizarea coloanelor de tabel cu auto-incrementare

Pentru a preciza că MySQL va repartiza o valoare secvențială unică în coloana care servește drept cheie primară a tabelului, se poate folosi indicatorul AUTO_INCREMENT.

Când se inserează un rind într-un tabel se poate folosi funcția mysql_insert_id() pentru a determina valoarea cheii primare atribuite de MySQL. Funcția are forma:

mysql_insert_id()

și returnează valoarea zero dacă interogarea precedentă nu a generat o valoare AUTO_INCREMENT. Ca atare, funcția trebuie apelată la puțin timp după interogarea care a inserat rândul din tabel, astfel încât o interogare ulterioară să nu modifice rezultatul.

V.2.10. Prelucrarea rezultatelor interogărilor SELECT

Spre deosebire de interogările UPDATE, INSERT și DELETE, interogările SELECT returnează rânduri de tabel ca rezultate. Rândurile unui tabel sunt incluse într-o structură de date numită set de rezultate. Prelucrarea setului de rezultate returnat de o interogare SELECT implică parcurgerea prin iterație a rândurilor setului de rezultate.

O modalitate de parcurgere iterativă a rândurilor unui set de rezultate constă în obținerea numărului de rânduri, urmată de deplasarea prin iterație, folosind numărul de rânduri ca limită pentru o instrucțiune for. Pentru a obține valoarea numărului de rânduri, se invocă funcția mysql_rows(), transferând ca argument valoarea returnată de funcția mysql_query().

Funcția mysql_fetch_row() se poate folosi pentru a obține următorul rând din secvența setului de rezultate. Totuși, funcția mysql_fetch_row() returnează true dacă un set de rezultate conține rânduri neprelucrate, respectiv false în caz contrar. Ca atare, în general este preferabil să se omită apelarea funcției mysql_num_rows() și să sa se folosească în schimb o instrucțiune while.

Valoarea returnată de funcția mysql_fetch_row() reprezintă un tablou alcătuit din toate coloanele rândului curent din tabel. Tabloul folosește indexuri întregi, unde valoarea primului index este egală cu zero. Pentru a prelucra coloanele stocate în tablou, se folosește o instrucțiune foreach, care elimină necesitatea existenței unui index explicit al buclei.

Daca se dorește obținerea accesului la valoarea unei anumite coloane, se poate face referire la elementul din tablou folosind un index. De exemplu, dacă rezultatul funcției mysql_fetch_row() este stocat în variabila $rind, se poate obține acces la prima coloană din setul de rezultate folosind sintaxa $rind[0], la a două coloană folosind sintaxa $rind[1], etc.

Pentru a obține rândurile tabelului se paote folosi mysql_fetch_array(), care returnează un tablou asociativ. Valorile indecșilor din tablou le reprezintă numele coloanelor din setul de rezultate. Ca și funcția mysql_fetch_row(), funcția mysql_fetch_array() returnează false dacă nu mai există rânduri în setul de rezultate.

V.1.11. Lucrul cu seturi de rezultate

Biblioteca de funcții MySQL a limbajului PHP include un set de funcții prin care se pot obține informații despre un set de rezultate, inclusiv:

Numărul coloanelor din setul de rezultate.

Numărul fiecărei coloane.

Lungimea fiecărei coloane.

Indicatorii MySQL asociați coloanei.

Tipul MySQL al fiecărei coloane.

Numele tabelului MySQL care conține coloana, dacă este cazul.

De asemenea, biblioteca furnizează o funcție care permite obținerea accesului în mod non-secvențial la rândurile din setul de rezultate, prin specificarea numărului unui rând.

V.2.12. Obținerea numărului coloanelor unui set de rezultate

Pentru a obține numărul coloanelor dintr-un set de rezultate se invocă funcția mysql_num_fields(), transferând ca argument valoarea returnată de funcția mysql_query().

V.2.13. Obținerea numelui unei coloane din setul de rezultate

Funcția mysql_field_name() returnează numele coloanei din setul de rezultate având valoarea indexului dată ca argument al funcției. Indexul asociat cu prima coloană este 0, indexul asociat celei de a doua coloane este 1, etc.

V.2.14. Obținerea lungimii unei coloane dintr-un set de rezultate

Funcția mysql_field_len() returnează lungimea maximă a coloanei dintr-un set de rezultate, având valoarea indexului dată ca argument al funcției. Indexul asociat primei coloane este 0, indexul asociat celei de a doua coloane este 1 etc.

V.2.15. Obținerea indicatorilor MySQL asociați unei coloane a setului de rezultate

Funcția mysql_field_flags() returnează indicatorii SQL asociați colaonei din setul de rezultate al cărei index este dat ca argument al funcției. Indexul asociat primei coloane este 0, indexul asociat celei de a doua coloane este 1, etc. Funcția mysql_field_flags() raportează următorii indicatori :

AUTO_INCREMENT

BINARY

BLOB

ENUM

MULTIPLE_KEY

NOT_NULL

PRIMARY_KEY

TIMESTAMP

UNIQUE_KEY

UNSIGNED

ZEROFILL

Dacă la o coloană sunt asociați mai multi indicatori, fiecare indicator este separat de vecinii săi prin intermediul unui singur spatiu.

V.2.16. Obținerea tipului MySQL al unei coloane din setul de rezultate

Funcția mysql_field_type() returnează tipul MySQL al unei coloane al carei index este dat ca argument al funcției. 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

Funcția mysql_field_table() returnează tabelul MySQL, dacă există, asociat coloanei din setul de rezultate al cărei index este dat de argumentul funcției. Indexul asociat primei coloane este 0, indexul asociat celei de a doua coloane este 1, etc. În cazul în care coloana conține o valoare calculată sau dacă respectiva coloană nu este asociata în alt mod cu un tabel MySQL, funcția returneaza un șir vid.

V.2.18. bținerea structurii complete a setului de rezultate

Funcția mysql_fetch_field() returnează un obiect ale cărui proprietăți conțin o varietate de informații cu privire la coloana unui set de rezultate. Proprietățiile sunt următoarele:

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 non-unică

name – numele coloanei

not_null – are valoarea 1 în cazul în care coloana nu poate conține 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 căruia îi aparține 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

Funcția mysql_fetch_field() preia două argumente: valoarea returnată de funcția 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-secvențial la coloanele unui set de rezultate

Funcțiile mysql_fetch_row() și mysql_fetch_array() returnează, în general rândurile dintr-un set de rezultate în mod secvențial. Totuși, funcția mysql_data_seek() permite obținerea accesului la rândurile unui set de rezultate într-o manieră non-secvențială. Funcția are forma :

mysql_data_seek(rezultat, numar_rind)

unde rezultat este valoarea returnată de funcția mysql_query(), iar numar_rind este indexul rândului la care doriți să obtineți accesul. Primul rând al setului de rezultate este numerotat cu 1, al doilea cu 2 etc. Funcția returnează true dacă execuția reușește, respectiv false în caz contrar. O invocare ulterioară a funcției mysql_fetch_row() sau a funcției mysql_fetch_array() va returna rândul din poziția specificată a setului de rezultate.

V.3. Implementarea funcționalităților principale

V.3.1. Înregistrarea noilor membrii

Pentru înregistrarea unui nou membru în baza de date a aplicației, utilizatorul trebuie să completeze formularul din pagina register.php. Acesta sunt cuprinde toate câmpurile din tabelul members al bazei de date, precum și o listă cu toate înregistrările din tabelul languages, pentru ca utilizatorul să poată selecta limbile cunoscute. Toate câmpurile sunt obligatorii, unele au furnizate valori implicite, iar pentru cele care necesită îndeplinirea anumitor condiții pentru a putea fi valide a fost realizată o funcție JavaScript. Aceasta realizează validarea datelor introduse în formular înainte ca cererea să fie trimisă spre procesare serverului.

Câmpurile de tip select din formular trebuie să aibă valori care sunt obținute din valorile posibile ale anumitor coloane de tip enum din baza de date, iar acestea sunt obținute prin apelarea funcției showenumvalues($col), definită în fișierul showenumvalues.php, inclus în directorul functions, funcție 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ă funcție este apelată în fișierul register.php pentru diferite valori ale parametrului $col, de exemplu:

<?php showenumvalues("haircolor"); ?>

Dacă datele au fost completate corect, formularul este trimis spre procesare. De acest lucru se ocupă fișierul register_action.php. Se încearcă inserarea elementelor din formular folosind o interogare de tip insert și prin apelul funcției mysql_query. Dacă inserarea eșuează este afișat 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 către adresa specificată de acesta și i se oferă posibilitatea de a trece într-o nouă pagină în care își poate upload-a până la maximum cinci fotografii personale. Tot acum este creat pe server un director al cărui 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 execuția interogărilor 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 instrucțiune if în care se verifică dacă a fost apăsat butonul sumbit din formularul de înregistrare astfel:

if(isset($_POST["submit"])){

//….

}

Pentru introducerea datelor din formular în baza de date, acestea sunt reținute în prealabil în variabile php corespunzătore:

$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 funcția mysql_query:

$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 execuția interogării și a celorlalți pași necesari, în funcție 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;

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ă funcția mailto($to, $pass), implementată în fișierul mail.php din directorul functions. Această funcție primește 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 funcția PHP mail, astfel:

<?php

function mailto($to,$pass){

$TO=$to;

$FROM = "[anonimizat]";

$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. Căutarea membrilor

Pentru căutarea în baza de date a fost creat pagina search.php care conține un formular în care utilizatorul poate specifica creiteriile de căutare. Aplicația permite căutarea membrilor folosind orice combinație a următoarelor coloane din tabelul members: name, gender, height, weight, haircolor, eyescolor, maritalstatus, smoker, country.

După introducerea informațiilor dorite pentru căutare, formularul este trimis spre procesare către pagina search_result.php. Aceasta include fișierul find.php, din directorul functions, în care este definită funcția find(). Aceasta primește ca parametrii toate variabilele din formularul de căutare și, ăn fucție 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 * FROM members WHERE gender='".$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;

}

?>

În pagina search_results are loc apelul metodei find folosind datele introduse în formular și se execută interogarea respectivă. Rezultatele căutării sunt prezentate într-un tabel, câte o înregistrare pe fiecare linie, cuprinzând câteva detalii pentru fiecare membru găsit, și cu lkegături către 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. Afișarea mebrilor

Pentru afișarea tuturor membrilor înregistrați în baza de date există două legături specificate în fișierul menubar.php, respectiv pentru Men și Women. Ambele legături indică, însă, către aceeași pagină, și anume members.php, dar care primește diferite valori pentru atributul detip URL gender. Astfel, pentru Men legătura se face către pagina members.php?gender=male, și respectiv, pentru Women, legătura este către members.php?gender=female.

În pagina members.php, construită pe baza templeate-ului, informațiile sunt prezentate sub forma unui tabel care conține pe fiecare linie câteva infoormații semnificative pentru fiecare membru și legătura către pagina detaliată a acestuia. Înainte de afișarea informațiilor are loc o verificare a valorii parametrului gender din URL și se formează astfel interogarea corespunzătoare:

<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>

V.3.4. Upload-ul fișierelor

După ce s-a înregistrat, unui membru i se dă posibilitatea de a încărca pe server maximum cinci fotografii personale. Acest lucru este implementat în fișierul upload.php. Acest fișier 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 acțiune a acestui formular este setată ca fiind tot upload.php. La accesarea paginii are loc o verificare dacă a fost apăsat butonul de Submit, adică dacă au fost selectate fișierele pentru upload. În caz afirmativ, se încearcă upload-ul fișierelor pe server și, în același timp, are loc și trecerea informațiilor corespunzătoare în baza de date. La final, este setată o variabilă php numită $succes, a cărei valoare va fi afișată opentru a furniza utilizatorului informații referitoare la succesul sau eșecul 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);

$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 logați 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 creării contului. Acest formular este trimis spre prelucrare tot către pagina login.php. La începutul fișierului are loc o verificare dacă a fost apăsat butonul de login și în caz afirmativ se preiau informațiile introduse în formular și se verifică dacă acestea corespund uneia și numai uneia dintre înregistrările din tabelul members. Dacă este găsită o asemenea înregistrare, sunt setate variabilele username și userid din scopul $_SESSION și fișierul statusbar.php își modifică conținutul pentru a afișa 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;

}

}

?>

În caz contrar, este setată o variabilă php numită $error și este afișat un mesaj de eroare, iar utilizatorul poate încerca din nou.

Fișierul statusbar.php este cel care realizează afișarea, sub bara de meniu a informațiilor legate de starea utilizatorului. După ce utilizatorul este recunoscut îi este afișat un link prin care poate accesa pagina logout.php, prin care se poate deconecta, iar dacă nici un utilizator nu este conectat, este afișată o legătură către 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 funcția session_start(). Aceasta permite determinarea stării utilizatorului: conectat sau neconectat. Anumite pagini ale site-ului permit accesul numai pentru utilizatorii conectați. 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 către 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 către pagina de start a site-ului, index.php, astfel:

<?php

session_start();

if( isset($_SESSION['username']) && isset($_SESSION['userid']) ){

unset($_SESSION['username']);

unset($_SESSION['userid']);

header("Location: index.php");

}

?>

Similar Posts