Documente Academic
Documente Profesional
Documente Cultură
1. Introducere MySql.
a. Ce este mySQL?
b. Argumente in favoarea mySQL
c. Instalare
d. Instalare sub Windows
e. Rulare sub Windows
f. Instalare sub Linux
g. Testarea instalarii
2. Algebra Relationala. Proiectarea si crearea unei baze de date
a. Proiectarea unei baze de date
b. Crearea unui dictionar de date
c. Elemente de Algebra Relationala
d. Normalizarea unei baze de date
e. Crearea/Stergerea/Migrarea unei BD mySQL
3. Conectarea la serverul mySQL
a. Conectarea la serverul mySQL
b. Folosirea unui client tip linie de comanda
c. Verificarea conectarii si a starii serverului
d. Crearea si utilizarea unei baze de date
e. Crearea unei baze de date
f. Utilizarea unei baze de date
4. Tipuri de date. Tabele
a. Tipuri de date
b. Constante, identificatori, comentarii
c. Operator i si functii mySql
d. Creare si stergerea tabelelor
5. Gestiunea Accesului
a. Sistemul de Privilegii mySql
b. Proiectarea unui sistem de gestiune a accesului
c. Accesul concurent la date
d. Replicarea datelor
6. Gestionarea datelor.
a. Inserarea datelor in tabele
b. Comanda INSERT
c. Utilizare comenzii INSERT
d. Modificarea datelor din tabele
e. Comanda UPDATE
f. Utilizarea comenzii UPDATE
g. Stergerea datelor din tabele
h. Comanda DELETE
i. Utilizarea comenzii DELETE
7. Interogari
a. Interogarea datelor
b. Comanda SELECT
c. Utilizarea conditiilor de selectie
d. Ordonarea rezultatului
e. Folosirea alias-urilor (poreclelor)
8. Interogari avansate
a. Selectarea datelor din mai multe tabele. Operatia JOIN.
b. Selectarea datelor din mai multe tabele.
c. Tipuri de JOIN.
d. Extragerea informatiilor de sumarizare
9. Biblioteci mySQL. Accesul concurent la date.
a. Implemetarea programelor client.
b. Suport ODBC.
c. Suport JDBC.
d. Biblioteca MySQL C.
e. Suport Pearl.
f. Suport PHP.
g. Accesul concurent la date.
h. Tranzactii. Blocarea/deblocarea unei tabele.
i. Replicarea datelor.
10. Limbajul PHP
a. Introducere
b. Comparatia cu alte sisteme
11. PHP - Instalare
a. Instalarea serverului Apache
b. Instalarea suportului PHP pentru serverul Apache
c. Testarea instalarii modulului de PHP
d. Instalarea mySQL
e. Informatii aditionale
12. Tipuri de date. Variabile
a. Inserarea codului PHP intr-o pagina HTML. Taguri PHP
b. Generarea dinamica de continut HTML
c. Tipuri de date. Conversii de tip
d. Identificatori. Constante
e. Variabile utilizator. Variabile referinta. Domeniu de valabilitate
f. Accesarea variabilelor din form-uri HTML
13. Operatori si expresii
a. Operatori aritmetici
b. Operatori pe siruri de caractere
c. Operatori de asignare
d. Operatori de referire
e. Operatori de comparare
f. Operatori logici
g. Operatori pe biti
h. Operatori aditionali
i. Expresii
14. PHP - Structuri conditionale si repetitive
a. Instructiuni conditionale
b. Instructiunea if
c. Instructiunea switch
d. Instructiuni repetitive
e. Instructiunea while
f. Instructiunea do while
g. Instructiunea for
h. Tablouri PHP. Instructiunea foreach
i. Instructiuni de control pentru repetitii
15. PHP - Functii. Formulare. Sesiuni.
a. Functii
b. Functii de biblioteca
c. Functii utilizator
d. Transmiterea parametrilor
e. Functii recursive
f. Reutilizarea codului
g. Instructiunea require
h. Instructiunea include
i. Cotrolul sesiunilor
j. Utilizare formulare si sesiuni pentru controlul utilizatorilor
16. Functii. Utilizare fisiere
a. Functii de prelucrare tablouri
b. Functii de prelucrare date calendaristice
c. Functii matematice
d. Functii de prelucrare siruri de caractere
e. Utilizare fisiere
f. Deschiderea si inchiderea unui fisier
g. Scrierea intr-un fisier
h. Citirea dintr-un fisier
i. Functii speciale pentru fisiere
17. Utilizare MySQL in PHP.
a. Limbajul SQL
b. Baze de date. Tabele
c. Utilizatori si privilegii
d. Adaugarea, modificarea si stergerea datelor
e. Interogari SELECT
f. Utilizarea unei baze de date mySQL in PHP
g. Conectarea la server
h. Adaugarea de informatii
i. Cautarea si afisarea rezultatelor
18. Aplicatii Multimedia e-Comerce Complexe
a. Tipuri de aplicatii e-Comerce
b. Brosuri de prezentare
c. Comenzi prin Internet pentru marfuri si servicii
d. Comert cu servicii si bunuri digitale
e. Aplicatii de tip "valoare adaugata"
f. Riscuri si probleme legate de aplicatiile e-comerce
19. Probleme de securitate
a. Utilizare cookies
b. Restrictii legate de cookies
c. Utilizare cookies in PHP
d. Probleme la folosirea cookies
e. Probleme de securitate la site-urile PHP
f. Securitatea serverului de Web
g. Securitatea instalarii PHP
h. Gestiunea utilizatorilor in PHP
i. Autentificarea utilizand serverul de Web
j. Autentificarea folosind PHP
ABD
1. Introducere
1.1. Ce este mySQL?
1.2. Argumente in favoarea mySQL
2. Instalare
2.1. Instalare sub Windows
2.2. Rulare sub Windows
2.3. Instalare sub Linux
2.4. Testarea instalarii
1. Introducere
1.1. Ce este mySQL?
MySQL este unul dintre cele mai populare sisteme de gestiune de baze de date (SGBD) in
regim OpenSource.
l Este un SGBD.
Asigura gestiunea unei colectii structurate de date.
l Este un SGBD relational.
Datele sunt organizate in tabele. Intre tabele sunt stabilite relatii si constrangeri de
integritate. Pentru gestiunea datelor foloseste limbajul SQL (Structured Query
Language) care este un standard in acest domeniu.
l Este un sistem client -server.
Serverul de baze de date este separat logic si deseori fizic (pe calculatoare diferite)
de programele client care asigura interfata operatiilor cu baza de date. Serverul
MySQL suporta o paleta larga de programe client, scrise in diverse limbaje de
programare.
l Este distribuit in formula Open Source Software.
Aceasta formula permite oricarei persoane sa utilizeze si sa modifice programul, care
poate fi luat gratuit de pe Internet. Formula utilizata pentru licentiere este GPL (GNU
General Public License). Pentru mai multe informatii accesati site-ul
http://www.gnu.org.
l Este rapid.
In multe aplicatii este chiar mai rapid dacat alte sisteme foarte scumpe.
l Este fiabil.
Asigura o buna protectie a datelor prin mecanisme specifice.
l Este usor de utilizat.
Chiar daca ofera o paleta foarte bogata de functii, organizarea acestora si modul in
care au fost create faciliteaza folosirea lor.
l Bazat pe fire de executie nucleu.
5
ABD
2. Instalare
2.1. Instalare sub Windows
#basedir = d:/mysql/
#datadir = d:/mysql/data/
6
ABD
c:\mysql\bin\mysqld
sau
c:\mysql\bin\mysqld -opt
Sub Winodws NT/2000 se va instala serverul ca si serviciu (va fi disponibil automat chiar si
dupa repornirea sistemului) tastand comanda:
3. Intrare in subdirector:
cd mysql-3.23.xx
./configure --prefix=/usr/local/mysql
5. Compilare executabil:
make
6. Instalare server:
make install
7
ABD
scripts/mysql_install_db
l c:\mysql\bin\mysqlshow
Databases
mysql
test
Dupa cum se observa, la instalare sunt create automat doua baze de date: mysql pentru
stocarea utilizatorilor si drepturilor de acces, respectiv test pentru a testa corectitudinea
configuratiei curente.
Database: mysql
Tables
columns_priv
db
host
tables_priv
user
8
ABD
1.2. Definitii
N-upletul este un ansamblu de constituanti (X1, X2, …, XN) sau de date (a1, a2,
…, an) cu ai in dom(X i). Un N-uplet de constituanti poate fi considerat ca si un
constituant compus.
9
ABD
3. definirea unui predicat logic care pentru orice N-uplet de date (a1, a2, …,
an) cu a i in dom(Xi ) cu i de la 1 la N da o propozitie adevarata sau falsa.
Relatia R(X) este formata din ansamblul N-upletilor pentru care predicatul da
propozitii adevarate.
Gradul unei relatii este dat de numarul atributelor ce formeaza relatia.
O relatie este definita ca un set de N-upleti distincti (din acest punct de vedere
corespunde tipului algebric multime).
Cheia primara (PK - primary key) este o cheie aleasa de administratorul bazei
de date pentru a identifica înregistrarile. De obicei se pe acest post se alege o
cheie cu un numar minim de atribute, daca este posibil chiar un singur atribut. La
nevoie se poate introduce o codifcare suplimentara fata de datele initiale ale
problemei.
Se numeste cheie externa (FK - foreign key) un grup de atribute care constituie
o cheie primara într-o alta relatie. O cheie externa ajuta la legarea datelor din cele
doua relatii.
Pentru prelucrarea datelor din tabele teoria relationala defineste doua tipuri de
operatori: operatori din teoria multimilor - UNION, INTERSECT, DIFERENCE,
KHARTEZIAN PRODCT, respectiv operatori specifici algebrei relationale:
SELECT, PROJECT, UNION. Acesti operatori stau la baza limbajelor de
interogare relationale, dintre care cel mai cunoscut este SQL.
10
ABD
11
ABD
Varianta: nu se permit atribute care nu fac parte din cheile candidat ale relatiei si
care determina alte atribute.
Se poate da si o definitie generalizata pentru forma 3NF. Orice atribut al relatiei
îndeplineste:
O varianta mai restrictiva este BCNF - Boyce Codd Normal Form. O relatie este
în BCNF daca, pentru orice dependenta X->Y din R, X este o cheie candidat a lui
R.
12
ABD
In general cel mai important criteriu ramane totusi spatiul pe disc. Chiar daca in
zilele noastre discurile au capacitati foarte mari, o baza de date cu redundanta
mare, pe langa ca ocupa inutil foarte mult spatiu, este si foarte greu de accesat
(viteza de cautare in tabele este in general proportionala cu dimensiunea
acesteia, daca nu sunt luate in considerare fisierele index).
Pesoane
Camp Tip Constrangeri Comentarii
13
BD
14
ABD
Cel mai facil client pentru conectarea la serverul de mySQL este cel tip linie de
comanda care face parte din kit-ul standard de instalare mySQL.
El se numeste mysql.exe si permite conectarea atat local cat si la un server la
distanta.
Clientul mysql.exe se poate utiliza si pentru a rula un fisier text de comenzi SQL.
Pentru aceasta se va utiliza sintaxa:
15
ABD
l Interogarile se vor termina cu ';'. Ele se pot despartii pe mai multe linii prin apasarea tastei
ENTER. Ultima linie trebuie sa se termine cu ';'.
l Limbajul de interogare nu este de tip "case sensitive", deci nu tine cont de litere mari/mici.
Practic se poate utiliza orice combinatie de litere mari sau mici.
Comanda anterioara este echivalenta cu:
mysql> select
-> Version()
-> ,
-> CURRENT_DATE;
mysql>SHOW databases;
In aceiasi maniera se pot obtine informatii despre tabelele apartinand unei baze
de date (spre exemplu baza de date 'mysql' creata automat la instalare):
Crearea unei baze de date corespunde crearii unui director in care vor fi pastrate
elementele specifice cum ar fi: tabele, indecsi, jurnale etc. Daca deja exista o
16
ABD
Pentru selectarea unei baze de date se va folosi comanda USE. Prin aceasta se
stabileste baza de date in contextul careia se vor executa interogarile ulterioare.
Ea se va numi baza de date activa.
mysql>USE nume_db;
Chiar daca o singura baza de date poate fi activa la un moment dat, o interogare
poate referi tabele si din alte baze de date prin utilizarea prefixarii cu numele
bazei de date respective (ex. db2.tabela5).
Exemplu:
mysql>USE mysql;
mysql>SHOW TABLES;
mysql>SELECT * FROM db;
3. Tema 2.2
Creati o baza de date numita BANCA. Cautati directorul creat pe disc care
corespunde bazei de date create.
Rulati comanda:
SHOW DATABASES;
Stergeti baza de date si creati-o din nou.
Selectati aceasta baza de date si rulati comanda:
SHOW TABLES;
Notati calea unde s-a creat directorul si raspunsul la ultima interogare.
©'2010 conf. dr. ing. Dan Pescaru
17
ABD
1. Tipuri de date
1.1. Tipuri de date numerice
1.2. Tipuri de date data calendaristica si timp
1.3. Tipuri de date sir de caractere
1.4. Tipuri de date binare mari (BLOB)
1.5. Tipuri de date speciale
2. Constante, identificatori, comentarii
2.1. Constante
2.2. Identificatori
2.3. Comentarii
3. Operatori si functii mySQL
3.1. Paranteze de grupare
3.2. Operatori aritmetici
3.3. Operatori logici
3.4. Operatori de comparare
3.5. Functii pe siruri de caractere
3.6. Functii matematice
3.7. Functii de tip data calendaristica si timp
4. Crearea si stergerea tabelelor
1. Tipuri de date
Ca orice limbaj de programare, limbajul SQL suporta anumite tipuri de date. Ele
pot fi in general impartite in: numerice, logice, data calendaristica, timp, siruri de
caractere si date binare mari (BLOB - binary large object).
Din motive de implementare, fiecare sistem de gestiune de baze de date
implementeaza propriile subtipuri ale tipurilor de baza. Aceasta situatie poate
pune uneori probleme de compatibilitate la trecerea bazelor de date de pe un
sistem pe altul.
In continuare se vor prezentat tipurile de date suportarte de mySQL.
Ca si regula generala, notatia:
are urmatoarea interpretare: tipul de date referit este afisat pe M pozitii, eventual
cu D pozitii in partea zecimala. Toate valorile ce se gasesc in paranteze drepte
semnifica marimi optionale.
Observatie: optiunile M si D nu influenteaza insa spatiul de stocare necesar
pentru memorarea valorilor de acel tip.
18
ABD
19
ABD
1. DATE
Data calendaristica. Intervalul de valori posibile este ['1000-01-01'..'9999-
12-31']. Stocarea/afisarea se face implicit in formatul 'YYYY-MM-DD' (an-
luna-zi).
2. DATETIME
Combinatie de data calendaristica si timp. Intervalul de valori posibile este
['1000-01-01 00:00:00'..'9999-12-31 23:59:59']. Stocarea/afisarea se face
implicit in formatul 'YYYY-MM-DD HH:MM:SS' (an-luna-zi
ora:minut:secunda).
3. TIMESTAMP [(M)]
Moment de timp. Include si data calendaristica. Este util la inregistrarea
efectuarii unor operatii gen inserare sau modificare pentru ca retine implicit
data efectuarii ultimei operatii. Doar prima coloana de acest tip din tabela in
care se face modificarea va fi actualizata automat! Intervalul de valori
posibile este ['1970-01-01 00:00:00'..'2037-01-01 00:00:00']. MySQL
afiseaza valorile TIMESTAMP in format YYYYMMDDHHMMSS,
YYMMDDHHMMSS, YYYYMMDD sau YYMMDD dupa cum M este 14 (sau
lipseste), 12, 8 sau 6. Parametrul M nu influenteza insa reprezentarea
interna a datelor la stocare.
4. TIME
Moment de timp. Intervalul de valori posibile este [-838:59:59'..'838:59:59'].
Reprezentarea este in format 'HH:MM:SS' (ora:minut:secunda). Motivul
pentru care ora nu este limitata la intervalul [0..24] esta ca acest tip poate fi
folosit si pentru a retine intervale de timp intre doua evenimente. Tot din
acest motiv ora poate fi si negativa.
5. YEAR [(2|4)]
An calendaristic pe 2 sau 4 cifre. Intervalul de valori posibile este
[1901..2155] pentru 4 cifre, respectiv [1970..2069] pentru 2 cifre (70-99..00-
69).
20
ABD
1. TINYBLOB
TINYTEXT
Valori BLOB, respectiv TEXT cu lungime de max. 255 elemente.
2. BLOB
TEXT
Valori BLOB, respectiv TEXT cu lungime de max. 65535 (64 KB) elemente.
3. MEDIUMBLOB
MEDIUMTEXT
Valori BLOB, respectiv TEXT cu lungime de max. 16777215 (16 MB)
elemente.
4. LONGBLOB
LONGTEXT
Valori BLOB, respectiv TEXT cu lungime de max. 4294967295 (4 TB)
elemente.
1. ENUM ('value1','value2',...)
Enumerare de elemente tip sir de caracter. Un obiect de acest tip poate
avea la un moment dat o singura valoare dintre cele enumerate sau
valoarea NULL. Valoarea " " (sir vid) este considerata valoare de eroare. Un
tip enumerare poate defini maxim 65535 de valori distincte.
2. SET ('value1','value2',...)
Multime de elemente tip sir de caracter. Un obiect de acest tip poate contine
la un moment dat mai multe valori distincte dintre cele definite sau poate fi
gol (nu contine nici o valoare). Un tip multime poate defini maxim 65 de
valori membru.
2.1. Constante
21
ABD
'constnta sir'
"alta constanta sir"
In interiorul unui sir se pot include caractere speciale precedate de semnul
'\' (escape):
¡ \n Trecere la linie noua (new line).
¡ \b Sterge inapoi.
¡ \\ Caracterul \.
Ex:
13534
342.3453
l Constanta NULL este folosita cu semnificatia "nici o valoare". Se face
diferenta intre NULL si numarul 0 sau sirul vid "".
2.2. Identificatori
Numele pentru baza de date, tabele, coloane, indecsi sau alias-uri trebuie sa
indeplineasca conditiile normale pentru identificatori in limabje de programare: sa
fie o combinatie de litere, cifre si semne grafice care incep cu o litera. In plus
mySQL impune:
Identificator Lungime maxima Caractere interzise
Baza de date 64 '/'
Tabela 64 '/' si '.'
Coloana 64
Alias 255
22
ABD
Identificatorii pot fi scrisi in general cu orice combinatie de litere mari sau mici.
Pentru numele bazei de date si cel al tabelelor unele, implementari impun
respectarea tipului de caractere folosit la definirea elementelor respective. Ca si
regula generala, este bine sa se pastreze o conventie de notare care sa nu fie
schimbata de la o interogare la alta. O regula simpla este sa se scrie comenzile
SQL cu litere mari si identificatorii definiti de utilizator cu litere mici.
2.3. Comentarii
MySQL suporta trei tipuri de comentarii prin care se poate explica codul. Ele
sunt:
Rulati secventele:
23
ABD
l + pentru adunare;
l - pentru scadere;
l * pentru inmultire;
l / pentru impartire; daca se imparte la 0 rezultatul va fi NULL;
Rulati secventele:
l NOT
! - Negatie logica. Intoarce 1 daca argumentul este 0, altfel intoarce 0.
Exceptie: NOT NULL intoarce NULL.
l OR
|| - SAU logic. Intoarce 1 daca cel putin un argument nu este 0 sau NULL.
l AND
&& - SI logic. Intoarce 0 sau NULL daca cel putin un argument este 0 sau
NULL, altfel intoarce 1.
Rulati secventele:
24
ABD
Rulati secventele:
25
ABD
Rulati secventele:
26
ABD
sus)
l ROUND(X) - rotunjire la cel mai apropiat intreg
l EXP(X) - exponentiala (e la puterea x)
l LOG(X) - logaritm natural din x
l LOG10(X) - logaritm in baza 10 din x
l POW(X,Y) - x la puterea y
l SQRT(X) - radical de ordinul 2 din x
l PI() - numarul PI; implicit se afiseaza cu 5 zecimale dar in calcule intervine
cu dubla precizie
l COS(X), SIN(X),TAN(X) - cosinus, sinus si tangenta de x
l RAND()
RAND(N) - genereaza un numar pseudo-aleator in intervalul [0..1]; prin N se
poate specifica o valoare de initializare calcul
l LEAST(X,Y,...) - intoarce cea mai mica valoare din lista valorilor specificate
l GREATEST(X,Y,...) - intoarce cea mai mare valoare din lista valorilor
specificate
Rulati secventele:
Rulati secventele:
27
ABD
Rulati secventele:
Activitate 10
mysql> SELECT DATABASE(), USER(), VERSION() ;
mysql> SELECT FORMAT(345674355.35,3), PASSWORD("parola") ;
specifica nimic)
28
ABD
genera automat o valoare mai mare cu o unitate fata de cea mai mare
valoare din acel camp. Poate fi specificata o singura coloana cu acest
parametru intr-o tabela. Coloanele specificate astfel trebuie indexate.
¡ PRIMARY KEY - specifica cheia primara pentru tabela. Un singur
Selectati cu ajutorul comenzii USE baza de date BANCA creata la Tema 2.2.
Creati o tabela Deponent ruland comanda:
5. Tema 3.1
29
ABD
Activitate 2:
2
2
2
... Obs: pentru a rula mai usor secventele se poate face "copy" in fereastra
navigatorului si "paste" in fereastra mySQL.
Conturi
nr_cont char(6) -- de forma 'C23432', cheie primara
nr_buletin char(8) -- cheie externa spre tabela Deponenti, nu poate fi null
tip_cont char(3) -- tipul contului, ex. 'LEI', 'USD' etc.
termen_depozit int(3) -- termen depozit in numar de zile (0 pentru cont curent),
implicit 0
sold int -- suma totala din cont, poate fi negativa daca s-a luat un imprumut
si
Operatii
nr_cont char(6) -- nu poate fi null, cheie externa spre tabela Conturi
suma int -- suma depusa (pozitiva) sau extrasa (negativa)
data timestamp -- data efectuarii operatiei
cheia primara va fi formata din nr_cont+data
30
ABD
1.1. Introducere
La instalarea sistemului este creat implicit un utilizator numit "root" care are toate
drepturile activate. Acest utilizator trebuie folosit, din motive de securitate, doar
pentru administrare. Pentru fiecare utilizator care va interactiona cu serverul
trebuie creat un utilizator.
Foarte important! Desi nu este obligatorie stabilirea unor parole pentru utilizatori
la crearea conturilor acestora, aceasta operatie este de cea mai mare
importanta. In caz contrar securitatea serverului este grav compromisa.
31
ABD
Un utilizator (sau proces) trebuie sa aiba cel mai scazut nivel de privilegii,
suficient pentru a putea executa sarcinile care i-au fost alocate.
Informatiile despre privilegii sunt stocate in tabelele user, db, host, tables_prv
si columns_priv din baza de date mysql. Serverul va citi continutul acestor
tabele ori de cate ori sistemul de privilegii trebuie sa actioneze.
Tabelul urmator prezinta sistemul de privilegii impreuna cu numele coloanelor din
tabelele de privilegii:
Denumire
Privilegiu Context Semnificatie
coloana
select Select_priv tabele permite selectarea (vizualizarea) datelor
insert Insert_priv tabele permite adaugarea unor noi inregistrari
update Update_priv tabele permite modificarea datelor
delete Delete_priv tabele permite stergerea inregistrarilor
index Index_priv tabele permite crearea/stergerea indecsilor
permite redenumire sau modificarea
alter Alter_priv tabele
structurii tabelei
baza de date, tabele sau
create Create_priv permite crearea unei baze de date/tabele
indecsi
drop Drop_priv baza de date, tabele permite stergerea unei baze de date/tabele
permite delegarea privilegiilor catre alt
grant Grant_priv baza de date, tabele
utilizator
permite oprirea serverului din programul
shutdown Shutdown_priv administrare server
client
permite vizualizarea/oprirea proceselor in
process Process_priv administrare server
executie
permite schimbul de date intre tabele si
file File_priv acces la fisiere externe
fisiere
32
ABD
GRANTprivilegii [coloane]
ONcomponenta
TOnume_utilizator [IDENTIFIED BY 'parola']
[WITH GRANT OPTINS]
l privilegii - este o lista de privilegii despartite prin virgula. Ele pot fi alese
dintre cele prezentate anterior (SELECT, INSERT, ALTER ...) plus clauza
speciala ALL PRIVILEGES (sau simplu ALL) care specifica toate privilegiile
posibile. Pentru a crea doar utilizatorul fara sa i se dea nici un drept, se va
folosi clauza USAGE.
l coloane - o lista de una sau mai multe coloane. Permite stabilirea
33
ABD
Conectarea la server se poate face local sau de la distanta folosind diversi clienti
mySQL. Toti acesti clienti vor permite trimiterea spre server a informatiilor legate
de numele utilizatorului si parola.
Clientul standard din chitul de distributie se va folosi astfel:
34
ABD
3. Retragerea privilegiilor
REVOKEprivilegii [coloane]
ONcomponenta
FROMnume_utilizator
35
ABD
Deoarece sistemul mySQL este pur relational, nu exista nici o diferenta intre
inserarea de noi date sau adaugarea lor. In ambele situatii, locul in care se face
adaugarea nu este precizat, nefiind relevant. La sistemele care nu sunt pur
relationale (cum este dBase sau FoxPro) operatia de adaugare semnifica
adaugarea la sfarsitul unei tabele, pe cand insertia inseamna inserarea intre alte
doua inregistrari existente.
36
ABD
O a treia sintaxa permite adugarea automata a inregistrarilor prin selectia lor din
alte tabele:
37
ABD
Deponent
nr_buletin char(8) NOT NULL PRIMARY KEY
cnp char(13) NOT NULL
nume char(24) NOT NULL
prenume char(24) NOT NULL
datan date
oras char(24) DEFAULT 'Timisoara'
adresa char(32)
telefon char(9)
Conturi
nr_cont char(6) NOT NULL PRIMARY KEY
nr_buletin char(8) NOT NULL
tip_cont char(3) DEFAULT 'Lei'
termen_depozit int(3) DEFAULT 0
sold int DEFAULT 0
Operatii
nr_cont char(6) NOT NULL
suma int
data timestamp
38
ABD
39
ABD
40
ABD
Cap.7. Interogari
1. Interogarea datelor
1.1. Comanda SELECT
1.2. Utilizarea conditiilor de selectie
1.3. Ordonarea rezultatului
1.4. Folosirea alias-urilor (poreclelor)
1. Interogarea datelor
Comanda SELECT este cea mai utilizata comanda SQL. Ea permite atat
regasirea si vizualizarea datelor din tabelele bazei de date cat si calcularea unor
expresii care nu au legatura cu datele din tabele.
Sintaxa comenzii SELECT pentru calcularea valorii unor expresii este foarte
simpla si a fost deja folosita in capitolele anterioare:
SELECT expresie;
Ex:
SELECT 3*(5+12);
SELECT [SQL_BUFFER_RESULT]
[HIGH_PRIORITY]
[DISTINCT | ALL]
expresie_de_selectie,...
[INTO {OUTFILE | DUMPFILE} 'nume_fisier']
[FROM referinte_tabele
[WHERE conditie_selectie]
[ORDER BY {intreg_pozitiv | nume_col | formula} [ASC | DESC] ,...]
Parametrii din paranteze drepte sunt optionali. Cei din acolade si despartiti prin '|'
sunt obligatorii dar mutual exclusivi (doar unul poate apare).
Ei au urmatoarea semnificatie:
41
ABD
42
ABD
O utilitate deosebita o au in cazul combinarii datelor din mai multe baze de date,
pentru a inlocui nume de tipul
nume_baza_de_date2.nume_tabela_1.nume_coloana_3, in cazul coloanelor
calculate sau in cazul operatiilor de JOIN (vor fi discutate in capitolul urmator).
Dupa cum se observa, alias-urile definite pentru tabele pot fi folosite in partea de
specificare a coloanelor, iar alias-urile coloanelor pot fi folosite in clauze ORDER
BY sau HAVING (va fi discutata in capitolul urmator).
43
ABD
SELECT lista_campuri
FROM lista_tabele
WHERE conditii_join AND conditii_selectie
ORDER BY ...
...
l lista_campuri - specifica acele campuri care vor face parte din rezultat.
Aceste campuri pot fi din oricare tabela specificata in clauza FROM. In
situatia in care un camp din rezultat apare sub acelasi nume in doua sau
mai multe tabele el trebuie prefixat cu tabela din care se extrage. In locul
numelui tabelei se prefera de obicei folosirea unui alias.
l lista_tabele - specifica tabelele din care se vor aduna datele. Unele tabele
de aici pot fi doar tabele de legatura intre alte tabele, ele neavand nici un
camp selectat in rezultat. Functie de tipul de operatie JOIN dorit,
lista_tabele poate fi doar o lista de nume despartite prin virgula sau poate
avea o forma mai execta, dupa cum se va preciza in sectiunea urmatoare.
l conditii_join - specifica conditiile relationale care leaga tabelele. Ele sunt
de obicei de forma tabela1.cheie_externa=tabela2.cheie_primara AND ....
Daca o legatura lipseste sau este pusa gresit, rezultatul va fi de obiecei un
produs cartezian intre tabele (toate combinatiile posibile intre inregistrari,
fara a tine seama de legaturile relationale).
44
ABD
SELECT lista_campuri
FROM tabela [INNER JOIN | LEFT OUTER JOIN | RIGHT OUTER JOIN]
tabela ON conditie_join ...
WHERE conditii_selectie
ORDER BY ...
...
45
ABD
SELECT lista_campuri
FROM lista_tabele
WHERE conditii_selectie
GROUP BY {colana | expresie}
HAVING conditie_includere_grup
ORDER BY ...
...
46
ABD
Pentru mai multe informatii despre utilizarea MySQL prin ODBC pot fi consultate
la adresele:
47
ABD
Pentru MySQL au fost create doua drivere JDBC gratuite (numite "twz"
respectiv "mm"). Ele pot fi descarcate de la adresa:
l http://www.mysql.com/Downloads/Contrib/
48
ABD
l MySQL documentation
l Pearl5 DBI
PHP (Personal HomePage) este un limbaj de tip script, inglobat in pagini HTML
49
ABD
Mai multe informatii despre PHP si utilizarea functiilor PHP-MySQL pot fi gasite
la adresa:
l PHP website
Pentru ca mai multi clienti sa poata accesa o tabela in acelasi timp (concurent),
este necesara implementarea unui sistem de partajare a informatiilor.
50
ABD
Pe de alta parte, functie de tipul de operatii efectuate, datele vor trebui sau nu
blocate pentru a asigura accesul exclusiv al unui client. Blocarea datelor in
general este necesara daca se doreste o scriere sau o modificare a lor care ar
afecta rularea altor clienti pentru aplicatii sensibile cum ar fi gestiunea bancara
sau e-comerce.
Pentru a bloca accesul altora asupra unei tabele, MySQL pune la dispozitie
comanda LOCK care are urmatoarea sintaxa:
UNLOCK TABLES
Cand se decide folosirea comezii LOCK trebuie avuta in vedere blocarea tuturor
tabelelor care vor fi prelucrate.
51
ABD
Cresterea robustetii se face prin utizarea replicarii datelor pe doua siteme - unul
master (principal) si unul backup (de rezerva) - si utilizarea sistemului backup
atunci cand cel principal nu este disponibil.
Pentru cresterea vitezei de acces la date, interogarile care necesita doar citirea
lor din tabele pot fi executate impartit pe master si pe backup. Acest procedeu
este eficient doar daca tabelele respective sunt intensiv accesate pentru citire si
mai putin pentru scriere. Aceasta este insa situatia intalnita pentru majoritatea
tabelelor unei baze de date.
52
ABD
1.1. Introducere
1.2. Comparatia cu alte sisteme
Limbajul PHP este un un limbaj de tip script creat special pentru Web. Liniile de
cod PHP trebuie incluse in interiorul unei pagini Web scrisa in HTML.
Contextul in care limbajul PHP poate fi utilizat presupune existenta unui server
de Web. Interpretorul de PHP va actiona ca si modul al acestui server. Schema
generala de lucru este prezentata in figura urmatoare.
53
ABD
Serverul Web incarca pagina din sitemul propriu de fisiere propriu si, constatand
ca este vorba de o pagina PHP o trimite interpretorului PHP.
Limbajul PHP are multi competitori, limbaje care au fost create sau adaptate in
acelasi scop: generarea de continut dinamic pe Web. Dintre acestea cele mai
importante sunt: Perl, Microsoft ASP (Active Server Pages), JSP (Java Server
Pages) si Allaire Cold Fusion.
l performanta buna
l interfete cu variate sisteme de gestiune a bazelor de date
l biblioteci puternice care acopera toate operatiilor Web uzuale
l cost scazut
l usor de invatat si utilizat
l portabil
l disponibil ca si cod sursa
Performanta - PHP este foarte eficient. Chiar utilizand un server Web ieftin, pot
fi serviti milioane de clienti pe zi. Mai multe informatii privind eficeinta PHP pot
fi citite la adresa http://www.zend.com.
Biblioteci standard - cuprind un numar foarte mare de functii, care ajuta la:
54
ABD
generarea de imagini GIF in mod dinamic, conectarea cu alte servicii din retea,
trimiterea de mesaje e-mail, gestiunea fisierelor cookies sau chiar generarea
automata de documente PDF. Utilizand functiile din biblioteci, toate aceste
operatii se pot implementa in foarte putine linii de cod.
Cost - PHP este gratuit. Ultima varianta este disponibila permanent la adresa:
http://www.php.net .
55
ABD
56
ABD
¡ AddModule mod_php5.c
57
ABD
<HTML>
<H2> Acesta este un fisier de test PHP </H2>
<P> <HR>
<? phpinfo() ?>
<P> <HR>
</HTML>
58
ABD
ftp://ftp.roedu.net/pub/mirrors/ftp.mysql.com/Downloads/MySQL -
4.0/mysql-4.0.21-win.zip.
2. Dezarhivare fisier mysql-4.0.21-win.zip intr-un director temporar (ex
c:\temp).
3. Se va rula programul setup.exe din directorul de dezarhivare. Directorul
de instalare va fi ales C:\mysql.
4. Crearea fisierului de configurare se va face prin copierea fisierului my -
example.cnf din directorul de instalare in radacina discului C sub numele
c:\my.cnf .
5. Pentru rulare in Winodws 95/98 se va lansa unul din serverele:
¡ mysqld - cu suport de depanare si alocare automata de memorie
Pentium
6. Serverul se va rula din Command Prompt (MS -DOS Prompt) (meniul
Start/Programs/MS-DOS Prompt) tastand: c:\mysql\bin\mysqld sau
c:\mysql\bin\mysqld-opt
Eventualele mesaje de eroare vor fi gasite in fisierul c:\mysql\mysql.err.
Desi editarea paginilor php se poate face in principiu cu orice editor de text (ex.
Notepad) se recomanda folosirea unui editor specializat, care ofera cel putin
colorarea bazata pe sintaxa si un sistem de ajutor (help) cu informatii despre
functiile php.
Un astfel de editor este Arisesoft Winsyntax v 2.0 si se poate obtine gratuit
de la adresa http://www.winsyntax.com/ .
60
ABD
l stilul "scurt":
Avantajul acestui stil este simplitatea. De aici rezulta o visteza mai mare
de scriere a codului.
l stilul XML:
l stilul SCRIPT:
Acest stil este destinat celor obisnuiti cu scrierea de cod JavaScript sau
VBScript. Este util daca se foloseste un editor HTML care are probleme cu
alte stiluri de tag -uri.
l stilul ASP:
61
ABD
Acest stil este similar cu cel folosit la ASP (Active Server Pages). Este util
daca se foloseste un editor HTML care genereaza cod ASP.
Texul care apare intre tagul de inceput si cel de incheiere (indiferent de stil) va
fi interpretat ca script PHP. Textul care apare in afara acestor taguri va fi tratat
ca si cod HTML obisnuit.
si
l stilul C: Comentariul se poate intinde pe mai multe linii si este cuprins intre
semnele '/*' si '*/'. El se poate insera chiar si in mijlocul unei expresii dar
nu poate fi imbricat in alt comentariu.
l stilul C++: Comentariul se intinde pe o singura linie, de la aparitia
semnului '//' pana la sfarsitul liniei curente.
l stilul Shell: Comentariul se intinde pe o singura linie, de la aparitia
semnului '#' pana la sfarsitul liniei curente.
62
ABD
<HTML>
<HEAD>
<TITLE>Activitate 1.</TITLE>
</HEAD>
<BODY>
<H2>Exemplu de generare dinamica de cod.</H1><P>
Linia urmatoare este generata de PHP:<P>
<?php
Ex. 1 echo "Data curenta pe server: ";
echo date ("H:i, jS F"); // se obtine data si ora curenta cu ajutorul
functiei date()
echo "<BR>";
?>
</BODY>
</HTML>
In plus, PHP suporta si tipurile pdfdoc respectiv pdfinfo pentru a asigura suport
pentru PDF (standardul Portable Document Format).
PHP este un limbaj slab tipizat. In limbajele puternic tipizate, o variabila poate
retine un singur tip de date pe toata durata sa de viata, tip asignat la
declararea acelei variabile. In PHP varibilele nu trebuie declarate explicit (ele
sunt considerate ca fiind declarate implicit la prima lor utilizare in cod), iar tipul
de date asignat este determinat de valoarea retinuta in acel moment.
Urmatoarele linii de cod sunt corecte in PHP (numele variabilelor PHP sunt
prefixate de semnul $):
$var1 = 1;
$var1 = "sirul 1";
Tipul datelor extrase din variabile poate fi schimbat fortat (casting sau
conversie de tip) in expresiile unde acestea intervin. Acest lucru se face prin
63
ABD
$var1 = 1;
$var2 = (double)$var1 + 3.52;
l Identificatorii pot fi de orice lungime si pot fi formati din litere, cifre, liniuta
de subliniere sau semnul dolar.
l Identificatorii nu pot incepe cu o cifra.
l Identificatorii sunt de tip "case sensitive" (tin cont de litere mici-mari).
Spre exemplu, $numepers este diferit de $numePers. Singurii identificatori
care nu respecta aceasta regula sunt cei care denota nume de functii PHP
predefinite.
...
define("PI",3.14);
$unUnghi = PI;
$altUnghi = 2*PI;
64
ABD
$var1 = 5;
$var2 = "var1";
echo "Valoarea din var1 este ";
echo $var1;
echo " sau ";
echo $$var2;
65
ABD
prezentat, paginile tinta ale formularelor vor fi fisiere PHP, paginile cuprinzand
formularele putand fi fisiere PHP sau HTML.
In PHP datele dintr-un formular HTML pot fi accesate prin doua metode.
Prima metoda, mai simpla dar mai inceata si mai nesigura, consta in folosirea
varibilelor inregistrate global. In acest fel numele campurilor dintr-un formular
HTML devin automat varibile PHP, cu valori setate corespunzator, in pagina tinta
a formularului. Transmiterea se face asemanator cu transmiterea parametrilor
spre functii. Pentru a putea folosi aceasta metoda trebuie ca fisierul de
configurare php.ini sa aiba setarea register_globals pe valoarea "On".
A doua metoda presupune obtinerea valorilor din doua tablouri create automat
si denumite $_POST, respectiv $_GET corespunzator metodei de trimitere din
formular spre server (post sau get). Indicele de acces in tablou va fi chiar
numele campului dorit din formular.
<HTML>
<HEAD>
<TITLE>Activitate 2 (form)</TITLE>
</HEAD>
<BODY>
<FORM name="primulForm" method ="post"
action="a2162.php">
<P>Date personale
<P>Nume <INPUT type="text" name="numePers" size="36"
maxlength="36"><BR>
Prenume <INPUT type="text" name ="prenumePers"
size="36" maxlength="36"><BR>
Mijlocul de transport preferat
<SELECT name="transport">
<OPTION>Masina </OPTION>
<OPTION>Trenul</OPTION>
<OPTION>Avionul</OPTION>
<OPTION>Vaporul</OPTION>
</SELECT>
<P> <INPUT type="submit" name="trimit" value="Submit">
<INPUT type="reset" name ="sterg" value="Reset">
</FORM>
</BODY>
</HTML>
66
ABD
<HTML>
<HEAD>
<TITLE>Activitate 2 (procesare)</TITLE>
</HEAD>
<BODY>
<H1>Prelucrare date din formularul a261.html</H1>
<HR>
<?php
$numePers = $_POST["numePers"];
$prenumePers = $_POST["prenumePers"];
$transport = $_POST["transport"];
Ex. 2 echo "Nume persoana: ".$numePers."<BR>";
echo "Prenume persoana: " .$prenumePers ."<BR>";
echo "Mijloc de transport preferat: ".$transport ."<BR>";
$nume =$numePers." " .$prenumePers;
echo $nume." prefera sa calatoreasca cu
".$transport ."."."<BR>";
?>
<HR>
</BODY>
</HTML>
67
ABD
2.2.1. Operatori
2.2.1.1. Operatori aritmetici
2.2.1.2. Operatori pe siruri de caractere
2.2.1.3. Operatori de asignare
2.2.1.4. Operatori de referire
2.2.1.5. Operatori de comparare
2.2.1.6. Operatori logici
2.2.1.7. Operatori pe biti
2.2.1.8. Operatori aditionali
2.2.2. Expresii
Operatorii sunt simboluri care pot fi utilizate pentru a efectua operatii asupra
unor varibile si constante de diverse tipuri. Entitatile asupra carora se aplica un
operator se numesc operanzi. Un operator poate avea unul, doi sau chiar trei
operanzi. Majoritatea operatorilor sunt binari (au doi operanzi). In general
operatorii sunt clasificati functie de tipul datelor asupra carora actioneaza.
Acestia sunt:
68
ABD
$a = 5;
$b = $a++; // b = 5, a = 6
$c = ++$a; // c = 7, a = 7
$d = 4 + --$a; // d = 10, a = 6
$e = 4 + --$c; // e = 11, c = 6
Daca operatorii aritmetici se aplica asupra unor valori de tip string, PHP va
incerca conversia acestora in numere. Daca conversia nu reuseste, sirurile sunt
convertite la valoarea 0.
<HTML>
<HEAD>
<TITLE>Activitate 2.2.1.1.</TITLE>
</HEAD>
<BODY>
<H2>Operatori aritmetici.</H1><P>
<?php
$a = 3;
$b = 11;
$c = 4.7;
echo "a = "; echo $a; echo "<BR>";
Ex. 1 echo " b = "; echo $b; echo "<BR>";
echo " c = "; echo $c; echo "<BR>";
echo "a - b = "; echo $a - $b; echo "<BR>";
echo "a * c = "; echo $a * $c; echo "<BR>";
echo "b % a = "; echo $b % $a; echo "<BR>";
echo "b % c = "; echo $b % $c; echo "<BR>";
echo "b + --a= "; echo $b + --$a; echo "<BR>";
echo "a / 0 = "; echo $a / 0; echo "<BR>";
?>
</BODY>
</HTML>
69
ABD
$a = 3;
$b = $a; // a = 3, b = 3
$b = 5; // a = 3, b = 5
$a = 3;
$b = &$a; // a = 3, b = 3
$b = 5; // a = 5, b = 5
70
ABD
Acestia sunt:
Acestia sunt:
Acestia sunt:
71
ABD
Operatorul evalueaza mai intai expresia logica din conditie. Daca conditia este
adevarata va intoarce expresia valoare_adevarata iar in caz contrar
valoare_falsa.
@(expresie)
Exemplu:
72
ABD
O atentie deosebita trebuie acordata sirurilor de caractere intre ghilimele " " . La
evaluarea expresiei in care acestea apar, toate numele de variabile care apar in
interiorul lor sunt inlocuite cu valorile corespunzatoare. Exemplu:
$nume = "Vasile";
$sir1 = "Domnul $nume are masina rosie!";
$sir2 = 'Domnul $nume are masina rosie!';
echo $sir1; // afiseaza Domnul Vasile are masina rosie!
echo $sir2; // afiseaza Domnul $nume are masina rosie!
73
ABD
<HTML>
<HEAD>
<TITLE>Activitate 2.2.2.1.</TITLE>
</HEAD>
<BODY>
<H2>Operatori si expresii.</H1><P>
<?php
$nume = "Ionescu";
$prenume = "Vasile";
$varsta = 38;
$salar = 1500;
$prop1 = "Domnul $prenume $nume are $varsta ani."."<BR>";
echo $prop1;
Ex. 2
$prop2 = "Domnul ".$nume." are salar ".
(($salar<1000)?"mic":"mare")."!<BR>";
echo $prop2;
$salarNou = & $salar; // salarNou indica spre salar
$procentMarire = 26; // procentul cu care se mareste salarul
$salarNou += $salarNou*($procentMarire / 100);
$prop3 = " Salarul sau dupa marire este de $salar $."; // salar si
salar nou indica spre aceiasi valoare
echo $prop3;
?>
</BODY>
</HTML>
74
ABD
if (expr)
instructiune
Exemplu:
if ($nota < 5)
echo 'Examenul trebuie repetat!';
75
ABD
if ($nota < 5)
{
echo 'Examenul trebuie repetat!';
$bursa = 0;
}
if ($nota < 5)
{
echo 'Examenul trebuie repetat!';
$bursa = 0;
}
else
{
echo 'Felicitari pentru trecerea examenului!';
$bursa = 1000000;
}
In unele situatii, la luarea unei decizii exista mai multe optiuni. In acest caz ar
trebui testate mai multe conditii. Pentru aceasta, limbajul PHP pune la dispozitia
programatorilor clauza elseif. In acest caz sintaxa instructiunii este:
if (expr1)
instructiune1
elseif (expr2)
instructiune2
...
elseif (expr3)
instructiune
Exemplu:
if ($nota < 5)
{
echo 'Insuficient';
$bursa = 0;
}
elseif ($nota<7)
{
echo 'Suficient';
$bursa = 500000;
}
elseif ($nota<9)
{
echo 'Bine';
$bursa = 1000000;
76
ABD
}
else
{
echo 'Bine';
$bursa = 1500000;
}
switch (expr) {
case valoare_1:
instructiune_1;
break;
case valoare_2:
instructiune_2;
break;
...
case valoare_n:
instructiune_n;
break;
defaut:
instructiune_default;
}
switch ($nota) {
case 1: case 2: case 3: case 4:
echo ' nu are bursa!';
break;
case 5: case 6:
echo ' bursa este 500000.';
break;
case 7:
echo ' bursa este 700000.';
break;
case 8: case 9:
echo ' bursa este 1000000.';
break;
77
ABD
case 10:
echo ' bursa este 1500000.';
break;
defaut:
echo 'nota nu este corecta!';
}
while (expr)
instructiune
Exemplu:
$i = 1;
while ($i< 5)
echo 'Numarul '.$i++."<BR>";
<HTML>
<HEAD>
<TITLE>Activitate 3.1.2.1.</TITLE>
</HEAD>
<BODY>
<H2>Tabela de conversie dolari/lei.</H1><P>
<?php
$curs= 33000;
$n = 50;
78
ABD
do
instructiune
while (expr);
Exemplu:
In cazul buclei do-while, instructiunea din bucla se va executa cel putin o data
79
ABD
Oricare dintre cele trei expresii pot fi vide. Daca expr3 este vida PHP o va
considera adevarata si va cicla la infinit. In acest caz trebuie asigurata o iesire
fortata din bucla utilizand una dintre instructiunile de control pentru repetitii
(vezi capitolul 3.1.3).
Un tablou este un tip de date ce poate retine un set de valori. In PHP tabloul
va asocia fiecarei intrari o cheie prin care aceasta poate fi regasita. Cheile pot fi
numerice (in acest caz indicii creati implicit vor fi 0,1,2 ...) sau pot fi siruri de
caractere (caz in care tabloul se numeste asociativ). Valorile retinute pot avea
orice tip dar sunt de acelasi fel pentru un tablou dat.
80
ABD
Exemplu:
In PHP dimensiunea unui tablou este variabila. Pentru a adauga un nou element
se va atribui pur si simplu variabilei cu urmatorul indice o anumita valoare. Spre
exemplu $culori[5]="negru" va adauga un nou element ("negru") la sfarsitul
tabloului $culori.
Numarul curent de elemente ale unui tablou se poate afla in orice moment cu
ajutorul functiei count($tablou).
$tablou = array( "cheie1" => el1, "cheie2" => el2, ... "cheie_n" => el_n);
Exemplu:
$pret = array ("paine alba" => 7000, "ou" => 3000, "zahar" => 24000);
Prima forma permite extragerea tuturor valorilor din tablou si prelucrarea lor
81
ABD
<HTML>
<HEAD>
<TITLE>Activitate 3.1.2.4.</TITLE>
</HEAD>
<BODY>
<H2>Parcurgerea tablourilor.</H1>
<P>
<?php
$culori= array ("alb", "albastru", "verde", "rosu", "galben");
$pret = array ("paine alba" => 7000, "ou" => 3000, "zahar" =>
24000);
echo "<P>Tablou indexat numeric, extragere valori.<BR>";
echo "<UL>";
foreach ($culori as $culoare)
echo "<LI>".$culoare."</LI>";
echo "</UL>";
echo "<P>Tablou indexat numeric, extragere valori si
indecsi.<BR>";
echo "<TABLE border=1>";
Ex. 2 foreach ($culori as $indice => $culoare)
{
echo "<TR>"; // se creaza o noua linie in tabel
echo "<TD>"; // se creaza coloana pentru valoarea indexului
echo $indice; // se completeaza valoarea indexului
echo "</TD> <TD>"; // se creaza coloana pentru culori
echo $culoare; // se completeaza culoarea
echo "</TD> </TR>"; // se inchide linia curenta
}
echo "</TABLE>";
echo "<HR>";
echo "<P>Tablou asociativ, extragere valori.<BR>";
echo "<UL>";
foreach ($pret as $pret_produs)
echo "<LI>".$pret_produs."</LI>";
echo "</UL>";
echo "<P>Tablou asociativ, extragere valori si chei.<BR>";
echo "<TABLE border=1>";
foreach ($pret as $produs => $pret_produs)
{
echo "<TR>"; // se creaza o noua linie in tabel
echo "<TD>"; // se creaza coloana pentru valoarea cheii
(produsul)
echo $produs; // se completeaza valoarea cheii
82
ABD
echo "<UL>";
for ($i = 0; $i < count($culori); $i++)
echo "<LI>".$culori[$i]."</LI>";
echo "</UL>";
83
ABD
84
ABD
3.2.1. Functii
3.2.1.1. Functii de biblioteca
3.2.1.2. Functii utilizator
3.2.1.3. Transmiterea parametrilor
3.2.1.4. Functii recursive
3.2.2. Reutilizarea codului
3.2.2.1. Instructiunea require
3.2.2.2. Instructiunea include
3.2.3. Cotrolul sesiunilor
3.2.4. Utilizare formulare si sesiuni pentru controlul utilizatorilor
O functie este un modul de cod care ofera o interfata de apel, rezolva un anumit
algoritm si optional, returneaza o valoare.
Cele mai simple functii sunt cele care nu necesita parametrii de apel (valori de
prelucrat) si nu intorc nici o valoare. Apelul unei astfel de functii se face folosind
sintaxa:
nume_functie();
Numele functie identifica unic codul care va fi apelat in acel loc. Spre deosebire
de variabile, numele functiilor nu sunt "case-sensitive" deci pot fi scrise cu orice
combinatii de litere mari/mici (ex: Nume_functie sau Nume_FUNCTIE etc.)
85
ABD
In cele mai multe dintre cazuri, functiile au ca si scop prelucrarea unor date de
intrare transmise sub forma unor paramerii (variabile) de apel. Acesti
parametrii se specifica intr-o lista de expresii despartite prin virgula in
momentul apelului:
$masini = array ( "Dacia" => "Supernova", "Bmw" => "316i", "Renault" =>
"Clio", "Audi" => "A2");
asort($masini);
foreach($masini as $marca => $masina)
echo $masina." (".$marca.")<BR>";
Unele functii au ca si scop calcularea unei valori. Aceasta valoare este apoi
returnata prin numele functiei. Apelul acestor functii poate fi facut in interiorul
expresiilor.
function nume_functie()
{
// secventa de instructiuni
}
Numele unei functii utilizator trebuie sa fie cat mai scurt dar, in acelasi timp, sa
dea indicatii precise asupra scopului acelei functii (algoritmului implementat). In
86
ABD
plus, un nume de functie poate contine numai litere, cifre sau liniuta de
subliniere; numele nu poate incepe cu o cifra si nu poate fi identic cu cel al unei
functii de biblioteca.
87
ABD
Limbajul PHP ofera suport complet pentru functii recursive. O functie recursiva
este o functie care se apeleaza pe ia insasi direct sau indirect, prin intermediul
altor functii.
88
ABD
sunt calculul seriilor matematice recursive sau navigarea prin structuri de date
dinamice gen liste inlantuite sau arbori.
function afis_inversat($sir)
{
if (strlen($sir)>0)
afis_inversat(substr($sir, 1)); // apelul recursiv al functiei
echo substr($sir, 0, 1);
}
La scrierea unor functii recursive trebuie acordata o mare atentie iesirii din
recursivitate. Apelul recursiv din interiorul functiei va fi executat intotdeauna
conditionat.
In continuare vor fi analizate cele mai importante trei deziderate obtinute prin
reutilizarea codului: costul dezvoltarii, stabilitatea si consistenta produsului.
Costul. De-a lungul duratei de viata a unui produs software s-a observat ca o
foarte mare parte din timpul de dezvoltare il reprezinta timpul alocat mentinerii,
modificarii, testarii si documentarii. In mod surprinzator, timpul cerut pentru
scrierea initiala a programului are de obicei ponderea cea mai putin
semnificativa. Din acest punct de vedere, cu cat numarul de linii de cod care
trebuiesc intretinute este mai mic, cu atat scade si costul general al produsului.
Scaderea numarului de linii scrise se poate obtine prin reutilizarea celor
existente.
89
ABD
require ( "nume_fisier_reutilizat.php" );
// fisierul "reutilizabil.php"
<?
echo "<H2> Acesta este cod reutilizabil. </H2>";
?>
//fisierul "principal.php"
<?
echo "<H1> Acesta este fisierul principal. </H1><P>";
require ( "reutilizabil.php" );
echo "<P>Linie din fisierul principal.";
?>
<?
echo "<H1> Acesta este fisierul principal. </H1><P>";
echo "<H2> Acesta este cod reutilizabil. </H2>";
echo "<P>Linie din fisierul principal.";
90
ABD
?>
In varianta:
if (conditie)
{
require ("fis1.php");
}
else
{
require("fis2.php");
}
se vor expanda intai ambele ramuri ale instructiunii if, prin inlocuirea
instructiunilor require.
if (conditie)
{
include ("fis1.php");
}
else
{
include("fis2.php");
}
91
ABD
// fisierul generezPI.php
<?php
echo "fisierul genereaza numarul PI<BR>";
return 3.14;
?>
// fisier folosestePI.php
<?php
echo "fisierul care foloseste numarul PI<BR>";
$PI = include( "genereazaPI.php" );
echo "<B>PI</B> = ".$PI;
?>
Acest lucru permite implementarea unui mecanism de tip "logging in" pentru un
utilizator, si, implicit, posibilitatea de a limita accesul la anumite pagini cu
informatii confidentiale, respectiv de a pezenta continutul paginilor personalizat
dupa preferintele utilizatorului respectiv.
Sesiunile PHP sunt gestionate prin intermediul unui numar unic (session ID)
generat aleator pe baza unui algoritm criptografic. Acest numar este generat de
catre PHP si mentinut de catre clientul de Web care a acceseaza pagini pe tot
parcursul sesiunii de lucru.
92
ABD
paginii
l stergerea variabilelor sesiune si distrugerea sesiunii
Inainte de a utiliza o sesiune aceasta trebuie creata. Cel mai simplu mod de a
porni o sesiune este acela de a apela functia session_start(). Apelul acestei
functii creeaza automat un numar de sesiune si permite apoi utilizarea
variabilelor de sesiune. Aceasta functie trebuie apelata inainte de antetul
"<HTML>". O alta metoda, mai putin recomandata, este metoda creari implicite
a unei sesiuni in momentul in care se inregistreaza fortat o variabila de sesiune.
Pentru a folosi valori transmise intre pagini diferite se vor folosi variabile
sesiune. Variabilele sesiune se inregistraza ca atare prin apelul functiei
session_register (nume_variabila). De exemplu:
$varSesiune1 = 10;
session_register ( "varSesiune1");
Pentru a utiliza variabilele sesiune in alte pagini din aceeasi sesiune exista doua
metode, asemanator cu accesul la datele unui formular. Daca optiunea
register_globals din php.ini este setata pe On, in toate paginile sesiunii
variabila va fi accesibila direct prin nume. Daca optiunea este Off se poate apela
variabila prin intermediul tabloului asociativ $HTTP_SESSION_VARS. De
exemplu:
$n = 4 * $HTTP_SESSION_VARS["varSesiune1"];
93
ABD
session.save_path = c:/temp
;setare valabina pentru Windows (pt. Unix: session.save_path
= /tmp)
session.cache_limiter = private
<HTML><HEAD><TITLE>Activitate 3.2.3.1.</TITLE></HEAD>
<BODY>
<H2>Start sesiune. </H1><P>
<?php
$utilizator = $_POST["numePers"];
echo "Bine ai venit $utilizator!<BR>";
session_register ("utilizator");
echo "<P><A href="a3233.php">Pagina personalizata.</A>
?>
</BODY>
94
ABD
</HTML>
<?php
echo "Aceasta este pagina personalizata pentru uilizatorul
$utilizator!<BR>";
session_destroy();
?>
</BODY>
</HTML>
95
ABD
96
ABD
Functia print_r este folosita in special pentru depanare, pentru a afisa continutul
unei variabile intr-un mod usor de citit si inteles pentru om. In cazul in care
varibila este tablou, se va afisa in clar asocirea index=>valoare sau
97
ABD
<HTML>
<HEAD><TITLE>Activitate 4.1.1.1.</TITLE></HEAD>
<BODY>
<?php
$preturiProduse = array( " paine" => 6000,
"ou" => 3200,
" mere" =>23000,
"biscuiti" => 16000 );
echo "Tabloul original:<BR>";
print_r($preturiProduse);
asort($preturiProduse);
echo "<P><HR>Tabloul sortat prin <B>sort()</B>:<BR>";
print_r($preturiProduse);
krsort($preturiProduse);
Activitate
echo "<P><HR>Tabloul sortat prin <B>krsort()</B>:<BR>";
1
print_r($preturiProduse);
$preturiNoi = array ( "ou" => 3500,
"lapte" => 11000) ;
$preturiProduse = array_merge($preturiProduse, $preturiNoi);
echo "<P><HR>Se adauga tabloul de preturi noi:<BR>";
print_r($preturiNoi);
echo "<BR>Prin utilizarea <B>array_merge</B> a
rezultat:<BR>";
print_r($preturiProduse);
echo "<P><HR>Noul tablou are ".count($preturiProduse)."
elemente. <BR>";
?>
</BODY>
</HTML>
98
ABD
l int time ( );
Functia date transforma o data din forma UNIX timestamp sau data curenta
(daca parametrul lipseste) intr-un sir de caractere conform machetei format.
Macheta este un sir de caractere care poate cuprinde urmatoarele caractere:
99
ABD
<HTML>
<HEAD><TITLE>Activitate 4.1.1.2.</TITLE></HEAD>
<BODY>
<?php
$acum = time();
echo "<P>Data curenta (Unix timestamp): ".$acum."<BR>";
Activitate echo "<P>Data curenta (<b>date('\R\u\l\a\\t \a\s\\t\a\z\i, d F Y
2 \l\a \o\\r\a h:i:s A.'): ".date('\R\u\l\a\t \a\s\t\a\z\i, d F Y \l\a
\o\r\a h:i:s A.', $acum)." <BR>";
echo "<P>Tabloul obtinut prin apelul getdate()<BR>";
$dataCrt = getdate();
print_r($dataCrt);
?>
</BODY>
</HTML>
100
ABD
Functia ceil rotunjeste in sus valoarea parametrului. Desi rezultatul este intreg,
el este retunat tot sub forma de float.
Functia floor rotunjeste in jos valoarea parametrului. Desi rezultatul este intreg,
el este retunat tot sub forma de float.
Functiile cos, sin si tan calculeaza valoarea coresponedenta din unghiul dat in
radiani.
Functiile max si min calculeaza valoarea maxima (minima) din sirul de valori
transmise ca si parametru. Functiile pot primi oricati parametrii. Daca primul
parametru este numeric, se va calcula valoarea maxima (minima) dintre valorile
continute.
101
ABD
<HTML>
<HEAD><TITLE>Activitate 4.1.1.3.</TITLE></HEAD>
<BODY>
<?php
for($i=0; $i<6; $i++)
$noteExamene[$i] = mt_rand( 4, 10 );
echo "<P>Sirul de note obtinute in sesiune<BR>";
print_r( $noteExamene );
echo "<P> Nota maxima obtinuta in sesiune:".max
Activitate
($noteExamene)." <BR>";
3
echo "<P>Suma notelor obtinute: ";
for ($suma=$i=0; $i<count( $noteExamene); $i++)
$suma += $noteExamene[$i];
echo $suma."<BR>";
echo "<P>Media notelor obtinute: ".($suma / count
($noteExamene))."<BR>";
?>
</BODY>
</HTML>
Aceste functii permit efectuarea de prelucrari asupra valorilor de tip string. Ele
au o importanta deosebita deoarece majoritatea operatiilor asupra paginilor de
Web se refera la prelucrarea textelor.
Functia chr transforma un numar intre 0 si 255 intr-un sir continand caracterul
corespunzator codului ASCII al acestuia.
102
ABD
Functiile ltrim, rtrim, trim elimina spatiile albe de la inceputul, sfarsitul respectiv
din ambele capete ale sirului transmis ca si parametru. Sunt considerate ca si
spatii albe caracterele spatiu, tab, linie noua si NULL.
103
ABD
Functia substr extrage subsirul care incepe pe pozitia start si are lungima
lungime din sirul transmis ca si parametru. Daca parametrul lungime lipseste,
lungimea se considera pana la sfarsitul sirului original.
Functiile ucfirst si ucwords transforma prima litera din primul cuvant, respectiv
prima litera din toate cuvintele din sir, in litera mare.
Functiile strtolower si strtoupper transforma toate literele din sir in litere mici,
respectiv litere mari.
<HTML>
<HEAD><TITLE>Activitate 4.1.1.4.</TITLE></HEAD>
<BODY>
<?php
$sir = "alin dinu george ion laurentiu ovidiu serban";
Activitate $adresa = "cineva@servermail.ro";
4
$sirCorect = ucwords ( $sir );
$tNume = explode ( " ", $sirCorect );
echo "<P> Sirul de nume: ".$sir."<BR>";
echo "<P> Sirul corectat prin ucword: ".$sirCorect."<BR>";
echo "<P> Tabloul rezultat prin expode:<BR>";
print_r ( $tNume );
$sirNou = implode ( ",", $tNume );
printf ( "<P> printf: Sirul '%s' are lungimea %d.<BR>", $sirNou,
strlen( $sirNou ));
$poz = strpos( $adresa, "@");
104
ABD
Un fisier poate fi prelucrat ca fisier text (detine informatii sub forma de text
ASCII organizat pe linii) sau ca fisier binar (infromatia este privita ca un sir de
octeti).
Pasii care trebuie parcursi pentru scrierea intr-un fisier sunt urmatorii:
105
ABD
Functia returneaza un 'handler ' pentru fisierul deschis prin care programatorul
poate interactiona cu fisierul.Daca nu se reuseste deschiderea fisierului, functia
returneaza valoarea FALSE.
Numele fisierului este o cale prin care fisierul poate fi accesat. Exista trei situatii
posibile:
l Serverul Web ruleaza sub Unix : calea catre fisier este data prin nume de
directoare despartite prin '/', spre exemplu "/tmp/a1.dat";
l Serverul Web ruleaza sub Windows : calea catre fisier respecta conventia
Windows, cu dublarea caracterului '\' (caracter de control PHP) in cale,
spre exemplu "c:\\temp\\a1.dat";
l Adresa este a unei resurse de pe un server HTTP sau FTP:
"http://server1.domeniu5.com/diretorulmeu/" sau
"ftp://utilizator:parola@serverftp.domeniu3.com/pub/fisier4.txt";
Daca numele este simplu (nu cuprinde nici o cale) fisierul se considera in
directorul unde se gaseste scriptul PHP.
mod efect
r deschide strict in citire si pozitioneaza referinta la inceputul fisierului
r+ deschide in citire / scriere si pozitioneaza referinta la inceputul fisierului
deschide doar in scriere si pozitioneaza referinta la inceput, trunchiind fisierul;
w
daca fisierul nu exista va fi creat
deschide doar in scriere /citire si pozitioneaza referinta la inceput, trunchiind fisierul;
w+
daca fisierul nu exista va fi creat
deschide doar in scriere si pozitioneaza referinta la sfarsitul fisierului,
a
permitand adaugarea; daca fisierul nu exista va fi creat
deschide doar in scriere /citire si pozitioneaza referinta la sfarsitul fisierului,
a+
permitand adaugarea; daca fisierul nu exista va fi creat
Dupa folosirea unui fisier, acesta trebuie inchis. In acest scop se foloseste
functia fclose. Sintaxa sa este:
Parametrul fp este un handler al unui fisier deschis prin functia fopen. Daca
fclose nu poate inchide fisierul, functia returneaza valoarea FALSE.
106
ABD
Scrierea intr-un fisier poate fi realizata apeland la una din cele doua functii:
fwrite sau fputs.
Functia fwrite permite scrierea intr-un fisier text sau binar a unui sir de octeti
transmisi prin intermediul unei variabile string. Observatie: doar sistemele
bazate pe Windows vor face diferenta intre fisierele binare si cele text.
Prototipul acestei functii este:
Functia returneaza numarul de octeti scrisi sau -1 daca scrirea s-a facut cu
eroare.
Functia fputs (file put string) este identica cu functia fwrite atat ca si parametrii
cat si ca actiune.
Functia fgets permite citirea unei linii de text dintr-un fisier text. La intalnirea
unei erori de citire returneaza FALSE. Sintaxa de apel este:
107
ABD
Functia returneaza numarul de caractere citite corect sau FALSE daca a aparut o
eroare. De remarcat faptul ca, spre deosebire de functiile anterioare, readfile
primeste direct numele unui fiser si nu necesita deschiderea acestuia in
prealabil cu ajutorul lui fopen.
$fisier = "comenzi.dat";
if (!copy($fisier, $fisier.".bak"))
echo "Nu s-a reusit crearea unei copii de siguranta pentru $fisier...<BR>");
108
ABD
Functia unlink sterge un fisier specificat prin numele sau. Daca stergerea
reuseste returneaza TRUE, FALSE in caz contrar.
Functia file_exists permite testarea existentei unui fisier specificat prin numele
sau. Testarea se face fara deschiderea fisierului.
Functia filesize returneaza dimensiunea in octeti a unui fisier dat prin nume. In
caz de eroare intoarce FALSE. Nu se poate afla dimensiunea unui fisier care nu
este local (peste FTP sau HTTP).
Functia fseek permite pozitionarea pe o anumita pozitie in fisier. Are sens doar
daca informatia este structurata. Deplasamentul se specifica in octeti. Pozitia
din care acesta se calculeaza este specificata de parametrul deUnde care poate
avea valorile: SEEK_SET (fata de inceputul fisierului), SEEK_CUR (fata de
pozitia curenta), SEEK_END (fata de sfarsitul fisierului). Daca parametrul
deUnde nu este specificat se considera implicit SEEK_SET.
Functia flock permite blocarea accesului la un anumit fisier dintr-un script PHP.
Acest lucru este necesar pentru a nu permite ca doua procese sa acceseze
simultan continutul unui fisier, in cazul in care cel putin unul dintre ele modifica
fisierul. Tipul blocarii accesului se specifica prin parametrul operatie:
operatie efect
blocare de citire (reading lock).
1
Fisierul poate fi accesat de altii pentru citire dar nu si pentru scriere.
blocare de scriere (writing lock).
2 Fisierul nu mai poate fi accesat de nimeni altcineva.
3 Eliberare blocare (atat de citire cat si de scriere)
prin adaugarea valorii 4 la valorile anterioare functia flock nu se va
+4
bloca in cazul in care nu a putut obtine accesul ci va returna imediat FALSE.
109
ABD
<HTML>
<HEAD><TITLE>Activitate 4.1.2.4</TITLE></HEAD>
<BODY>
<?php
110
ABD
[site1]
12
[siteulMeu]
56
...
Fiecare site va avea o intrare cu numele sau intre paranteze drepte '[' si ']' pe o
linie si cu valoarea contorului corespunzator pe linia urmatoare.
Functia va incrementa doar contorul corespunzator numelui transmis. Daca
functia incrementeazaContor nu gaseste o intrare corespunzatoare numelui
transmis, va crea o astfel de intrare si o va initializa cu 1.
Scrieti apoi o pagina care foloseste acest program pentru a afisa un contor.
<< Cuprins
111
ABD
MySQL este unul dintre cele mai populare sisteme de gestiune de baze de date (SGBD) in regim
OpenSource. Producatorul sau se numeste MySQL AB si este o companie a carei principala
activitate consta in oferirea de servicii legate de acest SGBD (sistem de gestiune a bazelor de
date).
În conceptia relationala o baza de date este formata dintr -o colectie de relatii (tabele , fisiere de
date) asupra carora se aplica o colectie de operatori pentru a gestiona datele continute de relatii.
Cel mai facil client pentru conectarea la serverul de mySQL este cel tip linie de comanda care face
parte din kit-ul standard de instalare mySQL. El se numeste mysql.exe si permite conectarea atat
local cat si la un server la distanta. In continuare, comenzile si exemplele se vor rula de la
prompterul afisat dupa conectarea la server.
112
ABD
Pentru a sterge o baza de date mySQL care nu mai este necesara se va folosi comanda:
Pentru selectarea unei baze de date se va folosi comanda USE . Prin aceasta se stabileste baza de
date in contextul careia se vor executa interogarile ulterioare. Ea se va numi baza de date
activa.
Datele retinute sunt organizate de o baza de date in tabele . Pentru a crea o tabela se va utiliza
comanda CREATE TABLE . Aceasta are sintaxa:
TEMPORARY - specifica crearea unei tabele temporare care va fi stearsa automat la inchiderea
conexiunii in care a fost creata; doua conexiuni pot crea doua tabele temporare cu aceleasi nume,
ele nu vor interfera.
create_definition - pentru definirea coloanelor este un sir de tipul:
col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [PRIMARY
KEY]
PRIMARY KEY - specifica cheia primara pentru tabela. Un singur camp din tabela poate avea
acest parametru. Coloana declarata ca si cheie primara este indexata automat. Daca tabela are
cheia primara formata din mai multe campuri, aceasta va trebui specificata separat, pe post de
camp suplimentar, cu sintaxa "primary key (camp1, camp2 ...)".
La un server mySQL se pot conecta mai multi utilizatori in diverse scopuri. Pentru a asigura
securitatea datelor intre utilizatori, respectiv securitatea generala a serverului, mySQL are
implementat un sistem de privilegii .
Functia pricipala a sistemul de privilegii al MySQL este aceea de a autentifica si autoriza utilizatorii
conectati la server. Autorizarea se refera la permisiunea de a rula interogari precum SELECT,
INSERT, UPDATE sau DELETE. O clasa aparte de privilegii se refera la drepturile de administrare si
de interactionoare cu sistemul de operare.
Termenul privilegiu denota in general un drept al unui utilizator de a actiona intr -un anumit fel
asupra unui obiect al bazei de date (tabela, camp, index etc.).
Regula de baza la stabilirea privilegiilor este urmatoarea: un utilizator (sau proces) trebuie sa aiba
cel mai scazut nivel de privilegii, suficient pentru a putea executa sarcinile care i -au fost alocate.
113
ABD
Adaugarea de noi inregistrari (randuri) intr -o tabela se face prin comanda INSERT. Exista trei
forme de baza ale acestei comenzi:
Pentru modificarea datelor existente se va folosi comanda UPDATE . Sintaxa acestei comenzi este:
WHERE conditie_de_actualizare - indica acele coloane care sunt actualizate, si anume doar
cele pentru care conditie_de_actualizare are valoarea adevarat. Daca clauza WHERE lipseste, vor
fi actualizate toate inregistrarile !
Comanda SELECT este cea mai utilizata comanda SQL. Ea permite atat regasirea si vizualizarea
datelor din tabelele bazei de date cat si calcularea unor expresii care nu au legatura cu datele din
tabele.
114
ABD
Din clientul de mySQL rulati secveta pentru crearea bazei de date biblioteca:
115
ABD
l Cautarea unei informatii in fisier necesita un timp mare si diverse artificii de programare
l Apar probleme la accesul concurent asupra fisierelor care pot ingreuna sau chiar bloca pentru
un timp indelungat accesul la site
l La stergerea sau inserarea datelor in mijlocul fisierului acesta va trebui recopiat, ceea ce duce
la timpi inadmisibili de mari pentru prelucrari
l Nivelul de securitate la accesul spre aceste fisiere este lasat exclusiv la latitudinea sistemului
de operare. In general este imposibil de asigurat chiar si un nivel minim de securitate.
Din motivele expuse reiese necesitatea de a utiliza baze de date in locul unor simple fisiere pentru
a asigura stocarea si regasirea eficienta a datelor aplicatiei.
Utilizand combinatia PHP+mySQL se pot scrie adevarate aplicatii de baze de date cu interfata Web.
Cele mai comune implementari raman totusi cele specifice Internetului: magazine virtuale,
forumuri de discutii, portaluri de e -mail etc.
Pentru a putea interoga o baza de date, o pagina PHP trebuie sa stabileasca in prealabil o
conexiune cu serverul de mySQL. Conexiunea poate fi privita ca un canal de comunicatie prin care
programul transmite cereri SQL iar serverul returneaza raspunsurile corespunzatoare.
Din PHP se pot stabili doua tipuri de conexiuni catre un server mySQL: persistente si
nepersistente.
Conexiunile persistente se realizeaza prin apelul functiei mysql_pconnect iar cele nepersistente
prin apelul mysql_connect . Ambele tipuri de conexiuni asigura aceiasi functionalitate. Singura
diferenta dintre ele consta in eficienta cu care se trateaza deschiderea unei conexiuni raportata la
cantitatea de resurse blocate. Concret, o conexiune persistenta se pastreaza dupa prima utilizare
chiar si dupa terminarea paginii curente sau dupa apelul mysql_close . Orice deschidere a unei noi
conexiuni cu aceiasi parametrii va reutiliza pe cea veche in locul crearii uneia noi. In opozitie cu
aceasta, o conexiune nepermanenta va fi distrusa la terminarea paginii sau la apelul mysql_close .
Observatie: datorita faptului ca ambele conexiuni asigura aceiasi functionalitate, in cazul paginilor
comerciale se poate testa la incepul crearea de conexiuni permanente din toate paginile si apoi a le
modifica in conexiuni nepermanente daca se constata ca apar cazuri dese in care paginile nu sunt
accesibile datorita imposibilitatii stabilirii conexiunilor cu serverul de mySQL. Modificarea se poate
realiza prin simpla inlocuire a apelurilor mysql_pconnect cu apeluri mysql_connect cu aceiasi
parametri.
server - specifica numele masinii pe care ruleaza serverul de mySQL. Daca sereverul de Web si
cel de mySQL ruleaza pe aceiasi masina, numele poate fi "localhost". In cazul in care serverul de
mysQL s-a instalat pe alt port decat cel standard (3306), numarul portului se specifica dupa
numele serverului, spre exemplu "loalhost:3371".
utilizator - specifica numele utilizatorului pentru care se realizeaza 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 creste securitatea site-ului.
116
ABD
parola - este un sir de caractere cuprinzand parola in clar a utilizatorului specificat. Deoarece
liniile php nu traverseza serverul Web, aceasta parola nu poate fi citita de utilizator prin comanda
View Source a navigatorului Web. Singura problema apare daca cineva neautorizat are acces local
la sistemul de fisere de pe server si poate citi direct fisierul php.
Ambele comenzi returneaza conexiunea daca totul este ok si valoarea FALSE daca nu se poate
stabili legatura. O secventa tipica de apel este:
Dupa realizarea unei conexiuni, pentru a putea accesa datele din tabelele unei anumite baze de
date de pe server, aceasta trebuie selectata prin comanda mysql_select_db :
Pentru adaugarea informatiei in baza de date trebuie transmisa din pagina de PHP o interogare
INSERT spre serverul de mySQL. Transmiterea (rularea) unei interogari SQL spre server se poate
face cu ajutorul functiei mysql_querry . Aceasta functie presupune existenta unei conexiuni
deschise spre server, selectia prealabila a bazei de date si existenta unor drepturi suficiente pentru
rularea interogarii.
In cazul in care interogarea transmite inapoi un rezultat (SELECT, DESCRIBE, EXPLAIN sau
SHOW), functia returneaza un identifictor spre resursa reprezentata de rezultat. In cazul
interogarilor actiune (INSERT, DELETE, UPDATE etc.) functia va retura TRUE daca s -a executat
corect interogarea. In ambele situatii functia returneaza FALSE daca interogarea nu a putut fi
executata de server.
Pentru a afla numarul inregistrarilor afectate de o interogare actiune se poate folosi functi
mysql_affected_rows:
int mysql_affected_rows ( );
<HTML>
<HEAD>
<TITLE> Citire editura </TITLE>
</HEAD>
<BODY>
117
BD
<HTML>
<HEAD>
<TITLE> Adaugare editura </TITLE>
</HEAD>
<BODY>
<H1> Prelucrare date din formularul a4222.html</H1>
<HR>
<?php
$codEdi = addslashes ( trim ( $HTTP_POST_VARS["codEdi"] ) );
$numeEdi = addslashes ( trim ( $HTTP_POST_VARS["numeEdi"] ) );
$adrEdi = addslashes ( trim ( $HTTP_POST_VARS["adrEdi"] ) );
Activitate
$telEdi = addslashes ( trim ( $HTTP_POST_VARS["telEdi"] ) );
2
echo "Cod editura: " .$codEdi."<BR>";
echo "Nume editura: ".$numeEdi."<BR>";
echo "Adresa editura: " .$adrEdi."<BR>";
echo "Telefon editura: " .$telEdi ."<BR>";
if($codEdi=="" or $numeEdi=="")
die("Nu sa compeltat codul si numele editurii!");
@ $bd = mysql_connect( "localhost", "webcititor", "pAroLA!");
if( !$bd )
die("Nu s-a putut realiza conexiunea cu mySQL!");
mysql_select_db ( "Biblioteca" );
$interogare = "INSERT INTO Edituri VALUES (\"$ codEdi\", ";
$interogare .= "\" $numeEdi\", \" $adrEdi \", ";
$interogare .= "\" $telEdi\" )";
echo "<P> Interogarea rezultata: ".$interogare ."<BR>";
$rez = mysql_query ($interogare);
if ( !$rez)
die("Eroare la adaugare!");
echo "Adaugare reusita. Inregistrari adaugate: ".mysql_affected_rows() ."<BR>";
mysql_close ($bd);
?>
<HR>
</BODY>
</HTML>
Pentru a cauta informatii intr -o baza de date se vor utiliza interogari SELECT. Procedura de
118
ABD
transmitere a unor astfel de interogari este asemanatoare cu cea pentru interogari actiune,
prezentata in capitolul anterior. Diferenta majora la interogarile de tip SELECT consta in
necesitatea de a afisa rezultatul interogarii.
In urma rularii unei interogari de cautare se va folosi functia mysql_num_rows pentru a afla
numarul de inregistrari din rezultat. Acestei functii i se va transmite ca si parametru referinta
rezultata in urma apelului functiei mysql_query.
Exista trei metode diferite de a interpreta si prelucra rezultatul unei interogari SELECT:
2. Rezultatul este preluat prin functia mysql_fetch_row si interpretat ca un tablou indexat numeric.
Acest tablou are ca si indexi numerele 0,1,2 etc. iar ca si valori, valorile corespondente coloanelor
de pe pozitiile respective din rezultat. Fiecare apel succesiv al functiei mysql_fetch_row va returna
urmatoarea inregistrare din rezultat. Cand nu mai sunt disponibile inregistrari, functia va retuna
valoarea FALSE.
3. Rezultatul este preluat prin functia mysql_fetch_object si interpretat ca un obiect. Acest obiect
are ca si atribute numele coloanelor selectate iar ca si valori ale acestora, valorile corespondente
din rezultat. Fiecare apel succesiv al functiei mysql_fetch_object va returna urmatoarea
inregistrare din rezultat. Cand nu mai sunt disponibile inregistrari, functia va retuna valoarea
FALSE.
De obicei la prelucrarea rezultatelor unei interogari SELECT se vor genera liste sau tablouri HTML.
<HTML>
<HEAD>
<TITLE> Cautare editura </TITLE>
</HEAD>
<BODY>
<FORM name="cautEdi" method="post" action="a4223.php">
<P>Cautare EDITURA (daca nu se introduce nimic se vor afisa toate editurile!)<BR>
Denumire <INPUT type="text" name="numeEdi" size="64"
maxlength ="64"><BR>
<P> < INPUT type="submit" name="trimit" value="Submit" >
<INPUT type ="reset" name="sterg" value ="Reset" >
</FORM>
</BODY>
</HTML>
<HTML>
<HEAD>
<TITLE> Afisare editura </TITLE>
</HEAD>
<BODY>
<H1> Afisare rezultat la cautare editura</H1>
<HR>
<?php
$numeEdi = addslashes ( trim ( $HTTP_POST_VARS["numeEdi"] ) );
echo "Se cauta editura cu numele: " .$numeEdi."<BR>";
119
ABD
B) Creati pagini pentru adaugarea si vizualizarea de carti (2 formulare si 2 fisiere php pentru
prelucrarea lor). La adaugarea unei noi carti se va testa existenta campurilor cod_editura si
cod_domeniu in tablele Edituri respectiv Domenii inainte de a face adaugarea (se vor rula in
prealabil 2 interogari SELECT si, daca ele returneaza corect se va executa interogarea INSERT).
Raspunsul la aceasta tema va consta in numele celor patru fisiere si observatiile referitoare la
problemele intampinate, fisierele urmand sa fie transmise prin e- mail la adresa dan@cs.upt.ro.
<< Cuprins
120
ABD
Pentru a sterge o baza de date mySQL care nu mai este necesara se va folosi comanda:
Pentru selectarea unei baze de date se va folosi comanda USE . Prin aceasta se stabileste baza de
date in contextul careia se vor executa interogarile ulterioare. Ea se va numi baza de date
activa.
Datele retinute sunt organizate de o baza de date in tabele . Pentru a crea o tabela se va utiliza
comanda CREATE TABLE . Aceasta are sintaxa:
TEMPORARY - specifica crearea unei tabele temporare care va fi stearsa automat la inchiderea
conexiunii in care a fost creata; doua conexiuni pot crea doua tabele temporare cu aceleasi nume,
ele nu vor interfera.
create_definition - pentru definirea coloanelor este un sir de tipul:
col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [PRIMARY
KEY]
PRIMARY KEY - specifica cheia primara pentru tabela. Un singur camp din tabela poate avea
acest parametru. Coloana declarata ca si cheie primara este indexata automat. Daca tabela are
cheia primara formata din mai multe campuri, aceasta va trebui specificata separat, pe post de
camp suplimentar, cu sintaxa "primary key (camp1, camp2 ...)".
La un server mySQL se pot conecta mai multi utilizatori in diverse scopuri. Pentru a asigura
securitatea datelor intre utilizatori, respectiv securitatea generala a serverului, mySQL are
implementat un sistem de privilegii .
Functia pricipala a sistemul de privilegii al MySQL este aceea de a autentifica si autoriza utilizatorii
conectati la server. Autorizarea se refera la permisiunea de a rula interogari precum SELECT,
INSERT, UPDATE sau DELETE. O clasa aparte de privilegii se refera la drepturile de administrare si
de interactionoare cu sistemul de operare.
Termenul privilegiu denota in general un drept al unui utilizator de a actiona intr -un anumit fel
asupra unui obiect al bazei de date (tabela, camp, index etc.).
Regula de baza la stabilirea privilegiilor este urmatoarea: un utilizator (sau proces) trebuie sa aiba
cel mai scazut nivel de privilegii, suficient pentru a putea executa sarcinile care i -au fost alocate.
121
ABD
Adaugarea de noi inregistrari (randuri) intr -o tabela se face prin comanda INSERT. Exista trei
forme de baza ale acestei comenzi:
Pentru modificarea datelor existente se va folosi comanda UPDATE . Sintaxa acestei comenzi este:
WHERE conditie_de_actualizare - indica acele coloane care sunt actualizate, si anume doar
cele pentru care conditie_de_actualizare are valoarea adevarat. Daca clauza WHERE lipseste, vor
fi actualizate toate inregistrarile !
Comanda SELECT este cea mai utilizata comanda SQL. Ea permite atat regasirea si vizualizarea
datelor din tabelele bazei de date cat si calcularea unor expresii care nu au legatura cu datele din
tabele.
122
ABD
Din clientul de mySQL rulati secveta pentru crearea bazei de date biblioteca:
123
ABD
l Cautarea unei informatii in fisier necesita un timp mare si diverse artificii de programare
l Apar probleme la accesul concurent asupra fisierelor care pot ingreuna sau chiar bloca pentru
un timp indelungat accesul la site
l La stergerea sau inserarea datelor in mijlocul fisierului acesta va trebui recopiat, ceea ce duce
la timpi inadmisibili de mari pentru prelucrari
l Nivelul de securitate la accesul spre aceste fisiere este lasat exclusiv la latitudinea sistemului
de operare. In general este imposibil de asigurat chiar si un nivel minim de securitate.
Din motivele expuse reiese necesitatea de a utiliza baze de date in locul unor simple fisiere pentru
a asigura stocarea si regasirea eficienta a datelor aplicatiei.
Utilizand combinatia PHP+mySQL se pot scrie adevarate aplicatii de baze de date cu interfata Web.
Cele mai comune implementari raman totusi cele specifice Internetului: magazine virtuale,
forumuri de discutii, portaluri de e -mail etc.
Pentru a putea interoga o baza de date, o pagina PHP trebuie sa stabileasca in prealabil o
conexiune cu serverul de mySQL. Conexiunea poate fi privita ca un canal de comunicatie prin care
programul transmite cereri SQL iar serverul returneaza raspunsurile corespunzatoare.
Din PHP se pot stabili doua tipuri de conexiuni catre un server mySQL: persistente si
nepersistente.
Conexiunile persistente se realizeaza prin apelul functiei mysql_pconnect iar cele nepersistente
prin apelul mysql_connect . Ambele tipuri de conexiuni asigura aceiasi functionalitate. Singura
diferenta dintre ele consta in eficienta cu care se trateaza deschiderea unei conexiuni raportata la
cantitatea de resurse blocate. Concret, o conexiune persistenta se pastreaza dupa prima utilizare
chiar si dupa terminarea paginii curente sau dupa apelul mysql_close . Orice deschidere a unei noi
conexiuni cu aceiasi parametrii va reutiliza pe cea veche in locul crearii uneia noi. In opozitie cu
aceasta, o conexiune nepermanenta va fi distrusa la terminarea paginii sau la apelul mysql_close .
Observatie: datorita faptului ca ambele conexiuni asigura aceiasi functionalitate, in cazul paginilor
comerciale se poate testa la incepul crearea de conexiuni permanente din toate paginile si apoi a le
modifica in conexiuni nepermanente daca se constata ca apar cazuri dese in care paginile nu sunt
accesibile datorita imposibilitatii stabilirii conexiunilor cu serverul de mySQL. Modificarea se poate
realiza prin simpla inlocuire a apelurilor mysql_pconnect cu apeluri mysql_connect cu aceiasi
parametri.
server - specifica numele masinii pe care ruleaza serverul de mySQL. Daca sereverul de Web si
cel de mySQL ruleaza pe aceiasi masina, numele poate fi "localhost". In cazul in care serverul de
mysQL s-a instalat pe alt port decat cel standard (3306), numarul portului se specifica dupa
numele serverului, spre exemplu "loalhost:3371".
utilizator - specifica numele utilizatorului pentru care se realizeaza 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 creste securitatea site-ului.
124
ABD
parola - este un sir de caractere cuprinzand parola in clar a utilizatorului specificat. Deoarece
liniile php nu traverseza serverul Web, aceasta parola nu poate fi citita de utilizator prin comanda
View Source a navigatorului Web. Singura problema apare daca cineva neautorizat are acces local
la sistemul de fisere de pe server si poate citi direct fisierul php.
Ambele comenzi returneaza conexiunea daca totul este ok si valoarea FALSE daca nu se poate
stabili legatura. O secventa tipica de apel este:
Dupa realizarea unei conexiuni, pentru a putea accesa datele din tabelele unei anumite baze de
date de pe server, aceasta trebuie selectata prin comanda mysql_select_db :
Pentru adaugarea informatiei in baza de date trebuie transmisa din pagina de PHP o interogare
INSERT spre serverul de mySQL. Transmiterea (rularea) unei interogari SQL spre server se poate
face cu ajutorul functiei mysql_querry . Aceasta functie presupune existenta unei conexiuni
deschise spre server, selectia prealabila a bazei de date si existenta unor drepturi suficiente pentru
rularea interogarii.
In cazul in care interogarea transmite inapoi un rezultat (SELECT, DESCRIBE, EXPLAIN sau
SHOW), functia returneaza un identifictor spre resursa reprezentata de rezultat. In cazul
interogarilor actiune (INSERT, DELETE, UPDATE etc.) functia va retura TRUE daca s -a executat
corect interogarea. In ambele situatii functia returneaza FALSE daca interogarea nu a putut fi
executata de server.
Pentru a afla numarul inregistrarilor afectate de o interogare actiune se poate folosi functi
mysql_affected_rows:
int mysql_affected_rows ( );
<HTML>
<HEAD>
<TITLE> Citire editura </TITLE>
</HEAD>
<BODY>
125
ABD
<HTML>
<HEAD>
<TITLE> Adaugare editura </TITLE>
</HEAD>
<BODY>
<H1> Prelucrare date din formularul a4222.html</H1>
<HR>
<?php
$codEdi = addslashes ( trim ( $HTTP_POST_VARS["codEdi"] ) );
$numeEdi = addslashes ( trim ( $HTTP_POST_VARS["numeEdi"] ) );
$adrEdi = addslashes ( trim ( $HTTP_POST_VARS["adrEdi"] ) );
Activitate
$telEdi = addslashes ( trim ( $HTTP_POST_VARS["telEdi"] ) );
2
echo "Cod editura: " .$codEdi."<BR>";
echo "Nume editura: ".$numeEdi."<BR>";
echo "Adresa editura: " .$adrEdi."<BR>";
echo "Telefon editura: " .$telEdi ."<BR>";
if($codEdi=="" or $numeEdi=="")
die("Nu sa compeltat codul si numele editurii!");
@ $bd = mysql_connect( "localhost", "webcititor", "pAroLA!");
if( !$bd )
die("Nu s-a putut realiza conexiunea cu mySQL!");
mysql_select_db ( "Biblioteca" );
$interogare = "INSERT INTO Edituri VALUES (\"$ codEdi\", ";
$interogare .= "\" $numeEdi\", \" $adrEdi \", ";
$interogare .= "\" $telEdi\" )";
echo "<P> Interogarea rezultata: ".$interogare ."<BR>";
$rez = mysql_query ($interogare);
if ( !$rez)
die("Eroare la adaugare!");
echo "Adaugare reusita. Inregistrari adaugate: ".mysql_affected_rows() ."<BR>";
mysql_close ($bd);
?>
<HR>
</BODY>
</HTML>
Pentru a cauta informatii intr -o baza de date se vor utiliza interogari SELECT. Procedura de
126
ABD
transmitere a unor astfel de interogari este asemanatoare cu cea pentru interogari actiune,
prezentata in capitolul anterior. Diferenta majora la interogarile de tip SELECT consta in
necesitatea de a afisa rezultatul interogarii.
In urma rularii unei interogari de cautare se va folosi functia mysql_num_rows pentru a afla
numarul de inregistrari din rezultat. Acestei functii i se va transmite ca si parametru referinta
rezultata in urma apelului functiei mysql_query.
Exista trei metode diferite de a interpreta si prelucra rezultatul unei interogari SELECT:
2. Rezultatul este preluat prin functia mysql_fetch_row si interpretat ca un tablou indexat numeric.
Acest tablou are ca si indexi numerele 0,1,2 etc. iar ca si valori, valorile corespondente coloanelor
de pe pozitiile respective din rezultat. Fiecare apel succesiv al functiei mysql_fetch_row va returna
urmatoarea inregistrare din rezultat. Cand nu mai sunt disponibile inregistrari, functia va retuna
valoarea FALSE.
3. Rezultatul este preluat prin functia mysql_fetch_object si interpretat ca un obiect. Acest obiect
are ca si atribute numele coloanelor selectate iar ca si valori ale acestora, valorile corespondente
din rezultat. Fiecare apel succesiv al functiei mysql_fetch_object va returna urmatoarea
inregistrare din rezultat. Cand nu mai sunt disponibile inregistrari, functia va retuna valoarea
FALSE.
De obicei la prelucrarea rezultatelor unei interogari SELECT se vor genera liste sau tablouri HTML.
<HTML>
<HEAD>
<TITLE> Cautare editura </TITLE>
</HEAD>
<BODY>
<FORM name="cautEdi" method="post" action="a4223.php">
<P>Cautare EDITURA (daca nu se introduce nimic se vor afisa toate editurile!)<BR>
Denumire <INPUT type="text" name="numeEdi" size="64"
maxlength ="64"><BR>
<P> < INPUT type="submit" name="trimit" value="Submit" >
<INPUT type ="reset" name="sterg" value ="Reset" >
</FORM>
</BODY>
</HTML>
<HTML>
<HEAD>
<TITLE> Afisare editura </TITLE>
</HEAD>
<BODY>
<H1> Afisare rezultat la cautare editura</H1>
<HR>
<?php
$numeEdi = addslashes ( trim ( $HTTP_POST_VARS["numeEdi"] ) );
echo "Se cauta editura cu numele: " .$numeEdi."<BR>";
127
ABD
B) Creati pagini pentru adaugarea si vizualizarea de carti (2 formulare si 2 fisiere php pentru
prelucrarea lor). La adaugarea unei noi carti se va testa existenta campurilor cod_editura si
cod_domeniu in tablele Edituri respectiv Domenii inainte de a face adaugarea (se vor rula in
prealabil 2 interogari SELECT si, daca ele returneaza corect se va executa interogarea INSERT).
Raspunsul la aceasta tema va consta in numele celor patru fisiere si observatiile referitoare la
problemele intampinate, fisierele urmand sa fie transmise prin e- mail la adresa dan@cs.upt.ro.
<< Cuprins
128
ABD
Pornind de la acest fapt se pot identifica mai multe cai pentru a transpune
concepte comerciale pe Internet. Serviciile on -line pot fi folosite pentru a face
reclama unor produse "conventionale"; pentru a comercializa astfel de produse
in magazine virtuale; pentru a comercializa produse "digitale" gen publicatii
electronice, imagini, secvente audio sau video in format digital, produse
software etc; pentru a oferi servicii Web gen "valoare adaugata" ca o alternativa
eficienta la serviciile conventionale.
Un site tip "brochureware " poate fi orice, de la o carte de vizita a companiei sub
forma unei pagini Web pana la o colectie extinsa de informatii de marketing. In
general un astfel de site poate fi asimilat unui catalog de produse si oferte. In
toate situatiile, scopul unui astfel de site este acela de a facilita contactul cu
clientii si beneficiarii companiei respective.
Acest tip nu produce castiguri materiale directe dar poate creste semnificativ
aria clientilor potentiali pentru companie.
129
ABD
implementarii (in multe situatii limbajul HTML este suficient) ci mai degraba
sunt probleme legate de marketing:
Legat de interactivitate, solutia cea mai comuna consta in oferirea unei adrese
de e-mail unde beneficiarii pot pune intrebari. In cazul acesta, o companie care
nu ofera raspuns zilnic la astfel de intrebari creaza senzatia ca desconsidera
beneficiarul respectiv, ceea ce duce in general la intreruperea relatiilor
bilaterale.
Un pas logic dupa implementarea unui site tip brosura este acela in care
serviciile sunt extinse pentru a permite comandarea directa din pagina a
produselor prezentate. Acest lucru este evident tinand cont de faptul ca un
interval mare de timp scurs intre prezentarea unui produs si oferirea
oportunitatii de a -l cumpara duce la pierdera unui procent important din
cumparatorii care au urmarit prezentarea: "un cumparator se razgandeste cu
atat mai usor cu cat are mai mult timp pentru a lua decizia de cumparare".
130
ABD
Cel mai clar exemplu in acest sens este chiar "informatia". In multe situatii
informatia este complet gratuita sau suportata prin servicii aditionale de
reclama. In alte cazuri, informatia este distribuita pe baza unei subscrieri.
In privinta serviciilor, cele mai raspandite afaceri sunt cele de ISP (Internet
Service Provider) sau Web Hosting. Alte servicii specializate in diverse domenii
pot fi oferite chiar si sub forma de sisteme expert partial sau complet automate.
Multe afaceri de succes pe Web nu vand efectiv nici un produs or serviciu. Spre
exemplu serviciul Web pentru posta rapida UPS (www.ups.com) ofera suport
131
ABD
Posibilitatea clientilor de a urmari drumul unui colet (la UPS) sau de a-si
consulta pe Web balanta bancara asigura in general un avantaj cometitiv
companiilor respective.
l Crackeri
l Riscul unui impact minor pe piata
l Caderi hardware
l Erori software
l Probleme cu liniile de comunicatii
l Neclaritati in legislatie
l Limite fizice ale sistemelor
Atacurile crackerilor sunt cele mai mediatizate riscuri ale afacerilor e-comerce.
Crackerii sunt specialisti in calculatoare rau intentionati. Activitatea lor se
incadreaza in ceea ce politia denumeste "criminalitate electronica". Crackerii
ataca un site comercial pentru a castiga prestigiu, pentru a-si demostra
abilitatile, pentru a sabota o afacere sau pentru a fura bani sau bunuri oferite
132
ABD
pe Web. Pentru a limita pierderile determinate de aceste atacuri, cele mai utile
masuri sunt: pastrarea unor copii de siguranta a tuturor datelor oferite pe
Internet, o politica justa in privinta salariatilor care sa nu determine
nemultumiri grave si dorinta de razbunare, utilizarea unui soft sigur si
actulizarea lui permanenta, examinarea zilnica a activitatii si jurnalelor de
tranzacti.
Este evident faptul ca, din moment ce toata afacerea se bazeaza pe rularea
unor programe specifice pe calculatoare ruland servere de Web, de baze de
date, de e -mail etc. , caderea fizica (hardware) a unui astfel de calculator duce
la blocarea afacerii. Din acest motiv, un important accent se pune pe asigurarea
unor servicii redundante, astfel incat, la caderea unui server, altul de rezerva sa
ii poata lua locul in cel mai scurt timp. Problema aici este legata de costul mare
a suportului hardware relativ la costul total al afacerii.
Un capitol greu controlabil este legat de lacunele care exista peste tot in lume
legate de legislatia in domeniul e-comerce. Aceste lacune sunt perfect
explicabile tinand cont de vechimea relativ mica a unor astfel de afaceri. Partea
incurajatoare este data de faptul ca se fac eforturi sustinute pentru inlaturarea
acestor probleme. Din acest motiv este important sa se supravegheze continu
modificarile legislatiei si sa se tina cont de eventuale taxe care pot apare in
legatura cu cele existente deja in domeniul afacerilor conventionale.
133
ABD
Baza de date va contine cel putin 3 produse, cu poze aferente in directorul IMG.
<< Cuprins
134
ABD
Cap. 19 Securitate
Entitatile de tip cookies au fost create tocmai pentru a permite unui server de
Web sa stocheze si sa citeasca mai apoi date de pe calculatorul clientului care
ruleaza navigatorul Web. Aceste date vor fi stocate de catre navigator pe discul
clientului, intr-un director dedicat. Acest lucru permite stocarea informatiilor nu
doar pe parcursul unei sesiuni client (de la lansarea pana la oprirea
navigatorului Web) ci chiar si intre sesiuni (pe o perioada de timp determinata
de programatorul paginii care creaza cookies). In acest fel se permite spre
exemplu pastrarea informatiilor de conectare (nume utilizator/parola) pentru a
evita citirea lor la fiecare pornire a navigatorului si conectare la site, sau
pastrarea informatiilor despre preferintele utilizatorului, astfel incat sa i se
afiseze direct o pagina personalizata ori de cate ori se conecteaza la site.
135
ABD
Singura problema poate fi mentinerea unor informatii sensibile gen parole sau
conturi pe un calculator la care au acces mai multi utilizatori intre care
sistemul de operare nu asigura protectie.
Data expirarii este utilizata pentru ca navigatorul sa isi dea seama daca un
cookie este inca valid, si ca atare trebuie transmis serverului. Daca un cookie a
expirat, el nu va mai fi trimis catre server in nici o circumstanta. Daca timpul de
expirare nu este precizat, navigatorul va sterge automat cookie-ul la oprire.
Informatia despre domeniul valid stabileste serverele spre care acel cookie va fi
trimis. Informatia poate contine numele unui server (ex.
"www1.domeniulmeu.ro") sau numele unui domeniu (ex. ".domeniulmeu.ro")
caz in care sunt validate toate serverele din acel domeniu. Domeniul stabilit
implict este cel al servrului care seteaza acel cookie.
Suportul pentru cookies este integrat in limbajul PHP. Utilizarea de cookies din
PHP este la fel de facila ca si utilizarea informatiilor din form-uri HTML.
Pentru crearea unui cookie se va folosi functia setcookie . Cea mai simpla forma
a acestei comenzi este:
136
ABD
Functia returneaza adevarat daca s-a putut trimite acel cookie spre navigator si
fals in caz contrar. Daca functia returneaza adevarat nu inseamna insa ca acel
client a acceptat respectivul cookie. Un client poate refuza un cookie daca s-au
depasit limitele cantitative (300 sau 20) sau daca navigatorul este setat sa
refuze informatiile cookie.
In cazul in care se doreste mentinerea mai multor date la client se vor crea mai
multe cookies. Dezavantajul acestei metode este legata de restrictia de maxim
20 de cookies / server. Pentru a evita acest lucru se poate apela la asocierea
valorilor multiple la un anumit cookie. Lucrul acesta este posibil daca se
apeleaza la tablouri in locul valorii singulare. Spre exemplu se poate folosi
secventa:
<?php
setcookie("preturi[0]",2000);
setcookie("preturi[1]",5000);
...
?>
Pentru a extinde durata de viata a unui cookie se poate trimite, prin intermediul
functiei setcookie , si termenul de expirare a lui. Timpul trebuie transmis ca si o
valoarea UNIX timestamp (numar de secunde scurs de la 01.01.1970). In PHP
exista doua functii pe baza carora se poate calcula un timestamp pentru o
anumita data. Prima este functia mktime care poate fi folosita pentru a calcula
date absolute (sintaxa: mktime( ore, min, sec, luna, zi, an ) ). A doua functie
este time care returneaza momentul curent in format timestamp . Utilizand time
se poate calcula o data relativa de expirare (ex. 30 de zile de la data curenta:
time()+30*24*60*60). O problema care apare relativ la data expirarii este
"timpul diferit" intre setarea cookie-ului (timpul de pe server) si timpul fata de
care navigatorul testeaza expirarea lui (timpul de pe calculatorul client).
<?php
$expira1 = mktime ( 0, 0, 0, 12, 30, 2004 ); // 30.12.2004, ora 0:00
$expira2 = time () + 3*30*24*60*60; // trei luni: 90 de zile de la data
curenta
setcookie("user", "Horia", $expira1);
setcookie("parola", "abcd", $expira2);
...
?>
137
ABD
In mod frecvent un server Web retine mai multe site-uri diferite. In acest caz se
creaza o serioasa bresa de securitate daca navigatorul trimite cookies setate de
un site catre paginile altui site de pe acelasi server. Pentru a evita acest lucru
se poate apela la parametrul "directorul valid" pentru un cookie. In acest caz,
informatiile cookies vor fi trimise doar paginilor care se gases in directoarele
care incep cu prefixul stabilit. Spre exemplu, pentru un director valid "/firma" se
va trimite informatia spre paginile "/firma1/pag1.php" si
"/firma2/formulare/f23.php", dar nu si spre "/firme/index.php":
Tot in acest scop se poate limita numarul de servere spre care se transmite
cookies, prin precizarea "domeniului valid" al lor. Parametrul "domeniu valid"
poate cuprinde o singura masina (ex. "www.domeniulmeu.ro") sau mai multe
(ex. ".domeniulmeu.ro" este valid si pentru www.domeniulmeu.ro dar si pentru
hercules.domeniulmeu.ro etc.).
Daca in plus se doreste ca acel cookie sa fie trimis doar daca conexiunea este
una securizata (protocolul este HTTPS in locul protocolului HTTP standard).
Pentru a sterge un cookie fortat dintr-o pagina se poate apela functia setcookie
cu un singur parametru, si anume chiar numele cookie-ului respectiv. Trebuie
avut in vedere doar ca aceasta functie nu poate fi apelata decat la inceputul
paginii, inainte de orice iesire spre client.
Pentru a folosi informatiile cookies intr-o pagina PHP, acestea pot fi accesate
prin intermediul tabloului $HTTP_COOKIE_VARS ["numeCookie"] (cau
$_COOKIE["numeCookie"] in PHP4). Spre exemplu se poate verifica daca un
cookie este primit sau nu prin secventa:
if ( !isset($HTTP_COOKIE_VARS ["utilizator"]) )
die ( "Acesati aceasta pagina pentru prima data! Va rugam sa va inregistrati
in prealabil." );
Cea mai comuna problema se refera la apelul setcookie dupa ce s-a inceput
trimiterea de informatii in pagina client. In acest caz se va primi un mesaj de
atentionare care explica faptul ca antetul paginii a fost deja trimis si deci
setcookie nu mai are efect.
138
ABD
<?php
// executia acestui script consta in doua faze:
// Faza 1: se trimite un setcookie si apoi se reincarca pagina
curenta
// Faza 2: se testeaza daca, dupa reincarcarea paginii,
informatia cookie exista
if ( !isset($HTTP_GET_VARS["test"])) {
// faza 1
$reincarca = "$PHP_SELF?test=1";
header("Location: $reincarca");
setcookie("cookieTest", "ok");
}
else
{
echo "<HTML>";
Activitate echo "<HEAD>";
1 echo "<TITLE>Activitate 5.2.1.3.</TITLE>";
echo "</HEAD>\n <BODY>";
if (!isset($HTTP_COOKIE_VARS["cookieTest"]))
die ( "Nu pot crea cookie. Va rugam scimbati optiunile
navigatorului!");
else {
// este ok. se poate redirecta spre pagina principala
// de ex: header( "Location: main.php" );
echo "Navigatorul accepta cookies";
echo "</BODY>\n</HTML>";
}
}
?>
Copiati fisierul in directorul htdocs al serverului de Web. Porniti
navigatorul si setati optiunile astfel incat sa nu accepte nici un
cookie. Incarcati adresa http://localhost/a5213.php si verificati
mesajul de eroare. Schimbati optiunile navigatorului ca sa
accepte cookies, reporniti navigatorul si apoi reincarcati pagina.
139
ABD
Pe langa aceasta, restul metodelor sunt specifice fiecarui server in parte desi,
principial, sunt asemanatoare. Exemplele urmatoare se refera la serverul de
Apache.
140
ABD
<Directory />
AllowOverride None
Options None
Order deny, allow
Deny from all
</Directory>
l open_basedir
Aceasta optiune stabileste directoarele din care se pot accesa fisiere prin
functii PHP. Deoarece implicit optiunea stabileste directorul radacina al
serverului si, prin urmare sunt accesibile toate fisierele si directoarele
acesteia, ea se constituie intr-o serioasa lacuna de securitate. Daca
valoarea ei se stabileste la ".", vor putea fi accesate doar fisierele din
directorul curent al paginii sau subdirectoare ale acestuia.
l memory_limit
Aceasta optiune limiteaza cantitatea de memorie (in octeti) pe care scripul
o poate utiliza. In felul acesta se poate evita ca un script sa ocupe prea
multe resurse de pe server. Implict valoarea este stabilita la 8Mo.
l register_globals
Daca aceasta optiune este ON, toate datele care provin din exterior (din
141
ABD
formulare get sau post, din linia de adresa sau din cookies) sunt
transformate in variabile avand numele corespunzatoare. Acest lucru, desi
simplifica intr-o 0oarecare masura scrierea programelor, adauga o mare
supraincarcare la interpretarea scriptului precum si lacune mari de
securitate. O astfel de variabila poate fi suprascrisa destul de usor de catre
un hacker printr-un apel fals la pagina. In cazul in care optiunea este OFF,
datele se pot accesa prin tablourile sistem $HTTP_grup_VARS[] (grup
poate fi GET, POST, COOKIE, ENV etc.).
l expose_php
Aceasta optiune trebuie stabilita pe OFF pentru ca sistemul sa nu ofere
direct informatii ca ruleaza o anumita versiune de PHP. Desi acest lucru nu
poate preveni un atac, il poate totusi intarzia.
In multe aplicatii PHP este nevoie de gestiunea utilizatorilor. Fie ca este vorba
de un forum de discutii la care utilizatorii trebuie sa se inscrie pentru a putea
purta discutii sau de un magazin virtual in care un utilizator are posibilitatea sa
faca cumparaturi on -line, gestiunea utilizatorilor va asigura, pe langa
autentificarea utilizatorilor autorizati si personalizarea aspectului paginilor
afisate respectiv acordarea de drepturi diferite referitor la operatiile care se pot
efectua pe site.
142
ABD
gigel:$apr1$aS2.....$K0d7UyUtuGnxxTR9wWsX71
<?php
if (!isset($HTTP_SERVER_VARS["PHP_AUTH_USER"])) {
header("WWW-Authenticate: Basic realm=\"pagini_secrete\"");
header('HTTP/1.0 401 Unauthorized');
echo 'Nu aveti drepturi de access!';
exit;
}
else {
echo "<p>Buna {$HTTP_SERVER_VARS['PHP_AUTH_USER']}.</p>";
echo "<p>Parola introdusa: {$HTTP_SERVER_VARS
['PHP_AUTH_PW']} .</p>";
}
echo "<P>Autentificare realizata. Puteti vedea informatia din pagina!";
?>
Desi autentificarea prin serverul de Web este simplu de realizat, ea are o serie
143
ABD
<?php
$user = $HTTP_POST_VARS["user"];
$parola = $HTTP_POST_VARS["parola"];
if ( $user != "gigel" || $parola != "gigel" ) {
?>
<FORM action="a5232.php" method="POST">
<TABLE>
<TR><TD><CENTER>Utilizator:
<INPUT type="TEXT" name="user">
</CENTER></TD></TR>
Activitate <TR><TD><CENTER>Parola:
2 <INPUT type="PASSWORD" name="parola">
</CENTER></TD></TR>
<TR><TD><CENTER>
<INPUT type="SUBMIT" value="Log-in">
</CENTER></TD></TR>
</TABLE>
</FORM>
<?php
}
else {
echo "Acestea sunt informatii doar pentru Gigel!";
}
?>
144
ABD
Urmatorul exeplu va crea un mic site care asigura atat faza de inregistrare cat
si cea de log-in, autentificare si afisare de informatii personalizate.
145
ABD
</TABLE>
</FORM>
</BODY> </HTML>
146
ABD
<TABLE>
<TR><TD>Utilizator:</TD>
<TD> <INPUT type="TEXT" name="user">
</TD></TR>
<TR><TD>Parola: </TD>
<TD> <INPUT type="PASSWORD" name="parola">
</TD></TR>
<TR><TD> <INPUT type="SUBMIT" value="Login"></TD>
<TD> <INPUT type="RESET" value="Reset">
</TD></TR>
</TABLE>
</FORM>
</BODY> </HTML>
147
ABD
Pe baza acestui schelet simplu de aplicatie se pot dezvolta site-uri mult mai
complexe. In situatii reale trebuie in schimb tinut cont de anumite modificari,
printre care:
B) Creati un mic site adaugand la pagina tip catalog de produse (din tema 5.a)
pagini pentru autentificare si inregistrare clienti. In acest scop adaugati o tabela
de utilizatori la baza de date deja creata.
148
ABD
<< Cuprins
149
ABD
150