Professional Documents
Culture Documents
LUCRARE DE LICEN
Cuprins
Introducere..............................................................................................................4 ......................................................................................................................5 Capitolul 1........................................................................................................................6 1.1 Avantajele limbajului PHP......................................................................................6 1.2 Sintaxa PHP...............................................................................................................7 1.3 Comentarii.................................................................................................................8 ...............................................................................................................................8 1.4 Tipuri de date n PHP.................................................................................................8 1.5 Variabile.....................................................................................................................9 1.6 Constante..................................................................................................................11 1.7 Operatori.................................................................................................11 1.8 Expresii..............................................................................................14 1.9 Tablouri...................................................................................15 1.10 Structuri de control...................................................................................16 1.10.1 Instruciuni conditionale..................................................................16 1.10.2 Instruciuni repetitive...................................................................................18 1.11 Funcii....................................................................................................19 1.11.1 Funcii predefinite .....................................................................20 1.11.2 Funcii utilizator .................................................................20 ............................................................................................................21 1.11.3 Transmiterea parametrilor............................................................21 1.11.4 Funcii recursive..............................................................................................21 1.12 Clase i obiecte.......................................................................................................21 1.12.1 Definirea unei clase.........................................................................................21 1.12.2 Constructori.....................................................................................................22 1.12.3 Motenire........................................................................................................23 1.13 Reutilizarea codului ............................................................................................23 ..................................................................................................................................23 1.13.1 Instruciunea require.......................................................................................23 1.13.2 Instruciunea include.....................................................................................24 1.14 Controlul sesiunilor................................................................................................24 Capitolul 2......................................................................................................................26 2.1 Noiuni generale.......................................................................................................26 2.2 Proiectarea unei baze de date...................................................................................27 Normalizarea unei baze de date relaionale.....................................................27 2.3 Elemente de limbaj ..................................................................................................28 2.3.1 Comentarii ..........................................................................28 2.3.2 Tipuri de date....................................................................................................28 .......................................................................................................................30 2.3.3 Operatori .....................................................................................................30 .......................................................................................................................................31 ....................................................................................................................................31 2.4 Crearea unei baze de date i gestiunea acesteia.......................................................31 2.4.1 Crearea unei tabele............................................................................................31
2.4.2 tergerea unei tabele.........................................................................................32 2.4.3 Inserarea datelor n tabele....................................................................32 2.4.4 tergerea datelor din tabele.................................................................34 2.4.5 Extragerea informaiilor din tabele.......................................................34 2.5 Folosirea alias-urilor................................................................................................36 2.6 Accesul la o baz de date................................................................................36 2.6.1 Utilizatori i parole .....................................................................................36 ..................................................................................................................37 2.6.2 Privilegii MySQL..........................................................................37 ....................................................................................................................................39 ...................................................................................................................................39 ................................................................................................................................40 Capitolul 3......................................................................................................................40 3.1 Conectarea la serverul MySQL................................................................40 3.2 Interogri.................................................................................41 3.3 Cutarea i afiarea rezultatelor........................................................................42 Concluzii........................................................................................................................43 ......................................................................................................................................43 Bibliografie....................................................................................................................44
Introducere
ntr-o epoc modern ca aceasta n care trim, poi rezolva totul cu ajutorul internetului printr-un simplu click o singur apsare a mouse-ului i ai cumprat rochia pe care i-o doreai sau ai aflat ultimele tiri. Nu ai mai intrat demult ntr-o librrie, dar ai acas toat colecia semnat Coelho, fie c trieti ntr-un mare ora sau ntr-un orael provincial, dac ai acces la internet poi face orice. Totui, pentru ca aceste lucruri s se ntample muli oameni lucreaz la actualizarea paginilor, la meninerea acestora sub o form interesant, care s atrag mereu vizitatori. Cum internetul este ntr-o continu dezvoltare, i nevoia de a implementa pagini web dinamice crete. Ce ar fi dac pentru un magazin online, de exemplu, ar trebui modificate preurile sptmnal? Asta ar nsemna rescrierea sutelor de resurse HTML, i un timp exagerat de mare. i la aceasta se mai adaug i faptul c designul i coninutul unui site sunt realizate de persoane total diferite, ceea ce ngreuneaz i mai tare realizarea de actualizri ale paginilor web. Prin proiectarea unui site fundamentat pe o baz de date se poate rezolva aceast problem. Se realizeaz separarea dintre design i coninut, astfel c este suficient s scrii o pagin pentru un anumit tip de informaie, fr a fi nevoie s copiezi mereu n vechile pagini coninutul cel nou. Implementarea unui sistem de gestiune a coninutului le va permite celor ce au modificri de facut s le realizeze singuri fr s fie nevoie de cunotine HTML. Pentru proiectarea unui astfel de site exist mai multe opiuni n ceea ce priveste limbajul de programare, ct i sistemul de management al bazei de date. Trebuie avut n vedere faptul c nu toate limbajele de programare se pot conecta la toate bazele de date. Cea mai potrivit alegere pentru realizarea unui web site dinamic este utilizarea PHP i MySQL . PHP este un limbaj de scripting utilizat pe scar larg, realizat i distribuit n sistem Open Source, care este special realizat pentru a dezvolta aplicaii web, prin integrarea codului PHP n documente HTML. Acestea nu vor mai fi simple pagini web, iar serverul care le ncarc vznd c este vorba despre pagini php le va trimite interpretorului PHP i va primi napoi transformat prin interpretarea codului PHP. Acest fiier va conine doar cod HTML (eventual i JavaScript) dar nu i cod PHP. MySQL este un limbaj de interogare standard pentru interaciunea cu bazele de date, un pachet software care se ocup de organizarea i gestiunea cantitilor mari de informaie. Apache este un server web open-source pentru UNIX, Windows 2000 sau alte platforme. Apache a devenit n prezent cel mai popular i des folosit Web server, datorit caracteristicilor puternice i a perfomanelor excepionale.
Prin intermediul acestei lucrri voi prezenta avantajele combinrii celor doua tehnici de programare (PHP i MySQL) i tehnica de creare a unor pagini web cu coninut dinamic i actualizat, implementate cu ajutorul acestora. Aplicaia realizat n scopul susinerii acestei lucrri este o pagin de poezii online. Lucrarea de fa este structurat n mai multe capitole astfel : Primul capitol cuprinde noiuni fundamentale despre limbajul PHP specificnd avantajele acestuia, tipurile de baz, proprietile de baz, operatori, structuri de control, tablouri, funcii, clase, obiecte, refolosirea codului si controlul sesiunilor. Capitolul doi prezint bazele de date relaionale, ncepnd cu informaii introductive despre sistemul de gestiune a bazelor de date MySQL : utilitatea, caracteristicile i avantajele sale i continund cu procesul de concepere i de proiectare a unei baze de date relaionale, normalizarea unei baze de date, relaiile ntre tabele i tipuri de date. Urmeaz prezentarea serverul de baze de date MySQL mpreun cu noiuni SQL legate de operatori i funcii, implementarea, crearea, tergerea, modificarea, sortarea n baze de date. Capitolul trei combin cele dou tehnici de programare PHP i MySQL si prezint modul de conectare la baza de date prin intermediul limbajului PHP i diverse operaii efectuate asupra bazei de date. Capitolul patru prezint dezvoltarea aplicaiei, pagina de poezii online, de la crearea bazei de date i conectarea la aceasta, la forma final n care utilizatorul poate accesa pagina de internet.
Capitolul 1
Limbajul PHP
Limbajul PHP este o modaliatate eficient de dezvoltare a aplicaiilor Web, n mod dinamic. El a fost implementat n 1994 de ctre Rasmus Lerdorf, la nceput fiind vorba numai de un proiect personal, care cuprindea cteva scripturi PERL ce monitorizau accesul la pagina web a acestuia. n 1995 este disponibil sub numele de Personal Home Page. Pentru a-i oferi mai mult funcionalitate el a implementat o varianta n C care permitea accesul la baze de date oferind astfel posibilitatea de creare a paginilor web dinamice. ncepand cu versiunea 3, din 1997, acest limbaj a nceput s fie dezvoltat de o echip de programatori, iar versiunea 4 dispune de engine-ul de scripting al firmei Zend Techologies. Programul a fost corectat, dezvoltat i extins n regim open source, depind cu mult scopul su iniial. Numele s-a pstrat, dar semnificaia este alta, i anume : Hypertext Preprocessor. Pentru a crea i testa documente PHP este nevoie de instalarea lor pe un server de web, deoarece dac un fisier PHP este ncarcat direct n navigator de pe discul local, prin comanda File/Open, fr a apela un server de web, documentul afisat va contine codul PHP neinterpretat.
PHP poate genera automat aceste fiiere i s le salveze n sistemul de fiiere n loc s le afieze, formnd un cache de partea serverului pentru coninutul dinamic. Deoarece PHP a fost scris special pentru crearea de pagini Web dinamice, poate efectua mult mai rapid i mai eficient unele operaii, n comparaie cu competitorii si Perl ,VCScript, Java, care nu au fost creai special pentru crearea de pagini Web .Cu toate acestea, nu nseamn c PHP este un limbaj de programare mai bun decat celelalte, deoarece exist actiuni pe care Java, Perl le pot efectua si PHP nu este capabil s le efectueze,ns PHP este mult mai bun pentru domeniul pentru care a fost creat. Unul din principalele avantaje PHP este faptul c e relativ simplu i direct, de aceea PHP este mult mai uor de nvaat i de utilizat fa, spre exemplu , de ASP.NET care necesit cunoasterea unor noiuni de VCScript, C# ,sau fa de CGI care necesit cunostine de Perl sau de C. PHP nu are probleme de compatibilitate cu browserul. Scripturile PHP sunt interpretate de server i nimic mai mult, asadar nu trebuie s ne facem griji dac limbajul n care dezvoltam este recunoscut de browserele utilizate de clienti. PHP permite o ncarcare mai rapid pe partea clientului. JavaScript ar incetini afiarea unei pagini web pe calculatoare mai slabe, deoarece browserul trebuie s ruleze scriptul mai nti ; n cazul interpretrii de catre server, sarcina aceasta este transferat mainii serverului web. Un alt mare avantaj alt limbajului PHP este acela c ofer posibilitatea de a alege programarea procedural sau programarea orientat obiect, sau chiar ambele. Cu toate acestea, nu orice facilitate a standardului POO este prezent n versiunea curent PHP-ului, multe librrii de cod i aplicaii mari (incluznd i librria PEAR) sunt scrise folosind doar cod POO.
n dezvoltarea aplicaiei am folosit stilul XML care tinde s fie utilizat tot mai des. La scrierea codului, instruciunile PHP din script vor fi terminate printr-un separator punct i virgul ';' asemntor celor din limbajul C, C++ sau Java. Omiterea acestui separator va genera o eroare de sintax. Interpretorul de PHP va ingnora n schimb spaiile dintre instruciuni sau dintre elementele unei instruciuni. Exemplu : 1 : <?php echo "Hello"; echo "world !"; ?> 2 :<?php echo "Hello"; echo "world !" ;?> Rezultatul va fi acelai.
1.3 Comentarii
Pentru claritatea codului programatorii obinuiesc s explice rolul anumitor linii din cadrul programului incluznd anumite comentarii. Interpretorul de PHP va ignora textul din comentarii. O modalitate de a insera un comentariu este cea n stilul C, cnd comentariul se poate ntinde pe mai multe linii i este cuprins ntre semnele '/*' i '*/'. El se poate insera chiar i n mijlocul unei expresii dar nu poate fi imbricat n alt comentariu. Exemplu : < ?php /* linii de cod*/ ?> Pentru un comentariu care se ntinde pn la sfaritul liniei curente exist dou posibiliti : stilul C++ i stilul Shell. Exemplu : < ?php //linie de cod ?> < ?php #linie de cod ?>
Pentru a specifica un ir mai pot fi folosite i apostroafe. Diferena n acest caz const n faptul c se inhib evaluarea variabilelor. O alt modalitate de a delimita un string este folosirea sintaxei heredoc . Trebuie furnizat un identificator dup <<<, apoi string-ul, apoi acelai identificator pentru a nchide citatul. Identificatorul de nchidere trebuie s nceap n prima coloan a liniei. De asemenea trebuie s urmeze aceeai regul de numire ca orice alt etichet PHP: trebuie s conin doar caractere alfanumerice i underscore i trebuie s inceap cu un character diferit de o cifr sau cu underscore. Exemplu de astfel de identificatori sunt EOD, EOT. PHP mai suport i dou tipuri de date compuse : Array : un tablou n PHP este de fapt un tip care mapeaz n mod ordonat. Un astfel de tip mapeaz valorile n chei. Tipul array este optimizat n cateva moduri, aa ncat poate fi folosit ca o list efectiv, ca un vector, un tablou hash, mulime, stiv, coad etc. Object este utilizat pentru a reine obiecte instante ale claselor n PHP mai exist doua tipuri speciale : resource i NULL Tipul resource desemneaz o variabil special, care reine o referin la o resurs extern. Resursele sunt create i utilizate de funcii speciale. Valoarea special NULL reprezint o variabil care nu are nici o valoare, iar NULL este singura valoare posibil a tipului. O variabil este considerat NULL dac : a fost asignat cu constanta NULL nu a fost setat la nici o valoare nca a fost dealocat folosind unset
1.5 Variabile
Variabilele sunt locaii de memorie desemnate printr-un identificator care ncepe cu semnul $. Numele variabilelor sunt case-sensitive i pot ncepe cu o litera sau undescrore (_), urmat de oricte cifre, litere sau caractere underscore. Variabilele permit memorarea valorilor de diverse tipuri. PHP proceseaz automat tipul variabilei. O variabil se consider declarat implicit prima dat cnd este folosit. Pentru a atribui o valoare unei variabile este folosit semnul egal (=). Exemplu: $nume = "Ina" Mai exist o metod pentru asignarea de valori variabilelor, aparut n cadrul PHP 4 : asignarea prin referin. Aceasta nseamn c noua variabil doar pointeaz ctre variabila original i schimbrile asupra noii variabile afecteaz originalul i reciproc. Pentru a determina aceast practic s aib loc, trebuie doar s atam simbolul & la nceputul variabilei care este asignat (variabila surs). Variabilele dinamice sunt o alternativ la folosirea irurilor.Se utilizeaz atunci cnd este necesar un numr mare, variabil, necunoscut dinainte de variabile. Variabilele pot avea nume variabile, care pot fi setate i folosite/schimbate dinamic. Acest lucru se face prin utilizarea valorii unei varibile pe post de nume de variabil. 9
Indirectarea se realizeaz prin utilizarea marcajului dolar '$' n faa numelui variabilei referin. De exemplu: <?php $var1 = 5; $var2 = "var1"; echo "Valoarea din var1 este "; echo $var1; echo " sau "; echo $$var2; ?> Notaia $$var2 a fost folosit pentru a desemna valoarea reinut de variabila $var1. Exist mai multe tipuri de variable n funcie de domeniul de valabilitate al acesteia, adic de locul n care poate fi folosit dup ce a fost creat: Variabile locale: o variabil definit n interiorul unei funcii nu va putea fi accesat dect de instruciunile din interiorul acelei funcii. Variabile globale: o variabil definit n exteriorul unei funcii nu va putea fi accesat n interiorul funciei. Variabile globale n interiorul unei funcii: o variabil definit n afara unei funcii trebuie redeclarat ca variabil global n interiorul funciei. Fiecrui script pe care l ruleaza, PHP i furnizeaz o serie de variabile predefinite folosite pentru a afla starea serverului Web, numite variabile de mediu. Acestea n mare msur sunt create i depind de serverul Web care ruleaz, sau sunt variabile proprii PHP. Ele sunt de fapt o mulime de tablouri predefinite ce conin variabile de pe serverul web, mediul i input-ul utilizatorului. Aceste tablouri sunt speciale prin faptul c sunt automate, adic disponibile n orice punct al scriptului. Aceste variabile predefinite sunt urmatoarele : $_ENV conine variabile disponibile prin intermediul mediului n care este executat. $_SESSION conine variabile care corespund sesiunii curente a script-ului. $_GET si $_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. $GLOBALS - pot fi accesate toate variabilele globale care sunt accesibile script-ului PHP curent; acest vector este indexat chiar prin numele variabilelor globale. $SERVER - conine o serie de variabile ale cror valori sunt setate de serverul Web; majoritatea valorilor variabilelor din acest vector depind de mediul de execuie al scriptului curent. $_COOKIE conine valorile variabilelor ce conin informaii referitoare la cookie-urile pstrate pe calculatorul utilizatorului care acceseaz pagina Web. $_FILES conine variabile primite de script prin intermediul ncrcrilor de fiiere prin metoda POST.
10
1.6 Constante
O constant este un nume dat unei valori. O constant nu i poate modifica valoarea de-a lungul execuiei scriptului. Numele de constante sunt case-sensitive. O diferena notabil fa de variabile este aceea c numele constantelor nu sunt precedate de semnul $.Prin convenie constantele sunt scrise cu litere mari. Definirea unei constante se face folosind funcia define(). Exemplu :
<?php define("CONSTANT", "o_constanta"); echo CONSTANT; // afiseaza "o_constanta" echo Constant; // afiseaza "Constant" ?>
O constant odat definit nu poate fi modificat sau dealocat.Vizibilitatea unei constante este global.
1.7 Operatori
Pentru a putea efectua operaii asupra unor varibile i constante de diverse tipuri se folosesc anumite simboluri numite operanzi. Entitile asupra crora se aplic un operator se numesc operanzi. Un operator poate avea unul, doi sau chiar trei operanzi. Majoritatea operatorilor sunt binari (au doi operanzi). n general operatorii sunt clasificai n funcie de tipul datelor asupra crora acioneaz. Exist : Operatori aritmetici - provin din matematic i acioneaz asupra datelor de tip numeric. Acetia sunt prezentai n tabelul urmator: Exemplu Nume -$a Negaia $a + $b Adunarea $a - $b Scaderea $a * $b nmulirea $a / $b mparirea $a % $b Modulul Rezultat Opusul lui $a. Suma lui $a i $b. Diferena dintre $a i $b. Produsul dintre $a i $b. Ctul mparirii lui $a la $b. Restul mparirii lui $a la $b.
Operatorul de mparire ("/") returneaz o valoare ntreag de fiecare dat, chiar dac cei doi operanzi sunt ntregi (sau string-uri convertite la ntregi). Operatorii de incrementare/decrementare sunt operatori unari care au ca rezultat creterea/descreterea cu o unitate a varibilei opernd asupra creia se aplic. Operatorii post se aplic dup ce valoarea este evaluat n expresia din care face parte iar operatorii pre se aplic nainte de evaluarea expresiei. Exemplu: $a = 1; $b = $a++; // b = 1, a = 2
11
$c = ++$a; // c =3, a = 3 $d = 4 + --$a; // d = 6, a = 2 $e = 4 + $c--; // e =7 , c = 2 Dac operatorii aritmetici se aplic asupra unor valori de tip string, PHP va ncerca conversia acestora n numere. Dac conversia nu reuete, irurile sunt convertite la valoarea 0. Operatori de asignare - permit atribuirea de valori varibilelor. Operatorul de asignare de baz este operatorul '=', care nseamn operatorul din stnga ia valoarea expresiei din dreapta. Valoarea expresiei este evaluat, apoi atribuit variabilei din partea stanga i, n final, returnat de operator. Valoarea unei expresii de asignare este valoarea asignat; de exemplu valoarea lui "$a = 3" este 3. Deoarece = nu este o instruciune PHP ci un operator, el poate intra n expresii complexe de genul: $a = $b = 4 + ($c = 3); // a = 7, b = 7, c=3 Pe lang operatorul de baz de asignare, exist i operatori combinai care permit folosirea unei valori ntr-o expresie i apoi setarea valorii la rezultatul acelei expresii. Acetia sunt : Operator Utilizare Semnificaie += $a += $b $a = $a + $b -= $a -= $b $a = $a - $b *= $a *= $b $a = $a * $b /= $a /= $b $a = $a / $b %= $a %= $b $a = $a % $b .= $s1 .= $s2 $s1 = $s1 . $s2 Operatori pe bii-ajut la prelucrarea numerelor ntregi considerate ca iruri de biti. Acetia sunt : Exemplu $a & $b $a | $b $a ^ $b ~ $a $a << $b Nume i Sau Xor Negare Rezultat Biii sunt setai dac sunt setai att n $a ct i n $b Biii sunt setai dac sunt setai fie n $a fie n $b Biii care sunt setai n $a sau $b dar nu n ambele Biii care sunt setai n $a nu sunt setai n rezultat, i viceversa la Deplaseaz biii lui $a cu $b poziii spre stanga (fiecare pas nseamn nmulire cu doi) la Deplaseaz biii lui $a cu $b poziii spre dreapta (fiecare pas nseamn mparire cu doi)
12
Exemplu Nume Rezultat $a and $b And TRUE dac atat $a si $b sunt TRUE. $a or $b ! $a $a || $b Or Not Or
TRUE TRUE TRUE TRUE TRUE
dac fie $a fie $b sunt TRUE. dac fie $a fie $b sunt TRUE, dar nu ambele dac $a nu este TRUE. dac atat $a cat si $b sunt TRUE. dac fie $a fie $b sunt TRUE.
Operatori de comparare - sunt operatori binari care au ca scop compararea valorilor operanzilor. Rezultatul acestor operatori este unul logic, avnd valoarea true (adevarat) sau flase (fals). Operatori pe iruri de caractere- exist un singur operator pe iruri de caractere, restul operaiilor fiind efectuate prin intermediul unor funcii din biblioteca standard a limbajului. Acest operator este operatorul de concatenare - punct '.'. Exemplu: $s1="Ina"; $s2=$s1."are mere";// in $s2 vom avea "Ina are mere" Operatori de referire - este un operator unar, avnd ca operand o variabil i permite legarea unui nume de variabila de zon de memorie a variabilei operand. Exemplu : $a = 2; $b = $a; // a = 2, b = 2 $c=&$a; // a=2, c=2 $c=4; // c=4, a=4, b=2 Operatori asupra tablourilor exist un singur operator asupra tablourilor n PHP i anume operatorul +. Adaug tabloul din dreapta la cel din stanga, iar cheile duplicate nu sunt suprascrise. Exemplu : $a = array ("a" => "mere", "b" => "banane") ; $b = array ("a" => "pere", "b" => "capuni", "c" => "ciree" ) ; $c = $a + $b ; Var_dump($c) ; Va fi afisat :
array(3) { ["a"]=> string(5) "mere" ["b"]=> string(6) "banane" ["c"]=> string(6) "ciree" }
Operatori de execuie - poate fi folosit pentru a executa o comand pe interpretorul de comenzi al serverului. El const n doua apostroafe inverse '`'ntre care
13
este plasat comanda. PHP va ncerca s execute coninutul apostroafelor inverse ca o comand shell ; rezultatul va fi returnat (poate fi asignat unei variabile). Folosirea operatorului de execuie este identic utilizrii comenzii shell_exec(). Operatorul de execuie acioneaz doar dac opiunea safe_mode din php.ini este dezactivat (Off). n general acest operator nu se foloseste datorit breselor de securitate pe care le deschide pe server. Operatorul de inhibare a erorilor- are sintaxa @(expresie) i rolul de a suprima erorile i avertismentele generate de expresia operand. Poate fi folosit naintea oricrei expresii, caz n care orice mesaje de eroare ce ar putea fi generate de acea expresie vor fi ignorate. Exemplu : $a = (2 / 0); // genereaz avertisment de mpartire la zero $a = @(2 / 0 ); // nu genereaza avertisment Dac opiunea track_errors este activat, orice mesaj de eroare generat de expresie va fi reinut n variabila $php_errormsg. Aceast variabil va fi suprascris la fiecare eroare. Operatorul @ se aplic doar expresiilor. Nu poate fi adugat n faa funciilor sau definiiilor de clase, sau n faa structurilor condiionale de tipul if i foreach . ternar -are sintaxa : condiie ? valoare_adevarat : valoare_fals. Operatorul evalueaz mai nti expresia logic din condiie. Se aseaman cu structura condiional if-else. Dac condiia este adevrat va ntoarce valoare_adevarat iar n caz contrar valoare_fals. Exemplu: echo ($varsta < 18) ? "minor" : "adult"; Operatorul condiional sau
1.8 Expresii
Expresiile sunt foarte importante n PHP. Aproape tot ceea ce scriem n limbajul PHP reprezint o expresie. Expresiile combina operanzi i operatori de diverse tipuri : constante, variabile i nume de funcii. Dac scriem $a=3, i atribuim lui $a valoarea 3. Alte exemple de expresii sunt prezentate mai jos: $condiie ? $operand1 : $operand2; $b = $a = 3; $i++; Dup atribuirea $a=3 ne ateptm ca valoarea lui $a s fie 3; aadar dac scriem $b = $a, ne ateptm s se comporte ca i cum am fi scris $b = 3. Cu alte cuvinte, $a este o expresie care are valoarea 3. Dac totul funcioneaz corect, comportamentul descris mai sus este cel ce va avea loc. n cazul irurilor de caractere ntre ghilimele trebuie acordat o mare atenie. La evaluarea expresiei n care acestea apar, toate numele de variabile care apar n interiorul lor sunt nlocuite cu valorile corespunzatoare. De exemplu: $nume = "Ina"; $sir1 = "$nume are mere!"; 14
$sir2 = '$nume are mere!'; echo $sir1; // va afisa Ina are mere echo $sir2; // va afia $nume are mere
1.9 Tablouri
Tabloul, aa cum spuneam la tipul de date array, este cel care mapeaz valorile n chei. Adic el reprezint o variabil ce stocheaz mai multe valori . Aceste valori individuale se numesc elementele tabloului. n PHP tabloul va asocia fiecrei intrri o cheie prin care aceasta poate fi regsita. Cheile pot fi numerice (n acest caz indicii creai implicit vor fi 0,1,2 ...) sau pot fi iruri de caractere (caz n care tabloul se numete asociativ). Valorile reinute pot avea orice tip dar sunt de acelai fel pentru un tablou dat. Variabilele care au o singur valoare se numesc scalare. O variabila de tip tablou poate fi creat prin constructorul array(). Sintaxa pentru crearea unui tablou indexat numeric este: $tablou = array (el0, el1, ... el_n); Exemplu : $fructe= array ("capuni", "pere", "mere", "gutui", "portocale"); Accesul la elementele tabloului se face prin indecsi numerici (cu semnificaia de numere de ordine n tablou). Spre exemplu $fructe[0] are valoarea "capuni", $fructe[3] are valoarea "gutui" etc. Pentru a afla numarul curent de elemente ale unui tablou se face cu ajutorul funciei count($tablou). n PHP dimensiunea unui tablou este variabila. Pentru a aduga un nou element se va atribui pur i simplu variabilei cu urmatorul indice o anumit valoare. Spre exemplu $fructe[5]="banane" va adauga un nou element ("banane") la sfritul tabloului $fructe. Tablourile n care valorilor coninute le sunt asociate chei prin care acestea pot fi regsite se numesc tablouri asociative. Sintaxa pentru crearea unui astfel de tablou este: $tablou = array( "cheie1" => el1, "cheie2" => el2, ... "cheie_n" => el_n); Exemplu : $pret = array ("paine alb" => 7000, "ou" => 3000, "zahr" => 24000); Accesul la un element se face prin cheia asociat. Spre exemplu $pret ["paine alb"] are valoarea 7000. i n acest caz tabloul poate fi extins dinamic prin adaugarea unui nou element a carei cheie nu exista n tablou. Spre exemplu $pret["miere 500g"] = 30000 va aduga elementul 30000 cu cheia "miere 500g" la tabloul $pret, acesta avnd acum patru elemente. Ambele tipuri de tablouri rein intern o referin (pointer) catre elementul curent de prelucrat. Acest lucru permite scrierea secvenelor pentru parcurgerea i prelucrarea elementelor lor. Instruciunea foreach este asemanatoare cu instruciunea for (combin instruciunea FOR cu funcia EACH) dar este destinat exclusiv parcurgerii de tablouri, n special a celor asociative Sintaxa acestei instruciuni are dou forme alternative: foreach (tablou as cheie => valoare_element_curent)
15
{ //instruciuni } foreach (tablou as valoare_element_curent) { //instruciuni } Prima form permite i extargerea i prelucrarea cheilor asociate, pe cnd cea de a doua form permite extragerea tuturor valorilor din tablou i prelucrarea lor individual.
16
if (expr1) instruciune1 elseif (expr2) instruciune2 ... elseif (exprN) instruciune Ambele variante elseif si else if (cu spatiu si fr spatiu) sunt corecte. Instruciunea SWITCH Instruciunea switch este similar cu o serie de instruciuni if care testeaz mai multe valori posibile pentru o anumit expresie. ntr-o instruciune if, condiia poate fi adevarat sau fals; ntr-o instruciune switch condiia poate avea orice numr de valori, diferite, atta timp ct se evalueaz la un tip de baz (integer, string sau double). Este necesar o instruciune case pentru a se ocupa de fiecare valoare la care trebuie s reacioneze i opional, o instruciune default pentru restul situaiilor pentru care nu sunt descrise comportamente. Se folosete n situaiile cnd dorim s comparm aceeai variabil cu diferite valori i s executm buci de cod diferite pentru fiecare caz n parte.Avantajul instruciunii switch este o scriere mai concis i mai simplu de neles i depanat. Sintaxa acestei instruciuni este: switch (expr) { case valoare_1: instruciune_1; break; case valoare_2: instruciune_2; break; ... case valoare_n: instruciune_n; break; defaut: instruciune_default; } Dupa evaluarea expresiei, valoarea obinut este comparat cu valorile din clauzele case. Dac se ntlneste o potrivire se va continua cu execuia instruciunilor din clauzele case urmtoare, pn la ntlnirea instruciunii break. Consecina este c, dac instruciunile dintr-o clauz case nu se termin cu break, se va continua execuia cu instruciunile clasei urmtoare. Observaie : Instruciunea continue aplicat n cadrul switch-ului acioneaz similar cu break. Dac avem un switch ntr-un ciclu i dorim s continum de la urmtoarea iteraie a ciclului, se folosete continue 2.
17
18
afl la sfritul ciclului). Diferena fundamental const n faptul c ciclul este executat cel puin o dat. Se iese din ciclu n momentul n care expresia este evaluat ca fiind FALSE.Ca i while, ea permite execuia unei instruciuni sau a unui bloc de instruciuni inclus ntre acolade ('{' i '}') i are sintaxa: do instruciune while (expr); Expresia expr este o expresie (condiie) logic ce se evalueaz dup fiecare repetiie. Dac, dup executarea instruciunii condiia este adevarat se va relua secvena de la nceput. n cazul n care condiia devine fals, repetiia se va ncheia i se va trece la instruciunea de dup do-while. n cazul buclei do-while, instruciunea din bucla se va executa cel puin o dat chiar i n cazul n care condiia nu este adevarat de la nceput. Instruciuni de control pentru repetiii Pentru a simplifica implementarea unoeri este necesar s se ias forat dintr-o iteraie.n PHP exist instruciuni speciale: continue, break i return. Instruciunea continue permite terminarea forata a iteraiei curente i trecerea la urmatoarea iteraie. Ea poate fi folosit cu instruciunile for, foreach, while sau do..while. Continue are rolul de a sri peste restul iteraiei curente i de a continua execuia de la nceputul urmatoarei iteraii. Continue accept opional un argument numeric ce specific din cte structuri trebuie s iese forat. Instruciunea break permite ntreruperea forata a buclei curente. Ea poate fi folosit cu instruciunile for, foreach, while, do..while sau switch. Accept opional un argument numeric ce specific din cte structuri trebuie s iese forat. Instruciunea return permite terminarea forata a funciei sau programului curent. Ea poate fi folosit n instruciunile for, foreach, while sau do..while unde, prin terminarea scriptului, termin n mod evident i bucla curent. Dac este apelat dintro funcie, return ncheie imediat execuia aesteia i returneaz argumentul su ca valoare a apelului de funcie. Dac se dorete generarea unui mesaj n pagin nainte de ncheierea scriptului, n loc de return se pot folosi funciile exit(mesaj) sau die(mesaj) die fiind un alias al funciei exit.
1.11 Funcii
O funcie este un modul de cod care ofer o interfaa de apel, rezolv un anumit algoritm i opional, returneaz o valoare.Ea grupeaz instruciunile care execut un anumit algoritm i permite refolosirea codului ori de cate ori este nevoie de acel 19
algoritm ntr-un program. Funciile reprezint pri identificabile prin nume ale unui program, care se pot lansa n execuie la cerere prin intermediul acestor nume. Funciile pot fi predefinite (existente n biblioteca de baz a limbajului) sau definite de utilizator.
20
variabile conexe ntr-o unitate, cunoscut sub numele de clas. Accesul la datele dintrun obiect este posibil prin intermediul operaiilor obiectului, care alctuiesc interfaa sa. Multe din proiectele Web evolueaz de la o mulime de hyperlink-uri la o aplicaie complex. Aceste aplicaii, fie prezentate prin cutii de dialog i ferestre, fie prin pagini HTML generate dinamic, au nevoie de o metodologie de dezvoltare gndit ndeaproape. O clas poate fi asimilat cu un tip definit de utilizator. Proprietile unei clase sunt variabile care descriu membrii clasei, iar metodele clasei sunt operaii pe care membrii clasei le pot efectua. O clas poate include o metod special, numit metod constructor sau pur i simplu constructor. Constructorul unei clase este folosit pentru a crea instane sau membri ai clasei, care sunt cunoscui sub numele de obiecte. O clas se definete utiliznd urmtoarea sintax: class nume_clas { var nume_varibilaX ;//pot fi oricte variabile funcion nume_funcieX { //corpul funciei ; pot fi oricte funcii } } n exteriorul claselor, instruciunea var este rareori folosit, deoarece PHP definete n mod automat o variabil n momentul atribuirii unei valori. Cu toate acestea, proprietile claselor trebuie definite folosind instruciunea var. Metodele sunt definite folosind cuvntul cheie funcion, ceea ce este normal, deoarece metodele, ca i funciile, execut aciuni. Diferena dintre metode i funcii este legat de amplasarea acestora; metodele sunt definite n interiorul claselor, n timp ce funciile sunt definite n exteriorul acestora. Pentru a obine accesul la un membru al clasei metodele vor folosi sintaxa $this->, care are o semnificaie similar cu aceea a pronumelui posesiv din limba romn, persoana I singular (meu). Cnd o metod face o referire de forma $this-> item, se consider c referina face trimitere la proprietatea $item a obiectului curent. PHP stabilete valoarea variabilei speciale $this la fiecare invocare a unei metode. Clasele sunt tipuri. Pentru a crea o variabil de tipul dorit se folosete operatorul new. Instanierea unei clase nseamna crearea unui obiect de tipul clasei respective.
1.12.2 Constructori
Un constructor este apelat atunci cnd este creat un obiect, i are de obicei rolul de a iniializa i seta atribute la valori de pornire sau de a crea obiecte de care are nevoie obiectul curent. Constructorul are proprietatea c posed acelai nume cu clasa n care este definit i nu ntoarce nici o valoare. PHP apeleaz automat constructorul la invocarea operatorului new.
22
1.12.3 Motenire
Motenirea permite specificarea unei clase folosind o alt clas ca punct de plecare. Clasa original se numete clas de baz sau clas printe, iar clasa specificat mai recent se numete clas derivat sau clas copil. Motenirea funcioneaz n sens unic, clasa copil motenete proprieti i metode ale clasei printe, dar clasa printe nu preia trsturi de la copil. Clasa copil sau derivat posed toate variabilele i funciile clasei de baz alturi de variabilele i funciile proprii, definite n extensie. Acest lucrul se realizeaz utiliznd cuvntul cheie extends. Motenirea multipl nu este acceptat. Exemplu: class clasa_copil extends clasa_parinte { var nume_varibilaX ; funcion nume_funcieX { //corpul funciei } }
23
conine un script n mod normal, incluznd instruciuni PHP, tag-uri HTML, funcii sau clase PHP. Se poate observa necesitatea introducerii codului ntre taguri PHP. n absena acestor taguri, codul este interpretat ca i text (codificat HTML) i afiat ca atare la ieire. Instruciunea corelat require_once asigur faptul c fiierul specificat este inclus o singur dat ntr-un script dat. n cazul crerii de fiiere de includere care folosesc instruciunea require pentru a include coninutul altor fiiere de includere, instruciunea require_once poate fi util.
24
Suportul pentru sesiuni n PHP const din modalitatea de a pstra anumite date n vederea accesului ulterior. Un vizitator ce acceseaz website-ul primete un id unic, aanumit id de sesiune. Acest id este fie reinut ntr-o cookie , fie propagat prin URL. Sesiunile permit nregistrarea unui numar aleator de variabile pentru a fi pstrate pentru cereri. Cnd un vizitator aceeseaz site-ul, PHP va verifica automat (dac session.auto_start este setat pe 1) sau la cerere (explicit prin session_start() sau implicit prin session_register()) dac un anume id de sesiune a fost trimis mpreuna cu cererea. n acest caz, este recreat mediul salvat anterior. Paii care se fac la utilizarea unei sesiuni sunt urmtorii: crearea unei sesiuni nregistrarea variabilelor sesiune utilizarea variabilelor sesiune pentru controlul accesului su personalizarea paginii tergerea variabilelor sesiune i distrugerea sesiunii nainte de a utiliza o sesiune aceasta trebuie creat. Cel mai simplu mod de a porni o sesiune este acela de a apela funcia session_start(). Apelul acestei funcii creeaz automat un numr de sesiune i permite apoi utilizarea variabilelor de sesiune. Aceast funcie trebuie apelat nainte de antetul "<HTML>". O alt metod, mai puin recomandat, este metoda creri implicite a unei sesiuni n momentul n care se nregistreaz forat o variabil de sesiune. Funcia session_start va fi apelat la nceputul tuturor paginilor care compun sesiunea curent. Pentru a folosi valori transmise ntre pagini diferite se vor folosi variabile sesiune. Variabilele sesiune se nregistraz ca atare prin apelul funciei session_register(nume_variabila). De exemplu: $varSesiune1 = 10; session_register( "varSesiune1"); Trebuie remarcat c numele variabilei se transmite funciei ca i un ir de caractere, fr a include i semnul $. Variabila va rmne vizibil pn cnd este tears sau pn cnd sesiunea curent se incheie. Dac se dorete, se pot nregistra mai multe variabile printrun singur apel de session_register prin sintaxa: session_register( "v1", "v2" ...); Pentru a utiliza variabilele sesiune n alte pagini din aceeai sesiune exist dou metode, asemntor cu accesul la datele unui formular. Dac opiunea register_globals din php.ini este setat pe On, n toate paginile sesiunii variabila va fi accesibila direct prin nume. Dac opiunea este Off se poate apela variabila prin intermediul tabloului asociativ $HTTP_SESSION_VARS. De exemplu: $n = 4 * $HTTP_SESSION_VARS["varSesiune1"]; Pentru a testa ntr -o pagin dac o variabil a fost sau nu nregistrata n sesiunea curent se va folosi funcia session_is_registered("numeVariabila"). Aceast funcie ntoarce o valoare logic care poate fi ulterior testat. Dac se dorete la un moment dat tergerea unei variabile sesiune se poate apela la funcia session_unregister(numeVariabila). 25
Pentru a ncheia sesiunea curet i a terge toate variabilele sesiune asociate se va apela funcia session_destroy(). Aceast funcie nu primete nici un parametru i va distruge sesiunea curent mpreuna cu toate informaiile asociate. Observaie! Pentru a Funciona corect mecanismul de control al sesiunii trebuie ca n fiierul php.ini s existe setrile: session.save_path = c:/temp ; setare valabil pentru Windows (pt. Unix: session.save_path = /tmp) session.cache_limiter = private
Capitolul 2
Baze de date MySQL
2.1 Noiuni generale
O baz de date este o colecie de informaii organizate n aa fel ncat un program poate selecta rapid anumite pri din acea informaie.Pentru a putea accesa informaiile stocate ntr-o baz de date este nevoie de un sistem de gestiune a bazelor de date (SGBD). Unul dintre cele mai populare sisteme de gestine a bazelor de date este MySQL. Ca i PHP, MySQL este distribuit n formula Open Source, deci permite oricarui utilizator s modifice programul care s poate fi luat gratuit de pe internet. Datele sunt organizate n tabele, ntre care sunt stabilite relaii i constrngeri de intergritate. Pentru gestiunea datelor foloseste limbajul SQL (Structured Query Language) care este un standard n acest domeniu. 26
MySQL este un sistem client-server, serverul MySQL suportand o palet larg de programe client, scrise n diverse limbaje de programare.De obicei, serverul de date este separat logic i fizic de programele client care asigur interfaa operaiilor cu baza de date. MySQL este un sistem de gestiune al bazelor de date relaional. Principiile algebrei relaionale au fost stabilite de F. C. Codd n 1970. Ea reprezint fundamentarea matematic a bazelor de date relaionale. n concepia relaional o baz de date este format dintr-o colecie de relaii (tabele, fiiere de date) asupra crora se aplic o colecie de operatori pentru a gestiona datele coninute de relaii. Un operator relaional se aplic asupra unor tabele i va avea ca i rezultat tot o tabel. Potrivit algebrei relaionale nu este permis accesul direct asupra nregistrarilor dintr-o tabel. Avantaje ale utilizarii bazelor de date relaionale: facilitarea partajrii datelor, asigurarea independenei datelor, interogarea ad-hoc, organizarea datelor, securitatea datelor, reducerea la minimum a experienei necesare n domeniul programrii, eficien n prelucrarea datelor.
A cincea form normal O relaie este n a cincea form normal dac i numai dac ea nu poate fi spart n relaii mai mici si apoi reunit fr a-i schimba faptele i semnificaiile. A sasea form normal Cea de-a sasea form normal a fost definit de curnd i este definit doar cand este luat n considerare i dimensiunea temporal. Factori care influeneaz, de asemenea, proiectarea sunt de cutare a informaiilor, factor esenial care cere uneori repetarea datelor n tabele i deci, nclcarea unor forme normale i viteza de adugare i modificare a datelor, care cere uneori reorganizarea datelor. Nu n ultimul rnd spaiul pe disc este i el un criteriu important n cadrul proiectrii unei baze de date. Chiar dac n zilele noastre discurile au capaciti foarte mari, o baz de date cu redundan mare, pe lang ca ocup inutil foarte mult spaiu, este i foarte greu de accesat (viteza de cautare n tabele este n general proporional cu dimensiunea acesteia). Proiectarea bazei de date se face folosind procedeul cunoscut sub numele de modelare entitate-relaie sau modelare E-R. n acest context, o entitate este similar cu un tablou relaional. Modelarea E-R este un proces n cadrul cruia coloanele, entitile i relaiile ntre entiti sunt descoperite i organizate. Un model E-R poate fi folosit cu uurin, pentru a genera o structur a bazei de date, care poate fi transformat ntr-o baz de date relaional efectiv.
28
4. INT sau INTEGER: reprezint un numr ntreg normal. Intervalul de valori posibile este [-2147483648..2147483647]. 5. BIGINT : reprezint un numr ntreg mare. Intervalul de valori posibile este [9223372036854775808..9223372036854775807]. 6. FLOAT : reprezint un numr n virgul flotant, simpl precizie (numr real). Intervalul de valori posibile este [-3.402823466E+38.. -1.175494351E-38, 0,1.175494351E-38..3.402823466E+38]. 7. REAL sau DOUBLE : reprezint un numr real n virgula flotant, dubl precizie. 8. DECIMAL (L) sau NUMERIC (L): reprezint un numr n virgul flotant nempachetat. L- lungimea, care spre deosebire de celelalte tipuri la care nu trebuie specificat.
Tipuri de date de tip dat calendaristic i timp 1. DATE : reprezint o dat calendaristic stocat n formatul 'YYYY-MM-DD' (an-luna-zi). Intervalul de valori posibile este ['1000-01-01'..'9999-12-31']. 2. DATETIME : reprezint o combinaie de dat calendaristic i timp stocat n formatul 'YYYY-MM-DD HH:MM:SS' (an-luna-zi ora:minut:secund). Intervalul de valori posibile este ['1000-01-01 00:00:00'..'9999-12-31 23:59:59']. 3. TIMESTAMP : reprezint o semnatur de timp stocat dup lungimea specificat, care poate fi 14, 12, 8 sau 6 : YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD sau YYMMDD. 4. TIME : reprezint ora, minutul i secunda. Intervalul de valori posibile este [838:59:59'..'838:59:59']. Poate reine intervalul de timp dintre dou evenimente, de aceea poate fi i negativ. 5. YEAR : reprezint anul calendaristic pe doua sau patru cifre. Intervalul de valori posibile este [1901..2155] pentru 4 cifre, respectiv [1970..2069] pentru 2 cifre (70-99..00-69). Tipuri de date ir de caractere 1. CHAR (L) : reprezint un ir de caractere de lungime fix. Lungimea L a irului poate lua valori n intervalul [1..255]. 2. BIT, BOOL, CHAR sinonime cu delaraia CHAR(1). 3. VARCHAR (L) : reprezint un ir de caractere de lungime variabil.Lungimea L a irului poate lua valori ntre [1..255]. Tipuri de date binare mari (BLOB) 1. TINYBLOB, TINYTEXT : reprezint valori BLOB, TEXT cu lungime maxim de 255 elemente. 2. BLOB, TEXT : reprezint valori BLOB, TEXT cu lungime maxim de 65535 (64K) elemente. 3. MEDIUMBLOB, MEDIUMTEXT : reprezint valori BLOB, respectiv TEXT cu lungime de max. 16777215 (16 MB) elemente. 29
4. LONGBLOB, LONGTEXT : reprezint valori BLOB, TEXT cu lungime de maxim 4294967295 (4 TB) elemente. Tipuri de date speciale 1. ENUM ('value1','value2',...) : reprezint o enumerare de elemente de tip ir de caracter. Un obiect de acest tip poate avea la un moment dat o singur valoare dintre cele enumerate sau valoarea NULL. Valoarea " " (ir vid) este considerat valoare de eroare. Un tip enumerare poate defini maxim 65535 de valori distincte. 2. SET ('value1','value2',...) : reprezint o mulime de elemente de tip ir de caracter. Un obiect de acest tip poate conine la un moment dat mai multe valori distincte dintre cele definite sau poate fi gol (nu conine nici o valoare). Un tip mulime poate defini maxim 65 de valori membru.
2.3.3 Operatori
Operatori aritmetici : opereaz asupra numerelor ntregi cu precizia BIGINT (pe 64 biti). Sunt disponibili urmatorii operatori: + : adunare; - : scdere; * : nmulire; / : mprire; dac se mparte la 0 rezultatul va fi NULL. Operatori logici : ntorc 1 pentru adevarat i 0 pentru fals. 1. NOT: ! - Negaie logic. ntoarce 1 dac argumentul este 0, altfel ntoarce 0. Excepie: NOT NULL ntoarce NULL. 2. OR: || - SAU logic. ntoarce 1 dac cel puin un argument nu este 0 sau NULL 3. AND : && - I logic. ntoarce 0 sau NULL dac cel puin un argument este 0 sau NULL, altfel ntoarce 1. Operatori de comparare : returneaz 1 pentru adevrat, 0 pentru fals i NULL dac nu se poate efectua comparaia. La compararea a doua iruri nu se va ine cont de litere mari/mici. = egalitate; la compararea cu NULL ntoarce NULL; <> sau != inegalitate; < - mai mic;
30
<= - mai mic sau egal; > - mai mare; >= - mai mare sau egal; <=> - echivalen; la compararea cu NULL ntoarce 0 sau 1 (1 doar la NULL <=> NULL); dac ambii operanzi sunt diferii de NULL se comport ca i =;
IF NOT EXISTS - inhib mesajul de eroare care se genereaz dac la ncercarea de a crea o tabel care mai exist. NOT NULL / NULL - nu se permit valori NULL n acest camp (campul trebuie completat n orice situaie) /permite valori NULL n camp (opiune implicit dac nu se specific nimic) DEFAULT default_value - completeaz cmpul lasat liber cu valoarea implicit default_value AUTO_INCREMENT - dac nu se insereaz nimic n cmp, se va genera automat o valoare mai mare cu o unitate fa de cea mai mare valoare din acel cmp. Poate fi specificat o singur coloan cu acest parametru ntr-o tabel. Coloanele specificate astfel trebuie indexate. PRIMARY KEY - specific cheia primar pentru tabel. Un singur cmp din tabel poate avea acest parametru. Coloana declarat ca i cheie primar este indexat automat. UNSIGNED precizat dupa un tip ntreg nseamn c poate avea o valoare pozitiv sau 0. Exemplu : CREATE TABLE persoan ( nume CHAR(30), prenume CHAR(30), vrst INT(3))
inserarea de noi date sau adugarea lor. n ambele situaii, locul n care se face adugarea nu este precizat, nefiind relevant. Sintaxa comenzii INSERT este urmatoarea : INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] nume_tabel [(col_nume,...)] VALUES (expresie,...),(...),... LOW_PRIORITY este folosit pentru a ntrzia scrierea efectiv a datelor n tabela pn cnd ali utilizatori nu mai citesc date din tabel. Acest lucru avantajeaz citirea dar ntrzie, semnificativ pentru o tabel foarte utilizat, scrierea. Efectul este blocarea execuiei pn cnd se reuete scrierea efectiv. DELAYED - are aciune opus parametrului precedent. nregistrarea care trebuie adugat este pus ntr-o coad de ateptare pe server i controlul revine la client, ca i cum scrierea ar fi fost fcut efectiv. Avantajul const n timpul mic de execuie a comenzii INSERT pe o tabel utilizat intensiv. Dezavantajul const n ncrcarea serverului cu o operaie n plus i n pierderea datelor dac serverul se oprete neateptat. Din aceast cauz parametrul este folosit doar cnd este cu adevrat necesar. IGNORE - este util dac se insereaz mai multe nregistrari simultan (n acest caz lista de dup VALUES va conine mai multe seturi de date n paranteze, desprite prin virgul). De obicei, MySQL raporteaz eroare i nu execut comanda care ncearc adugarea a cel puin unei nregistrri care duplic cheia primar sau cmpuri cu valori unice. Prin folosirea parametrului IGNORE nregistrrile greite sunt ignorate, dar restul sunt adugate fr raportarea unei erori. Dup execuia comenzii se va raporta doar numrul de nregistrri a cror adugare a reuit. INTO - este opional, se folosete pentru compatibilitate cu alte sisteme SQL. Datorit claritii mai mari a interogrii se prefer totui utilizarea lui. col_nume,... - este o list de coloane care specific ordinea n care se vor aduga datele n tabel. Prin aceasta se pot insera doar datele considerate eseniale, restul primind valorile implicite specificate la declararea tabelei. Dac lista lipsete, setul de date furnizat trebuie s aib valori pentru toate cmpurile, n ordinea din declararea tabelei. VALUES (expresie, ...),(...) - specific datele ce vor fi adugate n tabel. Ele trebuie s respecte numarul i ordinea coloanelor de la declararea tabelei sau, dac e specificat, numarul i ordinea cmpurilor din lista de coloane (col_nume,...) prezentat anterior. Exemplu: INSERT INTO persoan VALUES ("Olaru", "Niculina",22) ;
33
Comanda UPDATE - permite actualizarea valorilor dintr-o tabel. Sintaxa acestei comenzi este: UPDATE [LOW_PRIORITY] [IGNORE] nume_tabel SET col_nume1=expr1, col_nume2=expr2,... [WHERE condiie] [LIMIT NUMBER] LOW PRIORITY - este folosit pentru a ntarzia scrierea efectiv a datelor n tabel pn cnd ali utilizatori nu mai citesc date din tabel. IGNORE - este util dac se insereaz mai multe nregistrri simultan (n acest caz lista de dup VALUES va conine mai multe seturi de date n paranteze, desprite prin virgul). SET col_nume1=expr1, col_nume2=expr2,... atribuie noile valori expr1, expr2.. la col_nume1, col_nume2 unde (WHERE) are loc conditie. Dac clauza WHERE lipsete, vor fi actualizate toate nregistrrile. LIMIT permite setarea numrului de nregistrri care vor fi afectate de comanda UPDATE. Exemplu : UPDATE persoan SET nume="Popescu" ;
34
SELECT itemi FROM nume_tabel [ WHERE condiie ] [ GROUP BY {colan | expresie} ] [ HAVING condiie_includere_grup] [ ORDER BY tip_ordonare ] [LIMIT criteriu_de_limitare ] ; FROM - specific tabela sau tabelele din care se selecteaz datele. n cazul n care referina cuprinde mai multe tabele operaia este una de JOIN. WHERE - specific condiia de includere a datelor n selecie. Permite selecia doar a datelor care intereseaz la un moment dat. n cazul operaiunii de JOIN aici se vor aduga i constrngerile date de relaiile dintre tabele. Condiia de selecie const dintr-o expresie logic simpl sau complex. ORDER BY tip_ordonare {intreg_pozitiv | nume_col | formula} [ASC | DESC] permite ordonarea rezultatului dupa anumite coloane sau formule. Dac se specific o list de numere, acestea vor fi interpretate ca numere de ordine a coloanelor specificate n SELECT (ncepnd cu 1). Ordonarea se face dup prima coloan din list. n cazul n care dou nregistrri au aceiai valoare pentru coloana respectiva se va lua n considerare a doua coloan din list (dac este specificat) etc. Parametrii ASC i DESC specific ordonarea cresctoare, respectiv descresctoare a nregistrrilor n rezultat. Pentru a selecta toate nregistrrile dintr-o tabel se va folosi * : SELECT * FROM nume_tabel ; Dac se dorete enumerarea tuturor nregistrrilor ce satisfac o anumit condiie se va proceda n felul urmator : SELECT * FROM nume_tabela WHERE condiie ; Clauza GROUP BY specific dupa ce valoare se va face gruparea. n majoritatea cazurilor expresia de grupare este reprezentat de o singur coloan. Toate nregistrrile cu aceeai valoare pentru expresia de grupare vor fi considerate ca fcnd parte din acelai grup. Clauza HAVING permite selectarea grupurilor care sunt luate n considerare. Condiia din HAVING se aplic dup constituirea grupului, pe cnd condiia din clauz WHERE n timpul selectrii nregistrrilor. n plus, acest clauz poate cuprinde doar referine la cmpuri i aliasuri de cmpuri din lista de cmpuri a comenzii SELECT sau funcii de sumarizare pe grup. MySQL include funcii care permit raportarea valorilor agregate, precum un numr al rndurilor tabelului. Exemple de funcii de agregare: -count(*) = numrul rndurilor din tabel -avg(coloana) = valoarea medie a coloanei numerice specificate -min(coloana) = valoarea minim pentru coloana specificat
35
36
37
PROCESS - permite administratorului s vad procesele care ruleaz pe server i s le opreasc. Este utilizat pentru a vedea coninutul interogarilor ce se executa n acel moment, inclusiv cele de setare a parolei. De asemenea el d posibilitatea opririi forate a conexiunilor altor utilizatori. RELOAD - permite administratorului s rencarce tabele alocate i s actualizeze privilegiile, gazdele, logurile i tabelele. SHUTDOWN - permite administratorului s opreasca serverul de MySQL de la distan. FILE - permite administratorului s citeasc informatii sensibile de pe server; s insereze date n tabele din fisiere i reciproc. Privilegiile speciale sunt doua : ALL - ofer toate privilegiile. Se poate folosi ALL PRIVILEGES n loc de ALL. USAGE - nu ofer nici un privilegiu. Va fi creat un utilizator cruia i se va permite s se logheze dar nu va avea nici un drept. De obicei se adaug pe parcurs privilegii. Orice utilizator poate avea oricare din aceste privilegii, dar se obinuiete s se restricioneze cele proprii administratorului doar acestuia. Comanda GRANT - permite crearea utilizatorilor i/sau stabilirea, respectiv codificarea privilegiilor acestora pe patru nivele de privilegii:
Global este aplicat tuturor bazelor de date existente pe un server Database - este aplicat tuturor tabelelor dintr-o baz de date Table - este aplicat tuturor coloanelor dintr-o tabel Column - este aplicat doar coloanelor specificate explicit
Sintaxa comenzii GRANT este: GRANT privilegii [coloane] ON component TO nume_utilizator [IDENTIFIED BY 'parol'] [WITH GRANT OPTIONS] Unde: privilegii - peprezint o list de privilegii desparite prin virgul, ce pot fi alese dintre cele prezentate anterior plus clauza special ALL are specific toate privilegiile posibile. coloane - o list optional de una sau mai multe coloane. Permite stabilirea privilegiilor la nivel de coloane. componenta - este numele unei baze de date sau tabele asupra crora vor fi stabilite privilegiile. Toate bazele de date se pot specifica prin *.*, i este nivelul Global. Nivelul Database se poate specifica prin nume_bd.*, iar nivelul Table prin nume_bd.nume_tabel. Dac se specific doar nume_tabel se va interpreta ca fiind o tabel a bazei de date selectate. Nivelul Column se va obine prin folosirea unei liste de coloane nevide.
38
nume_utilizator - este numele utilizatorului cruia i se atribuie privilegiile. El poate conine i un nume de staie de pe care are dreptul s se conecteze. parola - specific parola cu care utilizatorul se va conecta. Parola trebuie n general s nu fie uor de ghicit (s nu fie chiar numele contului sau un cuvnt din dicionar). Opiunea IDENTIFIED BY este obligatorie deoarece dac lispsete, utilizatorul se va putea conecta fr parol. WITH GRANT OPTION - d dreptul utilizatorului s dea privilegii echivalente cu ale sale altor utilizatori. Acest opiune poate fi utilizat pentru a delega dreptul de administrare, inclusiv creare de utilizatori, unor administratori ale unor baze de date particulare de pe server. Aceti administratori nu vor putea ns s interacioneze cu alte baze de date. Exist posibilitatea vizualizrii privilegiilor. Aceasta se realizeaz cu ajutorul comenzii: SHOW GRANTS FOR utilizator; Deasemenea, exist posibilitatea de a retrage drepturile cuiva. Sintaxa acestei comenzi este: REVOKE privilegii [coloane] ON componenta FROM nume_utilizator Pentru a retrage privilegiul acordat prin clauza WITH GRANT OPTION, se va utiliza sintaxa: REVOKE GRANT OPTIONS ON componenta FROM nume_utilizator
39
Capitolul 3
PHP i MySQL
n PHP sunt implementate o serie de funcii pentru conectarea i comunicarea cu server-ul MySQL. Folosind aceste funcii, un program PHP poate obine accesul la bazele de date rezidente ntr-o baz de date MySQL i le poate modifica. Pentru a utiliza cu success funcii PHP pentru a comunica cu serverul MySQL, trebuie ca MySQL s ruleze pe o locaie la care serverul web folosit s se poat conecta (nu neaprat aceeai maina cu cea a serverului web). De asemenea e necesar un cont de utilizator (protejat de o parol) i trebuie s tim numele bazei de date la care vrem s ne conectm.
40
O conexiune nepersistent va fi distrus la terminarea paginii sau la apelul mysql_close. Se realizeaz prin apelul mysql_connect. Avantajele conexiunilor temporare: nu blocheaz conexiunea dect pe perioada interpretrii scriptului, iar dezavantajul este timpul mai mare de rspuns datorat crerii unei noi conexiuni la fiecare apel. Ambele tipuri de conexiuni asigur aceiai funcionalitate. Singura diferen dintre ele const n eficiena cu care se trateaz deschiderea unei conexiuni raportat la cantitatea de resurse blocate. Sintaxa lor este asemntoare: resource mysql_pconnect ( string server , string utilizator , string parol ) resource mysql_connect ( string server , string utilizator , string parol ) Parametri au urmtoarea semnificaie: server - specific numele mainii pe care ruleaz serverul de mySQL. Dac serverul de Web i cel de mySQL ruleaz pe aceiai main, numele poate fi "localhost". n cazul n care serverul de mysQL s-a instalat pe alt port dect cel standard (3306), numarul portului se specific dup numele serverului, spre exemplu "loalhost:3371". utilizator - specific numele utilizatorului pentru care se realizeaz conexiunea. Deoarece prin nume serverul va stabili drepturile pe care programul le are asupra unei anumite baze de date, acest parametru poate fi folosit pentru a crete securitatea siteului. parola - este un ir de caractere cuprinznd parola n clar a utilizatorului specificat. Deoarece liniile php nu traversez serverul Web, aceast parola nu poate fi citit de utilizator prin comanda View Source a navigatorului Web. Singura problem apare dac cineva neautorizat are acces local la sistemul de fiiere de pe server i poate citi direct fiierul php. Pentru nchiderea conexiunii, dup ce nu mai este necesar, se va utiliza comanda: bool mysql_close ( resource identificatorBD ); Parametrul identificatorBD trebuie s fie un identificator valid de conexiune returnat n prealabil de comada mysql_connect (sau mysql_pconnect). Pentru a putea accesa datele din tabelele unei anumite baze de date de pe server, dup realizarea conexiunii, aceasta trebuie selectat prin comanda mysql_select_db: bool mysql_select_db ( string numeBazaDeDate ); Funcia returneaz false n caz de eec.
3.2 Interogri
n cadrul limbajului PHP interogrile sunt emise cu ajutorul comenzii:
41
resource mysql_query ( string query ); i exist dou categorii de interogri: interogrile SELECT, i interogrile UPDATE, INSERT i DELETE. Pentru a aduga informaii n baza de date trebuie transmis din pagina de PHP o interogare INSERT spre serverul de mySQL. Transmiterea unei interogri SQL spre server se poate face cu ajutorul funciei mysql_query. Aceasta funcie presupune existena unei conexiuni deschise spre server, selecia prealabil a bazei de date i existena unor drepturi suficiente pentru rularea interogrii. Dac interogarea transmite napoi un rezultat (SELECT, DESCRIBE, EXPLAIN sau SHOW), funcia returneaz un identificator spre resursa reprezentat de rezultat. n cazul interogrilor aciune (INSERT, DELETE, UPDATE etc.) funcia va retura TRUE dac s-a executat corect interogarea. n ambele situaii funcia returneaz FALSE dac interogarea nu a putut fi executat de server. Spre deosebire de interogrile UPDATE, INSERT i DELETE, interogrile SELECT returneaz rnduri de tabel. Rndurile unui tabel sunt incluse ntr-o structur numit set de rezultate. Prelucrarea setului de rezultate returnat de o interogare SELECT implic parcurgerea prin iteraie a rndurilor setului de rezultate. Pentru a obine valoarea numrului de rnduri se folosete funcia mysql_num_rows(). Funcia mysql_fetch_row() se poate folosi pentru a obine urmtorul rnd din secvena setului de rezultate. Pentru a evita problemele care apar din cauza caracterelor speciale interpretate diferit de mySQL i PHP, valorile variabilelor trebuie transformate corespunztor prin utilizarea funciei addslashes: string addslashes ( string parametru) .Pentru a afla numarul nregistrrilor afectate de o interogare aciune se poate folosi funcia mysql_affected_rows: int mysql_affected_rows ( );
42
mysql_fetch_array() va returna urmatoarea nregistrare din rezultat. Cnd nu mai sunt disponibile nregistrri, funcia va retuna valoarea FALSE. Rezultatul este preluat prin funcia mysql_fetch_row() i interpretat ca un tablou indexat numeric. Acest tablou are ca i indexi numerele 0,1,2 etc. iar ca i valori, valorile corespondente coloanelor de pe poziiile respective din rezultat. Fiecare apel succesiv al funciei mysql_fetch_row() va returna urmatoarea nregistrare din rezultat. Cnd nu mai sunt disponibile nregistrri, funcia va retuna valoarea FALSE. Rezultatul este preluat prin funcia mysql_fetch_object() i interpretat ca un obiect. Acest obiect are ca i atribute numele coloanelor selectate iar ca i valori ale acestora, valorile corespondente din rezultat. Fiecare apel succesiv al funciei mysql_fetch_object va returna urmatoarea nregistrare din rezultat. Cnd nu mai sunt disponibile nregistrari, funcia va retuna valoarea FALSE.
Concluzii
Prima ntrebare pe care cititorul acestei lucrri ar gndi-o, probabil, este referitoare la faptul c prin intermediul aplicaiei nu poi cumpra nimic i poate prea fr folos. Dar nainte de a ntreba i-ar da seama c majoritatea aplicaiilor dezvoltate cu ajutorul tehnologiilor PHP i MySQL sunt magazinele online i bibliotecile-librrii virtuale, de unde poi cumpra orice. Dei exist multe cri ce pot fi cumprate, nu mereu ne permitem s cumprm; i dac ne permitem s cumprm, nu avem timp s le rsfoim. Prin intermediul acestei lucrri am ncercat s evideniez utilitatea combinrii celor dou tehnologii PHP si MySQL pentru obtinerea de pagini Web cu continut dinamic. Am ales limbajul PHP deoarece este special conceput pentru crearea de pagini Web i este un limbaj inter-platform, surs gratuit i uor de invat. De asemenea el ofer suport pentru o gama larg de sisteme de baze de date. Am ales sistemul MySQL deorece este un sistem de gestiune al bazelor de date relaional i este distribuit in regim gratuit, ca i PHP-ul. Alegerea a fost influenat i de facilitatea realizrii unei intefee prietenoase i uor de inteles. Aplicaia este realizat pentru a folosi tuturor, att celor care vor deveni membrii fideli i vor ajuta la imbuntirea paginii de internet, ct i celor care, pentru a evada din rutin, se vor relaxa pentru cteva minute citind o poezie. Bine nteles, pe internet exist multe pagini pe care se pot gsi poezii, dar aceasta pagin va destinat ntru totul domeniului literar. Membrii vor putea s i mprteasc gndurile, s i spun prerea despre o anumit poezie, vor putea veni cu noi idei pentru aceast pagin. Sistemul de notare existent are rolul de a spori interesul i dorina membrilor de a posta noi poezii care s fie printre primele n topul poeziilor. Urmtorul pas in cadrul paginii va fi realizarea unui forum unde utilizatorii s poat discuta pe baza poeziilor, i nu numai. Prerile si ideile utilizatorilor vor fi importante pentru dezvoltarea continu a acestei pagini.
43
Bibliografie
Nr. crt.
1 2 3 4
Titlu
PHP-Portal Dynamic site with PHP_MySQL PHP 4 A BEGINNER'S GUIDE PHP Manual
Autor
http://www.php.maelvi.ro/pgs/tut_mysql_date.php Ashraful Anam Bill McCarty, traducere de Mihai Mnstireanu 2002 Teora Stig Sther Bakken, Alexander Aulbach, Egon Schmid, Jim Winstead Lars Torben Wilson Rasmus Lerdorf Andrei Zmievski Jouni Ahto or http://www.php.net/docs.php Graeme Merral Luke Welling and Laura Thomson Michael Glass, Yann Le Scouarnec, Elizabeth Naramore, Gary Mailer, Jeremy Stolz, Jason Gerner Build your own database driven website using PHP and MySql SitePoint, August 2001
5 6 7 8
PHP/MySQL Tutorial PHP and MySQL. Web Development Beginning PHP, Apache, MySQL Web Development Kevin Yank
44