Documente Academic
Documente Profesional
Documente Cultură
PROGRAMARE WEB
Curs Masteral pentru Informatic Didactic - anul I
-9-
INTRODUCERE
Conceptele iniiale ale sistemului WWW
Termenul World Wide Web (cu binecunoscutul acronim WWW sau colocvialul Web), definete un spaiu informaional n Internet, alctuit din resurse situate n locaii sau noduri ale reelei globale. Acestea pot fi regsite cu ajutorul unui sistem hypertext, pe baza unei modaliti universale de identificare cunoscut sub numele de URI (Uniform Resource Identifier). Resursele sunt organizate prin intermediul unei pagini de Web situate pe un server de Web. Paginile pot fi vizualizate prin intermediul unui program client numit browser sau navigator de Web. Web-ul a aprut n anul 1989 la CERN (Conseil Europen pour la Recherche Nuclaire- Genve, Confdration Helvtique) ca rezultat al propunerii fcute de Tim Berners-Lee n luna martie a aceluiai an, pentru crearea unei colecii de documente, n scopul rezolvrii unor probleme de comunicare existente ntre echipele de cercettori ale centrului. Ulterior, n octombrie 1994, Tim Berners-Lee a nfiinat World Wide Web Consortium (W3C-http://www.w3.org/) la Massachusetts Institute of Technology, Laboratory for Computer Science [MIT/LCS] n colaborare cu CERN i cu sprijinul primit din partea DARPA (Defense Advanced Research Projects Agency) i a Comisiei Europene (European Commission). Prima versiune a protocolului HTTP (Hypertext Transfer Protocol), este HTTP/0.9, dezvoltat de Tim Berners-Lee i echipa sa. Ultima versiune, HTTP/1.1 este protocolul implicit de comunicare ntre browser i serverul de Web. Dezvoltarea acestui protocol este coordonat de W3C (World Wide Web Consortium). HTTP utilizeaz opt metode pentru comunicarea ntre browser i server, cea mai des utilizat fiind GET (folosit n situaia n care browser-ul cere serverului o resurs). Dup 1990 se dezvolt o gam larg de tehnologii Web, limbaje i platforme de programare, prezentate de consoriul W3C sub forma unor recomandri/standarde. Cele mai importante dintre acestea pot fi prezentate sub forma urmtoarei liste (incomplete): XML (Extensible Markup Language) XHTML (Extensible Hypertext Markup Language) PHP (PHP: Hypertext Preprocessor) ASP (Active Server Pages) JSP (JavaServer Pages) AJAX (Asynchronous JavaScript And XML) WSDL (Web Services Description Language) RSS (Really Simple Syndication) RDF (Resource Description Framework) OWL (Web Ontology Language) SOAP (Simple Object Access Protocol) JSON (JavaScript Object Notation) DOM (Document Object Model) XSL (EXtensible Stylesheet Language) CSS (Cascading Style Sheets) PNG (Portable Network Graphics) i SVG (Scalable Vector Graphics )
- 10 -
- 11 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Aplicaiile Web 2.0 utilizeaz adesea combinaii ale unor tehnici/tehnologii care au existat nc din anii 90 ai secolului trecut (e.g., Web syndication 1997, servicii Web - 1998). Astfel, pe de o parte, noul concept are un rol de integrare, oferind noi valene i direcii de dezvoltare tehnicilor/tehnologiilor amintite (e.g., AJAX). Pe de alt parte, multe dintre conceptele i tehnologiile dezvoltate recent (Weblog, linklog, wiki, podcast) sunt vzute ca o contribuie la dezvoltarea Web 2.0.
2.
La activitatea de definire, proiectare i dezvoltare a Web-ului Semantic particip un numr mare de cercettori coordonai de Consoriul W3C. Scopurile vizionare ale lui Semantic Web sunt de a extinde principiile funcionale ale Web-ului actual de la documente spre informaii(date). Aceast extindere va amplifica potenialul sistemului WWW pentru c va permite unor largi comuniti umane s acceseze n comun colecii uriae de informaii, care apoi pot fi prelucrate automat de instrumentele software. Semantic Web va permite realizarea urmtoarelor obiective: 1. Extragerea datelor n forma lor real, astfel nct programele s nu mai fie nevoite s le caute n paginile de Web, din care trebuie mai nti s elimine informaiile despre formatare, imaginile i alte elemente suplimentare neutilizabile. Scrierea/generarea de fiiere care descriu/explic relaiile/asociaiile dintre diferite seturi de date. Aceasta va permite sistemelor de calcul s urmreasc hyper-legturile semantice dintre obiectele care fac parte din acelai concept abstract i astfel s integreze automat date din mai multe surse diferite. - 12 -
2.
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Tehnologiile Semantic Web pot fi utilizate n domenii variate de aplicaii: Integrarea datelor. Informaii din locaii diferite i n formate diferite pot fi integrate ca un tot unitar ntr-o aplicaie; Descoperirea i clasificarea resurselor. Aceasta va asigura capaciti mbuntite motoarelor de cutare specializate pe domenii de cunotine. Catalogarea informaiilor care descriu coninutul i relaiile disponibile ntr-un anume site/pagin de Web sau bibliotec digital. Implementarea agenilor software inteligeni care permit diseminarea/partajarea i schimbul de cunotine. Evaluarea coninutului. Descrierea coleciilor de pagini care reprezint un singur document logic Descrierea drepturilor de proprietate intelectual ale paginilor de Web. Semantic Web (date integrate semantic) Web 2.0 (servicii i date) Web 1.0 (documente)
- 13 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 RDF Vocabulary Description Language 1.0: RDF Schema, W3C Recommendation, February 10, 2004, Ramanathan V. Guha, Dan Brickley, eds. Resource Description Framework (RDF): Concepts and Abstract Syntax, W3C Recommendation, February 10, 2004, Graham Klyne, Jeremy J. Carroll, eds. RDF Semantics, W3C Recommendation, February 10, 2004, Patrick Hayes, ed. RDF Test Cases, W3C Recommendation, February 10, 2004, Jan Grant, Dave Beckett, eds.
- 14 -
HTML
XML
XHTML
Ontologia meta-limbajelor. SGML(Standard Generalized Markup Language), HTML(Hypertext Markup Language), XML(Extensible Markup Language), XHTML(Extensible Hypertext Markup Language)
- 15 -
Definiie recursiv: PHP (PHP Hypertext Preprocessor) = Preprocesorul de Hypertext PHP (Preprocesorul de Hypertext PHP (Preprocesorul de Hypertext PHP(...))) PHP (acronim recursiv pentru "PHP: Hypertext Preprocessor") este un limbaj de scripting (realizat i distribuit n sistem Open Source) ce poate fi ncapsulat n HTML i care se utilizeaz pe scar larg n aplicaiile bazate pe tehnologiile Web, inclusiv n aplicaii de comer electronic. Exemplul 1.1. Trei scripturi elementare introductive ce conin respectiv numai cod PHP, cod PHP + cod HTML i cod PHP + cod JavaScript
<html> <head> <title>Exemplul 1 </title> </head> <body> <?php echo "Salut, eu sunt un script PHP elementar!"; ?> </body> </html> <html> <head> <title>Exemplul 2</title> </head> <body> <?php // scriptul se salveaza intr-un fisier "pagina_mea.php" echo 'Acesta este un script RECURSIV ce contine si <b>HTML</b> <br> <a href="pagina_mea.php">Legatura AUTOREFERENTIALA catre pagina mea</a>'; ?> </body> </html> <html> <head> <title>Exemplul 3</title> </head> <body> <?php echo '<html> <head><title>PHP cu JavaScript</title> <script language="JavaScript"> function alertare () { alert(Acesta este un test PHP ce contine JavaScript)
- 16 -
Se observ din acest exemplu cum difer un script PHP fa de un script scris n alte limbaje cum ar fi Perl (Practical Extraction and Report Language) sau C -- n loc de a scrie un program cu o mulime de comenzi pentru a produce un HTML, se scrie un script HTML ce include cod pentru a realiza un obiectiv (n acest caz, a afia un text). Codul PHP este delimitat de coduri de start i de sfrit (<?php?>)ce i permit s intri i s iei din "modul PHP". Diferena dintre PHP i alte limbaje cum ar fi JavaScript este aceea c PHP este executat pe server pe cnd JavaScript este executat pe calculatorul clientului (de ctre programul de navigare pe Internet). Dac ar fi s ai un script similar cu cel de mai sus pe serverul tu, clientul ar primi doar rezultatele scriptului ce este rulat, fr a vedea n nici un fel codul din spatele acestuia. Se poate chiar configura serverul de web ca acesta s proceseze toate fiierele HTML cu PHP i astfel nct nici un utilizator nu poate vedea ce exist n fiierele serverului. PHP este n principal axat pe partea de scripting ce ruleaz pe server, deci se poate realiza i un program CGI(Common Gateway Interface), cum ar fi colectarea de date de la formulare, generarea de coninut dinamic sau trimitere i primire de cookie-uri.
Figura 1.1.
1.
Exist trei domenii principale unde sunt folosite scripturile PHP. Scripturi ce ruleaz pe server. Acesta este cel mai tradiional i cel mai important pentru PHP. Sunt necesare trei lucruri pentru a face s mearg: 1. 1. Interpretorul PHP (CGI sau modul server), 1. 2. Un server de web i 1. 3. Un navigator de web. - 17 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Este nevoie ca serverul de web s fie pornit, cu o conexiune PHP instalat. Rezultatul programelor PHP poate fi vizualizat cu un navigator prin intermediul serverului de web.
2.
Scripting la linia de comand. Se poate face ca PHP s ruleze fr a fi nevoie de server i de browser, ci doar de interpretorul PHP. Aceast metod este ideal pentru scripturile ce se vor a fi executate regulat folosind cron (task scheduler n Windows), sau sarcini simple de procesare a textelor. Scrierea de aplicaii ce ruleaz pe partea clientului n mod grafic (GUI). Se pot folosi facilitile avansate ale PHP-ului n aplicaiile ce ruleaz de partea clientului prin exploatarea extensiei PHP-GTK pentru a scrie astfel de programe care pot rula, de asemenea pe platforme diferite folosind aceast metoda.
3.
PHP poate fi folosit pe aproape toate marile sisteme de operare, incluznd Linux, multe variante de Unix (incluznd HP-UX, Solaris i OpenBSD), Microsoft Windows, Mac OS X, RISC OS, probabil i altele. PHP are, de asemenea, suport pentru majoritatea serverelor de web din prezent. Acestea includ serverele Apache, Microsoft Internet Information Server, Personal Web Server, Netscape i iPlanet, serverul Oreillz Website Pro, Caudium, Xitami, OmniHTTPd, i multe atele. Pentru majoritatea serverelor, PHP are un modul, iar pentru celelalte suport standardul CGI, PHP putnd s lucreze ca un procesor CGI. Deci, cu PHP, se poate alege liber un sistem de operare i un server de web. Exist, de asemenea, posibilitatea de a alege programarea procedural sau programarea orientat obiect, sau chiar un mixaj ntre aceste stiluri de programare. Una dintre cele mai puternice i importante faciliti n PHP o reprezint suportul su pentru o gam larg de baze de date. Scrierea unei pagini de web ce interacioneaz cu o baz de date este simpl i poate fi realizat pentru urmtoarele baze de date: Adabas D dBase Empress FilePro (doar citire) Hyperwave IBM DB2 Informix Ingres InterBase FrontBase mSQL Direct MS-SQL MySQL ODBC Oracle (OCI7 i OCI8) Ovrimos PostgreSQL Solid Sybase Velocis Unix dbm
n plus, PHP suport ODBC, standardul Open DataBase Connectivity, care permite conectarea la orice alt baz de date care este realizat dup o tehnologie ce suporta acest standard mondial. Funciile PHP pentru acces la bazele de date nu sunt standardizate. Aceasta conduce la necesitatea existenei unei biblioteci de clase pentru baze de date care s ascund diferenele ntre API(Aplication Program Interface) ale diverselor servere de baze de date (i.e. s ncapsuleze particularitile implementrilor acestora) astfel nct interschimbul de informaii privitoare la bazele de date i coninutul lor s se realizeze facil. O implementare care satisface aceste cerine este ADOdb (ActiveX Data Objects for Data Base).
- 18 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 n momentul de fa biblioteca ADOdb suport Access, MySQL, Oracle, Microsoft SQL Server, Sybase, Sybase SQL Anywhere, Informix, PostgreSQL, FrontBase, Interbase (variantele Borland i Firebird), FoxPro, ADO, DB2, SAP DB i ODBC. PHP se poate folosi cu succes n domeniul comerului electronic, existnd deja un mare arsenal de funcii pentru plai on-line, funcii de plat Cybercash, CyberMUT, VeriSign Payflow Pro i CCVS. Exemplul 1.2. Afiarea unei variabile care este element al unui tablou (Variabila superglobal _SERVER)
<?php //Afisarea unei variabile care este element al unui tablou //(Variabila superglobala) _SERVER) echo $_SERVER['HTTP_USER_AGENT']; ?>
Rspunsul va fi: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322) Exemplul 1.3. Utilizarea structurii de control condiionale IF i a funciilor
<?php //Utilizarea structurii de control conditionale IF si a functiilor if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {echo 'Utilizati MS-Internet Explorer pentru navigare.<br />';} else {echo 'Multumiri pentru utilizarea MS-Internet Explorer!.<br />';} ?>
Rspunsul va fi: Utilizati MS-Internet Explorer pentru navigare. Exemplul 1.4. Mixaj ntre HTML i PHP
<?php //Mixaj ntre HTML si PHP if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) { ?> <h3>Functia strpos() a intors valoarea ADEVARAT</h3> <p>Utilizati MS-Internet Explorer pentru navigare </p> <?php } else { ?> <h3> Functia strpos() a intors valoarea FALSE</h3> <p> NU utilizati MS-Internet Explorer pentru navigare </p> <?php } ?>
Rspunsul va fi: - 19 -
1.2.
Marcaje de delimitare. Scripturile PHP pot fi incluse n paginile Web n diferite moduri, uzual folosindu-se construcia: < ?php ... ? > Comentariile pot fi scrise n stilul comentariilor din limbajele C/C++ ori Perl /* ... */ sau //. . . sau #. . .
Caracterul terminal Declaraiile i instruciunile se separ prin ;"ca i n C, Perl ori Java ; Funcionarea analizorului (motorului) PHP este urmtoarea: preprocesorul PHP va detecta construciile PHP delimitate ntre tag-urile <?php i ?> i le va interpreta, ignornd restul coninutului documentului pe care l va trimite, la ieirea standard, nealterat. Astfel, putem privi analizorul PHP ca un script CGI care efectueaz o preprocesare special nainte ca datele s fie expediate clientului Web. PHP se bazeaz pe motorul de scripting Zend.
1.3.
Tipurile de date
Tipurile de date simple suportate sunt cele scalare: 1. Valori logice (boolean), 2. Numere ntregi (integer), 3. Numere reale n virgul mobil (float, double, real) 4. ir de caractere (string). Tipurile de date structurate sunt reprezentate de: 1. Tipul tablou (array) - indexat i asociativ 2. Tipul obiect (object) Tipurile de date speciale sunt reprezentate de: 1. Tipul resurs (resource) 2. Tipul nul (NULL)
- 20 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 irurile de caractere se pot delimita ntre ghilimele ( ) sau caracterele apostrof (...), n acest ultim caz inhibndu-se evaluarea variabilelor din interiorul irului respectiv (exact ca la script-urile bash ori Perl), Variabilele n PHP se reprezint prin intermediul unui identificator prefixat de caracter $. Numele variabilei este case-sensitive (i.e. variabila $PHP este diferit de $php) i este compus din caractere alfa-numerice i simbolul _". Tipul unei variabile se determin funcie de valoarea pe care o stocheaz. Variabilele se pot folosi fr a trebui s fie declarate n prealabil. Exist, de asemenea, i diverse variabile predefinite, mai ales cele specifice serverului Web. Tot ca variabile sunt transmise unui script PHP cmpurile formularelor HTML dintr-o pagin sau cookie-urile. Un tip special sunt variabilele globale (globals) care stocheaz diverse categorii de variabile externe (de exemplu $_GET, $_POST, $_COOKIES, $_ENV etc.). Observaii: Din motive de lizibilitate, au fost introduse trei pseudo-tipuri: mixed, number i callback. Tipul double are aceeai semnificaie cu cea a tipului float. Cele dou denumiri coexist doar din motive "istorice". n PHP, de obicei, tipul unei variabile nu este specificat de ctre programator, ci este stabilit n timpul execuiei n funcie de contextul n care este folosit variabila. Tipul boolean Variabilele de acest tip pot avea doar dou valori: TRUE sau FALSE. Aceste valori sunt indicate prin cuvintele cheie TRUE sau FALSE (pentru ambele nu se face distincie ntre literele mari i literele mici). Exist posibilitatea de a converti o variabil de orice tip la tipul boolean. n momentul efecturii unei conversii, sunt convertite la valoarea FALSE urmtoarele valori: numrul ntreg 0; numrul real 0.0; irul vid; irul "0"; un vector fr nici un element; un obiect fr nici o variabil membru; o variabil de tipul NULL; o variabil nedefinit. Orice alt valoare este convertit la valoarea TRUE (inclusiv resursele). Acest tip se poate folosi, de exemplu, pentru verificarea logrii ntr-o pagin de administrare. Dup ce se fac verificrile, dac utilizatorul este logat ca administrator, funcia noastr pentru verificarea logrii poate returna valoarea de adevr (TRUE), dac este logat sau valoarea contrar (FALSE) dac nu este logat, i astfel vom ti dac s i acordm sau nu acces utilizatorului n seciunea de administrare.
- 21 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Tipul integer O variabil de tip integer reprezint o valoare din mulimea numerelor ntregi. Aceste numere pot fi specificate n baza 10, n baza 16 sau n baza 8, conveniile fiind aceleai ca i n limbajele C/C++ sau Java. Modul de reprezentare depinde de platforma utilizat; de obicei se folosete reprezentarea pe 32 de bii. Interpretorul PHP nu ofer suport pentru numerele ntregi fr semn. Trebuie remarcat faptul c n PHP nu exist nici un operator pentru efectuarea de mpriri ntregi. De exemplu, rezultatul operaiei 3/2 nu va fi numrul ntreg 1 (ca n C/C++ sau Java), ci numrul real (float) 1.5 i pentru numerele ntregi exist posibilitatea efecturii de conversii:
Valoarea logic TRUE este convertit la valoarea ntreag 1; Valoarea logic FALSE este convertit la valoarea ntreag 0; Un numr real este convertit prin "rotunjire nspre 0". Aadar, valoarea real 2.5 va fi convertit la valoarea ntreag 2, n timp ce valoarea real -2.5 va fi convertit la valoarea ntreag -2; Un ir de caractere este convertit lund n considerare doar primele caractere care conin informaii numerice. Aadar irul "10" va fi convertit la valoarea ntreag 10. De asemenea irul "10 ani" va fi convertit tot la valoarea 10; daca primele caractere nu conin informaii numerice, rezultatul conversiei va fi valoarea 0.
Tipul float O variabil de tip float poate fi specificat folosind fie forma zecimal, fie cea tiinific (cu exponent). La fel ca i n cazul tipului integer, precizia variabilelor de tipul float este dependent de platforma utilizat. De obicei se folosete standardul IEEE 64. Exist posibilitatea de a converti o variabil de orice tip la tipul float. Pentru numerele reale se pot efectua urmtoarele conversii: Un ir de caractere este convertit lund n considerare doar primele caractere care conin informaii numerice; aadar irul "10.2" va fi convertit la valoarea real 10.2; irul "1.23E1 ani" va fi convertit la valoarea 12.3; n toate celelalte cazuri se realizeaz conversii la numere ntregi care apoi sunt convertite la valorile reale corespunztoare.
Tipul string O variabil de tip string reprezint un ir de caractere. Un caracter se reprezint pe un octet, deci sunt 256 de caractere distincte. Acest lucru implic faptul c interpretorul PHP nu ofer suport nativ pentru setul de caractere Unicode. Lungimea variabilelor de tip string nu este limitat de ctre interpretor. - 22 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Literalii de tip ir de caractere pot fi specificai n trei moduri diferite: Prin folosirea ghilimelelor simple (apostrofelor) ' (Exemplu: $a='acesta este un sir de caractere'). Pentru a avea n cadrul irului simbolul apostrof " ' ", atunci naintea acestuia trebuie scris caracterul "\", iar pentru a putea specifica simbolul "\" acesta trebuie dublat. Prin folosirea ghilimelelor duble ". Folosind aceast notaie, pot fi specificate mai multe caractere speciale, pe lng caracterele de la varianta anterioar, printre care:
a) sfrit de linie ("\r") b) rnd nou ("\n") c) tab orizontal ("\t") d) semnul dolar ("\$") e) ghilimelele duble ("\"") f) secvene de caractere pentru specificarea expresiilor regulate n notaie octal
("\[0-7]{1,3}")
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Un numr real va fi convertit la un ir de caractere care reprezint notaia tiinific a acestuia; Obiectele sunt ntotdeauna convertite la irul "Object"; Variabilele de tipul resource sunt convertite la irul "Resource id #n", unde n reprezint un numr unic ataat resursei respective de ctre interpretorul PHP; Valoarea NULL este convertit la irul vid (""). Variabile predefinite $GLOBALS = pot fi accesate toate variabilele globale care sunt accesibile script-ului PHP curent $_SERVER = conine o serie de variabile ale cror valori sunt setate de server-ul web; majoritatea valorilor variabilelor din acest vector depind de mediul de execuie al script-ului curent. $_GET i $_POST conin variabile primite de script prin intermediul unor transferuri care folosesc metodele HTTP get, respectiv post. De exemplu, prin intermediul acestor vectori, pot fi accesate valorile cmpurilor dintr-un formular care a fost completat i transmis folosind una dintre cele dou metode. $_COOKIE conine valorile variabilelor care cuprind informaii referitoare la cookie-urile pstrate pe calculatorul utilizatorului ce acceseaz pagina Web. $_FILES conine variabile primite de script prin intermediul ncrcrilor de fiiere prin metoda post. $_ENV conine variabile disponibile prin intermediul mediului n care este executat. $_REQUEST conine variabile disponibile prin intermediul oricrui tip de mecanism cu ajutorul cruia utilizatorul poate introduce date. $_SESSION conine variabile care corespund sesiunii curente a script-ului. Tipul array Vectorii n PHP sunt mulimi formate din chei. Fiecrei chei din vector i se ataeaz o valoare. Acest tip de date este optimizat astfel nct s poat fi folosit n locul urmtoarelor structuri de date: liste, tabele de dispersie, dicionare, colecii, stive, cozi i altele. Datorit faptului c o valoare poate fi chiar un alt vector, se pot simula foarte uor arborii ndimensionali sau tablourile n-dimensionale. Valoarea unei variabile de tip vector se poate specifica folosind construcia: array (cheie => valoare, cheie => valoare, ...) De exemplu, urmtoarea instruciune PHP va construi un vector cu dou elemente, dintre care unul este de tip string, iar cellalt de tip boolean: $a = array('ch' => 'string', 12 => TRUE); Variabila $a reprezint un vector, $a["ch"] are valoarea string, iar $a[12] are valoarea TRUE. n cazul n care nu se specific o cheie pentru o valoare, atunci acea valoare va fi ataat unei chei care
- 24 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 va fi cheia maxim de tip integer folosit anterior, la care se adaug valoarea 1. Cheile pot avea i valori negative. Dac nu exist chei de tip integer, atunci valoarea va fi ataat cheii 0. De exemplu, urmtoarele dou instruciuni sunt echivalente: array(5 => 43, 32, 56, 'b' => 12); array(5 => 43, 6 => 32, 7 => 56, 'b' => 12);
Dac se folosete valoarea logic TRUE ca i cheie, atunci aceasta va fi convertit la cheia de tip ntreg 1, iar valoarea FALSE va fi convertit la numrul ntreg 0. Nu se pot folosi pentru chei variabile de tipul array sau object. O variabil de tip array se poate modifica prin setarea explicit de valori. De exemplu instruciunea: $a["x"] = 42; adaug n vectorul $a valoarea 42 ataat cheii "x". Dac se folosete un vector care nu a fost definit anterior, atunci acesta este creat automat. Aadar printr-o instruciune de forma $a[5] = 42, n cazul n care vectorul $a nu exist, atunci se va crea un vector cu un singur element. Cheia acestuia va fi numrul ntreg 5, iar valoarea sa va fi 42. De asemenea, exist posibilitatea de a crea un element nou fr a-i preciza cheia. Sintaxa are forma : $vector[] = valoare; Aceasta instruciune are ca efect adugarea unui element a crui cheie este un numr ntreg mai mare cu 1 dect cel mai mare numr ntreg care este cheie a unui alt element al vectorului. Dac nu exist nici o astfel de cheie, atunci noul element va avea cheia 0. De exemplu, urmtoarele dou secvene sunt echivalente: $a[5] = 1; ............................ $a[5] = 1; $a[6] = 2; ............................ $a[] = 2; Prin conversia la un vector a unei variabile de tip scalar (boolean, integer, float, string) sau resource se creeaz un vector cu un singur element; cheia acestui element este numrul ntreg 0, iar valoarea este cea a variabilei convertite. Dac se convertete un obiect (variabil de tip object), atunci vectorul rezultat va conine cte un element pentru fiecare variabil membru a obiectului. Cheile elementelor vor fi date de denumirile proprietilor obiectului (variabilele membru ale obiectului), iar valorile elementelor vor fi valorile proprietilor obiectului. Dac realizm o conversie a unei variabile de tip NULL, atunci rezultatul va fi un vector vid (care nu conine nici un element). - 25 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 n continuare sunt prezentate cteva exemple care descriu mai detaliat posibilitile oferite de folosirea vectorilor n PHP. Pentru nceput, iat un vector ale crui elemente reprezint caracteristicile unei portocale:
<?php $a = array ('denumire' => 'portocala', 'familie' => 'citrice', 'culoare' => 'portocaliu', 'forma' => 'rotunda', 'gust' => 'dulce'); echo $a['denumire'].' <br> '.$a['familie']; ?>
Putem aduga i alte elemente care s reprezinte diferite alte proprieti. De exemplu, am putea avea nevoie de o valoare suplimentar creia nu dorim s i atribuim nici un nume de identificare (cheie). Pentru ca vectorul s conin un element suplimentar cu valoarea 4, vom putea defini vectorul astfel:
<?php $v = array ('denumire' => 'portocala', 'familie' => 'citrice', 'culoare' => 'portocaliu','forma' => 'rotunda', 'gust' => 'dulce',4); echo 'Denumirea: '.$v['denumire']. '<br/>'.'Familia: '.$v['familie'].'<br/>'. 'Pretul: '.$v[0]; ?>
Scriptul 1.1. array1.php - Cheia elementului cu valoarea 4 va fi numrul ntreg 0 deoarece nu exist nici o alt cheie care este numr ntreg.
<?php $v['denumire'] = 'portocala'; $v['familie'] = 'citrice'; $v['culoare'] = 'portocaliu'; $v['forma'] = 'rotunda'; $v['gust'] = 'dulce'; $v[] = 4; echo $v['denumire'].' <br> '.$v['familie']; ?>
- 26 -
Scriptul 1.2. array2.php - O alternativa de construire a aceluiai vector v cu acelai rezultat n browser.
<?php $fructe = array ( 'denumire' => array('p' => 'portocala', 'a' => 'ananas', 'm' => 'mar'), 'numere' => array(1, 2, 3, 4, 5, 6), 'ordine' => array('prima', 5 => 'a II-a', 'a III-a') ); echo 'Denumire: '.$fructe['denumire']['p'].' - '.$fructe['denumire']['a']. '<br>'; echo 'Numere: '.$fructe['numere'][0].' - '.$fructe['numere'][1].' <br>'; echo 'Ordine: '.$fructe['ordine'][0].' - '.$fructe['ordine'][5].' <br>'; ?>
Scriptul 1.3. array3.php - Folosirea unor array-uri ale cror elemente sunt alte array-uri. Tipul object Pentru a defini un obiect care poate fi folosit pentru afiarea mesajului Salutare lume!, se scrie urmtoarea secven:
<?php class Salutare { function AfiseazaSalutare() { echo 'Salutare lume!'; }
- 27 -
Scriptul 1.4. clasa.php Definirea unui obiect elementar cu o singur metod Se observ faptul c AfiseazaSalutare(). este afiat textul Salutare lume!, text ce l-am introdus n funcia
Pentru a utiliza o variabila de tip obiect, va trebui s realizm o instaniere a obiectului prin intermediul instruciunii new. Sintaxa ei este: $a = new Salutare Astfel, variabila $a devine un obiect ale crui metode pot fi utilizate. Pentru afiarea propriu-zis a mesajului va trebui s executm metoda AfiseazaSalutare() printr-o instruciune de tipul: $a-> AfiseazaSalutare(); Orice variabil de un anumit tip poate fi convertit ntr-un obiect : Dac variabila respectiv este un obiect, atunci ea nu va fi modificat. n caz contrar, efectul conversiei este crearea unei noi instane a clasei stdClass. Dac variabila are tipul NULL, atunci noua instan va fi vid. n toate celelalte cazuri, instana va conine o variabil membru numit scalar a crei valoare va fi cea a variabilei convertite. Pentru conversii se folosesc instruciuni de tipul $obiect = (object) "Salutare lume!". Dup realizarea conversiei, se poate tipri mesajul Salutare lume! folosind instruciunea echo $obiect->scalar; Tipul resource Variabilele de tip resource sunt folosite pentru pstrarea unor referine ctre anumite resurse externe cum ar fi conexiuni la baze de date, fiiere, etc. Resursele sunt create i utilizate de anumite funcii speciale. Datorit specificului acestui tip de date, valoarea nici unei variabile de alt tip nu poate fi convertit la tipul resource.
- 28 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Tipul NULL Valoarea special NULL este atribuit oricrei variabile care nu a fost nc iniializat. Aceast valoare este singura pe care o pot avea variabilele de tip NULL. Se consider c o variabil are tipul NULL dac: i s-a atribuit constanta NULL; nu a fost iniializat; a fost deziniializat (prin intermediul funciei unset () ). Constantele pot fi considerate variabile ale cror valori sunt fixate i nu mai pot fi alterate pe parcursul programului. O constant stocheaz o valoare, precum face i o variabil, dar aceast valoare nu mai poate fi modificat n script, dup ce a fost stabilit (i.e. constanta a fost definit). Pentru a defini o constant se va folosi construcia sau funcia define( ). Numele constantelor va fi scris, de obicei cu majuscule. Aceasta opiune nu este obligatorie, ns este recomandabil deoarece va face codul mai frumos i mai lizibil. O diferen important ntre constante i variabile, este faptul c o constant nu are n faa ei semnul $. Exemplul 1.5. Definirea constantelor
<?php define('AUTOR', 'Eugen ZAHARESCU'); define('VARSTA', '50 de ani'); echo "<u>Autorul manualului este:</u> <b>".AUTOR.'</b> <br> '.'<u>Initializat in urma cu:</u> <b>' .VARSTA."</b>"; ?>
1.4.
Operatorii
PHP pune la dispoziie un set impresionant de operatori. Aceti operatori sunt cei disponibili n limbaje precum C sau Perl. Categoriile importante de operatori sunt: Operatorii aritmetici (+, -, *, /, %) sunt cei cunoscui din clasicele limbaje C/C++, Java, etc. Operatorii aritmetici Exemple Nume - 29 Rezultat
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Operatorii aritmetici Exemple $a + $b $a - $b $a * $b $a / $b $a % $b Nume Adunare Scdere nmulire mprire Modulo Rezultat Suma lui $a cu $b. Diferena dintre $a i $b. Produsul lui $a cu $b. Ctul mpririi lui $a la $b. Restul mpririi lui $a la $b.
Operatorii de asignare (= sau +=") Exemplul 1.6. Utilizarea operatorilor de asignare = , +=" i concatenare .=
<?php //Operatori de asignare "=" sau "+=" $a = ($b = 4) + 5; // $a este egal cu 9 si $b a fost setat la 4. echo "a=",$a,"<br />","b=",$b; $a = 3; $a += 5; // seteaza $a la 8, ca si in expresia: $a = $a + 5; $b = "Salut "; $b .= "PHP!"; // seteaza $b la "Salut PHP!", ca si in $b = $b . "PHP!"; echo "a=",$a,"<br />","b=",$b; ?>
Operatorii la nivel de bit Exemple $a & $b $a | $b $a ^ $b ~ $a $a << $b $a >> $b Nume And Or Xor Not Shift left Shift right Rezultat Biii setai la 1 n $a i n $b vor fi setai la 1. (i bit cu bit) Biii setai la 1 fie $a, fie n $b vor fi setai la 1. (sau bit cu bit) Biii setai 1 fie $a, fie n $b dar nu simultan vor fi setai 1. (sau exclusiv) Biii setai la 1 n $a, vor fi resetai la 0, i vice versa. (not bit cu bit) Deplaseaz $b poziii spre stnga biii lui $a. Deplaseaz $b poziii spre dreapta biii lui $a.
Operatorii relaionali (ca noutate se poate meniona aici ===" care are ca rezultat constanta TRUE dac operanzii au valori identice i n plus sunt de acelai tip) Operatorii relaionali Exemple $a == $b Nume Egalitate Rezultat
TRUE dac $a este egal cu $b.
- 30 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Operatorii relaionali Exemple $a === $b $a != $b $a <> $b $a !== $b $a < $b $a > $b $a <= $b $a >= $b Nume Identitate Diferit Diferit Non-identitate Mai mic dect Mai mare dect Mai mic sau egal cu Mai mare sau egal cu Rezultat TRUE dac $a este egal cu $b i sunt de acelai tip. (PHP 4) TRUE dac $a nu este egal cu $b. TRUE dac $a nu este egal cu $b. TRUE dac $a nu este egal cu $b sau nu sunt de acelai tip. (PHP 4) TRUE dac $a este strict mai mic dect $b. TRUE dac $a este strict mai mare dect $b. TRUE dac $a este mai mic sau egal cu $b. TRUE dac $a este mai mare sau egal cu $b.
Un alt operator condiional este operatorul teriar "? :". Expresia (expr1) ? (expr2) : (expr3) se evalueaz la expr2 dac expr1 este evaluat la valoarea TRUE i la expr3 dac expr1 este evaluat la valoarea FALSE.
Exemplul 1.7.
<?php //Operator condiional tertiar "?:". Structura (expr1) ? (expr2) : (expr3) $variabila = "CORECTA"; echo $variabila == "CORECTA" ? "Variabila are valoarea CORECTA" : "Variabila nu are valoarea CORECTA"; ?>
Operatori de control al erorilor (@ )(exist un singur operator @ care inhib erorile ce pot aprea n cadrul expresiei pe care o prefixeaz), Operatori de incrementare / decrementare (++ i ) Exemple ++$a $a++ --$a $a-Operatori de incrementare / decrementare Nume Rezultat Pre-increment Incrementeaz $a cu 1, apoi ntoarce $a. Post-increment ntoarce $a, apoi incrementeaz $a cu 1. Pre-decrement Decrementeaz $a cu 1, apoi ntoarce $a. Post-decrement ntoarce $a, apoi decrementeaz $a cu 1.
Operatori logici (and sau &&", or sau | |", xor, !") Operatori logici Exemple Nume - 31 Rezultat
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Operatori logici Exemple $a and $b $a && $b $a or $b $a || $b $a xor $b ! $a Nume And And Or Or Xor Not Rezultat TRUE dac ambele $a i $b sunt TRUE. TRUE dac ambele $a i $b sunt TRUE. TRUE dac fie $a sau $b sunt TRUE. TRUE dac fie $a sau $b sunt TRUE. TRUE dac fie $a, fie $b sunt TRUE, dar nu ambele simultan. TRUE dac $a nu este TRUE.
Operatori pentru iruri de caractere Se definete operatorul de concatenare . similar celui din Perl. Poate fi folosit, de asemenea i operatorul de test ? :" i operatorul de concatenare (.=), care adaug argumentului din partea stng, argumentul din partea dreapt. Exemplul 1.8. Utilizarea operatorului de concatenare "." pentru iruri de caractere
<?php //operatorul de concatenare "." pentru siruri de caractere $a = "Hello "; $b = $a . "World!"; // $b contine "Hello World!" $a = "Hello "; $a .= "World!"; ?> // $a contine de asemenea "Hello World!"
1.5.
Instruciunile limbajului PHP sunt cele uzuale din alte limbaje de programare. Sunt disponibile instruciuni de atribuire (de forma $variabil = expresie), instruciuni de test (if i switch), instruciuni repetitive (while, do, for, foreach) i instruciuni de control (break, continue, return).
if
if (expresie) instruciune
- 32 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Mai nti, expresie (de tipul boolean) este evaluat la valoarea ei logic. Dac expresie este evaluat la valoarea TRUE, atunci PHP va executa instruciune iar dac expresie este evaluat la valoarea FALSE atunci PHP va ignora instruciune. 1.5.1.2. Instruciunea
else
Instruciunea else este executat dac expresia logic dup if este evaluat la valoarea FALSE ca i toate expresiile logice elseif succesoare (dac exist). Altfel spus, toate expresiile logice predecesoare trebuie sa fie evaluate la valoarea FALSE.
<?php $a=1;$b=2; if ($a > $b) { echo "a mai mare decat b";} else { echo "a NU este mai mare decat b";} ?>
1.5.1.3.
Instruciunea
elseif
Instruciunea elseif este o combinaie de if and else. Precum else, extinde o instruciune if pentru a executa o alta instruciune diferit n cazul n care expresia logic original if este evaluat la FALSE. Totui, spre deosebire de else, ramura alternativ va fi executat dac i numai dac expresia condiional elseif este evaluat la TRUE. Pot fi mai multe elseif n aceeai instruciune if. Prima alternativ elseif pentru care expresia logic este evaluat la TRUE va fi executat. n PHP, se poate scrie 'else if' (n 2 cuvinte) cu acelai comportament, identic ca i n cazul lui 'elseif' (ntr-un singur cuvnt). Exemplul 1.9. Utilizarea structurii condiionale if..elseif..else
<?php //Structura conditionala if..elseif..else $a=1;$b=2; if ($a > $b) {echo "a mai mare decat b";} elseif ($a == $b) {echo "a este egal cu b";} else {echo "a mai mic decat b";} ?>
1.5.1.4.
Instruciunea
switch
Instruciunea switch este asemntoare cu o serie de instruciuni if cu aceeai expresie logic. n multe situaii, se dorete compararea aceleiai variabile (sau expresii) cu mai multe valori diferite i s se execute secvene diferite de cod depinznd de valoarea ei la un moment dat. Instruciunea structurat switch a fost proiectat tocmai pentru acest lucru.
- 33 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Not: Spre deosebire de alte limbaje de programare, instruciunea continue se aplic i acioneaz similar cu break. Dac exist un switch n interiorul unui ciclu i se dorete s se continue cu urmtoarea iteraie a ciclului exterior, se va utiliza continue 2. Urmtoarele 2 exemple ilustreaz dou modaliti de a scrie acelai lucru: una prin utilizarea unei cascade de instruciuni if i elseif, i alta prin utilizarea instruciunii switch: Exemplul 1.10. Utilizarea structurii condiionale if..elseif i echivalentul ei switch..case
<?php //Structura conditionala if..elseif si echivalentul ei switch..case $i=0; echo "STRUCTURA CONDITIONALA if..elseif<br />"; if ($i == 0) { echo "i este egal cu 0"; } elseif ($i == 1) { echo "i este egal cu 1"; } elseif ($i == 2) { echo "i este egal cu 2"; } echo "<br /><br />STRUCTURA CONDITIONALA switch..case<br />"; switch ($i) { case 0: echo "i este egal cu 0"; break; case 1: echo "i este egal cu 1"; break; case 2: echo "i este egal cu 2"; break; } ?>
Pentru a evita greelile este important de neles cum este executat instruciunea switch. Instruciunea switch se execut linie cu linie (de fapt, instruciune cu instruciune). La nceput, nu se execut nici un cod. Numai cnd se ntlnete o instruciune case cu o valoare care se potrivete valorii expresiei switch atunci PHP ncepe ntr-adevr s execute instruciunile alternativei respective. PHP va continua s execute instruciunile pn la sfritul blocului switch, sau pn la prima apariie a instruciunii break. Dac nu se adaug o instruciune break la sfritul listei de instruciuni case, PHP va continua s execute instruciunile urmtoarei alternative case. Exemplul 1.11. Utilizarea structurii condiionale switch..case fr break
<?php //Fara break la sfrsitul listei de instructiuni case... //...PHP va continua sa execute instructiunile urmatoarei alternative case $i=0; switch ($i) { case 0: echo "i este egal cu 0<br />";
- 34 -
n acest exemplu, dac $i este egal cu 0, PHP ar executa toate instruciunile echo. Dac $i este egal cu 1, PHP ar executa ultimele 2 instruciuni echo. Comportamentul dorit se obine numai dac $i este egal cu 2 (i.e. va fi afiat textul 'i este egal cu 2'). De aceea este important s nu se uite inserarea instruciunilor break n structura de ramificare multipl switch. ntr-o instruciune switch, condiia este evaluat numai o dat i rezultatul este comparat cu fiecare instruciune case. ntr-o instruciune elseif, condiia este evaluat din nou. Dac condiia este mai complicat dect o simpl comparaie i/sau se afl ntr-un ciclu foarte strns, o instruciune switch poate fi mai rapid. Lista de instruciuni pentru un case poate fi de asemenea vid, ceea ce face s treac controlul spre lista de instruciuni a urmtorului case. Exemplul 1.12. Utilizarea structurii condiionale switch..case cu alternative vide
<?php //Structura case cu alternative vide... $i=0; switch ($i) { case 0: case 1: case 2: echo "i este mai mic decat 3 dar nu negativ"; break; case 3: echo "i este 3"; } ?>
O situaie special o reprezint alternativa case denumit default. Aceast alternativ corespunde oricror altor cazuri care nu s-au potrivit celorlalte alternative case i trebuie s fie ultima instruciune (alternativ) case. Exemplul 1.13. Utilizarea structurii condiionale switch..case cu alternativa default
<?php //Structura case cu alternativa default... $i=3; switch ($i) { case 0: echo "i este egal cu 0";
- 35 -
Expresia case poate fi orice expresie care poate fi evaluat la un tip simplu de dat: integer, floating-point numbers sau strings. Arrays sau objects nu pot fi utilizate dect dac ele sunt redefinite ca tipuri simple. Se pot utiliza i alte sintaxe, alternative, pentru structurile de control ale ramurilor instruciunii structurate switch: Exemplul 1.14. Utilizarea structurii condiionale switch..case cu sintaxa alternativ ":" + endswitch
<?php //Structura case cu sintaxe alternative ":" + endswitch; $i=3; switch ($i): case 0: echo "i este egal cu 0"; break; case 1: echo "i este egal cu 1"; break; case 2: echo "i este egal cu 2"; break; default: echo "i nu este egal cu 0, 1 sau 2"; endswitch; ?>
while
Ciclurile while reprezint cele mai simple cicluri n PHP. Ele se comport exact precum structurile similare din limbajul C. Structura de baz a sintaxei unei instruciuni while este:
while (expresie) instruciune;
- 36 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Instruciunea while determin PHP s execute instruciunile incluse n mod repetat, atta timp ct expresia while este evaluat la valoarea TRUE. Valoarea expresiei este verificat de fiecare dat la nceputul ciclului, astfel nct chiar dac aceast valoare se modific n timpul execuiei instruciunilor incluse, execuia nu se va opri pn la sfritul iteraiei (rularea tuturor instruciunilor din cadrul ciclului). Atunci cnd expresia while este evaluat la valoarea FALSE de la nceput, instruciunile din cadrul ciclului nu vor fi executate nici mcar o dat. Ca i n cazul instruciunii if, se pot grupa mai multe instruciuni n cadrul aceleiai instruciuni repetitive while prin ncadrarea lor cu paranteze acolad {} sau prin utilizarea sintaxei alternative:
while (expr): instruciune ... endwhile;
Exemplele urmtoare sunt identice i ambele afieaz numerele de la 1 la 10: Exemplul 1.15. Utilizarea structurii repetitive while
<?php /* exemplul 1 */ $i = 1; while ($i <= 10) { echo $i++, ;/*(post-increment) se afiseaza $i inainte de incrementare*/ } /* exemplul 2 */ echo <br/>; $i = 1; while ($i <= 10): echo $i, ; $i++; endwhile; ?>
1.5.2.2.
Instruciunea
do..while
Ciclurile do..while sunt foarte asemntoare ciclurilor while, cu excepia faptului c expresia logic este verificat la sfritul fiecrei iteraii i nu la nceputul ei. Principala diferen fa de ciclurile while obinuite este c prima iteraie a ciclului do..while se execut ntotdeauna (pentru c expresia logic este verificat de abia la sfritul ciclului). Acest comportament nu se ntlnete i la ciclurile while obinuite (pentru c expresia logic este verificat la nceputul fiecrei iteraii iar dac este evaluat la valoarea FALSE atunci execuia ciclului se ncheie imediat). Structura sintactic a unui ciclu do..while este:
do instruciune while (expresie) ;
- 37 -
Ciclul de mai sus este executat o singur dat deoarece dup prima iteraie, expresia logic este evaluat la valoarea FALSE ($i nu este mai mare dect 0). Programatorii n C experimentai utilizeaz uneori n mod diferit ciclul do..while, permind ntreruperea execuiei n mijlocul blocului de instruciuni, prin construirea unui ciclu infinit do..while i includerea instruciunii break precum n exemplul urmtor: Exemplul 1.16. Utilizarea structurii repetitive do..while(1) ca un ciclu infinit
<?php // ciclu infinit do..while (1) $factor=2; $limita_minima=100; $i=5; //Se termina la a doua structura if //$i=0; // Se termina la prima structura if $i=5; do { if ($i < 5) { echo "Variabila i nu este suficient de mare"; break; } $i *= $factor; if ($i > $limita_minima) { echo "<br/>i=",$i," i este prea mare!.. >",$limita_minima; break; } echo "<br/>i=",$i," Variabila i este O.K.!"; /* proceseaza i */ } while (1); ?>
1.5.2.3.
Instruciunea
for
Ciclurile for sunt cele mai complexe cicluri n PHP. Se comport precum ciclul corespunztor din C. Sintaxa ciclului for este:
for (expr1; expr2; expr3) {instruciune};
Prima expresie (expr1) este evaluat (executat) cel puin o dat n mod necondiionat la nceputul ciclului. La nceputul fiecrei iteraii, expr2 este evaluat. Dac este evaluat la TRUE, ciclul continu i instruciunile incluse sunt executate. Dac n schimb este evaluat la FALSE, execuia ciclului se termin. La sfritul fiecrei iteraii, expr3 este evaluat (executat). Fiecare din expresii - 38 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 poate fi vid. Dac expr2 este vid aceasta nseamn c ciclul ar trebui s se execute la infinit (PHP implicit consider c este TRUE, precum n C). Aceasta poate fi uneori util atunci cnd se dorete terminarea ciclului prin utilizarea unei instruciuni condiionate break n locul expresiei logice a lui for. Toate exemplele urmtoare vor afia numerele de la 1 la 10: Exemplul 1.17. Utilizarea structurii repetitive for. Generarea/afiarea secvenei de numere 1..10.
<?php // Generarea/afiarea secvenei de numere 1..10 echo <br/> Exemplul 1 : ; for ($i = 1; $i <= 10; $i++) { echo <br/> Exemplul 2 : ; for ($i = 1; ; $i++) { if ($i > 10) { break; echo $i, ; } echo <br/> Exemplul 3 : ; $i = 1; for (; ; ) { if ($i > 10) { break; echo $i, ; $i++; } echo $i, ; }
echo <br/> Exemplul 4 : ; for ($i = 1; $i <= 10; prin $i, prin , $i++); ?>
- 39 -
Scriptul 1.5. fibonacci.php- Utilizarea structurii for pentru calculul elementelor sirului lui Fibonacci i Raportul De Aur. PHP permite, de asemenea, varianta alternativ a ciclului for prin utilizarea sintaxei speciale asociate caracterului ":"
for (expr1; expr2; expr3): instructiune; ...; endfor;
- 40 -
foreach
PHP 4 sau 5 (nu i PHP 3) includ o construcie foreach, foarte asemntoare cu cea din Perl sau alte limbaje. Aceast structur permite iterarea n interiorul unor tablouri de elemente (arrays). Ciclul foreach lucreaz numai cu arrays i va genera o eroare atunci cnd se va ncerca utilizarea unei variabile de un alt tip de dat sau a unei variabile neiniializate. Exist 2 sintaxe ale acestui ciclu:
foreach (expresie_array as $value) instruciune foreach (expresie_array as $key => $value) instruciune
Prima form itereaz peste array-ul desemnat de <expresie_array>. La fiecare ciclu, valoarea elementului curent este asignat variabilei $value pointerul intern al array-ului este incrementat cu o unitate (astfel nct n urmtorul ciclu se va face referire la urmtorul element al array-ului). A doua form se comport similar, doar c indexul elementului curent se va asocia variabilei $key la fiecare ciclu. Observaii: Cnd foreach ncepe execuia primului ciclu, pointerul intern al array-ului este automat resetat la indexul primului element al array-ului. Aceasta nseamn c nu este nevoie s se apeleze reset() naintea execuiei niciunui ciclu foreach. Ciclul foreach lucreaz pe o copie a array-ului specificat i nu pe array-ul nsui. De aceea, pointerul array-ului nu este modificat precum n construcia each() i orice modificare efectuat asupra elementelor din array nu se reflect n array-ul originar. Totui, pointerul intern al arrayului originar este incrementat pe parcursul procesrii array-ului. La sfritul unei procesri complete pointerul intern al array-ului va indica ultimul element din tablou. Ciclul foreach nu poate suprima mesajele de eroare prin utilizarea lui '@'. Urmtoarele structuri funcioneaz identic: Exemplul 1.18. Utilizarea structurii repetitive foreach. Prima sintax i echivalentul ei while.
<?php // Utiliz. structurii repetitive foreach-s1 i echivalentul ei $arr = array("one", "two", "three"); reset ($arr); while (list(, $value) = each ($arr)) { echo "Valoare cu while: $value<br />"; } foreach ($arr as $value) { echo "Valoare cu foreach: $value<br />"; } ?> while
- 41 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Urmtoarele structuri funcioneaz, de asemenea, identic: Exemplul 1.19. Utilizarea structurii repetitive foreach. A doua sintax i echivalentul ei while.
<?php // Utilizarea structurii repetitive foreach-s2 i echivalentul ei while $arr = array("one", "two", "three"); reset($arr); while (list($key, $value) = each ($arr)) { echo "Index-while: $key; Valoare-while: $value<br />"; } foreach ($arr as $key => $value) { echo "Index-foreach: $key; Valoare-foreach: $value<br />; } ?>
Alte exemple de procesare a tablourilor de elemente: Exemplul 1.20. Utilizarea structurii repetitive foreach n diferite ipostaze de procesare a array-urilor.
<?php /* foreach exemplul 1: numai value */ echo "<br/>Exemplul-1<br/>"; $a = array(2, 4, 6, 8); foreach ($a as $v) { echo "Valoarea curenta a lui $a: $v <br/>"; } /* foreach exemplul 2: value (cu afisarea key pentru ilustrare) */ echo "<br/>Exemplul-2<br/>"; $a = array(20, 40, 60, 80); $i = 0; /* numai pentru ilustrare */ foreach ($a as $v) { echo "$a[$i] => $v<br/>"; $i++; } /* foreach exemplul 3: key si value */ echo "<br/>Exemplul-3<br/>"; $a = array( "one" => 200, "two" => 400, "three" => 600, "seventeen" => 800 ); foreach ($a as $k => $v) { echo "$a[$k] => $v<br/>";
- 42 -
1.5.2.5.
Instruciunea
break
Instruciunea break termin execuia structurii curente din cadrul instruciunilor structurate for, foreach, while, do..while sau switch. Instruciunea break accept i un argument numeric opional care comunic cte structuri incluse, imbricate, vor fi anulate sau desfcute prin terminarea execuiei lor. Exemplul 1.21. Utilizarea break n diferite structuri repetitive.
<?php $arr = array('one', 'two', 'three', 'four', 'stop', 'five'); echo "<br />Exemplu break pentru while<br />"; while (list (, $val) = each ($arr)) { if ($val == 'stop') { break; /* Se poate scrie de asemenea si 'break 1;' aici. */ } echo "$val<br />"; } /* Utilizarea argumentului optional. */ echo "<br />Exemplu break pentru switch<br />"; $i = 0; while (++$i) { switch ($i) { case 5: echo "Break la 5<br />"; break 1; /* Iesirea numai din switch. */ case 10: echo "Break la 10; Abandonare!<br />"; break 2; /* Iesirea si din switch si din while. */ default:
- 43 -
} } ?>
1.5.2.6.
Instruciunea
continue
Aceasta instruciune este folosit pentru a ntrerupe execuia secvenei de instruciuni din interiorul unui ciclu i trecerea la urmtoarea iteraie. n cazul instruciunii for, nainte de urmtoarea iteraie se evalueaz (execut) expresia de incrementare (expresia nr_3 din sintaxa general). La fel ca i n cazul instruciunii break, poate aprea un argument care indic numrul structurilor imbricate asupra crora are efect. Exemplul urmtor afieaz elementele unui ir de numere ntregi care sunt mai mari dect 1000:
<?php /* Utilizarea instructiunii continue*/ $a = array(2000, 400, 6000, 80, 999, 1001); foreach($a as $k=>$v) { if($v <= 1000) continue; echo "Pret/articol depaseste valoarea de prag (1000): [$k]=$v <br/>"; } ?>
Scriptul 1.7. continue1.php Afiarea selectiv a elementelor care depesc pragul de 1000.
- 44 -
n exemplul de mai sus, blocul HTML "A este egal cu 5" este imbricat n interiorul unei nstruciuni if scris cu sintaxa alternativ. Blocul HTML va fi afiat numai dac $a este egal cu 5. Sintaxa alternativ se aplic i structurii else and elseif n egal msur. n exemplul urmtor structurile if, elseif i else sunt n formatul alternativ: Exemplul 1.22. Utilizarea sintaxei alternative pentru structura de control if..elseif..else..endif.
<?php $a=10; if ($a == 5): echo "a este egal cu 5"; echo "..."; elseif ($a == 6): echo "a este egal cu 6"; echo "!!!"; else: echo "a nu este nici 5 nici 6"; endif; ?>
- 45 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Iat n continuare un exemplu de afiare a sumei valorilor unui tablou unidimensional (vector), prin utilizarea variabilelor de tip ntreg i tablou indexat, a instruciunilor for i foreach a operatorilor relaionali, de asignare i de incrementare (funcia predefinit echo( ) afieaz la ieirea standard - aici fereastra navigatorului Web - codul HTML generat): Exemplul 1.23. Generarea unui tablou de valori.
<?php // Umplem un tablou cu valori de la 1 la 10 $n=20; for ($contor =1; $contor <= $n; $contor++) { $valori[$contor] = $contor; } $suma = 0; foreach ($valori as $element) // realizam suma valorilor, utiliznd foreach $suma += $element; // afisam suma obtinuta; valoarea este trimisa browserului cu echo() echo (" <p>Suma numerelor de la 1 la ".$n." este: <b>". $suma . "</b></p>"); ?>
1.6.
O funcie poate fi definit prin utilizarea urmtoarei sintaxe: Exemplul 1.24. Pseudo-cod care ilustreaz definirea i utilizarea funciilor.
<?php function functie($arg_1, $arg_2, /* ..., */ $arg_n) { echo "Exemplu functie.\n"; return $retval; } ?>
Orice cod PHP valid poate fi inclus n interiorul unei funcii, chiar i alte funcii i definiii de obiecte (class). n PHP 3, funciile trebuiau s fi definite nainte de apelul lor. Aceste restricii au fost eliminate pentru PHP 4 i PHP 5. Face excepie cazul n care o funcie este definit condiional ca n exemplul de mai jos. Cnd o funcie este definit ntr-o manier condiional definiia sa trebuie s fie procesat naintea apelului su. Exemplul 1.25. Funcii definite condiional.
<?php $creeaza = true; /* Nu se poate apela nu_exita_func()aici deoarece ea inca nu exista .. ...dar se poate apela exita_func() */ exita_func(); if ($creeaza) {
- 46 -
1.7.
Valorile sunt returnate prin utilizarea instruciunii opionale return. Orice tip de date poate fi returnat, incluznd liste i obiecte. Aceast instruciune determin funcia s-i termine execuia sa imediat i s cedeze controlul napoi liniei de program de unde ea a fost apelat. Exemplul 1.27. Utilizarea instruciunii return()
<?php function patrat($num) {return $num * $num; } $num=35; echo "Patratul lui $num este= ".patrat($num);// Afiseaz '1225'. ?>
- 47 -
Exemplul 1.28. Funcie definit recursiv pentru calculul elementelor irului lui Fibonacci i a raportului de aur.
Nu se pot returna valori multiple dintr-o funcie, dar rezultate similare pot fi obinute prin returnarea unei liste. Exemplul 1.29. Returnarea unui array pentru a obine valori multiple.
<?php function articole() { return array ('CAFEA', 100, 20); } list ($den_art, $pret, $cant) = articole(); echo "Valoarea total/articolul $den_art este = ".$pret*$cant." RON"; ?>
- 48 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Constructorul list() este utilizat pentru a atribui valori unei liste de variabile printr-o singur instruciune ca i cnd ar fi elementele unui vector. list() lucreaz numai asupra vectorilor indexai numeric i se consider c indecii numerici pornesc de la 0, n mod implicit. Pentru a returna o referin(adres) dintr-o funcie, trebuie s se utilizeze operatorul referenial & att n antetul de declarare a funciei ct i atunci cnd se asociaz valorile returnate unei variabile: Exemplul 1.30. Returnarea unei referine dintr-o funcie.
1.8.
Variabile funcii
PHP implementeaz conceptul de variabile funcii. Aceasta nseamn c dac numele unei variabile este ncadrat de paranteze, PHP va cuta o funcie cu acelai nume ori de cte ori variabila va fi evaluat i se va ncerca executarea ei. Aceasta poate fi utilizat pentru implementarea tabelelor de funcii, a tehnicilor de autentificare prin apelul emitentului etc. Variabilele funcii nu vor lucra cu construciile limbajului precum echo(), print(), unset(), isset(), empty(), include(), require() etc. Exemplul 1.31. Variabile funcii.
<?php function functia1() { echo "Se executa functia1()<br/>"; } function functia2($arg = '') { echo "Se executa functia2(); Argumentul era '$arg'.<br/>\n"; } // Aceasta este o functie bazata pe echo: repeta valoarea argumentului function ecou($string) { echo $string; } $func = 'functia1'; $func(); // Aceasta apeleaza functia1() $func = 'functia2'; $func('valoare'); // Aceasta apeleaza functia2() $func = 'ecou'; $func('Ecoul argumentului!'); // Aceasta apeleaza ecou()
- 49 -
Se poate, de asemenea, apela metoda unui obiect prin utilizarea variabilelor funcii. Exemplul 1.32. Exemplu de metode variabile.
<?php class Obiect { function Variabila_functie() { $nume = 'Metoda'; $this->$nume(); // Aceasta apeleaza metoda Metoda() } function Metoda() { echo "Se executa functia Metoda!"; } } $obiect = new Obiect(); $nume_func = "Variabila_functie"; $ obiect ->$ nume_func (); // Apeleaza metoda $obiect->Variabila_functie() ?>
1.9.
- 50 -
n scriptul de mai sus se definete o clas denumit Catalog care conine un array asociativ de articole din catalog i 2 funcii care adun i respectiv extrag articole din acest catalog. Avertisment Nu se poate despri definiia unei clase n mai multe fiiere sau blocuri PHP multiple. O astfel de definiie este greit i nu va fi acceptat: Contra-Exemplu
<?php class test { ?> <?php function test() { prin 'OK'; } } ?>
Observaie: PHP4 rezerv toate numele de funcii care ncep cu __ ca nume magice. Este recomandat s nu se utilizeze nume de funcii cu __ n PHP4 pentru a se evita unele efecte ale funciilor magice. n PHP 4, numai iniializri constante sunt permise pentru variabilele var. Pentru a iniializa variabile cu valori non-constante, este necesar iniializarea unei funcii care este apelat automat cnd un obiect este construit din acea clas. O astfel de funcie este numit un constructor (vezi mai jos): Exemplul 1.34. Utilizarea funciei constructor.
<?php class Catalog { /* Nici una din acestea nu vor functiona in PHP 4. */ var $data_curenta = date("Y-m-d"); var $nume = $prenume; var $proprietar = 'Ion ' . 'Georgescu '; /* Array-uri care contin valori constant vor merge totusi. */ var $items = array("VCR", "TV"); } /* Acesta este modul corect de definire in PHP 4. */ class Catalog { var $data_curenta; var $nume; var $proprietar; var $items = array("VCR", "TV");
- 51 -
Clasele sunt tipuri de date, adic sunt schie sau abloane ale adevratelor variabile. O variabil din tipul dorit se va crea cu operatorul new. Exemplul 1.35. Generare unei clase cu operatorul new.
<?php $catalog = new Catalog; $catalog ->add_item("10", 1); $alt_catalog = new Catalog; $alt_catalog ->add_item("0815", 3); ?>
Aceste declaraii creeaz obiectele $catalog i $alt_catalog, ambele din clasa Catalog. Funcia add_item() a obiectului $catalog este apelat pentru a aduga un exemplar la articolul cu numrul de catalog 10 din clasa $catalog. Trei exemplare din articolul cu numrul de catalog 0815 sunt adugate la $alt_catalog. Ambele, $catalog and $alt_catalog, au funcii add_item(), remove_item() i o variabil exemplar (item). Acestea sunt funcii i variabile distincte. Obiectele pot fi reprezentate mental ca fiind similare directoarelor dintr-un sistem de fiiere. ntr-un sistem de fiiere pot exista dou fiiere diferite README.TXT, atta timp ct ele sunt n directoare diferite. Aa cum, n cazul structurii arborescente a sistemelor de fiiere, trebuie precizat calea complet de acces pentru fiecare fiier ncepnd de la directorul rdcin (i.e. de la nivelul superior), tot aa trebuie specificat numele complet al unei funcii ce urmeaz a fi apelat. n limbajul PHP, directorul rdcin (de la nivelul superior) va fi numele spaiului global, iar separatorul cilor de acces va fi ->. Astfel, numele $catalog->items i $alt_catalog->items sunt dou nume de variabile diferite. A se observa c variabila se numete $catalog->items, i nu $catalog->$items, deoarece un nume de variabil n PHP este precedat de un singur $ (simbolul dolar). Exemplul 1.36. Utilizarea corect a identificatorilor de variabile din interiorul claselor.
<?php // corect, se utilizeaz un singur $ $catalog->items = array("10" => 1); // invalid, deoarece $catalog->$items devine $catalog->"" $ catalog ->$items = array("10" => 1);
- 52 -
n cadrul definiiei unei clase, nu se va tii numele sub care obiectul va fi accesibil n program (e.g. n momentul n care clasa Catalog a fost definit, nu se tia c obiectul de va numi mai trziu $catalog sau $alt_catalog). Astfel, nu se poate scrie $catalog->items chiar n interiorul clasei Catalog. n schimb, n scopul de a accesa propriile sale funcii i variabile din cadrul unei clase, se poate utiliza pseudo-variabila $this care poate fi citit ca proprietatea mea sau obiectul_curent'. Astfel, $this->items[$artnr] += $num' poate fi citit ca adun $num la contorul $artnr al array-ului meu de exemplare (items) sau adun $num la contorul de exemplare $artnr ale array-ului din cadrul obiectului curent.
1.9.2. Interfee
PHP folosete aceast categorie special de clase ca o alternativ la motenirea multipl. O interfa este declarat similar unei clase dar include numai prototipuri de funcii (fr implementare) i constante. Sintaxa de implementare a unei interfee este urmtoarea:
class A implements B, C, ... { ... }
Clasele care implementeaz o interfa au o legtur instanceof cu interfaa. De exemplu, dac clasa A implementeaz interfaa myInterface, atunci se va tipri mesajul '$obj is-A myInterface':
$obj = new A(); if ($obj instanceof myInterface) { print '$obj is-A myInterface'; }
Exemplul urmtor definete o interfa numit Loggable, ale crei clase pot fi implementate s defineasc care informaii vor fi nregistrate de funcia MyLog(). Obiectele claselor care nu implementeaz aceast interfa i sunt transmise spre funcia MyLog() vor genera un mesaj de eroare:
interface Loggable { function logString();} class Client implements Loggable { private $nume, $adresa, $idNumber, $varsta; function logString() { return "class Client: nume = $this->nume, ID = $this->idNumber\n";} } class Produs implements Loggable { private $nume, $pret, $DataExpirare; function logString() { return "class Produs: nume = $this->nume, pret = $this->pret\n";} } function MyLog($obj) { if ($obj instanceof Loggable) { print $obj->logString();} else {print "Eroare: Obiect nu implementeaz interfata Loggable \n";} } $client = new Client(); // ... $produs = new Produs(); MyLog($client); MyLog($produs);
- 53 -
Elementul SELECT Acest element este folosit pentru crearea unei liste de opiuni, fie sub forma unui meniu care se desfoar (list derulant), fie sub forma unei casete cu list derulant. Fiecare din opiunile din list reprezint un element OPTION.
<select [name=nume] [size=latime] [multiple] [disabled] [tabindex=numar] [onblur=script] [onchange=script] [core] [international] [events]> Elementele din select </select> <option [selected] [disabled] [value=valoare] [core] [international] [events]>Nume</option> [onfocus=script]
Exemplu SELECT:
<select name=test> <option value=val_optiune1>DenOptiune_1</option> <option value=val_optiune2>DenOptiune_2</option> <option value=val_optiune3>DenOptiune_3</option> <option value=val_optiune4>DenOptiune_4</option> </select>
- 54 -
Elementul INPUT
<input [type=text|password|checkbox|radio|submit|image|reset|button|hidden|file] [name=nume] [value=valoare] [checked] [disabled] [readonly] [size=latime] [maxlength=cuvinte_maxime] [src=url] [alt=altText] [usemap=url] [align=left|center|right|justify] [tabindex=numar] [accesskey=keyCombo] [onfocus=script] [onblur=script] [onselect=script] [onchange=script] [accept=set_caractere] [core] [international] [events]>
Acest element INPUT este cel mai important n preluarea datelor de la utilizator prin intermediul formularelor. Explicitarea valorilor Type ale elementului INPUT button checkbox file hidden image password radio reset submit text Butoane personale Casete de validare Fiiere incluse Elemente ascunse Imagini Casete de introducere a parolei Butoane radio Buton reset Buton trimite Caseta text Exemplu: <input type=submit name=Buton value=Buton> Exemplu: <input type=checkbox name=nume value=valoare> Exemplu: <input type=file name=nume value=valoare> Exemplu: <input type=hidden name=nume value=valoare> Exemplu: <input type=image name=Buton src=poza_buton.gif> Exemplu: <input type=password name=nume value=valoare> Exemplu: <input type=radio name=nume value=valoare> Exemplu: <input type=reset name=Reseteaza value=Reseteaza> Exemplu: <input type=button name=Trimite value=Trimite> Exemplu: <input type=text name=nume value=valoare>
- 55 -
Imaginile i exemplele asociate valorilor Type ale elementului INPUT Elementul TEXTAREA Acest element este asemntor cu cel text numai c aici se poate tasta ntr-o seciune mult mai mare dect n cazul text.
<textarea [name=nume] [rows=nr_randuri] [cols=nr_coloane] [disabled] [readonly] [tabindex=numar] [onfocus=script] [onblur=script] [onselect=script] [onchange=script] [core] [international] [events] </textarea>
- 56 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Exemplu TEXTAREA: <textarea name="nume" cols="20" rows="5"> Control pentru introducerea textului </textarea> Exemplu de formular: <form action="formular.php" method="post"> Prenume: <input type="text" name="prenume" value=""> <br><br> Nume: <input type="text" name="nume" value="" size=50 maxLength=15> <br><br> Selectati varsta: <br><br> sub 16 <input type="radio" name="varsta" value="sub16"> | peste 16 <input type="radio" name="varsta" value="peste16"> <br><br> Introduceti parola : <input type="password" name="parola" value=""> <br><br> <input type="submit" name="Trimite" value="Trimite"> <input type="reset" name="Reseteaza" value="Reseteaza"> </form>
1.11. Preluarea datelor din formular 2.2.1. Transmiterea datelor scriptului de prelucrare
n interiorul marcajului <form> exist elementul action i method (care pot fi POST sau GET). n elementul action se pune calea ctre scriptul PHP care prelucreaz datele iar n method se pune metoda prin care se vor prelucra datele atunci cnd butonul Trimite este apsat. - 57 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 POST Aceasta metod face ca datele trimise prin formular s nu fie vizibile utilizatorului adic sunt trimise prin spatele paginii de Web i nu sunt afiate n caseta Address a browserului. GET Prin aceasta metod, datele trimise prin formular sunt vizibile n URL-ul afiat n caseta Address a browserului (adic n pagina de Web asociat i afiat n browser) 1.Transmiterea datelor spre server prin metoda POST Urmtorul exemplu creeaz pagina prin care se afieaz datele trimise prin formular: <?php echo $_POST['nume']; ?> Dup salvare se acceseaz din browser http://localhost/formular.html. Se va completa caseta Nume i apoi se apas butonul Trimite. n pagina formular.php invocat de formular.html se va afia numele introdus n caseta Nume din pagina anterioar (formular.html). Dup adugarea variabilelor $_POST corespunztoare formularului exemplul arat astfel: <?php echo 'Nume: '.$_POST['nume'].' <br> Prenume: '.$_POST['prenume'].' <br> Varsta: '.$_POST['varsta'].' <br> Parola: '.$_POST['parola'].' <br>'; ?>
Folosind variabila $_POST datele nu sunt afiate dect dac le definim $_POST[nume] n pagina formular.php. Numele din interiorul variabilei $_POST trebuie s fie acelai cu numele din interiorul elementelor din formular.html. De exemplu, n formular.html avem input-ul de la numele clientului potenial astfel: <input type="text" name="nume" value="" size=60 maxLength=15> Valoarea cmpului name al acestui element INPUT este nume. Acestuia i se va asocia n variabila $_POST, respectiv $_POST[nume] n continuare pentru prenumele clientului asocierea este previzibil. Urmtorului element din fiierul formular.html : <input type="text" name="prenume" value=""> i corespunde n fiierul formular.php elementul $_POST[prenume] . . . .a.m.d. - 58 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Rezultatul obinut este acelai n pagina Web, numai c informaiile formularului sunt postate i n adresa din browser(URL) sub forma unui ir n care elementele sunt separate de caracterul &:
Metoda POST dezvluie valorile transmise, ns este recomandabil pentru sigurana transmiterii. Transmiterea datelor spre server prin metoda GET- versiunea a II-a
Fiierul formular_POST_VERIF.html
<?php if(($_POST[nume] == ) || (is_numeric($_POST[nume])) || (strlen($_POST[nume]) < 5)) {echo Campul nume nu a fost completat corect. <br> <a href=formular_POST_VERIF.html>Apasati aici</a> pentru a va intoarce la formularul initial.; } else {echo Nume: .$_POST[nume]. <br> Prenume: .$_POST[prenume]. <br> Varsta: .$_POST[varsta]. <br> Parola: .$_POST[parola]. <br>; } ?>
Fiierul formular_POST_VERIF.php i mesajul de eroare afiat atunci cnd se completeaz greit. Condiia verificat este: dac variabila cu numele $_POST[nume] este goal, ori dac este numeric, ori dac numrul de caractere este mai mic de 5, atunci se va afia mesajul de eroare i se va propune ntoarcerea la formularul iniial. Dac toate condiiile sunt ndeplinite, atunci se va executa ramura else.
- 61 -
Fiierul FORMULAR2_met_POST.php gestioneaz formularul i activeaz scriptul actiune2_POST.php la acionarea butonului Trimite comanda. Elementele de control utilizate sunt de tipul checkbox
Fiierul actiune2_POST.php afieaz i verific existena datelor trimise prin metoda POST de fiierul FORMULAR2_met_POST.php. Elementele de control utilizate, de tipul checkbox, pot s nu iniializeze indecii i valorile asociate n variabila $_POST dac nu sunt selectai. Atunci pentru a evita mesajele de eroare generate n acest caz, se va verifica existena lor prin funcia boolean isset(). Fiierul actiune2_POST.php este activat de butonul "Trimite comanda". - 63 -
Protocolul http, care este utilizat n WWW, este lipsit de stri, adic nu introduce nici o posibilitate de memorare a unui utilizator i a aciunilor acestuia (i.e., serverul Web nu memoreaz cererile clientului). Utilizarea variabilelor cookie reprezint una dintre soluiile implementate n PHP (ca i n alte limbaje/platforme de programare) pentru pstrarea strii sesiunii. Rezolvarea problemei pstrrii valorilor unor variabile se face prin memorarea lor pe calculatorul utilizatorului i prin folosirea acestor valori atunci cnd este nevoie de ele. Ele sunt valori ale unor variabile PHP speciale, numite variabile cookie. Acestea sunt utilizate n diverse scopuri, de exemplu: pstrarea unor informaii privitoare la preferinele utilizatorilor (e. g., tema cromatic a site-ului); pstrarea unor date volatile (e.g., comenzile de produse n cadrul unui co de cumprturi). Pentru pstrarea informaiilor confideniale (aa cum sunt parolele) se utilizeaz variabilele sesiune (ale cror valori sunt pstrate la loc sigur, pe server). Pentru pstrarea diverselor variabile de stare privitoare la un anumit vizitator al unui site Web se pot utiliza variabilele cookie. Implementarea acestui mecanism de conservare temporar a informaiilor se realizeaz prin activarea n browser a posibilitii/opiunii de utilizare a variabilelor cookie. Aceasta este condiia sine qua non pentru funcionarea corect a exemplelor prezentate n continuare. Pentru a crea o variabil cookie n PHP, se folosete funcia predefinit setcookie al crei prototip este prezentat n continuare: int setcookie (string nume [, string valoare [, int moment_expirare [, string cale [, string domeniu [, int sigurana] ] ] ] ] ) - 64 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Explicitarea argumentelor funciei setcookie(): 1. nume este singurul argument obligatoriu al funciei; acest argument specific numele variabilei cookie. Dac este prezent numai argumentul nume, variabila cu numele nume va fi tears de pe calculatorul client; 2. valoare indic valoarea variabilei cookie; 3. moment_expirare indic momentul expirrii", dup care variabila cookie nu mai este accesibil; este un ntreg de tip timp UNIX, ntors de funciile PHP time() sau mktime (). a. Dac moment_expirare nu este precizat, este creat un cookie nepersistent (stocat n browserul utilizatorului, dar nu i pe hard-diskul acestuia) sau temporar. b. Dac moment_expirare este precizat n viitor, atunci este creat un cookie persistent (stocat ntr-un fiier situat pe hard-diskul utilizatorului i n browser). c. Dac moment_expirare este precizat n trecut, variabila cookie corespunztoare este tears (inclusiv de pe hard-diskul utilizatorului, n cazul cookie-urilor persistente). Cnd terge o variabil cookie, programatorul trebuie s asigure ca moment_expirare s fie n trecut, pentru a asigura declanarea mecanismului de eliminare a variabilei (mecanism asigurat de browser); 4. sigurana indic faptul c variabila cookie va fi trimis folosind o conexiune sigur (HTTPS). Valoarea 1 indic serverului s nu transmit variabila cookie n cazul n care conexiunea nu este sigur, iar valoarea 0 permite transmiterea variabilei cookie i prin conexiuni HTTP nesigure; 5. cale specific un URL asociat variabilei cookie. n mod obinuit (i.e., n absena acestui argument), variabila cookie poate fi utilizat numai de scripturile aflate n acelai director cu scriptul n care a fost definit variabila, precum i n subdirectoarele acestuia. Dac se dorete ca variabila cookie s poat fi folosit n scripturile altui director i ale subdirectoarelor acestuia, acest director trebuie s fie indicat n mod explicit prin specificarea cii sale; 6. domeniu permite specificarea unui nume de domeniu, astfel nct variabila cookie va putea fi utilizat numai n scripturile care aparin unui site din domeniul respectiv. n mod implicit, o variabil cookie poate fi folosit numai de scripturile aflate n acelai site Web n care se afl scriptul care a generat variabila respectiv; Observaii: Funcia setcookie() definete o variabil cookie care va fi trimis ca o parte a antetului HTTP. Prin urmare, apelul funciei setcookie() trebuie plasat nainte de marcajul <html> sau de o instruciune echo. Pentru evitarea acestei restricii se utilizeaz mecanismul output buffering. Utilizarea acestui mecanism presupune activarea, n prealabil, a directivei output_buffering (=On) n fiierul de configurare php.ini; Variabilele cookie vor deveni vizibile n pagina n care sunt definite numai la urmtoarea ncrcare a acesteia; O variabil cookie trebuie tears cu aceiai parametri utilizai la crearea ei (variabila va fi tears, oricum, la expirarea termenului, dac un astfel de termen este precizat); Argumentele se pot nlocui cu irul vid (), pentru a le omite; argumentele moment_expirare i sigurana sunt ntregi care nu pot fi nlocuii cu iruri vide (n schimb, poate fi folosit valoarea 0- zero). Numele tuturor variabilelor cookie (persistente i nepersistente) definite la un moment dat, precum i valorile acestora pot fi obinute utiliznd tabloul global asociativ HTTP_COOKIE_VARS sau tabloul $_COOKIE (acesta din urm ncepnd cu versiunea 4.1.0 a limbajului PHP). n cazul n care se utilizeaz IIS (Microsoft Internet Information Server) trebuie fcut o modificare n fiierul de configurare .\PHP\php.ini cu rolul de a dezactiva variabila cgi.force_redirect fr a afecta securitatea serverului de Web. Fiierul de configurare - 65 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 .\PHP\php.ini poate fi adaptat dupa sursa php.ini-recommended aflat tot n folder-ul PHP:
; cgi.force_redirect is necessary to provide security running PHP as a CGI under ; most web servers. Left undefined, PHP turns this on by default. You can ; turn it off here AT YOUR OWN RISK ; **You CAN safely turn this off for IIS, in fact, you MUST.** cgi.force_redirect = 0
Deoarece variabilele cookie persistente sunt pstrate pe hard-disk-ul utilizatorului, acestea pot fi citite de persoane ruvoitoare. De aceea, se impune criptarea acestora prin intermediul funciilor Mcrypt, din biblioteca libmcrypt. Aceast bibliotec nu face parte din distribuia standard PHP. De asemenea, se poate utiliza criptarea PHP prin intermediul funciilor md5() i crypt(), incluse n distribuia standard PHP. Crearea i utilizarea variabilelor cookie n acest exemplu sunt create dou variabile cookie persistente ($var1cookie i $var2cookie) i o variabil cookie nepersistent ($var3cookie).
Valorile variabilelor cookie definite n scriptul prezentat anterior sunt stocate n 3 elemente ale tabloului superglobal $_COOKIE: $_COOKIE ['var1cookie'] , $_COOKIE['var2cookie'] i $_COOKIE ['var3cookie']. Ele vor fi afiate la a doua execuie a scriptului (dup operaia de Refresh/Reload). Ca o msur de securitate sporit, browserul poate fi setat astfel nct i cookie-urile s ntrebe utilizatorul dac le accept sau nu. Locul de pe hard-disk-ul utilizatorului n care se stocheaz cookie-urile persistente depinde de navigatorul utilizat. Informaiile prezentate n continuare se refer 1a navigatorul Internet Explorer-6.0. n cazul sistemului de operare Windows XP, fiierele acestea se gsesc n directorul c:\Documents and Settings\Administrator\Cookies\ (dac suntei logat ca Administrator) sau n directorul c:\Documents and Settings\Utilizator\Cookies (dac suntei logat n contul utilizatorului Utilizator). Coninutul fiierului administrator@COOKIE[1].txt de pe aceast cale poate fi examinat prin editare cu un editor ASCII obinuit(Notepad sau Wordpad). Variabilele cookie persistente pot fi terse astfel: Automat, n momentul expirrii lor; n mod explicit, de ctre serverul care le-a produs (prin intermediul navigatorului, nainte de momentul expirrii lor); n mod explicit, de ctre utilizator (prin intermediul navigatorului); n mod explicit, de ctre utilizator, prin tergea de pe hard-disk a fiierului n care sunt stocate variabilele persistente (nainte de momentul expirrii lor). - 66 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Variabilele cookie nepersistente pot fi terse astfel: Automat, la nchiderea instanei navigatorului care le posed; n mod explicit, de ctre serverul care le-a produs (prin intermediul navigatorului, nainte de nchiderea instanei navigatorului). tergerea variabilelor cookie (persistente i nepersistente)
- 67 -
Comenzile inserate n interfaa CGI a serverului MySQL. # Mai nti se creeaz baza de date librrie i tabelele carti i reviste incluse n ea: mysql> create database librarie; mysql> use librarie; mysql> create table carti (titlu VARCHAR(100) PRIMARY KEY, ->autor VARCHAR(50)); mysql> create table reviste(nume VARCHAR(100) UNIQUE);
Interogarea CREATE TABLE n sintaxa acceptat de MySQL Query Browser CREATE TABLE `librarie`.`carti` ( `Titlu` VARCHAR(100), `Autor` VARCHAR(50), PRIMARY KEY(`Titlu`)) TYPE = InnoDB;
- 69 -
Interogarea CREATE TABLE n sintaxa acceptat de MySQL Query Browser CREATE TABLE `librarie`.`reviste` ( `Nume` VARCHAR(100) NOT NULL, PRIMARY KEY(`Nume`)) TYPE = InnoDB;
Comenzile inserate n interfaa CGI a serverului MySQL. # Se introduc nregistrri n cele dou tabele carti i reviste: mysql> INSERT INTO carti VALUES ('carte_1','autor_1'); .................................................................................................................. mysql> INSERT INTO carti VALUES ('carte_10','autor_10'); mysql> INSERT INTO reviste VALUES ('revista_1') ; .................................................................................................................. mysql> INSERT INTO reviste VALUES (' revista__10 ' ) ;
- 70 -
Scriptul complet care realizeaz secvena complet de operaii: 1. 2. 3. 4. Crearea bazei de date librarie Crearea tabelelor carti i reviste Completarea structurii tabelelor carti i revistecu cmpul suplimentar pret Introducerea a cte 10 nregistrri generice n tabelele carti i reviste
- 71 -
n continuare este prezentat codul-surs PHP inclus n cele trei fiiere componente ale aplicaiei co_de_cumprturi: 1. index.php- Include celelate 2 fiiere. Genereaz formularul iniial pentru apelul a 5 operaii: a. Adaug produse n coul virtual de cumprturi electronice b. Afieaz produsele din coul virtual de cumprturi electronice c. Adaug datele personale ale clientului d. Afieaz variabilele COOKIE generate n timpul sesiunii e. Finalizeaz cumprturile prin efectuarea calculelor preului total al coului
- 72 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 2. oferta.php- Conine 2 funcii de afiare a ofertei de produse: a. carti() #funcia pentru afiarea produselor (cri) disponibile b. reviste() #funcia pentru afiarea produselor (reviste) disponibile operatii.php- Conine 7 funcii de gestionare a operaiilor de comer electronic: a. adauga_carte($carte,$nr_carti) #permite adugarea crii selectate n co. b. adauga_revista($revista,$nr_reviste) #permite adugarea revistei select. n co. c. afiseaza() #determin afiarea coninutului coului de cumprturi d. cumpara() #functia care permite efectuarea operaiei de cumprare a produselor e. adauga_date() # afieaz un formular pentru datele personale ale utilizatorului f. stocheaza_date() #stocheaz datele personale ale utilizatorului n var. cookie date g. afiseaza_var_cookie()#afieaz toate variabilele cookie generate n sesiune
3.
- 73 -
- 74 -
- 75 -
- 76 -
- 77 -
- 78 -
- 79 -
Document XML
Figura 1.2.
Procesarea XSL a documentelor XML i tipurile de documente rezultate n urma procesrii lor.
Caracteristici XML: XML a fost proiectat pentru transportul datelor i nu pentru formatarea afirii lor; Marcajele XML nu sunt predefinite ci se definesc ad-hoc de utilizator; XML a fost proiectat s fie auto-descriptiv; XML este o recomandare a Consoriului W3C
- 80 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 n februarie 1998, ulterior acest standard a mai fost revizuit de dou ori n octombrie 2000 i respectiv n februarie 2004. Scopurile urmrite n proiectarea lui XML sunt: 1. XML trebuie s fie simplu de utilizat pe Internet. 2. XML trebuie s suporte o mare varietate de aplicaii. 3. XML trebuie s fie compatibil cu SGML. 4. Trebuie s fie uor de scris programele ce vor procesa documente XML. 5. Numrul facilitilor opionale din XML sunt reduse la minimum, ideal, la zero. 6. Documentele XML trebuie s fie citibile de ctre utilizatori i clare ntr-un mod rezonabil. 7. Designul XML ar trebui s fie pregtit rapid. 8. Designul XML trebuie s fie formal i concis. 9. Documentele XML trebuie s fie uor de creat. 10. Caracterul lapidar din marcajele XML s fie de o importan minim. Diferenele dintre XML i HTML: XML nu nlocuiete HTML, ci este o completare a sa. XML i HTML au fost proiectate pentru scopuri diferite: XML a fost proiectat pentru transportul i stocarea datelor i este focalizat pe coninutul lor; HTML a fost proiectat pentru afiarea datelor i este focalizat pe formatarea aspectului lor.
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Elementele unui document XML alctuiesc un arbore. Toate elementele pot avea sub-elemente (elemente fiu sau descendente): <root> <fiu> <sub-fiu>.....</sub-fiu> </fiu> </root> Toate elementele pot avea un coninut text i atribute precum n HTML.
Elementul root: <librarie>
Parinte
(ascendent)
Fiu
(descendent)
Atribut: limba
Element: <carte>
Atribut: categorie
Element: <titlu>
Element: <autor>
Element: <an>
Element: <pret>
Text: 2003
Text: 39.95
Figura 1.3.
<librarie> <carte categorie="SCIENCE FICTION"> <titlu limba="en">2001. A Space Odissey</titlu> <autor>Arthur C. Clarke</autor> <an>1972</an> <pret>30.00</pret> </carte> <carte categorie="AVENTURI"> <titlu limba="en">Harry Potter</titlu> <autor>J K. Rowling</autor> <an>2005</an> <pret>29.99</pret> </carte>
- 82 -
Un alt exemplu de reprezentare a unui document XML destinat transmiterii si stocrii potei electronice este urmtorul:
Figura 1.4.
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Exemplul 10.1. Fiierul mail.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE MAIL SYSTEM "MAIL.DTD"> <MAIL id="10" date="23-03-2008"> <FROM>ezaharescu@univ-ovidius.ro</FROM> <TO>admin@@univ-ovidius.ro</TO> <SUBJECT>Anunt</SUBJECT> <BODY> Informaii </BODY> </MAIL>
Prologul:
<?xml version="1.0" encoding="UTF-8"?>
Este o instruciune de procesare. Ea informeaz ca urmeaz descrierea unui fiier XML ce respect versiunea de specificaie 1.0 iar setul de caractere utilizat este codat UTF-8 (8-bit Unicode Transformation Format) Definiia tipului de document:
<!DOCTYPE MAIL SYSTEM "MAIL.DTD">
Precizeaz c fiierul MAIL.DTD conine declaraia tipului de document (DTD=Document Type Definition), document ce are ca rdcin tag-ul MAIL. Acesta este un set de reguli ce definesc structura unui fiier XML. Elementul rdcin:
<MAIL id="10" date="23-03-2008"> <FROM>ezaharescu@univ-ovidius.ro</FROM> <TO> admin@@univ-ovidius.ro</TO> <SUBJECT>Anunt</SUBJECT> <BODY> Informaii </BODY> </MAIL>
- 84 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Elemente Atribute Comentarii Entiti Seciuni CDATA Instruciuni de procesare Declaraia tipului de document
10.5.1.
Elementele
Elementele sunt blocurile de baz ale unui document XML. Pot fi folosite att pentru a reine informaii, ct i pentru definirea structurii documentului. Un element ncepe cu un marcaj de start si se termina cu corespunztorul marcaj de sfrit:
<nume_marcaj > ........ </nume_marcaj >
marcajul de start marcajul de sfrit Un element poate fi vid, adic poate s nu conin nimic. Sintaxa pentru un element vid este urmtoarea:
<nume_marcaj/>
Observaie: Marcajele sunt case sesitive, adic se face distincia ntre literele majuscule i literele minuscule. Astfel, urmtoarele exemple de marcaje sunt greite:
<Student>Popescu</STUDENT> <StudenT>Popescu</student>
Numele unui marcaj este o succesiune de caractere alfa-numerice ce ncepe obligatoriu cu o liter. Astfel <7nume> este eronat. Elementele sunt utilizate nu numai pentru a reine informaii, ele se utilizeaz i pentru a defini structura documentului: Exemplul 10.2. Biblioteca.XML
<?xml version="1.0"?> <BIBLIOTECA> <CARTE> <TITLU>XML Bible</TITLU> <AUTOR>Elliotte Rusty Harold</AUTOR> <EDITURA>IDG Books Worldwide</EDITURA> <AN_APARITIE>2002</AN_APARITIE> </CARTE> </BIBLIOTECA>
n acest exemplu, observm c elementele <TITLU>, <AUTOR>, <EDITURA>, <AN_APARITIE> conin informaii, n timp ce elementele <BIBLIOTECA>, <CARTE> sunt
- 85 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 folosite doar pentru a defini structura datelor. Prin folosirea lor, datele sunt mai bine organizate, facilitnd eventualele operaii de cutare, afiare sau sortare a datelor.
10.5.2.
Atributele
Atributele au rolul de a descrie elementele. Atributele n XML sunt aceleai cu atributele din HTML. De exemplu, un atribut al elementului <table> ar fi align="center". Atributele sunt localizate n marcajul de start al unui element, imediat dup numele elementului i sunt urmate de semnul = i de valoarea atributului delimitat de ghilimele (aici se gsete i explicaia regulii care interzice apariia spaiilor albe n numele unui element). Daca valoarea unui atribut nu este delimitat de ghilimele va fi semnalat o eroare de ctre analizorul XML, la fel ca i n cazul n care pentru un atribut nu ar apare i valoarea acestuia. Astfel, sintaxa general este urmtoarea:
<nume_marcaj numeAtribut1="valoare1"... numeAtributN="valoareN">...</nume_marcaj>
Pentru un element pot exista oricte atribute, att timp ct sunt declarate corect. Exemplul 10.3. Atributele elementelor XML
<?xml version="1.0"?> <BIBLIOTECA> <CARTE cota="12345" limba="engleza" > <TITLU>XML Bible</TITLU> <AUTOR>Elliotte Rusty Harold</AUTOR> <EDITURA> IDG Books Worldwide</EDITURA> <AN_APARITIE>2002</AN_APARITIE> </CARTE> </BIBLIOTECA>
10.5.3.
Comentariile
Comentariile sunt secvene de caractere ce pot aprea oriunde n document n afara altor marcaje ce sunt utilizate pentru a descrie anumite detalii legate de coninutul i structura documentului programatorului. Ele nu fac parte din datele caracter ale documentului. Un procesor XML poate s dea un acces aplicaiilor la comentarii, fr a fi ns obligatoriu. Un comentariu ncepe cu secvena <!-- si se ncheie cu -->.
<!-- comentariu -->
Comentariile pot fi orict de lungi, nu exist limite n ceea ce privete lungimea lor. De asemenea, un comentariu nu poate s conin secvena de caractere "--".
- 86 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Exemplul 10.4. Comentariile n XML
<?xml version="1.0"?> <!-- Documentul contine cartile dintr-o biblioteca --> <BIBLIOTECA> <CARTE cota="12345" limba="engleza" > <!-- titlul cartii --> <TITLU>XML Bible</TITLU> <!-- Autorul Cartii --> <AUTOR>Elliotte Rusty Harold</AUTOR> <!-- Editura in care a aparut cartea --> <EDITURA> IDG Books Worldwide</EDITURA> <!-- Anul de aparitie a cartii --> <AN_APARITIE>2002</AN_APARITIE> </CARTE> </BIBLIOTECA>
10.5.4.
Referinele la entiti
Referinele la entiti sunt de fapt pointeri ctre entiti. n XML, entitile sunt uniti de text, unde o unitate poate fi orice, de la un singur caracter la un ntreg document sau chiar o referin la un alt document. Sintaxa referinelor la entiti este &, urmat de numele entitii, urmat de ;:
&nume_entitate;
Una dintre cele mai frecvente utilizri ale referinelor la entiti este atunci cnd se dorete folosirea unor caractere care ar duce la apariia unor confuzii pentru analizorul XML i deci care nu ar trebui s apar n forma lor normal n text. n acest caz exist cinci entiti predefinite n XML: Tabelul 10.1. Entitate < > & ' Entiti definite in XML Referina la entitate < > & '
" "e; n momentul n care analizorul XML ntlnete referina la o entitate n document, el o va substitui cu datele la care aceasta se refer i va returna documentul cu toate nlocuirile realizate. Exemplul 10.5. Entitile n XML
- 87 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 O alt utilizare frecvent a referinelor la entiti apare n cazul documentelor XML ce conin fragmente de text care se repet. Pentru a nu repeta scrierea acestor poriuni de text de mai multe ori se va defini o entitate care va avea ca valoare acea poriune de text i de fiecare dat cnd fragmentul respectiv apare n document vom folosi numai referina la entitate. Prin folosirea referinelor la entiti se vor obine documente mai scurte i se va scurta timpul de redactare.
10.5.5.
Instruciunile de prelucrare
Instruciunile de prelucrare sunt un tip special de marcaj care conin informaii despre anumite aplicaii ce urmeaz a fi executate. Sintaxa general a unei instruciuni de procesare ar fi urmtoarea:
<?aplicatie instructiune="valoare" ?>
Instruciunile de prelucrare ncep cu <?, urmat de numele aplicaiei i de specificarea unor elemente ce in de acea aplicaie i se ncheie cu ?>. Numele aplicaiei trebuie s fie diferit de xml sau XML, sau alte moduri de scriere a acestui cuvnt, deoarece cuvintele de acest tip sunt rezervate, urmnd a fi standardizate ntr-o versiune ulterioar.
10.5.6.
Seciunile CDATA
Seciunile CDATA sunt utilizate pentru a include blocuri de text coninnd caractere care altfel ar fi recunoscute ca marcaje. Seciunile CDATA ncep cu irul <![CDATA[ i se termin cu irul ]]>. Seciunile CDATA sunt folosite n general atunci cnd se dorete ca datele incluse n interiorul lor s nu fie interpretate de ctre analizor, ci s fie considerate date caracter. Astfel de situaii se ntlnesc cnd dorim s includem caractere ca <, >, & etc. care ar putea crea confuzii analizorului XML i folosirea lor ar putea duce chiar la generarea de erori sau cnd dorim s includem marcaje care s fie considerate drept date caracter i s fie expuse utilizatorului ca atare. Spre exemplificare, considerm un fragment de document XML care conine informaii despre cum se poate crea un tabel n HTML:
<?xml version="1.0" encoding="UTF-8"?> <exemplu> Un exemplu de creare a unui tabel in HTML: <![CDATA[ <table align=center> <tr> <td>Coloana 1</td> <td>Coloana 2</td> </tr> </table> ]]>; </exemplu>
- 88 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 Folosind seciunea CDATA, analizorul va ignora coninutul acesteia i datele vor fi expuse utilizatorului exact n forma n care sunt. Datele, deci, nu vor fi interpretate drept marcaje, ci drept date caracter. O restricie de sintax este faptul ca n interiorul seciunilor CDATA nu poate s apar irul ']]'. nc un lucru de reinut este c seciunile CDATA nu pot fi incluse unele in altele.
10.5.7.
Declaraia tipului de document este un marcaj special ce poate fi inclus n documentele XML cu rolul de a specifica existena i locaia definiiei tipului de document (DTD Document Type Definition). Declaraia tipului de document i definiia tipului de document sunt noiuni diferite. DTD-ul este un set de reguli care definesc structura unui document XML, spre deosebire de declaraia tipului de document care are rolul de a transmite analizorului XML informaia despre definiia DTD ce trebuie s o foloseasc pentru verificare i validare. Sintaxa declaraiei tipului de document difer n funcie de tipul DTD-ului: intern sau extern. Considernd c avem un document XML numit doc.xml, modul de asociere dintre structura sa i setul de reguli specificate n reguli.dtd se realizeaz prin inserarea in documentul XML, imediat dup declaraia XML, a urmtoarei declaraii referitoare la tipul documentului:
<!DOCTYPE root SYSTEM "reguli.dtd">
unde root este elementul rdcin al documentului XML, iar reguli.dtd este numele DTD-ului asociat documentului. n cazul n care DTD-ul este intern, declaraia tipului de document va avea urmtoarea form:
<!DOCTYPE element_rdcin [ <!-- Setul de reguli--> ]>
Primul marcaj deschis trebuie sa fie ultimul care este nchis. Marcajele trebuie nchise exact n ordinea invers a deschiderii lor, altfel va fi semnalat eroare. Numele atributelor sunt unice n cadrul unui element Cu alte cuvinte un document XML este bine alctuit dac respect regulile sintactice descrise de standardul XML.
- 89 -
- 90 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 2. Se apas Next, apoi (dup ce se citete textul) se selecteaz opiunea "I accept the terms in the license agreement" -aceasta opiune nseamn c s-au citit i s-au citit acceptat termenii din licen i c se poate trece mai departe la instalare (se apas Next). Va apare o fereastr n care se completeaz cmpurile, exemplu:
3.
Se apas Next > Next > Next > Install i se ateapt s se efectueze instalarea. n final se apas Finish pentru a termina. Daca serverul s-a instalat cu succes se analizeaz zona trailer a sistemului de operare (Taskbar). Se poate observa dac serverul ruleaz
4.
Se acceseaz http://localhost/ . Daca pagina arat ca cea de mai jos, nseamn c serverul Apache a pornit i funcioneaz.
- 91 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 5. Fiecare server/pachet instalat are cte un fiier de configurare. Fiierul de configurare al serverului Apache este httpd.conf care se poate gsi n folderul din C:\Program Files\Apache Group\Apache2\conf\. Se intr n C:\Program Files\Apache Group\Apache2\htdocs\, se terge tot de acolo i se creeaz un fiier test.html n care se introduce codul: <html> <head> <title>Primul HTML</title> </head> <body> Acesta este un test HTML </body> </html> Se salveaz i se acceseaz n browser URL-ul: http://localhost/test.html Se observ dac serverul Apache ruleaz HTML-ul.
6.
- 92 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 3.3. Se caut: display_errors = Off i se schimb cu: display_errors = On (Aceast operaiune se face pentru a seta ON afiarea erorilor) 3.4. Se caut : session.save_path = /tmp i se schimb cu: session.save_path = C:\Program Files\Apache Group\php\sesiuni. Se intr apoi n folderul cu php (C:\Program Files\Apache Group\php) i se creeaz un folder cu numele sesiuni. (Aceast operaiune se face pentru a seta calea ctre sesiunile temporare de pe server)
Modificrile necesare n fiierul httpd.conf Se deschide fiierul de configurare al serverului Apache, aflat n C:\Program Files\Apache Group\Apache2\conf sub numele de httpd.conf i se efectueaz urmtoarele modificri: 1. Se adaug la sfritul fiierului, urmtoarele 3 linii : ScriptAlias /php/ "C:/Program Files/Apache Group/php/" AddType application/x-httpd-php .php Action application/x-httpd-php "/php/php.exe" 2. Se caut linia: DirectoryIndex index.html i se schimb cu: DirectoryIndex index.html index.php. n final se salveaz i se repornete serverul Apache. Se intr n C:\Program Files\Apache Group\Apache2\htdocs i se creeaz un fiier cu numele test.php n care se introduce codul de mai jos : <?php echo 'Primul script PHP'; ?> 4. Se salveaz i se acceseaz n browser: http://localhost/test.php. Internet browser-ul ar trebui s afieze urmtoarea imagine/text:
3.
- 93 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 5. Pentru a putea vedea configuraia PHP, se realizeaz un fiier cu numele phpinfo.php, n care se pune codul: <?php phpinfo(); ?> Se salveaz i se acceseaz n browser: http://localhost/phpinfo.php. Internet browser-ul ar trebui s afieze urmtoarea imagine/text:
Modificrile n fiierul php.ini necesare activrii extensiilor/bibliotecilor dinamice PHP n continuare, se activeaz extensiile necesare tergnd ; din faa extensiei i verificnd dac extensia activat se afl n directorul C:\Program Files\Apache Group\php\extensions. De exemplu pentru activarea bibliotecii dinamice grafice ar trebui fcut urmtoarea modificare: ;extension=php_gd2.dll .. Se terge ; i va apare: extension=php_gd2.dll Pentru activarea extensiei/bibliotecii dinamice MySQL linia corespunztoare este: extension=.\EXT\php_mysql.dll Instalarea unui mediu integrat de dezvoltare a aplicaiilor PHP (e.g. DzSoft PHP Editor) 1. Pentru editarea i testarea scripturilor php i a paginilor HTML este recomandabil utilizarea unui mediu integrat de dezvoltare cum ar fi DzSoft PHP Editor al crui kit este accesibil la adresa http://www.dzsoft.com/dzphp.htm:
- 94 -
2.
Dac dup instalare se recepioneaz o astfel de eroare referitoare la imposibilitatea pornirii serverului HTTP deoarece portul TCP 80 (declarat implicit de DzSoft PHP Editor) este blocat de o alt aplicaie:
Atunci se va efectua urmtoarea reconfigurare a portului TCP pentru serverului HTTP al lui DzSoft PHP Editor (valoarea propus 8080 este, de cele mai multe ori, valabil):
- 95 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 3. Reconfigurarea portului TCP pentru serverului HTTP al lui DzSoft PHP Editor (cu valoarea propus 8080) n fereastra de configurare (Run Options | HTTP Server Options) :
4.
Ceilali parametri de configurare sunt setai la valori implicite corecte, care nu creaz probleme de la prima rulare. Totui ei sunt disponibili spre a fi, eventual, modificai n a doua fi a ferestrei de configurare (Run Options | Parameters) :
- 96 -
3.
4.
n timpul instalrii va apare o fereastr unde se va cere s se creeze un cont sau sa v autentificai la www.MySQL.com . Se selecteaz Skip Sing-Up i apoi se finalizeaz prin apsarea butonului Next apoi Finish. Dup instalare, se va deschide o fereastr pentru configurarea serverului mysql. Se apas Next, apoi se selecteaz opiunea Standard Configuration. Se continu cu Next > Next i setarea parolei, cu care se va face autentificarea la serverul mysql. Se apas Next > Execute > Finish pentru a ncheia procedura de configurare.
5. 6.
- 97 -
2.
Atunci, se intr n C:\Program Files\Apache Group\Apache2\htdocs\phpmyadmin i se deschide fiierul config.inc.php. Apoi se caut linia: ($cfg['Servers'][$i]['password'] = '';) i se scrie parola aleas: (de exemplu: $cfg['Servers'][$i]['password'] = 'parolamysql';) Se salveaz i apoi se efectueaz un refresh la pagina http://localhost/phpmyadmin Dac rezultatul va fi ca cel prezentat mai jos nseamn c trebuie s actualizm parola mysql:
3.
4.
Se apas pe butonul Start de la Windows (jos, stnga) apoi n caseta run se scrie cmd, i se apas butonul OK. Se tasteaz comanda cd ../../Program Files/Apache Group/MySQL/bin apoi mysql -u root p. Se observ c se cere parola de mysql. Introducei parola pe care ai setat-o n momentul instalrii serverului MySQL apoi apsai Enter. 5. Dup ce v autentificai, se observ intrarea n consola MySQL: C:\Program Files\Apache Group\MySQL\bin>mysql -u root -p Enter password: ********* Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 to server version: 4.1.13a-nt Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> Se tasteaz comanda: SET PASSWORD FOR root@localhost=OLD_PASSWORD('parolaDvs'); apoi apsai Enter Se tasteaz comanda FLUSH PRIVILEGES; i se apas din nou Enter. - 98 -
Eugen ZAHARESCU Programare Web - CURS InfoDida-1 6. Se nchide fereastra apoi se efectueaz refresh la pagina http://localhost/phpmyadmin/ i scriptul se va ncrca. Dac nc se vor observa nite erori: The $cfg['PmaAbsoluteUri'] directive MUST be set in your configuration file! The mbstring PHP extension was not found and you seem to be using a multibyte charset. Without the mbstring extension phpMyAdmin is unable to split strings correctly and it may result in unexpected results. Atunci se caut linia $cfg['PmaAbsoluteUri'] n config.inc.php i se modific din : $cfg['PmaAbsoluteUri'] = ''; n $cfg['PmaAbsoluteUri'] = 'http://localhost/phpmyadmin'; Se efectueaz Refresh la pagin i se observ c a rmas doar eroarea legat de extensia mbstring deoarece acea extensie nu a fost activat din php.ini: Se intr n C:\Program Files\Apache Group\php i se deschide fiierul php.ini. Se caut linia ;extension=php_mbstring.dll i se activeaz eliminnd ; din faa ei astfel nct rezultatul s fie extension=php_mbstring.dll Se salveaz i apoi se efectueaz Refresh din nou la pagin. Se va observa c erorile au disprut, iar scriptul phpMyAdmin ruleaz fr probleme.
7.
Observaie: Pentru a da posibilitatea i altor persoane s acceseze scripturile PHP, ele trebuie incluse ntr-un domeniu gzduit pe un server ce s suporte PHP i MySQL. n reeaua Internet sunt foarte multe site-uri ce ofer n mod gratuit aceste servicii cu unele incoveniene (limitarea accesului la funciile PHP, introducerea reclamelor n pagin, etc.) http://www.3x.ro; http://www.as.ro/, http://site.ro/nume_user. Exist ns i alte site-uri (de exemplu: http://www.mxhost.ro/ ) care permit cumprarea unui domeniu .com, .org sau .net, cu posibilitatea crerii a 100 adrese de email @domeniul_dumneavoastra.com, 3 baze de date MySQL, scripturi deja realizate i o gzduire bun la un pre foarte accesibil.
- 99 -
Se deschide Control Panel (Start> Control Panel); Se deschide Add or Remove Programs; Se selectez Add/Remove Windows Components din partea stng a ferestrei; Se selectez apoi Internet Information Services (IIS);
- 100 -
Se apas pe Details i se verific selecia opiunii FrontPage < version > Server Extension Avnd kit-ul sistemului de operare Windows XP la ndemn se apas OK, apoi Next; Se indic locaia exact a kit-ului de Windows XP n fereastr (implicit unitatea de CD) Se apas butonul Finish.
O alt variant de instalare este utilizarea opiunii Install optional Windows components din meniul CD-ului de instalare a sistemului de operare Windows XP
- 101 -
Pentru a testa dac tot ce am fcut pn acum funcioneaz, vom deschide navigatorul Web preferat i vom introduce ca adres localhost. Dac totul funcioneaz, se vor deschide dou ferestre una dintre ele avnd ca titlu Welcome to Windows XP Server Internet Services, iar cealalt coninnd un manual pentru el. Dac nu se deschide nici o fereastr i apare mesajul The page cannot be displayed atuncii repetai paii descrii mai sus, ncepnd de la punctul 1.
- 102 -
http://dev.mysql.com/downloads/mysql/5.1.html#win32
3.3. Pentru toate versiunile sistemului de operare WINDOWS sunt disponibile urmtoarele
variante desccare:
Arhiv zip fr procedur de instalare doar prin dezarhivare n calea de accessrdcina discului C:\ (mysql-noinstall-5.1.17-beta-win32.zip): http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-noinstall-5.1.17-betawin32.zip/from/pick
3.4. Pentru o administrare elegant a serverului MySQL i o gestionare facil a bazelor de date
este recomandabil folosirea utilitarelor MySQL Administrator i MySQL Query Browser disponibile pentru descrcat n dou versiuni de la adresele:
1.
Cu program i procedur de instalare(mysql-gui-tools-5.0-r11a-win32.msi): http://dev.mysql.com/get/Downloads/MySQLGUITools/mysql-gui-tools-5.0-r11awin32.msi/from/pick Fr procedur de instalare doar prin dezarhivare n calea de access-rdcina discului C:\ (mysql-gui-tools-noinstall-5.0-r11a-win32.zip): http://dev.mysql.com/get/Downloads/MySQLGUITools/mysql-gui-tools-noinstall-5.0-r11awin32.zip/from/pick
2.
- 103 -
Connectivity) http://dev.mysql.com/downloads/connector/odbc/5.0.html. Pentru toate versiunile sistemului de operare WINDOWS sunt disponibile urmtoarele variante desccare 1. Arhiva de tip msi Installer (mysql-connector-odbc-5.00.11-beta-gplwin32.msi) sau http://dev.mysql.com/downloads/connector/odbc/5.1.html#win32
http://dev.mysql.com/get/Downloads/Connector-ODBC/mysql-connector-odbc-5.00.11beta-gpl-win32.msi/from/pick
2.
beta-gpl-win32.msi.zip):
http://dev.mysql.com/get/Downloads/Connector-ODBC/mysql-connector-odbc-5.00.11beta-gpl-win32.zip/from/pick
3.
Arhiv zip fr procedur de instalare doar prin dezarhivare n calea de accessrdcina discului C:\ (mysql-connector-odbc-noinstall-5.00.11-beta-win32.zip): http://dev.mysql.com/get/Downloads/Connector-ODBC/mysql-connector-odbc-noinstall5.00.11-beta-win32.zip/from/pick
- 104 -
(Open Data Base Connectivity) printr-o operaie de definire a unui descriptor de surs de date ODBC (Data Source Name):
- 105 -
Se salvez fiierul cu numele test.php i se copiaz n directorul c:\Inetpub\wwwroot. Se deschide un navigator i se introduce adresa http://localhost/test.php. Dac totul a fost instalat n bune condiii, atunci ar trebui s apar o pagin de Web cu informaii referitoare la PHP, generat de funcia predefmit phpinfo(). Printre informaiile afiate se numr versiunea curent a serverului PHP, extensiile disponibile, suportul pentru procesarea diverselor tipuri de documente etc. Alt alternativ de instalare o constituie aplicaia PHPTriad de la adresa urmtoare: http://sourceforge.net/projects/phptriad
4.1.
- 106 -
4.3.
- 107 -