Proiectarea Unei Aplicatii Web Pentru Consultatii Online
INTRODUCERE
Tehnologiile și aplicațiile de pe Internet se extind extraordinar de rapid, capătând o atenție deosebită, deoarece Internetul reprezintă un mediu de comunicații, un instrument pentru facilitarea afacerilor și un debușeu comercial.
Cel mai popular mijloc de acces la informație în Internet reprezintă “Rețeaua globală “ (World Wide Web). Cum este cunoscut, la baza ei stă ideea repartizării informației hypermedia. Navigarea în Web permite să ajungem la cele mai diferite servere informaționale, care conțin acea informație pregătită special (cu folosirea limbajului HTML).
Rețeaua globală a cucerit o așa mare popularitate în rândurile utilizatorilor Internet, în lumea bussinesului, științei, politicii ș.a. Principalele cuceriri Web – reprezintă simplitatea publicării informației în rețea, comoditate și compararea unicității accesului la documente, existența în prezent a sistemelor de căutare. În general, metodele de prezentare, păstrare și căutare a informației în WWW se referă la categoriile sistemelor informaționale și de căutare. Cu toate că locul de păstrare a datelor în nodurile Web uneori se numesc baze de date, acest termen în cazul de față se poate de folosit în sensul cel mai general.
Web este un mediu interativ, care permite utilizatorului să aibă în întregime controlul asupra a ceea ce dorește să obțină și când el poate, de exemplu, să creeze foarte ușor un document multimedia la care să aibă acces toți ceilalți utilizatori.
Internetul și WWW reprezintă o formă modernă de democrație electronică, deoarece nici o persoană, firmă, organizație sau guvern, nu controlează infrastructura tehnică, sistemele de calcul, aplicațiile și informațiile ce compun acest sistem de comunicații electronice.
Sistemele hipertext, în care se încadrează WWW, vor cunoaște o dezvoltare mai mare: tot mai multe baze de informații din Internet vor fi organizate după princiipile hipertext, în care legăturile semantice permit o navigare ușoară prin noianul de colecții de date disponibile; totodată, tehnicile de căutare se vor îmbunătăți, permițând scurtarea timpului petrecut de utilizatori în Internet, în favoarea perioadei afectată realizării lucrărilor în care sunt angajați.
Internetul va fi din ce în ce mai mult folosită pe baze comerțiale. Această utilizare este indicată pentru
firme mici, care nu-și pot permite realizarea unor rețele proprii. Desigur, se întrevăd și unele neajunsuri în această tendință. Multe universități, centre de cercetare sau chiar țări cu anumite dificultăți economice se vor lovi de posibilitatea prețurilor serviciilor Internet și vor fi nevoite să renunțe la conectarea, cu atât mai mult cu cât utilizarea curentă a serviciilor Internet nu este peste tot o obișnuință.
Dezvoltarea rapidă a tehnologiei World Wide Web, tehnologie care stă la baza gestiunii și circulației documentelor în Internet, propune o nouă abordare a sistemelor informatice și o reconsiderare a tehnologiilor și relațiilor din sfera mecanismelor comerciale.
Importanța și impactul tehnologiei WWW în proiectarea aplicațiilor din domeniul comerțului poate fi comparat cu cel petrecut în proiectarea aplicațiilor din domeniul industrial o dată cu standardizarea reprezentării tridimensionale (3D).
Analogia poate fi făcută și prin faptul că tehnologia Web a dat cel puțin trei dimensiuni noi informației conținute în documente: sunet, imagine, animație.
Dacă în sfera producție (industrie), tehnologia informatică s-a cristalizat în aplicații care au ajuns la maturitate printr-o evoluție ascendentă, normală, în sfera economicului și în special în domeniul comerțului evoluția tehnologiei Web este explozivă. Numărul de servere cuplate în Internet și numărul de persoane conectate cunosc o rată anuală incredibilă. Dacă la începutul anului 1996 erau peste 5 milioane de servere în anul 2001 s-a ajus la 210 milioane. Cele 210 milioane servere sunt accesate de aproximativ 350-400 milioane de utilizatori.
CAPITOLUL 1. NOȚIUNI TEORETICE
1.1 Prezentare a tehnologiilor World Wide Web (WWW)
Unul dintre cele mai importante și de succes servicii ale rețelei Internet, WWW-ul a fost creat la CERN (Centrul European de Cercetări Nucleare, Geneva), Elveția în anul 1989 de Tim Berners-Lee, Robert Caillau și echipa lor, dar dezvoltarea sa ulterioară a fost facilitată de programul client Mosaic, sub mediul X Window, de la NCSA (Centrul național pentru aplicațiile supercalculatoarelor, Universitatea Urbana-Champaign) furnizat gratuit din 1993, care avea o mare simplitate de utilizare și facilități multimedia.
WWW este un sistem distribuit de hipermedia funcționând în mod client-server prin Internet. Sistemul pune la dispoziție informațiile sub formă de hipertext (mixtură între text, grafică, elemente multimedia, plus referințe încrucișate). Pentru a căpăta acces la WWW, utilizatorul va fi nevoit să folosească un program client (user-agent) cum ar fi Lynx (în mod text) sau Mosaic și Netscape (în mod grafic) și bineînțeles va trebui să cunoască localizarea fizică a documentului dorit. Localizarea unui document hiper-text se exprimă sub forma de URL (Uniform Resource Locator), o modalitate flexibilă și eficientă de accesare a oricărei resurse Internet, prin oricare protocol (TELNET, FTP, Gopher, HTTP, mail) bazat pe TCP/IP.
Modul de dialogare între clienți și servere WWW se realizează prin protocolul HTTP (HyperText Transfer Protocol). Un document WWW trebuie în prealabil formatat (sau 'marcat') cu ajutorul limbajului HTML, marcaj ce va descrie structura logică a documentului și va fi procesat de programul client. Orice astfel de document poate cuprinde legături de tip hipertext, indicate prin zone de text sau imagini, conducându-l pe cititor fie în alt punct al aceluiași document, fie într-un alt document, care poate să se găsească stocat local (pe serverul curent) sau la distantă (pe oricare alt server Web din lume). Aceste legături încrucișate între miile și sutele de mii de servere WWW realizează o adevărată pânza de păianjen (web) planetara (world-wide) de unde vine și denumirea WWW, iar utilizatorul navighează în ciber-spațiul reprezentat de această rețea.
Clientul WWW poate manipula documente multimedia datorită facilitaților puse la dispoziție de diferitele versiuni ale limbajului HTML ce prevăd includerea de imagini (formate grafice precum GIF sau JPG), fișiere audio și video. Mai mult, programele client se pot comporta ca programe client FTP, Gopher sau News (NNTP) și sânt capabile să gestioneze poșta electronică. În HTML pot fi concepute formulare (forms) pentru introducerea interactivă a datelor (texte, meniuri, liste, butoane de selecție etc.) și trimiterea lor către server spre a fi procesate. Îmbinarea limbajului HTML cu rutine scrise în alte limbaje (scripturi) conferă o sporită interactivitate a Web-ului.
Viitorul Web-ului este extinderea sa la cea de a treia dimensiune. În primăvara anului 1994, la prima conferință asupra problematicii Web-ului de la Geneva, s-a născut proiectul VRML (Virtual Reality Modeling Language), limbaj de descriere a spațiului virtual tridimensional bazat pe formatul Open Inventor al firmei Silicon Graphics. Succesul VRML va depinde de existența programelor client capabile a interpreta acest limbaj pentru diverse platforme. Aceasta va constitui cu siguranță o nouă sursă de aplicații, mai ales în arhitectură, tele-medicină, industria jocurilor. Tot în 1994 a apărut și termenul de telesensation, concept care combină grafica computațională, realitatea virtuală, programarea vizuală și telecomunicațiile, imaginile transmise de la distanță fiind percepute global.
1.2 Arhitectura Client – Server
Tehnologiile de dezvoltare a aplicațiilor, client-server, ne indică faptul că avem de a face cu două entități distincte care comunică între ele, una îndeplinind cererile celeilalte. Cele două entități trebuie să poată lucra separat, fie pe calculatoare distincte, fie ca două procese independente în cazul în care este disponibil un sistem de operare multiproces. Unul dintre procese, procesul server, rulează în permanență în gol, așteptând să primească sarcini de executat. Un server poate în general deservi mai multe procese client fie direct, fie prin intermediul unor procese fie create câte unul pentru fiecare client în parte. Procesul server trebuie să poată să fie găsit întotdeauna la aceeași adresă de către clienți (adică pe același calculator, la aceeași căsuță postală), pentru ca aceștia să îi poată comunica cererile. Procesele clienți însă, pot lansa cererile de oriunde din rețea.
Desigur, între clienți și server trebuie să existe un limbaj comun în așa fel încât cererile adresate serverului să poată fi ușor întelese și rezolvate de către acesta. De multe ori, rezolvarea cererilor înseamnă returnarea unui set de date către client, selectat după dorințele acestuia. Diferența nu este prea mare deocamdată, fată de arhitectura clasică de rețea, Novell de exemplu. Serverul de fișiere Novell acceptă cererile de date venite de la stații și le prelucrează. Să luăm exemplul unui program xBase lucrând cu fișiere memorate în rețea, și care dorește să prelucreze datele dintr-un fisier DBF aflat pe un server. Să presupunem că programul nu vrea să prelucreze toate întregistrările din fisierul DBF, ci doar acelea care îndeplinesc o anumită condiție: au un câmp logic pe valoarea adevărat sau au o dată de înregistrare nu mai veche de o lună, etc. Care este soluția clasică? Aceea de a deschide fișierul de pe server și de a-i cere acestuia să transmită rând pe rând toate înregistrările aflate în fisier. Pe măsură ce aceste înregistrări sosesc la client, acestea sunt verificate dacă îndeplinesc condiția dată și, în caz de succes, sunt prelucrate.
Dezavantajul unei astfel de abordări este acela că toate înregistrările, indiferent dacă îndeplinesc sau nu conditia dorită, sunt transferate către client. O idee mai bună ar fi aceea că împreună cu cererea, să-i fie comunicată serverului și condiția care trebuie îndeplinită de către înregistrări pentru a putea fi prelucrate. În acest caz, serverul ar putea transmite spre client doar acele înregistrări care îndeplinesc condiția. În acest fel, traficul pe rețea este mult mai mic. În plus, clienții (în număr mare de obicei) nu trebuie să conțină în interior algoritmi sofisticați de selectare a înregistrărilor care îndeplinesc o anumită condiție. Acești algoritmi sunt memorați o singură dată, în interiorul serverului. Mai mult decât atât, datele originale sunt mereu protejate de server și memorate în orice format consideră serverul că este mai eficient. Clienții trebuie să cunoască doar formatul în care sosesc datele pe rețea, un format în general mult mai simplu.
Acestea sunt ideile care stau la baza unei arhitecturi client-server. Clienții comunică într-un limbaj standard cererile lor către server, iar acesta le execută indiferent dacă este vorba de cereri de selectare de date sau de actualizare a acestora. Într-un mod asemănător lucrează FoxPro atunci când lansează o cerere SQL-SELECT către un server SQL. Rezultatul cererii este memorat într-o tabelă temporară în memorie si poate fi prelucrat în același mod ca și o tabelă normală. Datele din memorie sunt o copie a acelora de pe server, modificarea lor duce doar opțional și la modificarea originalelor. Limbajul SQL în sine este un limbaj standard, des utilizat pentru comunicația dintre un server de baze de date și clienții acestuia.
Aplicația demonstrativă folosește o arhitectură de tip client-server pentru a selecta date dintr-un fișier de date. Comunicația între aplicații se face folosind protocolul TCP/IP. Atât serverul cât si clientul pot fi compilate sub Unix sau sub Windows. Sub Windows, este folosită implementarea de socluri TCP/IP standard, WINSOCK.DLL. Această implementare este foarte apropiată de implementarea standard BSD la nivelul interfeței de programare. Cele mai multe apeluri de rețea sunt identice. Serverul folosește un anumit port TCP/IP la care îl pot căuta clienții. Aienții. Adresa Internet a calculatorului pe care rulează serverul trebuie dată ca parametru pe linia de comandă a clientului.
Fișierele de date sunt păstrate în format DBF pe calculatorul pe care rulează serverul. Rutinele de lucru cu fișiere DBF sunt scrise de mine, dar spațiul din revistă împiedică publicarea surselor lor. Funcțiile se pot compila pe DOS/Windows/Macintosh/Unix. Cunoașterea modului de memorare a datelor este un privilegiu al aplicației server. Aplicația client comunică serverului cererile sale printr-un soclu cu conexiune, sub formă de mesaje. Mesajele sunt de lungime variabilă, primii doi octeți ai acestora păstrând lungimea mesajului sub formă binară. Serverul analizează cererea și comunică înapoi datele solicitate.
În implementarea actuală, serverul nu poate deservi decât un singur client. Motivul acestei limitări este acela că faptul nu este important deocamdată iar spațiul în revistă limitat. O implementare care deservește mai mulți clienți este mai complicată în Windows, unde nu putem apela rutine de tip fork pentru crearea de aplicații.
Fenomenul client/server a constituit suportul unei adevărate mutații în arhitectura sistemelor informaționale, mutație vizibilă în prima parte a anilor '90. Prin combinarea ergonomiei de lucru specifice suprafețelor grafice de lucru, cu un control centralizat și unitar al datelor, s-au cristalizat o serie de avantaje: flexibilitate, scalabilitate, portabilitate, deschidere către diferite platforme de lucru etc.
Într-o tentativă de definiție ambiguă, client-server este un model de lucru în care mai multe programe autonome comunică prin schimb de mesaje. Sistemele client/server sunt sisteme informatice distribuite. Un client este un calculator care, prin intermediul unui mesaj, formulează o cerere de informații/servicii, cerere adresată unui alt calculator denumit server. Serverul, tot prin intermediul unui mesaj, furnizează informațiile/serviciile clientului, întreaga operațiune derulându-se de o manieră transparentă pentru utilizator.
În general, clienții sunt calculatoare personale (PC-uri) utilizate pentru activități de gestionare a datelor. Un post client se caracterizează prin faptul că: a) prezintă o interfață utilizator care e de obicei grafică (GUI); b) "formulează" interogări (cereri, consultări) sau comenzi pe care le "înaintează" serverului; c) transmite interogările/comenzile respective serverului prin intermediul unei tehnologii de comunicație; d) analizează datele din rezultatele interogărilor/comenzilor primite de la server, iar un server prin faptul că: a) furnizează un serviciu clientului; b) răspunde la interogările/comenzile clientului; c) ascunde detaliile sistemului client/server, făcând transparent dialogul dintre client și server.
Orice sistem distribuit este alcătuit din minimum trei componente principale:
– interfața cu utilizatorul (sistem de operare/mediu grafic)
– aplicația (prelucrările sau procesele)
– sistemul de gestiune a bazelor de date.
Toate organizațiile din ziua de azi guvernamentale, economice și majoritatea întreprinderilor mari și mici recunosc rolul central pe care aplicațiile software îl au în cadrul lor, aplicațiile având rolul reducerii costurilor și
imbunătățirii serviciilor față de competiție.
Această dezvoltare și necesitatea utilizării pe o arie mare a unor date de interes comun a dus la apariția, utilizarea și proiectarea modelului Client/Server, care oferă date distribuite, portabilitate între platforme și un acces standardizat la resurse.
Termenul de Client/Server provine de la metoda tradițională de accesare a unui computer central numit server de către computere aflate la distanță sau clienți într-o infrastructură de rețea. Serverele utilizează baze de date relaționale în stocarea și întreținerea datelor între care există referințe. Aceste referințe sunt menținute printr-o tehnologie denumită integritate referențială (referential integrity) care oferă mecanisme care acționează asupra datelor (trigger) și proceduri de stocare (stored procedure).
Acest model este o combinație a trei tehnologii: sistemul relațional de management al bazelor de date (DBMS), rețeaua și interfața client (bazată pe GUI/PC). Fiecare element contribuie în funcționarea platformei
având rolul său, dar independent în execuția funcțiilor sale.
Foarte multă lume consideră clientul și serverul ca fiind două entități hardware, dar de fapt sunt entități software. Trebuie înteles că modelul Client/Server implică o entitate software (clientul) care efectuează cereri, acestea fiind îndeplinite de o altă entitate software (serverul). Clientul este cel ce transmite o cerere server-ului, acesta o interpretează și apoi o efectuează. Pentru a putea îndeplini cererea serverul poate referi o sursă de informație (baze de date), să efectueze procesări asupra datelor, să controleze periferice sau să efectueze cereri adiționale altor servere. În foarte multe arhitecturi, un client poate face cereri la multiple servere și un server și un server poate deservi mai mulți clienți.
Relația între client și server este una de comandă/control, clientul inițiază cererea și serverul este cel ce o îndeplinește transmițând rezultatul clientului, aplicația fiind procesată prin divizarea ei între cele două entități iar transferul de date este bidirecțional.
Un server nu inițializează niciodată un dialog cu clienții. Clientul poate funcționa pe un server hardware și să efectueze cereri de la un server care rulează pe un alt server hardware sau pe un PC saz clientul și serverul pot funcționa pe același computer.
Spre deosebire de un sistem file/server în care datele sunt aduse de pe file server pentru a fi procesate pe o masină locală în acest sistem comenzile sunt transmise asupra bazelor de date localizate pe server,
rezultatul fiind transmis înapoi clientului pentru a fi vizualizat.
Arhitectura afectează toate aspectele software, ea trebuie să ia în considerare complexitatea aplicației, nivelul de integrare și interfațare cerut, numărul utilizatorilor, răspundirea lor geografică natura rețelelor și toate tipurile de tranzacții necesare înainte de a decide tipul arhitecturii.
De asemenea alegerea arhitecturii afectează timpul de dezvoltare, flexibilitatea precum și întreținerea aplicației. La majoritatea aplicațiilor end user se urmărește: prezentare, procesare și date. Arhitecturile Client/Server definesc cum aceste trei componente sunt împărțite între entitățile software și distribuite în rețea, există o varietate de moduri cum pot fi divizate și implementate, utilizarea unor astfel de arhitecturi putând aduce multe beneficii în viitor companiei permițând adaptarea la diferite standarde și tehnologii. Câteva din caracteristicile acestei arhitecturi sunt:
Centralizarea informației – într-un astfel de mediu , datele sunt stocate pe un server central și există un singur punct de control care administrează cererile aplicațiilor și platformelor. Aceste servere de baze de date utilizează un sistem de management al bazelor de date (DBMS) pentru a defini, stoca și manipula date .Serverul este generic, programatorii neavând nevoie să cunoască un limbaj anume pentru a accesa date. Utilizând tehnicile de identificare o organizație poate creea magazii de date de la diferite servere distribuite în diferite zone geografice. Această tehnică maximizează performanțele fără a compromite modelul centralizat și reduce probabilitatea existenței de date redundante în aplicații.
Serverul procesor central – preluând acest avantaj , organizațiile pot reduce procesarea redundantă prin utilizarea procedurilor trigger și de stocare. Server-ul este orientat în procese standard ca: menținerea unor reguli, validări, și referințe de integritate, iar prin intermediul funcțiilor de stocare pe un server comun datele pot fi manipulate corect din punct de vedere logic
și viabile pentru o varietate de limbaje și unelte ale lor.
Performanțe – serverul este un computer dedicat să proceseze un set limitat de cereri de la clienți. Singura sa funcție este să proceseze cererile asupra bazelor sale de date. SQL oferă facilități eficient de utilizare a traficului în rețea deoarece doar subseturi ale datelor sunt transmise în rețea , în plus serverele și DBMS sunt desemnate să gestioneze baze de date masive fără o degradare simțitoare a performanțelor.
Securitate – serverele ce lucrează pe platforme ca UNIX , Windows NT sau OS/2 pot oferi o mai mare securitate pentru managementul bazelor de date în comparație cu file server-ele standard. Mecanismele de duplexing, mirroring și copiere permise administratorilor asigură evitarea dezastrelor, de asemenea aceste baze de date permit definirea de useri și parole care permit evitarea accesului unor persoane neautorizate.
Referitor la costurile unor astfel de arhitecturi, server-ele sunt cele ce necesită procesoare rapide, memorie, hard disc-uri mari și un sistem de operare, clienți care le accesează. Licențierea, instalarea și întreținerea unor sisteme ca Oracle, Sybase sau Informix necesită sute de mii de dolari iar dezvoltarea unor aplicații necesită memorie, mașini noi și noi sisteme de operare. Din acest motiv în prezent multe organizații care au utilizat mainframe- uri sau acomodat foarte ușor acestui mediu client/server care oferă o excelentă infrastructură pentru a asigura informație organizației asigurând integritate, viteză și securitate.
Cele mai populare tipuri de arhitecturi sunt cu doua entități(two-tier) și cu trei(three-tier).
CAPITOLUL 2. DESCRIEREA MIJLOACELOR INSTRUMENTALE
2.1 Limbajul HTML – Hipertext Markup Language
Indispensabil în crearea paginilor Web, HTML este un descendent al limbajului SGML, folosit pentru dezvoltarea de documente hiper-text accesibile prin Internet. Acest capitol trece in revista o serie din caracteristicile, implementările și tendințele acestui limbaj.
Un document poate fi indentificat prin următoarele caracteristici fundamentale: structură, conținut și formă. Dacă forma de vizualizare este dependentă de programul de afișare a informațiilor conținute de acel document, structura și conținutul său trebuie să aibă un format general de reprezentare, pentru a asigura portabilitatea.
Format:
Formatul se specifică prin HTML, limbaj care conformându-se SGML-ului, acceptă un număr de tag-uri pentru formatarea documentului. Ca și în SGML, tag-urile se încadrează între < și >, putând exista tag-uri de început și de sfârșit. Fișierele HTML sânt fișiere ASCII obișnuite având extensia .html (sau .htm) și sânt divizate în două parți: antetul (head) și corpul (body).
2.2 PHP – Hipertext Preprocessor
Limbajul PHP permite de a crea pagini cu context dinamic. PHP este un limbaj de “scripting” utilizat în fișierele HTML. Scriptul PHP este rulat de a permite programatorilor Web să scrie rapid pagini ce se generează dinamic. Prin intermediul PHP se pot accesa Microsoft SQL Server și baze de date Microsoft ACCES cu ajutorul ODBC. PHP este un limbaj de programare destul de tânar. El a fost creat în 1994 de către programistul Расмусом Лердофом. Chiar de la început limbajul reprezenta în sine CGI-interfața, scrisă pe Perl, care a lucrat pe pagina de acasă a lui Лердофом. Pe urmă autorul a copiat interfata de pe Perl pe C. Toate schimbarile sau înclus în întregul pachet, aparut în anul 1995 și numindu-se Personal Home Page Tools (PHP). El includea în sine cîteva macrosuri folositoare, parțial, se putea de găsit cartea de adrese, contorul și multe altele.
Rasmus Ledorf s-a pasionat serios de baze de date, adăugând interfața sa, mijloace pentru organizarea interpelării favorabile. Programistul de asemenea a scris interfață pentru schimbul comod între bazele de date și formele textuale – Form Interpreter. Unirea lucrarilor trecute și de asemenea descrierea de mai sus a pachetelor sau înclus în crearea PHP/FI (PHP and Form Interpreter). Anume acest limbaj a ramas actual pentru PHP4. În perioada de la 1996-1997 îl foloseau circa 50 mii de WebMasters. În anul 1997 codul limbajului a fost transcris și complectat de Zivom Suranski și Endy Gatmensom – anume ei au creat machetul de bază PHP4. Limbajul a început treptat cucerirea lumii. El a fost un sistem deschis, a adus la aceea că sute de specialiști începeau să creeze complectarea și corectarea pentru PHP4, aprovizionarea lui cu noile posibilități.
Principiile de lucru PHP
Oficial el se numește preprocesorul hipertextual. Spre deosebire de Perl, care cerea scrierea programului aparte, PHP lucreaza cu scenariu, aflindu-se în failul obișnuit HTML. Cum numai acest script este gasit, el se trimite pe ordonarea intertretorului pe server, care și indeplinește toate instrucțiunile scrise de WebMasters.
Acest mecanism este foarte comod din punct de vedere al programării și el este utilizat în cele mai populare limbaje ale serverilor, cum sunt Asp și ColdFusion.
Cu ajutorul PHP se pot crea pagini de WEB dinamice, care sunt generate în momentul în care programul utilizator (de exemplu: Nescape) a formulat cererea către serverul de VEB. Serverul de WEB trebuie să aibă activat suportul pentru PHP. Toate fișierele care au extensia .php4 trebuie să fie rulate de către motorul PHP. Fișierele se creează în aceeași manieră ca și fișierele HTML.
Este comod, ca în limbaj nu se cere descrierea schimbării înaintea începerii lucrului cu ele, cum, de exemplu, în C sau Pascal. În script pur si simplu, se scrie expresia $<variabila>= <valoare> și se întîmpla atribuirea schimbarii valorii. Expresia <variabila> se supune acelorași legi, cum și numele în toate limbajele de programare. Elementul <valoare> pentru toate tipurile de date poate fi și negativ și pozitiv, și întelege a șaisprezecea variantă de înscrire a datelor.
În schimbarea elementelor fracționare <valoare> se scrie în forma <valoare intreagă>.<valoare zecimală>. La fel se poate de scris numărul fracționar în formă prescurtată.
Rândurile întotdeauna se termina cu ghilimele duble “” și le împarte după posibilitatea prelucrarii simbolurilor speciale, caracteristic trăsăturii în care se afla în prezența slashului înapoi (back slash).
2.3 Sisteme de gestiune a bazelor de date MySQL
Acest capitol realizează o introducere în limbajul de interogare utilizat pentru a accesa o bază de date MySQL. Mulțimea comenzilor SQL sunt conturate ca blocuri de interogare de bază. În particular, noi discutăm declarațiile SQL folosite la:
execuția calculelor;
specificarea alternativă a capetelor de coloană;
concatenarea coloanelor;
sortarea rîndurilor;
introducerea criteriilor de căutare.
Privire de ansamblu asupra SQL
Un sistem de management al bazei de date necesită un limbaj de interogare pentru a permite utilizatorului să acceseze datele, SQL (limbaj de interogare structurată) este limbajul utilizat de majoritatea sistemelor de bază de date relațional.
Limbajul SQL a fost dezvoltat într-un prototip de sistem de management a bazelor de date relaționale – System R -de IBM la mijlocul anilor 1970.În 1979, Corporația Oracle introduce prima implementare a SQL în varianta comercială.
Trăsături caracteristice SQL
SQL este prezentat în limba engleză. Folosește cuvintele select, insert, delete ca părți ale setului de comenzi.
SQL este un limbaj neprocedural: specifică ce informații dorești, dar nu cum să le obții.Cu alte cuvinte SQL nu îți cere să specifici metoda de acces la date.Toate cererile SQL folosesc optimizarea cererilor- o parte a RDBMS – pentru a determina rapid remedierea datelor specificate. Aceste trăsături ușurează obținerea rezultatelor dorite.
Procesarea SQL asupra înregistrărilor nu se poate face decât asupra unei singure înregistrări la un moment dat.Cea mai comună formă a unui set de înregistrări este un tabel.
SQL poate fi folosit de un șir de utilizatori încluzând DBA, programatori de aplicații, personal de management și multe alte tipuri de utilizatori.
SQL pune la dispoziție comenzi pentru o varietate de tascuri încluzând:
date interogate; înserarea, extragerea și ștergerea rândurilor într-un tabel; crearea, modificarea și ștergerea obiectelor de tip bază de date; controlul accesului la baza de date și la obiectele de tip bază de date; garantarea consistenței bazei de date.
La început sistemele de management a bazei de date a utilizat un limbaj separat pentru fiecare categorie în parte. SQL le-a unificat pe toate acestea într-un singur limbaj.
SQL a devenit un limbaj standard industrial pentru bazele de date relaționale. Institutul Național American de Standarde(ANSI) a adoptat SQL ca limbaj standard pentru RDBMS în anul 1986. Organizația Internațională de Standarde (ISO) a adoptat deasemenea SQL ca limbaj standard pentru RDBMS. Toate RDBMS-urile suportă unele forme de SQL și toți vânzătorii de
RDBMS intenționează să alinieze la standardele ANSI.
Capitolul 3. DESCRIEREA APLICATIEI REALIZATE
Dezvoltarea rapidă a tehnologiei World Wide Web, tehnologie care stă la baza gestiunii și circulației documentelor în Internet, propune o nouă abordare a sistemelor informatice și o reconsiderare a tehnologiilor și relațiilor din sfera mecanismelor comerciale.
Rețeaua globală a cucerit o așa mare popularitate în rândurile utilizatorilor Internet, în lumea bussinesului, științei, politicii ș.a. încât majoritatea companiilor sunt dispuse de ași plasa informațiile despre produsele și serviciile ce le oferă rețeaua Internet spre atenția milioanelor de utilizatori. Plus la aceasta în ultimul timp o mare atenție se acordă sistemelor complexe de prezentare a produselor și a serviciilor, care facilitează lucrul nu numai clienților ci chiar și a colaboratorilor firmelor, adica se acordă o mare atenție elaborării produselor complexe compuse din programul client (în cazul nostru pagina Web) și programul administrator. De obicei, în marea majoritate a cazurilor, programul administrator este elaborat într-un mediu visual de programare (Delphi, Visual C++, Borlan C++ etc).
3.1 De ce PHP și MySQL?
PHP, acronim care provine din "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.
Caracteristica esențială a PHP-ului este faptul ca acesta este un limbaj “Server Side Scripting” – scripurile sunt interpretate de server și rezultatele sunt transmise browser-ului:
Figura 3.1
Deși PHP-ul este specializat pe “Server Side Scripting” poate face mai multe:
Server – side sripting;
Command line scripting;
Client-side GUI applications.
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 deasemenea 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 , PHP putând să lucreze ca un procesor .
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, sunt suportate standardele SAX și . Pentru a transforma documentele XML se foloseste extensia XSLT.
Folosirea PHP în domeniul comerțului electronic, s-a dovedit foarte folositoare pentru programul de plați online funcții de plată Cybercash, CyberMUT, VeriSign Payflow Pro și CCVS.
Una dintre cele mai puternice și importante facilități în PHP este suportul său pentru o gamă largă de baze de date (datorita acestui fapt a fost scrisa aceasta lucrare).
Sunt suportate urmatoarele baze de date:
Tabel 3.1 Baze de date
Deasemenea exista o extensie abstractă a bazei de date DBX ce permite într-un mod transparent folosirea oricărei bazei de date ce suportă această extensie. Mai mult, PHP suportă ODBC, standardul Open Database Connectio, deci există posibilitatea de a se conecta la orice altă bază de date ce suportă acest standard mondial.
3.2 Structura aplicației
Meniul aplicației este următorul:
Parent Directory
Actions/
Conf/
Css/
Db/
Models/
Populate.php
Questions.php
In meniurile Actions/ ;Conf/ ;Css/ si Models/ accesul este interzis,iar dacă accesăm Parent Directory ne duce la directorul principal,în cazul de față fiind meniul programului folosit,si anume xampp (figura 3.2)
Figura 3.2 XAMPP
Sistemul este bazat pe cea mai completă arhitectură de baze de date. Baza de date a fost realizata cu ajutorul scriptului php : phpmyadmin (Figura 3.3)
Figura 3.3 phpMyAdmin
Legatura cu baze de date am realizato cu ajutorul codului din menial Db/ ,si anume:
COD DB/ :
– phpMyAdmin SQL Dump
– version 3.4.7.1
– http://www.phpmyadmin.net
–
– Host: localhost
– Generation Time: Mar 25, 2012 at 01:28 PM
– Server version: 5.1.59
– PHP Version: 5.2.17
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
–
– Database: `quan`
–
– –––––––––––––––––––
–
– Table structure for table `question`
–
CREATE TABLE IF NOT EXISTS `question` (
`QuestionID` int(11) NOT NULL AUTO_INCREMENT,
`Question` varchar(1000) NOT NULL,
`Answer` varchar(1000) NOT NULL,
PRIMARY KEY (`QuestionID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;
–
– Dumping data for table `question`
–
INSERT INTO `question` (`QuestionID`, `Question`, `Answer`) VALUES
(1, 'aa', 'rr'),
(2, 'rtttt?', 'yep'),
(3, 'intrebare?', 'raspuns'),
(4, 'aaa?', 'da'),
(5, 'ttt?', 'vvvvv'),
(6, 'fff', 'fffff'),
(7, 'fff', 'fffff'),
(8, 'aa', 'tt'),
(9, 'fff', 'rrrrR'),
(10, 'aaaaaa?', 'daaaaaa'),
(11, 'Aaaa?', 'Da');
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
Codul folosit în meniul Actions/ :
<?php
require "../Models/QuestionModel.php";
// verific ce actiune este
// actiunea se tine in variabila din query string, numita 'action'
$action = $_REQUEST["action"];
$id = $_REQUEST["id"];
switch($action)
{
case "populate":
populate();
break;
case "answer":
answer();
break;
default:
break;
}
function populate()
{
$question = $_POST["populate_question"];
$answer = $_POST["populate_answer"];
$_SESSION['populate'] = null;
if( $question!=NULL && $question!="" && $answer!=NULL && $answer!="")
{
$model = new QuestionModel();
$data = array(
"Question" => $question,
"Answer" => $answer
);
$model->insert($data);
$_SESSION['populate'] = "OK";
}
require("../Populate.php");
}
function answer()
{
$question = $_POST["question"];
$_SESSION['response'] = null;
if ( $question!=NULL && $question!="")
{
$_SESSION['response'] = "NOT";
$model = new QuestionModel();
$result = $model->fetchAll();
foreach ($result as $r)
{
if($question == $r['Question'])
{
$_SESSION['question'] = $r['Question'];
$_SESSION['answer'] = $r['Answer'];
$_SESSION['response'] = "OK";
break;
}
}
}
require("../Questions.php");
}
Codul folosit în meniul Actions/ :
În fișierul db:
<?php
define("_SERVER","localhost");
define("_USERNAME","root");
define("_PASS","root");
define("_DB","quan");
?>
În fișierul Settings:
<?php
//error_reporting(E_ALL);
// –––- constants ––––––
// inclus in fiecare pagina html, in functie de el se construiesc url-urile relative
DEFINE("base_url","http://localhost/QuAn/");
?>
Butoanele și grafica au fost realizate în Css,folosind următorul cod,în meniul Css/ :
.Buttons
{
width: 100px;
height: 32px;
font-weight: bold
}
.ListItems
{
font-weight:800;
background-color: #CCCC00;
}
.btnDel
{
font-weight: bold
}
.LItmImages
{
width: 90px;
height: 71px;
}
.Labels
{
font-weight: bold
}
.Label_Values
{
color: #CC9900;
font-weight: bold
}
.product_id
{
}
În Models/ :
<?php
/* Partea de model din MVC va fi construită POO
Pentru aceasta, clasa BaseModel va fi părintele tuturor claselor model.În această clasă se deschide conexiunea și se efectuează operații clasice CRUD. Clasa și metodele vor fi moștenite în toate clasele model din proiectul nostru.
Se merge pe pattern-ul Active Record sau tehnologia ORM (mult simplificat)
*/
// includ fisierul cu datele de conexiune db
require_once "../Conf/db.php";
class BaseModel
{
// tabelul corespondent din sql
protected $table = '';
// –––––––––––––––––––––––
// cheia primara din tabel
protected $pk = '';
// –––––––––––––––––––––––
// conexiunea sql
protected $conn = NULL;
// –––––––––––––––––––––––
// mesaj spre exterior
protected $message = '';
// –––––––––––––––––––––––
function __construct()
{
// deschid conexiune la db
$this->conn = mysql_connect(_SERVER,_USERNAME,_PASS) or die('Eroare conexiune la baza de date.');
// selectez db
mysql_select_db(_DB, $this->conn);
}
// –––––––––––––––––––––––
function __destruct()
{
// inchid conexiune db
mysql_close($this->conn);
//echo $this->conn;
}
// –––––––––––––––––––––––
function setMessage($m)
{
$this->message = $m;
}
// –––––––––––––––––––––––
function getMessage()
{
return $this->message;
}
// –––––––––––––––––––
// GENERAL CRUD OPERATIONS
//–––––––––––––––––––
/**
* fetchAll
*
* selecteaza toate randurile din tabel
*
* @access public
* @return array of records
*/
function fetchAll()
{
$query = "SELECT * FROM $this->table";
$result = mysql_query($query);
$resultArr = array();
while($row = mysql_fetch_array($result))
{
$resultArr []= $row;
}
return $resultArr;
}
// –––––––––––––––––––––––
/**
* fetchRow
*
* selecteaza un rand, in functie de id
*
* @access public
* @return array ce contine un singur rand sau NULL
*/
function fetchRow($id)
{
$query = "SELECT * FROM $this->table
WHERE $this->pk = $id ";
$result = mysql_query($query);
if(mysql_num_rows($result) == 0)
{
return NULL;
}
else
{
return mysql_fetch_array($result);
}
}
// –––––––––––––––––––––––
/**
* Insert
*
* Insereaza date in db
*
* @access public
* @param array valorile de inserat
* @return string
*/
function insert($data)
{
if(is_array($data) == FALSE)
{
$this->message = "Datele de inserare nu au un format corect.";
return FALSE;
}
if(count($data) == 0)
{
$this->message = "Nu s-au furnizat date de inserat.";
return FALSE;
}
// obtin lista de coloane din tabel
$cols = $this->_list_columns();
$values = array();
//mapez valorile primite ca parametru cu coloanele din tabel
$i = 0;
foreach($cols as $c)
{
if(isset($data[$c]) == TRUE)
{
$values[$i] = $data[$c];
$keys[$i] = $c;
$i++;
}
}
$query = "INSERT INTO ".$this->table.
" (".implode(', ', $keys).")
VALUES ('".implode('\', \'', $this->escape_str($values))."')";
mysql_query($query);
if($this->affected_rows()!=1)
{
$this->message = mysql_error();
return FALSE;
}
return TRUE;
}
// –––––––––––––––––––––––
function update($id, $data)
{
if($id == "")
{
$this->message = "Datele de modificare nu au un format corect. Este necesar id.";
return FALSE;
}
if(is_array($data) == FALSE)
{
$this->message = "Datele de modificare nu au un format corect.";
return FALSE;
}
if(count($data) == 0)
{
$this->message = "Nu s-au furnizat date de modificat.";
return FALSE;
}
// obtin lista de coloane din tabel
$cols = $this->_list_columns();
$values = array();
//mapez valorile primite ca parametru cu coloanele din tabel
$i = 0;
foreach($cols as $c)
{
if(isset($data[$c]) == TRUE)
{
$values[$i] = $data[$c];
$keys[$i] = $c;
$i++;
}
}
$query = "UPDATE $this->table SET ";
for($i=0;$i<count($keys);$i++)
{
$query .= $keys[$i] . "="."'".$values[$i]."',";
}
$query = substr($query,0,-1);
$query .= " WHERE $this->pk = $id";
mysql_query($query);
if($this->affected_rows()!=1)
{
$this->message = mysql_error();
return FALSE;
}
return TRUE;
}
// –––––––––––––––––––––––
function delete($id)
{
$query = "DELETE FROM $this->table
WHERE $this->pk = $id";
mysql_query($query);
if($this->affected_rows()!=1)
{
$this->message = mysql_error();
return FALSE;
}
return TRUE;
}
// –––––––––––––––––––––––
/**
* affected_rows
*
* Intoarce id-ul ultimului rand inserat in db
*
* @access public
* @return int
*/
function insert_id()
{
return mysql_insert_id($this->conn);
}
// –––––––––––––––––––––––
/**
* affected_rows
*
* Intoarce numarul de randuri modificate de ultima instructiune mysql
*
* @access public
* @return int
*/
function affected_rows()
{
return mysql_affected_rows($this->conn);
}
// –––––––––––––––––––––––
/**
* _list_columns
*
* Intoarce numele coloanelor din table
*
* @access private
* @return array cu numele coloanelor
*/
private function _list_columns()
{
$query = "SHOW COLUMNS FROM ".$this->table;
$result = mysql_query($query);
$cols = array();
while($row = mysql_fetch_array($result))
{
// iau doar numele coloanei
$cols []= $row[0];
}
// exclud cheile primare (presupun ca avem doar o coloana)
// in acest context simplificam si consideram cheile primare auto increment, deci nu trebuiesc inserate
$i = 0;
foreach($cols as $c)
{
if($c == $this->pk)
{
unset($cols[$i]);
break;
}
$i++;
}
return $cols;
}
// –––––––––––––––––––––––
/**
* Escape String
*
* @access public
* @param string
* @param bool
* @return string
*/
function escape_str($str)
{
if (is_array($str))
{
foreach($str as $key => $val)
{
$str[$key] = $this->escape_str($val, $like);
}
return $str;
}
if (function_exists('mysql_real_escape_string') AND is_resource($this->conn))
{
$str = mysql_real_escape_string($str, $this->conn);
}
elseif (function_exists('mysql_escape_string'))
{
$str = mysql_escape_string($str);
}
return $str;
}
}
<?php
require_once "BaseModel.php";
Iar în QuestionModel avem :
class QuestionModel extends BaseModel
{
function __construct()
{
parent::__construct();
$this->table = "question";
$this->pk = "QuestionID";
}
}
In INDEX avem :
html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>
In fisierul Populate.php am folosit urmatorul cod:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Populate
</title>
<link type="text/css" media="screen" href="/QuAn/Css/StyleSheet.css" rel="stylesheet"/>
</head>
<body bgcolor="White">
<?php
//require_once "header_p.php";
?>
<div style="position: absolute; background-color: #66CCFF; top: 100px; left: 20px; width:1240px; height: 400px;">
<form id="questionFrm" method="post" action="/QuAn/Actions/actions.php?action=populate">
<P>
<label for="populate_question">Intrebare: </label>
<input type="text" id="populate_question" name="populate_question" />
<label for="populate_answer">Raspuns: </label>
<input type="text" id="populate_answer" name="populate_answer" />
</P>
<P>
</P>
<p>
<input type="submit" value="Populeaza" />
</p>
</form>
</div>
<?php
if ($_SESSION['populate'] == "OK")
echo "<label>Inregistrare adaugata</label>";
?>
<?php
// require_once "footer_p.php"
?>
</body>
</html>
Din acestă pagină (figura 3.4) putem adaugă în baza de date Întrebările și Răspunsurile necesare rulării aplicației.
Figura 3.4 Populate
Astfel,putem afla raspunsul dorit la intrebarea dorita ruland in pagina Questions.php (figura 3.5)Figura 3.5 Questions (exemplu)
Codul folosit este:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Question
</title>
<link type="text/css" media="screen" href="/QuAn/Css/StyleSheet.css" rel="stylesheet"/>
</head>
<body bgcolor="White">
<?php
//require_once "header_p.php";
?>
<div style="position: absolute; background-color: #66CCFF; top: 100px; left: 20px; width:1240px; height: 400px;">
<form id="questionFrm" method="post" action="/QuAn/Actions/actions.php?action=answer">
<p>
<label for="question">Intrebare: </label>
<input type="text" id="question" name="question" />
</p>
<p>
<input type="submit" value="Afla raspuns" />
</p>
</form>
<?php
if($_SESSION['response'] == "OK")
{
echo "<p>";
echo "<label>Intrebare:".$_SESSION['question']."</label>";
echo "</p>";
echo "<p>";
echo "<label>Raspuns:".$_SESSION['answer']."</label>";
echo "</p>";
}
if($_SESSION['response'] == "NOT")
{
echo "<p>";
echo "<label>Nu a fost gasit raspunsul la intrebarea respectiva</label>";
echo "</p>";
}
?>
</div>
<?php
// require_once "footer_p.php"
?>
</body>
</html>
CONCLUZII
BIBLIOGRAFIE
Sisteme de gestionare a bazelor de date: Abase. A. Ștefănescu, V. Stanciu, București, Editura ALL 1994.
Pasu Corina, Pasu Andrei, Totul despre … SQL.: Interogarea bazelor de date. București, Editura Tehnică 1992.
Vitalie Cotelea, Baze de date relaționale: proiectare logică. Editura ASEM, Chișinău 1997.
Florin Pilat, Mădălina Răceanu, Carmen Stanciu, World Wide Web – Mosaic și Netscape, București, Editura Tehnică, 1996.
Valentin Cristea, Monica Pietroșanu, Cristian Petculescu, Mai multe despre Internet. Eudora. Netscape. Internet în România, București, Teora, 1995.
W. Bardere, World Wide Web, Global Tour Guide. NEW READERS PRESS, 1996.
Kris Jamșa, Suleiman Lalani, Steve Weakley, Programarea în Web, București, Teora, 1998.
Kris Jamșa, Ken Cope, pRogramarea Aplicațiilor Internet,Editura Teora, București,1998.
Teach Yourself SQL in 21 Days, Second Edition, Sams Publishing 1997.
Hamer Alex, Ullman Ghris, Dinamic HTML, Spravocnik, 2000.
Infornis Guide to SQL, Informix Press, Menlo Park, CA, 1994.
My SQL benchmark & documentation: http://www.mysql.com/docs.
BIBLIOGRAFIE
Sisteme de gestionare a bazelor de date: Abase. A. Ștefănescu, V. Stanciu, București, Editura ALL 1994.
Pasu Corina, Pasu Andrei, Totul despre … SQL.: Interogarea bazelor de date. București, Editura Tehnică 1992.
Vitalie Cotelea, Baze de date relaționale: proiectare logică. Editura ASEM, Chișinău 1997.
Florin Pilat, Mădălina Răceanu, Carmen Stanciu, World Wide Web – Mosaic și Netscape, București, Editura Tehnică, 1996.
Valentin Cristea, Monica Pietroșanu, Cristian Petculescu, Mai multe despre Internet. Eudora. Netscape. Internet în România, București, Teora, 1995.
W. Bardere, World Wide Web, Global Tour Guide. NEW READERS PRESS, 1996.
Kris Jamșa, Suleiman Lalani, Steve Weakley, Programarea în Web, București, Teora, 1998.
Kris Jamșa, Ken Cope, pRogramarea Aplicațiilor Internet,Editura Teora, București,1998.
Teach Yourself SQL in 21 Days, Second Edition, Sams Publishing 1997.
Hamer Alex, Ullman Ghris, Dinamic HTML, Spravocnik, 2000.
Infornis Guide to SQL, Informix Press, Menlo Park, CA, 1994.
My SQL benchmark & documentation: http://www.mysql.com/docs.
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Proiectarea Unei Aplicatii Web Pentru Consultatii Online (ID: 150259)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
