Documente Academic
Documente Profesional
Documente Cultură
Programare Web. Suport de Curs PDF
Programare Web. Suport de Curs PDF
PROGRAMARE WEB
- suport de curs -
EDITURA
CONSPRESS
2013
CONSPRESS
B-dul Lacul Tei nr 124, sector 2
cod 020396, Bucureti
Tel: (021) 242 2719 / 300; Fax: (021) 242 0781
CUVNT NAINTE
Prezenta lucrare se constituie ca suport de curs aferent disciplinei
Programarea aplicaiilor Internet, fiind destinat studenilor anului 3, respectiv 4
domeniul Ingineria Sistemelor, din cadrul Facultii de Automatic i Calculatoare,
Universitatea Politehnica din Timioara.
Prin coninut i maniera de prezentare, prin setul generos de exemplificri
bine documentate, lucrarea poate fi de un real folos oricrui cititor interesant de
domeniu, ct i programatorilor lucrnd la dezvoltarea de aplicaii Web.
Pe parcursul a trei capitole, sunt tratate att sub aspect teoretic, ct i mai
ales aplicativ, cele mai relevante problematici (n opinia autorului) cu care se poate
ntlni n mod uzual un programator care utilizeaz suita de limbaje i tehnologii
selectate ca suport de implementare: HTML, PHP, MySQL, JavaScript, AJAX.
Alegerea acestei suite, dintr-o gam extrem de variat de alte limbaje i tehnologii
de programare Web, ofer cititorului o ampl imagine asupra procesului de
dezvoltare a aplicaiilor Internet, respectiv o prezentare tehnic a unui set complet
de limbaje i instrumente software destinate finalizrii acestui proces printr-un
produs end-user: un site Web complet funcional i livrabil clientului.
Lucrarea a fost elaborata n cadrul proiectului Reea naional de centre
pentru dezvoltarea programelor de studii cu rute flexibile i a unor instrumente
didactice la specializarea de licen i masterat, din domeniul Ingineria Sistemelor,
finanat prin Programul Operaional Sectorial pentru Dezvoltarea Resursei Umane
POSDRU (POSDRU/86/1.2/S/63806).
Cuprins 5
CUPRINS
INTRODUCERE .................................................................................. 9
1. HTML ............................................................................................. 11
1.1. Introducere ............................................................................................................... 11
1.2. Etichete HTML .......................................................................................................... 12
1.2.1. Etichete primare ............................................................................................ 12
1.2.2. Setarea unui fundal al paginii .................................................................. 13
1.2.3. Formatare text ............................................................................................... 14
1.2.4. Inserarea unei imagini ................................................................................ 16
1.2.5. Hiperlegturi ................................................................................................... 16
1.2.6. Formulare. Metodele GET i POST .......................................................... 17
1.3. Frame-uri .................................................................................................................... 22
1.3.1. Frame-uri linie/coloan ............................................................................... 22
1.3.2. Frame-uri ncuibate ...................................................................................... 23
1.3.3. Atribute ale frame-urilor ............................................................................ 25
1.3.4. Frame-uri legate ............................................................................................ 26
1.4. Tabele ........................................................................................................................... 28
1.4.1. Elemente introductive ................................................................................. 28
1.4.2. Controlul global al unui tabel.................................................................... 29
1.4.3. Controlul unei celule .................................................................................... 29
1.4.4. Combinarea celulelor ................................................................................... 30
1.4.5. Formatarea coloanelor ................................................................................ 31
1.4.6. Fundal i margini tabel ............................................................................. 32
1.5. Liste ............................................................................................................................... 34
1.5.1. Liste neordonate ............................................................................................ 34
1.5.2. Liste ordonate................................................................................................. 34
1.5.3. Alte tipuri de liste .......................................................................................... 35
1.6. Mapri pe imagini .................................................................................................. 36
1.7. Dinamic i multimedia. HTML 5 .................................................................. 37
1.8. Elemente CSS ........................................................................................................... 39
1.8.1. Stiluri interne .................................................................................................. 39
1.8.2. Stiluri externe ................................................................................................. 41
2. PHP ................................................................................................ 51
2.1. Preliminarii ................................................................................................................ 51
2.2. Instalare ...................................................................................................................... 52
2.3. Comenzi PHP ............................................................................................................. 53
2.3.1. Sintax i elemente de baz ......................................................................... 53
2.3.2. Tipuri de date ...................................................................................................... 56
2.3.3. Structuri condiionale i de ciclare .............................................................. 58
2.4. Dezvoltare de aplicaii PHP cu baze de date MySQL ......................... 61
2.4.1. Funcii PHP pentru operare cu MySQL ....................................................... 61
2.4.2. Elemente MySQL ................................................................................................ 65
2.4.3. Interogare neparametrizat a unei tabele a bazei de date ............... 66
2.4.4. Interogare parametrizat a unei tabele a bazei de date .................... 73
2.4.5. Adugare ntr-o tabel a bazei de date ..................................................... 83
2.4.6. tergere cu confirmare dintr-o tabel a bazei de date ....................... 86
2.4.7. Modificarea unei linii dintr-o tabel a bazei de date ............................ 89
2.4.8. Aplicaie exemplu cu operaii SQL multiple ............................................. 93
2.4.9. Interogare cu extragerea date dintr-o coloan BLOB .......................... 96
2.4.10. Apelul unei proceduri stocate ..................................................................... 98
2.4.11. Prevenirea problemei SQL injection ......................................................... 99
2.5. Dezvoltare de aplicaii PHP cu baze de date Oracle ........................ 104
2.5.1. Interogare fr parametri ............................................................................. 104
2.5.2. Operare tranzacional .................................................................................. 106
2.5.3. Interogare cu parametri pasai prin auto-apelare............................... 108
2.6. Dezvoltare de aplicaii PHP cu baze de date Interbase ................ 111
2.7. Grafic ........................................................................................................................ 113
2.8. Funcii pentru operare cu fiiere ................................................................ 117
2.9. Operare cu sesiuni .............................................................................................. 121
2.10. Operare cu cookies........................................................................................... 124
2.11. Transferuri de parametri .............................................................................. 125
2.11.1. Selecii multiple.............................................................................................. 125
Cuprins 7
Introducere 9
INTRODUCERE
Programarea Web se constituie astzi, n contextul exploziei informaionale
i a extinderii de neimaginat acum civa ani a reelei Internet, ca unul dintre
domeniile dezvoltrii de aplicaii software cu un trend permanent ascendent, ntr-o
continu evoluie, att calitativ, ct i cantitativ. Practic, un important segment al
dezvoltrilor informatice este acaparat de proiectarea i dezvoltarea de aplicaii
destinate Internetului, categoria Web fiind predominant n acest sens.
Punctul de start al prezentei lucrri l constituie o carte mai veche a autorului
Tehnologii de programare a aplicaiilor Internet cu baze de date [1], elaborat ca
suport de curs destinat disciplinei Programarea aplicaiilor Internet aferent
curriculei de studiu a anului 4 Ingineria Sistemelor. Prin modificrile i adaptrile
operate, prin subiectele revizuite i tematicile noi integrate, att la nivel teoretic, ct
i mai ales aplicativ, prin paragrafele suplimentare i capitolul complet nou adugat,
cartea de fa reprezint mult mai mult dect o simpl nou ediie, revizuit i
adugit, fiind practic o lucrare complet nou, ancorat n noile realiti ale unui
domeniu ntr-o continu expansiune. Prin titlul ales, considerat a descrie mult mai
bune coninutul actualizat n conformitate cu noile tendine i dezvoltri din domeniu
informatic abordat, lucrarea dezvluie direct, fr echivoc, subiectul stabilit ca
obiectiv principal: programarea Web. Evident c plaja de referin a unui asemenea
obiectiv este practic imposibil de cuprins i tratat complet, n vastitatea ei, ntr-o
singur lucrare. Din acest motiv, ngustnd zona abordat (cartea constituindu-se
tot ca suport de curs destinat studenilor, dar sigur util i programatorilor), inta
principal este focalizat pe furnizarea rapid, eficace i concis, axat strict pe
utilitatea uzual, a unor informaii de maxim eficien aplicativ, destinate unei
rezolvri rapide a diverselor probleme care apar frecvent n dezvoltarea aplicaiilor
Web, uzual cerute de piaa de profil. De asemenea, din imensa gam de limbaje i
tehnologii de programare utilizate la ora actual pentru dezvoltarea i ntreinerea
vastei construcii numit Internet, lucrarea se oprete doar asupra unei suite
restrnse, oferind ns un meniu complet de instrumente software permind
proiectarea i implementarea oricrui tip de aplicaii Web cerute pe pia. Suita la
care se face referire are urmtoarele componente: HTML+CSS, PHP+MySQL
(Oracle), JavaScript+AJAX, acoperind practic ntreaga arie de problematici care se
cer a fi rezolvate la dezvoltarea unui site Web: programare server-side (PHP),
programare client-side (JavaScript), baze de date (MySQL), elemente de dinamic i
interactivitate cu utilizatorul (AJAX), formatare i design (HTML, CSS).
Abordarea subiectelor tratate este caracterizat printr-o puternic tent
aplicativ, orice secven de cod prezentat putnd fi imediat rulat, astfel nct
programatorul s dispun din start de o baz de cod iniial, funcional, imediat
utilizabil, adaptabil i extensibil conform cerinelor acestuia. De asemenea,
abordarea este gradual, fiecare nou exemplu venind ca o completare a celor
precedente, respectiv ca un pas n fa pentru rezolvarea unei alte probleme,
succesiv i logic aprute dup rezolvarea celei precedente.
Dei la ora actual exist o mulime de surse bibliografice, n special
disponibile on-line pe Internet [20][21][34][37], cititorul putnd fi copleit de
multitudinea lor, lucrarea ncerc s ofere un solid punct de start pentru o abordare
pas cu pas, pornind de la simplu spre complicat, a extrem de vastului domeniu al
programrii Web.
10
Introducere
1. HTML
1.1. Introducere
HTML (HyperText Markup Language) este un limbaj de marcare folosit de
browser-ele Web pentru a determina modul de afiare a coninutului paginilor Web.
[1][2] Elemente de baz ale HTML sunt o serie de cmpuri sau marcaje speciale,
numite i tag-uri sau etichete HTML. O alt caracteristic esenial a HTML o
constituie posibilitatea realizrii de legturi (link-uri sau hyperlink-uri) spre alte
documente/pagini Web, aa cum rezult i din denumirea lui (HypertText element
crend o legtur spre un alt document). Protocolul destinat comunicaiei n cadrul
WWW (Word Wide Web sau pe scurt Web) este HTTP (Hypertext Transfer Protocol),
asigurnd transferul de informaie ntre un server Web i un client browser Web. [3]
Etichetele HTML se folosesc ori de cte ori se dorete o formatare a modului de
afiare a informaiei publicate (scrierea unui text cu bold, alegerea unui anumit
fundal al paginii, inserarea unei imagini, afiare tabelat, integrare de sunet sau
orice altceva legat de formatarea unei pagini Web). Tag-urile sunt coduri speciale
care nsoesc coninutul propriu-zis al paginii Web, stabilind modul n care acesta
este afiat pe parte de client apelant. Codul HTML (mpreun cu informaia propriuzis), stocat la distan pe un server Web, este transferat spre un browser Web
(folosind HTTP), fiind interpretat corespunztor de ctre acesta. Multitudinea de
browsere Web folosite face ca modul de interpretare al unor etichete HTML s difere
uneori de la un caz la altul (din acest motiv, testarea unei aplicaii Web trebuie
realizat de multe ori pe o gam larg de browsere).
Pentru o prim exemplificare, se consider eticheta HTML <b> reprezentnd
tag-ul pentru o afiare bold a unui text. n cazul n care acest tag pereche
ncadreaz un text (vezi exemplul urmtor), afiarea textului se va realiza cu bold:
<b>Acest text este bold!</b>
Trebuie remarcat existena i a unui tag complementar </b> ataat la
sfritul coninutului textual. Acest tag de sfrit al marcajului nchide seciunea de
bold i comunic browser-ului ca formarea impus se ncheie n acest punct. Cele
mai multe tag-uri au un tag complementar de nchidere a seciunii delimitate, dup
cum se va vedea n continuare (astfel nct se poate vorbi, de regul, despre aceste
etichete ca despre nite perechi de delimitatori ai informaiei de afiat). Etichetele
HTML nu sunt case-sensitive.
HTML este independent de platform (sistem de operare), dar trebuie avut
n vedere situaia n care se apeleaz resurse ale sistemului cu particulariti diferite
de la unul la altul (spre exemplu, problema case-sensitive la referirea numelui de
fiiere pe Linux). Un document n format HTML const, n esen, ntr-o mulime de
tag-uri mpreun cu informaia util. nvarea sintaxei acestor tag-uri este
sinonim cu nvarea HTML, ca limbaj de descriere a documentelor. Totui, fr
apariia unor limbaje de programare ca Java, JavaScript, PHP, Perl, limbajul de
marcare HTML ar fi asigurat doar o simpl prezentare prozaic pe ecran a unor
texte i grafice, totul ntr-un format static, singura calitate dinamic constituind-o
posibilitatea de navigare de la o pagin la alta.
HTML, ca limbaj de marcare pentru hypertexte, ajuns momentan la
versiunea 5, prezint o evoluie continu. HTML 1.0 a introdus conceptele de antet,
paragraf, liste, referine, HTML 2.0 a adugat posibilitatea de inserare a imaginilor,
12
HTML - 1
HTML 3.0 vine cu tabele, text n jurul figurilor frame-uri iar versiunile au evoluat
succesiv, nglobnd de obicei tot ceea ce exista i aducnd n plus elemente noi.
ncepnd cu HTML 4 i continund cu actuala versiune 5 (integrnd semnificative
faciliti multimedia [7]), noi etichete sunt adugate, specificaiile altora sunt
modificate, tendina principal fiind de a apropia aspectul i funcionalitile unei
aplicaii Web de cele ale unei aplicaii desktop. [22]
Evoluia HTML continu i n momentul de fa, integrnd o serie de noi
tehnologii i plugin-uri dedicate, extinznd substanial capabilitile multimedia ale
site-urilor Web. Astfel, se vorbete despre DHTML (Dynamic HTML), reprezentnd o
combinaie ntre HTML, CSS i JavaScript, AJAX - ca o integrare HTML, JavaScript i
XML (eXtended Markup Language) i multe altele, toate acestea conducnd la o
dinamic sporit a paginilor Web. [4][5] Aceast evoluie este strns legat i de
versiunile succesive de dezvoltare a browser-elor utilizate pe pia (Netscape,
Mozilla, Microsoft Internet Explorer, Mosaic, Opera, Safari, Google Crome etc),
fiecare prelund uneori ntr-o manier personalizat noile standarde HTML (dup
cum s-a precizat deja, putndu-se vorbi de o dependen de browser, adic acelai
document HTML este interpretat n mod diferit de browsere diferite).
<html></html>
<head></head>
<title></title>
<body></body>
13
Cel puin 99% din documentele Web, fie ele mai mici sau mai mari, mai
simple sau mai complicate, conin cel puin tag-urile prezentate mai sus. Ele descriu
cadrul general al oricrui document HTML. Din definiia tag-ului <body> se poate
vedea c cea mai mare parte din aciunea unei pagini HTML se desfoar n
aceast seciune, de vreme ce acest tag <body> cuprinde tot coninutul afiabil al
documentului. Utilizarea tag-urilor HTML este non-case-sensitive (se pot folosi att
caracter mici, ct i mari).
Observaie: Comentariile HTML sunt ncadrate de separatorii <!-- i -->:
<!--Cod HTML comentat sau simplu comentariu -->:
black
white
blue
yellow
red
green
#000000
#FFFFFF
#0000FF
#FFFF00
#FF0000
#008000
14
HTML - 1
lime
silver
#00FF00
#C0C0C0
<h1>Hello!</h1>
<h2>Hello!</h2>
<h3>Hello!</h3>
- Paragraful
Un paragraf poate fi creat n HTML prin utilizarea etichetei <p>. Aceast
etichet creeaz o zon de text, care este separat de restul documentului printr-o
linie vid deasupra i dedesubtul zonei de text. De exemplu:
<p>Acesta este primul paragraf. Acesta este primul paragraf. Acesta este
primul paragraf.</p>
<p> Acesta este al doilea paragraf. Acesta este al doilea paragraf. Acesta
este al doilea paragraf.</p>
De asemenea, se poate controla i modul n care este aliniat textul n cadrul
unui paragraf, folosind atributul align. Acest atribut accept trei valori: left, center i
right. Spre exemplificare, pentru a alinia un text la marginea din dreapta a
documentului se folosete sintaxa:
15
16
HTML - 1
<hr width=100% size=2>
1.2.5. Hiperlegturi
Tot la categoria caracteristici fundamentale ale HTML se ncadreaz i
posibilitate de a crea hyperlink-uri, asigurnd conexiunile/legturile spre alte pagini
Web i implicit navigarea pe internet. Ce ar fi WWW fr aceste legturi (sau linkuri, hyperlink-uri)? Legturile reprezint esena WWW, evoluia i expansiunea lui
17
fiind asigurat tocmai prin legarea mpreun a milioane i milioane de pagini Web (i
nu numai) de pe tot globul.
O asemenea legtur (hyperlink) este creat cu ajutorul etichetei ancor
<A>. Aceasta necesit un atribut href, care specific URL-ul (Uniform Resource
Locator) int care trebuie urmat dup ce se face click pe respectiva legtur.
Exemplul urmtor prezint o legtur de tip text care va conduce (naviga)
spre site-ul Yahoo:
<a href="http://www.yahoo.com">Click here for Yahoo</a>
Legtura de mai sus este spre un document extern de pe WWW. Se pot de
asemenea crea foarte uor legturi i spre documente locale, aflate chiar pe site-ul
propriu. Trebuie doar furnizat calea complet i corect a acestora relativ la
punctul de unde se apeleaz respectiva legtur. Cteva exemple n acest sens:
<a href="section3.htm"> Click here for the next section</a>
<a href="subdir/section3.htm">Click here for the next section</a>
Prima legtur presupune c documentul section3.htm se afl n acelai
director ca i pagina curent, iar al doilea presupune c section3.htm este n
directorul "subdir", care este subdirector al directorului curent.
Se pot crea legturi folosind i imagini. Dup ce s-a neles modul de creare
a legturilor text, crearea acestora folosind imagini este mai mult dect banal.
Trebuie doar substituit textul cu eticheta <img>. Spre exemplu, click pe o imagine
pentru a asigura legtura (hiperlink-ul) cu site-ul Yahoo:
<a href="http://www.yahoo.com"><img src="paperboy.gif"></a>
Dac se dorete ca imaginea respectiv s fie ncadrat de o bordur:
<a href="http://www.yahoo.com"><img src="paperboy.gif" border=1></a>
18
HTML - 1
Salar anual: <input NAME="salar" size=8><p>
<input TYPE="SUBMIT" VALUE="Run Query">
<input TYPE="RESET" VALUE="Sterge">
</form>
Se observ c n cadrul acestui
formular (FORM) se folosete metoda GET
pentru transmiterea parametrilor spre
scriptul indicat prin proprietatea ACTION
(n cazul de fa, un script PHP). Prin
apsarea butonului de tip SUBMIT Run
Query, presupunnd c iniial s-a tastat
5, respectiv 1000, spre scriptul apelat
este transmis un ir (string) de forma:
ani=5&salar=1000.
19
20
HTML - 1
21
Persoane cu virsta:
<SELECT NAME="virsta" size="1">
<OPTION VALUE="0"> mai mare ca 0
<OPTION VALUE="10" > mai mare ca 10
<OPTION VALUE="20"> mai mare ca 20
<OPTION VALUE="30"> mai mare ca 30
</SELECT>
<SELECT MULTIPLE NAME="meserie[]">
<OPTION selected VALUE="Inginer"> Inginer
<OPTION VALUE="Sofer" > Sofer
<OPTION VALUE="Dentist"> Dentist
</SELECT>
Autoturism <input type="checkbox" name="vehicol[]" value="Dacia" />
Autoturism Dacia
<input type="checkbox" name="vehicol[]" value="Ford" /> Autoturism Ford
<p>
<input TYPE="SUBMIT" VALUE="Cauta">
</form>
Primul tag <SELECT> numit virsta, prin modul lui de definire permite
selectarea (la un moment dat) doar a unei singure opiuni, fiind practic o caset cu
derulare: <SELECT NAME="virsta" size="1">
Dac parametrul size are valoarea 1, este vizibil o singur opiune la
momentul iniial; dac are o valoare n, la momentul iniial vor fi vizibile n opiuni
(indiferent ns de valoarea lui n, o singur opiune poate fi selectat).
Al doilea tag <SELECT> numit meserie, permite realizarea unor selecii
multiple (vezi i figura 1.3):
Cazul unor etichete care permit o selecie multipl ridic anumite probleme
privind preluarea valorilor parametrilor transmii de ctre acestea. Problema se
datoreaz faptului c, un acelai parametru este pasat simultan cu mai multe valori
diferite (selecii multiple), fiind ntlnit att la etichetele SELECT, ct i la INPUT de
22
HTML - 1
tip checkbox (acesta este motivul pentru care s-a inserat n exemplul anterior i o
secven de cod specific unei etichete INPUT checkbox). Problema prelurii acestor
parametri cu valori multiple, n ambele situaii, se rezolv stabilind un nume al
etichetei ntr-o sintax specific unui array (ir): meserie[],vehicol[]. Apoi
scriptului apelat, spre care sunt pasai parametri, i revine sarcina de a prelua aceste
variabile de tip ir (array) i de extrage, succesiv, valorile elementelor lor. n
capitolul urmtor se va reveni asupra problemei, prezentndu-se modul n care un
script PHP trateaz aceast situaie specific unor selecii multiple.
1.3. Frame-uri
1.3.1. Frame-uri linie/coloan
Frame-urile (numite i cadre) sunt practic elemente HTML prin care se
realizeaz o mprire a ecranului n mai multe zone (regiuni) de afiare,
permindu-se astfel afiarea simultan ntr-un acelai ecran a mai multor pagini
Web.[1][2]
O astfel de mprire a ecranului n mai multe regiuni, permite o
prezentare a informaiei ntr-o form mai flexibil, mai practic i uneori mai util.
n fiecare frame (avnd un anumit nume) este afiat coninutul unui anumit fiier
HTML (script), referit printr-un URL. Frame-ul poate fi redimensionat (opional) de
ctre utilizator. Cele mai uzuale marcaje (cuvinte cheie, tag-uri) specifice proiectrii
unei pagini Web utiliznd frame-uri sunt:
<FRAMESET>, <FRAME> (absolut obligatorii), respectiv (ca atribute opionale):
<NOFRAMES>,
TARGET,
ROWS,
COLS,
FRAMEBORDER,
BORDERCOLOR,
FRAMESPACING, NORESIZE, MARGINWIDTH, MARGINHEIGHT, SCROLLING,
<IFRAME>.
Utilizarea unor frame-urile n cadrul unei pagini Web presupune, ntr-o prim
faz, o definire a acestora n cadrul documentului HTML. Definirea frame-urilor
precizeaz tipul acestora, numrul i poziia lor n cadrul paginii Web, precum i
URL-urile (adresele) ctre fiierele HTML care vor constitui coninutul lor (coninutul
propriu-zis fiind practic stocat ntotdeauna separat, ntr-un alt fiier HTML).
Definiia unei succesiuni de frame-uri care vor fi plasate pe un ecran este
marcat printr-o etichet de tip <FRAMESET> (pentru o setare global). Eticheta
<FRAMESET> va fi ignorat dac orice alte etichete sunt plasate nainte, ntre taguri de tip <BODY>. Eticheta container <FRAMESET> conine o serie de etichete
<FRAME> , fiecare descriind succesiv cte un frame din setul de frame-uri care vor
alctui ecranul.
Dimensiunea i plasarea n pagin a unui frame sunt precizate n termeni de
rnduri i coloane, utiliznd combinaii de etichete <FRAMESET> i <FRAME>.
Exemplul urmtor prezint modul n care poate fi realizat o succesiune de 3
cadre, plasate n linie sub forma a trei coloane separate, n fiecare dintre ele
ncrcndu-se un fiier HTML, referit explicit printr-un URL (fiierele One.html,
Two.html, Three.html). Prima coloan este setat la 80 pixeli lime, coloana a doua
este setat la 25% din aria (limea) disponibil iar a treia coloan trebuie s ocupe
restul spaiului rmas (fig.1.4). nlimea ecranului este utilizat integral de ctre
1.3. Frame-uri
23
fiecare coloan. Fiecare coloan din exemplul prezentat este practic un frame
coloan, precizarea acestui tip (coloan) fiind dictat de folosirea atributului COLS:
<FRAMESET COLS="80,25%,*">
<FRAME SRC="one.htm">
<FRAME SRC="two.htm">
<FRAME SRC="three.htm">
</FRAMESET>
Pentru aranjarea pe linii a unor frame-uri, se utilizeaz atributul ROWS n
locul atributului COLS.
24
HTML - 1
1.3. Frame-uri
25
26
HTML - 1
1.3. Frame-uri
27
28
HTML - 1
1.4. Tabele
1.4.1. Elemente introductive
O tabel permite organizarea datelor pe linii (rnduri) i coloane, ca
modalitate de prezentare a unei informaii (text sau grafic) ntr-o pagin. Tabelele
sunt extrem de utilizate ca mod de formatare a informaiei returnate prin
interogarea unei baze de date.[1][4]
Cele mai uzuale marcaje (cuvinte cheie, tag-uri, etichete) specifice
proiectrii
unei
pagini
Web
utiliznd
tabele
(afiri
tabelate)
sunt:
<TABLE>,<TR>,<TD>,<TH> (lista putnd continua cu <CAPTION>, <COL>,
<COLGROUP>, <SPAN>, etc)
Definiia oricrui tabel presupune utilizarea perechii de etichete <TABLE>
</TABLE>. n definiia tabelei se poate folosi (opional) o etichet <CAPTION>, prin
care se ataeaz un titlu tabelului.
Dup cum se va prezenta n continuare, tabelele sunt construite succesiv,
linie cu linie (o linie la un moment dat, apoi alt linie, s.a.m.d.). Liniile unei tabele
sunt definite prin perechi de etichetele <TR> </TR>. n interiorul acestor etichete
trebuie inclus cel puin un header (cap de tabel) sau element de tip date (articol,
informaie) utiliznd perechea de etichete <TH> </TH>, respectiv <TD> </TD>
(etichete controlnd definirea unei coloane sau mai precis un element coloan al
unei linii). De subliniat faptul c, construcia unei tabele ncepe tot timpul cu
definiia unei linii (<TR>), iar n cadrul definiiilor liniilor sunt generate celulele
aferente coloanelor (<TH> pentru celule cap tabel, <TD> pentru celulele date)
Exemplu:
<TABLE border=1>
<CAPTION ALIGN=top>Clasament</CAPTION>
<TR>
<TH>Cool</TH>
<TH>Sad</TH>
</TR>
<TR>
<TD>Belle & Sebastian</TD>
<TD>Michael Bolton</TD>
</TR>
<TR>
<TD>Bentley Rhythm Ace</TD>
<TD>Mariah Carey</TD>
</TR>
</TABLE>
Efectul pe ecran este urmtorul:
Clasament
Cool
Belle & Sebastian
Bentley Rhythm Ace
Sad
Michael Bolton
Mariah Carey
1.4. Tabele 29
Analiznd codul, se poate remarca modul n care s-a construit succesiv
fiecare linie (capul de tabel, urmat de dou linii cu informaie), iar n cadrul fiecrei
linii modul n care s-au realizat celulele (practic mprirea liniei pe coloane).
30
HTML - 1
1.4. Tabele 31
<TH ROWSPAN=2>Artist</TH>
<TD>Belle & Sebastian</TD>
<TD>Michael Bolton</TD>
</TR>
<TR>
<TD>Bentley Rhythm Ace</TD>
<TD>Mariah Carey</TD>
</TR>
</TABLE>
Efectul n pagina Web este urmtorul:
Rating
Artist
Sad
Belle & Sebastian
Bentley Rhythm Ace
Cool
Michael Bolton
Mariah Carey
32
HTML - 1
<TD>Michael Bolton</TD>
</TR>
<TR>
<TD HEIGHT=35>Bentley Rhythm Ace</TD>
<TD>Leftfield</TD>
<TD>Nine Inch Nails</TD>
<TD>Mariah Carey</TD>
</TR>
</TABLE>
Cool
Groovy
Unique
Sad
Tricky
Michael Bolton
Leftfield
Mariah Carey
1.4. Tabele 33
</TR>
<TR BORDERCOLOR="Red" BGCOLOR="Green">
<TD BORDERCOLOR="Yellow">Bentley Rhythm Ace</TD>
<TD BGCOLOR="White">Mariah Carey</TD>
</TR>
<TR BORDERCOLOR="Orange" BORDERCOLORDARK="Blue"
BORDERCOLORLIGHT="White">
<TD>The Wedding Present</TD>
<TD>Celene Dion</TD>
</TR>
</TABLE>
Efectul pe ecran al scriptului HTML anterior este urmtorul:
Cool
Sad
Belle & Sebastian
Michael Bolton
Bentley Rhythm Ace
Mariah Carey
The Wedding Present
Celene Dion
Adugarea unei imagini ca background la un tabel (ncepnd cu Microsoft
Internet Explorer 3 i Netscape 4, apoi continund cu familia Mozilla) se poate face
utiliznd atributul background, ataat unor etichete de genul <table> sau <td>
(exact ca i pentru o etichet <body>). Exist cteva deosebiri n aceast problem,
referitor la modul de lucru cu Mozilla i Internet Explorer. Mozilla repet graficul de
background la nceput, pentru corpul fiecrei celule, n timp ce Internet Explorer
acoper cu acea imagine ntreg tabelul, inclusiv bordurile. n plus, Mozilla nu
permite un background individual pentru fiecare celul, dac s-a specificat deja un
background global, pentru ntreg tabelul.
Exemplu:
<TABLE BACKGROUND="graphics/babies.gif" WIDTH=50% BORDER=1>
<TR>
<TH BGCOLOR="orange">Cool</TH>
<TH BGCOLOR="orange">Sad</TH>
</TR>
<TR>
<TD>Belle & Sebastian</TD>
<TD>Michael Bolton</TD>
</TR>
<TR>
<TD>Bentley Rhythm Ace</TD>
<TD>Mariah Carey</TD>
</TR>
<TR>
<TD>The Wedding Present</TD>
<TD BACKGROUND="graphics/flower_t.jpg">Celene Dion</TD>
</TR>
</TABLE>
Observaie: Pentru crearea unei celule vide se poate folosi o secven de genul:
<TD> </TD> ( - jucnd rolul unui spaiu).
34
HTML - 1
1.5. Liste
Listele permit ordonarea dup anumite criterii i afiarea informaiei pe
ecran sub forma unor articole (item-uri) bine structurate.[1][2]
Exist mai multe tipuri de liste care pot fi create, cele mai importante fiind
listele ordonate i neordonate.
Iat
cteva
etichete
specifice
crerii
unor
liste:
<LI>,<OL>,<UL>,<MENU>,<DIR>,<DL>,<DT>,<DD>,
O list conine o succesiune de item-uri (articole/elemente). Tipul de list
determin cum sunt descrise (afiate) item-urile. Pentru cazuri mai complexe se pot
crea i liste ncuibate, pe mai multe nivele.
1.5. Liste
35
Tabel 1.3.
1
A
a
I
i
1,2,3,
A,B,C,
a,b,c,
I,II,III,
i,ii,iii,
Exemplu:
<OL TYPE=i START=2 >
<LI>Element2.</LI>
<LI>Element3.</LI>
<LI> Element4.</LI>
</OL>
cu rezultatul:
ii. Element2
iii. Element3
iv. Element4
36
HTML - 1
</DL>
<DL COMPACT>
<DT>alt termen</DT>
<DD>definitia noului termen</DD>
</DL>
37
ALT
Se folosete numai ncepnd cu Microsoft Internet Explorer 4. Este folosit
pentru a prevedea un mesaj (hint) pentru legtura care apare atunci cnd mouse-ul
trece deasupra zonei active.
TARGET="frame_name | window_name"
Acest atribut aloc destinaia unei legturi link, pentru a ncrca informaia
referita prin HREF ntr-un frame predefinit sau ntr-o fereastr. Dac nu este nici un
frame cu numele specificat, atunci legtura va fi ncrcat ntr-o fereastr nou
(care primete acel nume).
Exemplu (pentru Internet Explorer):
<IMG SRC="timis.jpg" USEMAP="#timis" BORDER=3>
<MAP NAME="timis">
<AREA SHAPE=RECT COORDS="11,121,329,548" HREF="vest.html" ALT="
vest Timis">
<AREA
SHAPE=RECT
COORDS="327,157,700,344"
HREF="ne.html"
ALT="nord-est Timis" >
<AREA
SHAPE=RECT
COORDS="328,344,685,570"
HREF="se.html"
ALT="sud-est Timis" >
</MAP>
Observaie: Referitor la exemplul anterior, n cazul unei rulrii pe un browser
Mozilla este posibil ca anumite atribute s nu aib efectul ateptat (spre exemplu
atributul ALT nu este funcional).
ntr-un paragrafele precedente se vorbea despre DHTML, adic de modul n
care chiar unele etichete HTML aduc o oarecare dinamic n statismul unei pagini
Web. n continuare sunt exemplificate cteva asemenea etichete.
38
HTML - 1
40
HTML - 1
<style type="text/css">
table {
font-family: "Edwardian Script ITC";
font-size: 36px;
color: #FFFFFF;
background-color: #0099FF;
border: 4px double #0033FF;
text-align: center;
}
</style>
</head>
<body>
<br><br>
<table align="center">
<tr>
<td>
Exemplu de utilizare a stilurilor interne!!!
</td>
</tr>
</table>
</body>
</html>
42
HTML - 1
reguli de stil, motivul fiind evident: atunci cnd se dorete modificare aspectului
ntregului site, este suficient doar o modificare ntr-o singur locaie, i anume fiierului CSS (efectul resimindu-se asupra tuturor paginilor din site care folosesc
foaia de stil respectiv). Astfel, printr-o singur operaie, se poate schimba rapid
aspectul ntregului site, indiferent de dimensiunea lui (numr de pagini).
44
HTML - 1
.text20albastru
{
font-size: 20px;
color: 00ddff;
}
.text16rosu
{
font-size: 16px;
font-weight: bold;
color: ff3300;
}
#nav-menu li
{
float: left;
margin: 0 0.4;
background:#B3B3B3;
}
#nav-menu li a
{
background: url(background.jpg) #fff bottom left repeat-x;
height: 2em;
line-height: 2em;
46
HTML - 1
float: left;
width: 9em;
display: block;
border: 0.1em solid #dcdce9;
color: #FFFFFF;
text-decoration: none;
text-align: center;
}
Figurile 1.12.a, respectiv 1.12.b prezint efectul succesiv cumulat al fiecrui nou
element de stil aplicat (ultimul conducnd chiar la meniul final din fig. 1.11).
n cadrul fiierului CSS se poate remarca referirea #nav-menu specificnd id-ul
elementului DIV (nglobnd ntreaga construcie a meniului). Cele trei stiluri #navmenu ul, #nav-menu li, #nav-menu li a, se refer la formatarea listelor (ul)
avnd ca printe DIV-ul (#nav-menu), a elementelor listelor (li), respectiv a
coninutului ancorelor (a) , avnd ca printe elemente ale listei (li), care la rndul
lor au ca printe DIV-ul (#nav-menu).
Dei rulnd codul anterior pe Mozilla, unele stiluri ar putea prea inutile, o simpl
rulare pe Internet Explorer este relevant pentru a dovedi necesitatea lor! Spre
exemplificare, eliminarea stilului aferent elementelor din lista (#nav-menu li)
conduce pe Internet Explorer la un meniu de genul celui din fig. 1.13.
menu),
stilurile
fiecrui
(fiecare
ul li
{
display: block;
position: relative;
float: left;
}
48
HTML - 1
li ul
{
display: none;
}
ul li a
{
display: block;
text-decoration: none;
color: #ffffff;
border-top: 1px solid #ffffff;
padding: 5px 15px 5px 15px;
background: #1e7c9a;
margin-left: 1px;
white-space: nowrap;
}
ul li a:hover
{
background: #3b3b3b;
}
// hover element selector ataat
unei etichete HTML, genernd, n
momentul n care mouse-ul se
deplaseaz deasupra acesteia, o
stilizare fie a acesteia, fie a altei
etichete.
// ul li a:hover - cnd mouse-ul se
deplaseaz deasupra unei ancore <a>
(etichet selectat), modific fundalul
ancorei avnd ca printe un element
<li>, care la rndul face parte dintr-o
list <ul>.
li:hover li {
float: none;
font-size: 20px;
}
// li:hover li - cnd mouse-ul se
deplaseaz deasupra unui element <li>,
stilizeaz acel <li> (avnd ca printe alt
<li>)
//aici s-ar putea opri dezvoltarea
meniului
li:hover a {
background: #00ff00;
color: #ff00ff;
}
//simple schimbri de culori (nu sunt
necesare)
</style>
50
HTML - 1
2. PHP
2.1. Preliminarii
Unul dintre cele mai utilizate limbaje de programare folosit la ora actual
pentru dezvoltarea aplicaiilor Web este PHP-ul (semnificaia acronimului PHP fiind PHP: Hypertext Preprocessor). PHP-ul este un limbaj de scripting derivat din
familia C, rulnd multiplatform (att pe paltformele Windows, ct i Unix-Linux),
permind dezvoltarea rapid de scripturi server-side de ctre orice programator
familiarizat cu binecunoscutul i popularul limbaj C. [10][20]
Ca software open-source i avnd o robustee confirmat n cei aproape 20
de ani de utilizare, PHP-ul prezint un cert avantaj n puternica competiie pe care o
are cu alte limbaje i tehnologii de programare Web server-side, cum ar fi ASP,
ASP.Net, JavaServer Pages (JSP) etc. Evident, fiind un limbaj rulnd pe partea de
server (de aceea se face o comparaie a acestuia doar cu acest tip de limbaje de
programare Web), scripturile PHP sunt rulate pe un server Web (folosind motorul
interpretor PHP), iar utilizatorul (clientul browser) nu poate vedea codul surs PHP al
programului, ci doar codul paginii HTML returnat spre browser-ul client. Altfel spus,
motorul limbajului interpreteaz codul surs program PHP, genernd pe baza
acestuia cod HTML (integrat cu datele / informaiile utile returnate/generate), pasat
apoi mai departe de ctre serverul Web spre browser-ul apelant, care tie s
interpreteze/afieze corespunztor codul HTML. Un alt mare avantaj al PHP-ului
const n faptul c suport o mare varietate de tipuri de baze de date, cum ar fi
MySQL, Oracle, PostgreSQL, IBM DB2, InterBase, Sysbase, Microsoft SQL Server
(suportul pentru MySQL fiind ncorporat nativ n interpretorul PHP). [12] Astfel, se
pot crea foarte uor aplicaii Web pentru accesarea bazelor de date, PHP-ul oferind
fie suport nativ, fie un suport concretizat prin utilizarea unor biblioteci .dll
suplimentare externe (programatorul trebuind s utilizeze selectiv biblioteci specifice
tipului respectiv de baz de date). [19] Alt avantaj este faptul c suport o serie de
protocoale de reea, printre care SMTP, NNTP, POP3 i HTTP. n cadrul lucrrii de
fa s-a folosit versiunea PHP 5.2.3. n momentul redactrii, ultima versiune PHP
5.4.4 era disponibil on-line la adresa www.php.net.
Limbajul de scripting PHP a fost implementat n 1994 de Rasmus Lerdorf, la
nceput fiind vorba de un proiect personal care includea cteva macro-uri i un
modul care permitea interpretarea lor, menite s urmreasc "activitatea" paginii
sale personale. n 1995 este disponibil sub numele Personal Home Page. ncepnd
cu versiunea 3, din 1997, a nceput s fie dezvoltat de o echip de programatori, iar
ncepnd cu versiunea 4 dispune de engine-ul de scripting al firmei Zend
52
PHP - 2
2.2. Instalare
Alt avantaj major al PHP l constituie instalarea extrem de facil, n contextul
unei conexiuni att cu serverul de Web Apache, ct i cu serverul de baze de date
MySQL. Astfel, cel mai simplu mod de a opera cu PHP-ul, n tandem cu MySQL i
Apache, este de a folosi pachetul WAMP, integrnd perfect aceast triplet
PHP+MySQL+Apache i disponibil la adresa www.wampserver.com/en/. Dup simpla
rulare a kit-ului de instalare WAMP, totul este deja pregtit pentru a scrie i rula
scripturi PHP (inclusiv cu apeluri la serverul de baze de date MySQL), fr a mai fi
necesar nici o alt setare suplimentar (n fiierele de configurare).
Observaie: De remarcat faptul c, la un moment dat, pe un calculator poate rula
doar un server Web, astfel nct, dac un alt server este deja instalat i pornit, este
necesar o oprire prealabil a acestuia.
Pachetul WAMP conine i aplicaiile PHPMyAdmin i SQLiteManager,
folosibile pentru gestionarea cu uurin a bazelor de date MySQL. WAMP este
pachetul destinat operrii sub Windows. [21] n mod similar se poate folosi LAMP
pentru operarea sub Linux. Cu aceleai avantaje, se poate folosi i pachetul XAMP
(Xml + Apache + Mysql + Php), oferind faciliti similare.
n cazul n care se utilizeaz componente disparate (interpretor PHP, server
WEB, server de baze de date SQL), iar pe computer nu este instalat un server de
WEB, este iniial necesar instalarea unuia. Versiunile mai vechi PHP (pn la 3)
erau disponibile doar ca pachet separat, integrarea lor cu un server de Web,
respectiv server MySQL fcndu-se manual, printr-o serie de setri n diverse fiiere
de configurare (n principal fiierul php.ini), respectiv o setare corespunztoare a
serverului de Web (n special n cazul IIS).
53
54
PHP - 2
55
<?php
// se va afisa data calendaristica
echo "<p><b>";
print( date("d F Y, l. ") );
?>
</b> </body>
</html>
Efectul rulrii acestui script este prezentat n figura 2.1:.
Dei secvena anterioar ncepe cu cod HTML i conine cod HTML n mare
msur, codul PHP constnd practic n doar dou linii, fiierul surs va avea
obligatoriu extensia PHP (vezi n fig.2.1, linia de apel: localhost/data.php) Liniile
dintre etichetele delimitatoare <?php, respectiv ?> reprezint codul PHP. Serverului
WEB detecteaz extensia fiierului, apoi trimite i cere motorului PHP instalat pe
acelai localhost s interpreteze codul dintre cei doi delimitatori. Interpretorul PHP
execut funcia date prin care citete data calendaristic de pe server (localhost) si,
integrnd-o ca pe un simplu string n codul HTML, trimite rezultatul astfel construit
(date+cod HTML) spre browser-ul apelant.
56
PHP - 2
57
$var = "0";
// $var = "0"
string
$var++;
// $var = "1"
$var+=1;
// $var = 2
integer
$var += c;
// $var = 2
integer
$var = $var + 1.3;
// $var = 3.3
float
$var = 5 + "10 obiecte";
// $var =15
$var = 5 + "obiecte";
// $var =5
integer
$var = "a";
// $var = "a"
string
$var++;
// $var = "b"
$var = "nu";
// $var = "nu"
string
$var++;
// $var = "nu"
string
Comentariile prezente n dreptul fiecrei linii precizeaz valoarea variabilei
($var) dup operaia efectuat, respectiv tipul acesteia (n multe cazuri fiind vorba
de o schimbare de tip, fr a se semnala o eventual eroare, chiar i pentru cele
mai puin probabile situaii de conversie de tip). Ultimele dou linii prezint cazul cel
mai defavorabil, n care operaia nu este posibil, situaie n care coninutul i tipul
variabilei rmne neschimbate.
Pentru tipul array sau ir (elementele unui ir putnd fi chiar de tipuri
diferite, ceea ce constituie iari o abatere de la regulile specifice altor limbaje
puternic tipizate), un exemplu edificator este prezentat n continuare:
$sir=array(1=>ion, 2=>dan, 3=>225);
echo $sir[1]."<br>";
// afieaz ion
(string)
echo $sir[2]."<br>";
// afieaz dan
(string)
echo $sir[3]."<br>";
// afieaz 125
(ntreg)
$sir[3]++;
// incrementeaz
echo $sir[3]."<br>";
// afieaz 226 (ntreg)
Eticheta <br> realizeaz afiarea pe o linie nou, iar operatorul . (punct)
este folosit pentru concatenarea a dou string-uri). Un element al irului poate fi
referit
independent,
ca
o
variabil,
printr-o
construcie
de
genul:
$nume_array[indice_element].
Secvena anterioar de cod poate fi rescris echivalent:
$sir=array(ion, dan, 225);
echo $sir[0]."<br>";
echo $sir[1]."<br>";
echo $sir[2]."<br>";
$sir[3]++;
echo $sir[2]."<br>";
n acest caz se poate observa c, dac irul este iniializat fr o precizare
explicit a indicilor elementelor, primul indice -cel de start- are valoarea implicit 0
i NU 1 (situaie des ntlnit pentru array-uri generate automat de unele
comenzi/structuri PHP).
Despre tipul boolean, o simpl exemplificare cu cele dou valori posibile:
$var=TRUE; //sau $var=false;
n plus, o eventual conversie la boolean a unei valori numerice 0, string 0
sau array vid (fr elemente), conduce automat la valoarea FALSE (restul de valori
non-zero, genernd TRUE).
58
PHP - 2
59
if ( conditie )
{
// secvena care se execut dac condiia este adevrat.
}
else
//ramificaie opional
{
// (Opional) secvena care se execut dac condiia este fals.
}
Structura if-else permite o bifurcare condiionat a programului. Iat un
exemplu (n care trebuie remarcat i operatorul de comparare egalitate ==):
if ( $name == "Ion" ) {
echo("Mesaj de afisat pentru: $name");
} else {
echo("Persoana neidentificat");
}
Exemplificarea anterioar utilizeaz o sintax redus a structurii condiionale
if-else (putnd s existe, de altfel, i o singur ramur condiional, evident if-ul).
De subliniat faptul ca parantezele acolade { } sunt obligatorii, chiar dac linia else
delimiteaz clar sfritul secvenei executate la ndeplinirea condiiei. O form
sintactic extins permite practic o ramificare nelimitat. Spre exemplificare, o
ramificare pe patru ramuri poate avea urmtorul cod:
if (conditie 1) {
...cod PHP
} elseif (conditie2) {
...cod PHP
} elseif conditie3) {
...cod PHP
}else (conditie 4) {
...cod PHP
}
Fiecare ramur elseif este testat doar dac condiiile impuse pe ramurile
anterioare nu sunt ndeplinite. ndeplinirea unei anumite condiii i execuia unei
anumite ramuri elseif (sau a ultimei ramuri else, ca ramur final opional)
conduce automat la ieirea din structura condiional. Altfel spus, verificarea
condiiilor se face secvenial, iar ndeplinirea uneia conduce automat la ieirea din
structur, verificarea tuturor ramurilor urmtoare fiind abandonat.
O alternativ des folosit pentru o multi-ramificaie bazat pe structura ifelseif-else o constituie structura condiional switch. Pentru o exemplificare concret
comparativ switch / if-elseif se consider urmtoarele secvene:
if ($var == 0) {
switch ($var) {
echo "mesaj 0";
case 0:
} elseif ($var == "ceva") {
echo "mesaj 0";
echo "ceva";
break;
} elseif ($var == 2) {
case "ceva":
echo "mesaj 2";
echo "ceva";
}
break;
case 2:
echo "mesaj 2";
break;
}
60
PHP - 2
61
{
// secvena de comenzi executat repetat, procesnd variabila $element
}
Un exemplu concret de extragere i afiare a elementelor unui ir (array)
folosind foreach:
$sir = array(1, 2, 3, 4);
foreach ($sir as $element)
{
print $element.<br>;
// afiare elemente
}
Structurile repetitive implementate cu foreach sunt foarte des utilizate n
contextul operrii cu baze de date. Motivul l constituie faptul c, de regul, liniile
unei tabele sunt disponibile succesiv sub forma unui array, iar accesul la fiecare
element al acestuia se poate realiza cu o bucl foreach. Atenie ns, la fiecare nou
ciclu foreach, valoarea anterior extras este tears (suprascris). O alternativ la
acest impediment o constituie comanda list, permind extragerea ntr-o list de
variabile predefinite a elementelor unui ir (extragerea tuturor elementelor fcnduse simultan, nu succesiv).
Exemplu:
$sir = array(unu, doi, 3);
list($var1, $var2, $var3) = $sir;
echo $var1. .$var2. . $var3;
Dac numrul de variabile nu coincide cu numrul de elemente ale irului
array (indiferent c este mai mare sau mai mic), extragerea se va face doar pentru
elementele disponibile, fr semnalarea unui mesaj de avertisment sau de eroare.
Dezavantajul fa de foreach const n faptul c, dac se dorete extragerea ntr-un
set de variabile a ntregului coninut al irului, trebuie cunoscut aprioric numrul de
elemente ale acestuia.
62
PHP - 2
Tabel 2.1.
Tip_returnat
Funcie(...)
resource mysql_connect
resource mysql_pconnect
bool mysql_close
bool mysql_select_db
bool mysql_create_db
Aciuni/caracteristici
- realizeaz conectarea la un server MySQL;
- funcia necesit trei parametri uzuali: nume
server MySQL/ adres IP server, nume utilizator
MySQL i parola de acces;
- returneaz valoarea logic FALSE n cazul n
care a euat conectarea la server-ul de baze de
date, respectiv un identificator resurs de acces la
conexiunea cu server-ul MySQL n cazul n care
conectarea a reuit.
- realizeaz o conexiune permanent la un server
MySQL (parametrii fiind aceiai ca la funcia
anterior);
- iniial, caut o conexiune permanent deja
existent, iar n cazul n care nu gsete, creeaz
una;
- nu nchide conexiunea la final de script;
- returneaz valoarea logic FALSE n cazul n
care a euat conectarea la server, respectiv un
identificator resurs de acces la conexiunea cu
MySQL n cazul n care conectarea a reuit.
- primete ca parametru un identificator de acces
la o conexiune cu un server MySQL i realizeaz
nchiderea acesteia. n cazul n care parametrul
nu este specificat, se va nchide conexiunea
curent;
- returneaz valoarea logic TRUE n cazul n care
nchiderea conexiunii s-a realizat cu succes,
respectiv valoarea logica FALSE n caz contrar;
- funcia este opional n cazul n care
conexiunea
nu este permanent, aceasta
nchizndu-se automat la final de script.
- selecteaz/deschide o baza de date curent
(existnd deja o conexiune cu un server MySQL)
pentru interogrile/operaiile SQL care vor urma;
- funcia are doi parametri: primul este de tip ir
de caractere, reprezentnd numele bazei de date
deschise/selectate, iar cel de-al doilea parametru
reprezint identificatorul resurs de acces la
conexiunea cu serverul MySQL;
- returneaz valoarea logic TRUE n cazul n care
s-a reuit selectarea bazei de date, respectiv
valoarea logic FALSE n cazul n care baza de
date nu poate fi deschis (nu exist, utilizatorul
nu are drepturi de acces la aceasta, etc).
- permite crearea unei noi baza de date MySQL;
- funcia are doi parametri: primul este de tip ir
de caractere, reprezentnd numele bazei de date
care va fi creat, iar cel de-al doilea parametru
bool mysql_drop_db
63
resource mysql_query
array mysql_fetch_row
array mysql_fetch_assoc
array mysql_fetch_array
object mysql_fetch_object
64
PHP - 2
int mysql_num_rows
int mysql_num_fields
resource mysql_list_fields
string mysql_field_name
int mysql_field_len
string mysql_field_type
int mysql_affected_rows
int mysql_errno
string mysql_error
tip_variabil mysql_result
bool mysql_free_result
65
Setarea unei parole pentu user-ul root se poate face cu o comand de genul:
mysql> SET PASSWORD FOR root@localhost = PASSWORD(parola);
mysql> SET PASSWORD FOR root@% = PASSWORD(parola);
De sunt necesare dou comenzi? Practic sunt doi useri administrator, cu
acelai nume root, unul fiind dedicat conectrii exclusiv de pe localhost, iar cellalt
(cu acelai nume) pentru realizarea unor conexiuni din exterior (la distan sau
remote).
Cei doi useri pot fi vizualizai cu comanda (parolele fiind criptate):
mysql> select host, user, password from mysql.user;
Tot dupa instalarea serverului de baze de date, dou baze sunt implicit
create, avnd numele mysql (coninnd informaiile pentru administrarea userilor,
drepturilor acestora, parolelor de acces, etc.), respectiv test (baz de lucru pentru
root).
Vizualizarea numelor bazelor de date existente pe server, respectiv
deschiderea uneia sau alteia i afiarea numelor tabelelor din baza curent, se poate
face cu o secven de comenzi de forma urmtoare:
66
PHP - 2
67
Cunotine apriorice legate de bazele de date SQL sunt necesare, n continuare sunt
punctate pe scurt cteva aspecte specifice MySQL-ului.
Codul surs PHP al aplicaiei considerate este urmtorul (rezultatul apelului
acesteia, folosind un browser WEB, fiind prezentat n fig. 2.3) :
<?php
//Conectare la server
//(n cazul de fa, server MySQL local, user root, parola parola)
mysql_connect("localhost","root","parola") or die ("Nu se poate conecta la serverul
MySQL");
//Selecie baza de date
mysql_select_db("persoane") or die("Nu se poate deschide baza de date");
//Interogare tabel (comand SQL)
$query=mysql_query("select * from table1 where nume=ion");
//Creeaz capul de tabel (se face o afiare tabelat)
print(<table align=center BORDER="2">);
print ("<tr>");
echo <th BGCOLOR="Silver">Nume</th>;
echo <th BGCOLOR="Silver">Virsta</th>;
echo <th BGCOLOR="Silver">Localitate</th>;
print ("</tr>");
//Iniializare variabil_contor coninnd numrul de elemente (celule)
// returnate prin interogarea tabelei
$nr_val=0;
//Cicleaz dup nr. nregistrri/linii gsite (realiznd o condiie logic i o
// atribuire prin returnarea elementelor unei linii/nregistrri n variabila
// ir (array) $row)
while ($row = mysql_fetch_row($query)){
// Variabila $row este un ir (array) coninnd succesiv, la un moment
// dat, elementele unei nregistrri (row[0] va conine elemente din
//coloana 1 a liniei curente, etc)
//Creeaz o linie nou n tabel
echo" <tr>\n";
//Cicleaz dup elementele unei nregistrri/linii
foreach ($row as $value) {
//Pune ntr-o celul din tabel elementul unei nregistrri (valoarea dintr// un cmp al nregistrrii)
//Creeaz o coloan nou n linia tabelului
echo "<td>$value</td>";
//Incrementeaz variabila_contor =
// nr.total elemente = nr.inreg. X nr. cmpuri
$nr_val++;
}//nchide bucl foreach
echo "</tr>";
}//nchide bucl while
//Calculeaz nr. de coloane returnate prin interogare
$coln=mysql_num_fields($query);
$nr_inreg=$nr_val/$coln;
//calculeaz nr. de nregistrri/linii
68
PHP - 2
echo "<br>";
echo "<center>";
if ($nr_inreg>0)
//verific cte nregistrri s-au gsit
echo "s-au gasit: ".$nr_inreg." inregistrari";
// punctul (.) - rol de operator de concatenare ntre siruri
else
die ("Nu gasesc nici o inregistrare ...");
//Comanda die nchide programul i toate conexiunile (ieire forat)
echo "</center>";
//Comanda urmtoare se va executa numai n caz de cutare reuit
mysql_close();
?>
69
Pentru MySQL (inclus n pachetul WAMP5), dup cum s-a mai precizat, user-ul
implicit existent la instalare este root, fr parol.
- Al patrulea parametru este de tip logic, avnd rolul de a indica motorului
PHP c, n cazul n care exist deja o conexiune la acelai server MySQL, s creeze o
nou conexiune n loc s o reutilizeze pe cea existent;
- Ultimul parametru este de tip ntreg i reprezint proprietile pe care le va
avea conexiunea (spre exemplu, dac se folosete compresia datelor).
Funcia mysql_connect returneaz (n cazul n care conectarea a reuit) un
identificator resurs de acces aferent conexiunii cu server-ul MySQL. Funcia este
absolut necesar a fi folosit naintea oricrei alte funcii opernd cu MySQL,
asigurnd practic realizarea conexiunii/legturii cu serverul de baze de date.
Funcia mysql_select_db selectez/deschide o baz de date aferent
serverului MySQL cu care s-a fcut conexiunea, fiind absolut necesar pentru
interogrile/comenzile SQL care vor urma. Funcia are doi parametri: primul
(obligatoriu), este de tip ir de caractere i reprezint numele bazei de date pe care
se va opera, iar cel de-al doilea parametru (opional) reprezint identificatorul de
acces la conexiunea cu serverul MySQL. Dac acesta nu este specificat explicit, se
consider conexiunea curent existent cu serverul MySQL. Funcia returneaz
valoarea logic TRUE n cazul n care s-a reuit selectarea bazei de date, respectiv
valoarea logica FALSE n caz contrar (baz de date nu exist, utilizatorul nu are
drepturi de acces la aceasta etc.).
Funcia mysql_query este cea prin care se asigur interaciunea efectiv cu
elementele (datele) bazei de date, permind operaiile SQL uzuale (interogare,
adugare, tergere, modificare etc). Funcia are doi parametri:
- Primul parametru este de tip ir de caractere i reprezint cererea
(comanda SQL) trimis spre execuie server-ului MySQL (n exemplul de fa, o
comand SELECT pe o tabel);
- Al doilea parametru reprezint identificatorul de acces al conexiuni cu
serverul MySQL. n cazul n care acesta lipsete se ia n considerare conexiunea
curent;
n exemplul anterior, cutarea n tabel s-a fcut dup o valoare bine
precizat: "select * from table1 where nume=ion". Exist ns situaii n care nu
se cunoate exact valoarea cheii de cutare, n acest caz, o alternativ constituind-o
folosirea operatorul like. Acesta, mpreun cu wildcard-ul % permit realizarea
unei interogri dup o masc aproximativ (ceva ce seamn cu cheia de cutare).
Spre exemplu, dac se dorete afiarea tuturor persoanelor a cror nume ncepe cu
ion, se poate folosi comanda "select * from table1 where nume like ion%". n
cazul n care se cere afiarea tuturor persoanelor a cror vrst se termin cu cifra
9, comanda select va arta n felul urmtor: "select * from table1 where varsta like
%9"
Observaie: Evident, comanda SELECT poate fi i o interogare pe mai multe tabele
(jonciuni de tabele), spre exemplu: select tabela1.col11, tabela1.col.12,
tabela2.col21, tabela2.col22 from tabela1, tabela2 where tabela1.col.12 =
tabela2.col21
Bucla
while($row=mysql_fetch_row($query)),
utiliznd
funcia
mysql_fetch_row, poate fi interpretat astfel: att timp ct este gsit o linie
(coninutul fiecrei linii gsite fiind returnat succesiv de funcia mysql_fetch_row
n variabila array $row) execut.
Funcia mysql_fetch_row va umple succesiv un ir ($row) cu datele unei
linii returnate de interogare. Aceste date sunt prelucrate succesiv (de regul afiate
ntr-un tabel pe ecran), ncepnd cu prima linie, apoi se trece la a doua (coninutul
70
PHP - 2
irului $row fiind astfel suprascris succesiv) i aa mai departe. Practic, bucla while()
cicleaz dup numrul de articole/linii gsite i returnate n urma interogrii.
Dup cum s-a mai precizat, PHP-ul ofer o multitudine de funcii alternative
pentru extragerea datelor aferente liniilor returnate de interogare. n exemplificarea
curent s-a folosit mysql_fetch_row, dar se puteau folosi (n cadrul condiiei
buclei while) i urmtoarele variante alternative:
$row = mysql_fetch_array($query), cele 3 elemente ale arrayului $row putnd fi referite direct $row[0], $row[1], $row[2], ceea ce ar
conduce probabil la un cod mai optimizat.
$row = mysql_fetch_assoc($query), genernd un ir cu
elementele $row[nume], $row[varsta], $row[localitate], referite cu nume
asociate coloanelor interogrii (n cazul de fa, chiar numele coloanelor tabelei).
$row = mysql_fetch_object($query), elementele irului returnat
putnd fi referite ca: $row->nume, $row->varsta, $row->localitate.
Dac numrul de linii returnate de interogare este constant, cunoscut
aprioric, funcia de extragere a datelor mysql_fetch_row poate fi referit explicit
de cte ori este nevoie, fr a se mai face apel la o structur de ciclare, gen while.
Este cazul unei cutri dup o cheie primar, numrul de linii gsite putnd fi 1 sau
0. n acest caz, comanda de extragere trebuie referit o singur dat, returnnd fie
un array aferent linie gsite, fie FALSE dac nu a gsit nici o linie.
Linia print(<table align=center BORDER="2">); trimite spre ecran un
ir HTML pentru crearea unui tabel n care vor fi afiate datele gsite. Deci tag-ul
<table> definete un tabel de afiare, tag-ul <tr> se refer la construcia unei linii
din tabel, <th> la o linie-header (cap de tabel), <td> la o coloan, toate fiind
elemente HTML care permit construcia unui format tabelat de afiare pe ecran.
Observaie: Comanda print are un efect similar cu al comenzii echo (afiare
neformatat a unui string). Pentru afiarea unor string-uri care includ variabile, se
poate folosi i o comanda de afiare formatat printf (dispunnd de civa
parametri speciali pentru formatarea coninutului variabilelor integrate n string-ul
de afiat: %s, %d, %f). Un scurt exemplu de utilizare al acesteia este prezentat n
continuare:
$var="string";
printf("Afisare: %s\n", $var);
//Afiare: string
$var=10.1234;
printf("Afisare intreg: %d", $var);
//Afiare intreg: 10
printf("Afisare float: %f", $var);
//Afisare float: 10.123400
printf(Afisare float: %.2f , $var);
//Afisare float: 10.12
Comanda foreach ($row as $value) este practic o bucl intern buclei
while(), ciclnd n cadrul fiecrui articol/linie dup numrul de elemente ale
articolului/liniei. Pentru fiecare articol succesiv gsit (in ciclul while()), comanda
foreach() ca i bucl, extrage succesiv din irul $row cte un element i-l trimite
spre variabila $value (care la un moment dat conine o valoare a unui articol
corespunztoare unui anumit cmp, deci practic valoarea unei celule).
Afiarea pe ecran (n celulele tabelului de afiare construit) a coninutului
variabilei $value (echo "<td >$value</td>";), nseamn practic afiarea element
cu element a coninutului fiecrui articol gsit, n celule succesiv create. Prin
incrementarea variabile $nr_val, aceasta va conine numrul total de elemente (spre
exemplu dac numrul de articole gsite este 3 (bucla while() se va executa de 3
71
72
PHP - 2
echo"</center>";
}
mysql_close();
?>
Aceasta variant reprezint o optimizare din punct de vedere al operrii pe
partea de interpretor PHP (practic pseudo-clientul aplicaiei Web), ntruct pentru a
calcula numrul de nregistrri obinute n urma interogrii se folosete funcia
mysql_num_rows, pasndu-se aceast sarcin serverului MySQL (care primete
astfel o solicitare n plus). Aceasta funcie returneaz numrul de linii obinute n
urma executrii unei comenzi SQL SELECT. Semnul @ (care apare n faa funciei
mysql_num_rows) are rolul de a suprima afiarea pe ecran a unor eventuale
warning-urilor (mesaje de avertisment) care pot aprea n timpul execuiei unor
comenzi.
n cele dou versiuni ale aplicaiei anterior prezentate, capul de tabel pentru
afiarea informaiilor din tabela bazei de date s-a realizat n mod manual,
presupunndu-se cunoscute numele coloanelor i numrul lor.
PHP-ul dispune de funcii prin care se pot obine informaii asupra structurii unei
tabele, informaii care pot fi utilizate pentru realizarea automat a unui cap de
tabel pentru afiare (coloanele lui fiind practic cmpuri ale tabelei bazei de date).
n continuare, sunt enumerate cteva dintre aceste funcii:
-mysql_list_fields() ofer informaii asupra structurii unei anumite tabele,
returnnd ca rezultat un identificator, care poate fi folosit de ctre urmtoarele
funcii, cu semnificaiile aferent precizate :
-mysql_field_name()- returneaz succesiv numele coloanelor tabelei;
-mysql_field_len() - returneaz succesiv lungimea coloanelor tabelei;
-mysql_field_type()- returneaz succesiv tipul coloanelor tabelei;
-mysql_num_fields() - returneaz numrul coloanelor tabelei.
Urmtorul exemplu comentat este destul de edificator asupra modului de
utilizare a acestor funcii, fr a mai fi necesar o prezentare a sintaxei lor de baz:
<?php
//Conectare la serverul MySQL
$link = mysql_connect(localhost, root, parola);
// Informaii asupra structurii unei anumite tabele dintr-o baz de date
$fields = mysql_list_fields("persoane", "table1",$link);
// Numrare coloane ale tabelei referite
$columns = mysql_num_fields($fields);
// Pentru fiecare coloan, afieaz numele, tipul i lungimea ei pe rnd nou
for ($i = 0; $i < $columns; $i++){
echo mysql_field_name($fields, $i);
echo mysql_field_type($fields, $i);
echo mysql_field_len($fields, $i);
echo <br>;
}
?>
Efectul rulrii scriptului anterior const n afiarea, pe coloan, a numelui,
tipului i lungimii fiecrui cmp al unei anumite tabele a unei baze de date MySQL,
tabel referit printr-un identificator ($fields) n funciile specializate folosite.
Observaie: Fiecare din funciile returnnd numele, tipul i lungimea unei coloane a
tabelei are ca argumente un identificator de pointare la tabel ($fields), respectiv un
73
74
PHP - 2
75
76
PHP - 2
77
78
PHP - 2
79
22 4 ,
23 8
n
la 2 ).
80
PHP - 2
81
82
PHP - 2
83
84
PHP - 2
<strong>Varsta:</strong>
 
<input type="text" name="varsta" size="4" ><br>
<strong>Localitate:</strong>  
<input type="text" name="localitate" size="10" ><br>
<center>
<input type="SUBMIT" value="Adauga" >
<input type="RESET" value="Reset" >
</center>
</td>
</table>
</form>
</html>
Acest fiier HTML permite (n cazul de fa) transmiterea valorilor a patru
parametrii (nr, nume, varsta, localitate - cu valori introduse de la tastatur) afereni
datelor necesare construciei unei noi linii care va fi adugat n tabela bazei de date
(s-a presupus existena unei tabele similare cu cea folosit n exemplele anterioare,
dar avnd n plus cmpul NR, cu valori unice pentru fiecare articol, deci definit ca
PRIMARY KEY).
Scriptul PHP spre care sunt transmise valorile parametrilor i care va realiza
adugarea propriu-zis n tabela bazei de date are urmtorul cod:
<?php mysql_connect("localhost","root","parola") or die ("Nu se poate conecta la
serverul MySQL");
mysql_select_db("persoane") or die("Nu se poate selecta baza de date");
$nr=$_POST[nr];
$nume=$_POST[nume];
$varsta=$_POST[varsta];
$localitate=$_POST[localitate];
// adugare parametrizat
$query=mysql_query("insert into table1
values($nr,$nume,$varsta,$localitate)");
echo "Inserare reusita!!!";
// selectarea i afiarea doar a nregistrrii/liniei nou adugate
$query=mysql_query("select * from table1 where nr=$nr");
//calculeaz nr. de nregistrri returnate prin interogare
$nr_inreg=@mysql_num_rows($query);
if ($nr_inreg>0){
echo "<center>";
echo "S-au gasit " . $nr_inreg . " inregistrari";
echo"</center>";
85
86
PHP - 2
vizibil pe ecran, mai precis nu va returna eventuale date care ar putea fi afiate, cel
mult aprnd un mesaj de eroare dac operaia de adugare nu poate fi executat.
Observaie: n locul unei comenzi mysql_query("SELECT) compacte, se poate scrie
echivalent:
//string de interogare memorat ntr-o variabil
$com= select * from table1;
$query=mysql_query($com);
//interogare
Soluia este recomandat mai ales n cazul construciei dinamice a string-ului
de interogare, permind o eventual afiare i inspectare vizual a acestuia.
<html>
<title>Stergere</title>
<center> <head><H1>Stergere</H1></head></center>
<form method="POST" action="http://localhost/ex4.php">
<table border=20 bordercolor="red" align=center BGCOLOR="Gold">
<td>
Nume:<input type="text" name="nume" size="10" ><br>
<center>
<input type="SUBMIT" value="Sterge" >
<input type="RESET" value="Anulare" >
</center>
87
</td>
</table>
</form>
</html>
Fiierul PHP pentru interogarea prealabil tergerii (cu rolul: gsete i
vizualizeaz ce se dorete a fi ters), este prezentat n continuare (acest fiier
primind ca parametru de intrare valoarea pasat spre el de ctre scriptul HTML
anterior):
<?php
mysql_connect("localhost","root","parola") or die ("Nu se poate conecta la serverul
MySQL");
mysql_select_db("persoane") or die("Nu se poate selecta baza de date");
// transfer valoare parametru ntr-o variabil intern
$nume=$_POST[nume];
// cutare dup cmpul nume a nregistrrilor care vor fi terse
$query=mysql_query("select * from table1 where nume=$nume");
//calculeaz nr. de nregistrri returnate prin interogare
$nr_inreg=@mysql_num_rows($query);
if ($nr_inreg>0){
echo "<center>";
echo "S-au gasit " . $nr_inreg . " inregistrari";
echo"</center>";
// creare tabel pentru afiare rezultate
echo "<table border=2 align=center>";
//numrare cmpuri
$coln=mysql_num_fields($query);
echo"<tr bgcolor=silver>";
// realizare automat a capului de tabel (coninnd toate cmpurile)
for ($i=0; $i<$coln; $i++){
//numele cmpurilor ca i cap de tabel
$var=mysql_field_name($query,$i);
echo "<th> $var </th>";
}
echo"</tr>";
// extragere informaii i afiare
while (list ($nr,$nume,$varsta,$localitate) =
mysql_fetch_row($query)){
print (" <tr>\n".
" <td>$nr</td>\n".
" <td>$nume</td>\n".
" <td>$varsta</td>\n".
" <td>$localitate</td>\n".
" </tr>\n");
}
echo"</table>";
// Apelarea scriptului de tergere efectiv/anulare (cu transmitere mai
88
PHP - 2
89
urmtoarea (PHP trimind practic spre ecran un script HTML folosind comanda
echo) :
echo <form method="POST" action="http://localhost/ex44.php">;
echo <input type="hidden" name="nume1" value= .$_POST[nume]. >;
echo <input type="SUBMIT" value="Stergere efectiva!
" >;
echo <br>;
echo </form>;
Secvena de cod prezentat, transmite valoarea parametrului de interogare,
memorat n variabila $nume (utilizat aici pentru o simpl afiare cu SELECT), spre
un alt parametru (nume1) care va fi pasat spre fiierul PHP de tergere efectiv. Se
remarc n acest caz, tipul type="hidden" utilizat pentru caseta de transfer a
parametrului, care face aceast caset invizibil pentru utilizator.
Fiierul pentru tergere efectiv are n acest caz o structur extrem de
simpl:
<?php
mysql_connect("localhost","root","parola") or die ("Nu se poate conecta la serverul
MySQL");
mysql_select_db("persoane") or die("Nu se poate selecta baza de date");
$nume1=$_POST[nume1] or die("Comanda esuata!");
// tergere efectiv
$query =mysql_query("DELETE FROM table1 where nume=$nume1");
echo "OK, am sters.";
mysql_close ();
?>
90
PHP - 2
91
92
PHP - 2
Spre exemplu, n cazul de fa (vezi fig. 2.14) s-a gsit un singur articol cu
4 elemente, acestea memorndu-se ntr-un ir avnd 4 elemente (cu indicii 1,2,3 i
4, deoarece contorul $nr_val a fost iniializat pe 0, dar este incrementat nainte de
folosirea lui ca indice al unui element al irului $sir).
n al doilea rnd, este utilizat secvena urmtoare:
echo <form method="POST" action="http://localhost/ex55.php">;
// Transfer (ascuns) spre script a parametrilor de cutare
echo <input type="hidden" name="nume2" value=.$sir[2].>;
echo <input type="hidden" name="varsta2" value=.$sir[3].>;
// Transfer spre script ca parametrii a datelor care pot fi modificate
echo <input type="text" name="nr1"
value=.$sir[1].>;
echo <input type="text" name="nume1" value=.$sir[2].>;
echo <input type="text" name="varsta1" value=.$sir[3].>;
echo <input type="text" name="localitate1" value=.$sir[4].>;
echo <input type="SUBMIT" value="Modifica!" >;
echo <br>;
echo </form>;
Primele tag-uri <INPUT type=hidden permit transferul spre fiierul script
PHP care realizeaz modificarea efectiv a parametrilor iniiali de interogare
(memorai n primele dou elemente ale array-ului $sir), acest lucru fiind necesar
deoarece aceti parametrii pot fi alterai n urma unei eventuale modificri permise
n continuare, dup cum se va vedea.
Urmtoarele 4 tag-uri <INPUT type=text permit afiarea (n casete care
permit att operaii de citire ct i de scriere) i alterarea (modificarea) acestor
patru parametrii, care vor substitui informaia existent n cmpurile articolului
localizat (cu parametrii transmii din primele dou INPUT-uri invizibile utilizatorului).
Cu alte cuvinte, aceast secvena transfer spre script-ul PHP de modificare efectiv
ase parametrii:
93
94
PHP - 2
95
96
PHP - 2
97
Esenial n acest caz este linia prin care este setat specificaia MIME
(Multipurpose Internet Mail Extension) pentru afiarea unei imagine JPG. Aceasta
nsemn c orice ieire spre browser, va fi interpretat ca i coninut al unei imagini
jpg, i afiat corespunztor. Dup o astfel de setare, realizat la nceputul
scriptului, nu este permis nici o alt ieire (de un alt tip) spre afiare la browser.
Exemplul prezentat presupune existena unui cmp imagine de tip BLOB (sau
LONGBLOB), ntr-o tabel referit n program.
Afiarea imaginii extrase din baza de date, se face printr-o simpl directare
spre browser a coninutului variabilei (print), n care este salvat (n format binary)
imaginea propriu-zis.
n cazul (cel mai probabil) al unei interogri cu parametri, linia de interogare
se modific astfel:
$query="select imagine from tabela2 where id=$id";
unde, $id este parametrul dup care se face interogarea, iar id este un cmp
identificator din tabel.
n cazul de fa, valoarea parametrului $id se transmite, fie printr-un
formular FORM, fie direct din linia de comand a browser-ului, printr-un apel cu
parametru, de forma (spre exemplu, pentru o cale dat i un nume al fiierului
script PHP imag1.php):
http://localhost/imag1.php?id=1;
Observaie: Pentru a putea extrage date dintr-o coloan de tip BLOB, aceasta
trebuie umplut anterior cu date binare. n MySQL inserarea de date BLOB ntr-o
linie nou se poate face fie direct printr-o comand INSERT implicnd utilizarea
funciei speciale MySQL LOAD_FILE, fie printr-o comand iniial INSERT care creaz
linia nou, eventual cu date pentru celelalte coloane (mai puin cea de tip BLOB),
urmat de o comand UPDATE setnd strict coloana BLOB (folosind de asemenea
funcia special MySQL LOAD_FILE). Pentru cazul de fa, cele dou cazuri
rezolvnd problema adugrii unei linii noi coninnd informaie BLOB (o imagine) n
coloana imag a unei tabele tabela2 sunt punctate n continuare:
INSERT into tabela2 values(1, LOAD_FILE ("c:\\poza.jpg"));
sau
INSERT into tabela2 (id) values(1);
UPDATE tabela2 SET imag=LOAD_FILE("c:\\poza.jpg") where id=1;
Un al doilea exemplu script PHP, folosete un fiier imagine intermediar
(temp1.jpg) n care este extras coninutul binar al cmpului BLOB:
<?php
$query="select imagine from tabela2 where id=2";
mysql_connect("localhost", "root", "parola") or die ("nu gsesc serverul MySQL");
mysql_select_db ("ioji") or die ("Nu gsesc baza");
$result = mysql_query($query);
// Verific dac gsete o astfel de nregistrare
if (mysql_num_rows()>0)
{
// mysql_num_rows() returneaz nr. de nregistrri gsite;
$var=mysql_fetch_row($result);
$var1=$var[0];
// Deschide un fiier pentru scriere n el
$fp=fopen("temp1.jpg","wb");
// Scrie n fiier
98
PHP - 2
fwrite($fp,$var1);
fclose($fp);
// Afieaz coninutul fiierului ca imagine
echo <image src="temp1.jpg">;
}
// Dac nu gsete nimic, terge fiierul
else {
unlink("TEMP1.JPG");
// sau delete("TEMP1.JPG");
} ?>
n acest exemplu, se verific totodat existena unei nregistrri care
corespunde interogrii realizate (structura if). Dac se gsete o astfel de
nregistrare, se salveaz coninutul cmpului BLOB ntr-un fiier (cu extensia jpg), i
se afieaz practic imaginea stocat de acest fiier. Pentru o nou interogare
reuit, acest fiier va fi suprascris. n caz de interogare nereuit, fiierul
intermediar va fi ters (pentru a nu se afia ultima imagine gsit).
Verificarea gsirii unei nregistrri care corespunde condiiei de interogare,
este asigurat de funcia: mysql_num_rows(). Aceast funcie returneaz numrul
de linii gsite de o comand SQL SELECT.
Observaie: Asupra lucrului cu fiiere n PHP se va reveni ntr-un paragraf ulterior.
Numrul funciilor PHP pentru lucrul cu baze de date MySQL este mult mai
mare. Prin exemplele prezentate i prin funciile specifice exemplificate, s-a dorit
doar o simpl introducere n problematica lucrului cu astfel de baze de date. Pentru
mai multe detalii, resursele bibliografice n domeniu sunt mai mult dect suficiente,
n special cele oferite pe Internet.
99
Pentru exemplificare, fie o tabel TESTUL, avnd 3 coloane de tip INT (c1,
c2, c3). Se consider o procedur stocat (numite TESTUL1), care adaug
parametrizat o linie nou n tabel (completnd cu date doar coloanele c1 i c2),
apoi pentru linia nou introdus calculeaz o valoare pentru coloana c3. La crearea
procedurii stocate, deoarece n MySQL caracterul ; (punct i virgul) semnific
ncheiere unei linii de cod (delimitator de linie), un alt caracter sau secven de
caractere trebuie definit i utilizat pentru marcarea sfritului definiiei procedurii
stocate (urmnd ca apoi s se revin la caracterul consacrat ;). Corpul procedurii
astfel create (inclusiv comanda de tergere prealabil a ei dac deja exist,
respectiv definiiile delimitatorilor necesari // i ;) este urmtorul
Drop procedure test1;
Delimiter //
Create procedure test1 (param1 int, param2 int)
Begin
Insert into testul1 (c1,c2) values(param1, param2);
Update testul1 set c3=c1+c2 where c1=param1;
End;
//
Delimiter;
Un apel al procedurii stocate (din cadrul clientului textual MySQL console),
urmat de o afiare a tabelei pentru a verifica efectul ei, este prezentat n continuare:
Call test1(101,101);
Select * from testul1;
Pentru apelul din PHP al procedurii stocate (scriptul Web jucnd rolul clientul
apelant) se poate folosi secvena urmtoare de cod (presupunnd o conexiune
valid):
$var=100;
mysql_query("call test1($var,101)") or die("Procedura esuata!");
echo ("Procedura executata!");
Observaie: O soluie simpl i comoda pentru a nu mai scrie explicit i repetat
pentru fiecare pagin script a unei aplicatii Web a setului de comenzi de conectare la
serverul de baze de date, respectiv selecie a bazei de date, o constituie crearea
unui script distinct de conectare, respectiv utilizarea comenzii PHP include() referind
acest script de conectare. Fie scriptul de conectare conectare.php:
<?php $server=localhost;
$user=root;
$passw=parola;
$db=baza;
$con=mysql_connect ("$server", "$user", "$passw") or die ("Error connecting to
mysql");
$dbf=mysql_select_db($db) or die ("Error connecting to DB"); ?>
n fiecare script al aplicaiei (site-ului) Web care necesit o conectare la
serverul MySQL, nainte de realizarea unor operaii SQL efective de interogare, se
insereaz linia urmtoare (asigurnd conectarea la serverul de baze de date):
include("conectare.php ");
100 PHP - 2
injection const ntr-o integrare (interactiv, prin datele de intrare) a unor poriuni
suplimentare de cod SQL care permit o ataare la interogrile SQL a unor condiii
permanent ndeplinite, anulnd astfel filtrele condiionale de securizare. [20] Astfel,
anumite combinaii de condiii ataate string-ului SQL de interogare pot s conduc
la o nou comand SQL valid, care anuleaz toate restriciile viznd accesul la
date, sau chiar conduc la crearea i trimiterea spre serverul de baze de date a unor
comenzi SQL cu cert potenial distructiv. Ideea de baz a acestei tehnici const n
faptul c, n cadrul codului script, pe baza datelor de intrare (INPUT), pot fi create
string-uri de comenzi SQL cu rol nedorit, maliios, pasate spre serverul de baze de
date i executate necondiionat de acesta. Aceste secvene ataate codului SQL
generat prin concatenri de string-uri, anuleaz condiiile de filtrare ale comenzii i
transform comanda SQL ntr-o nou comand, avnd o cu totul alt aciune dect
cea dorit.
Din fericire, la ora actual interpretoarele PHP de versiuni recente sunt
setate (prin intermediul unor valori adecvate ale variabilelor interne de stare din
fiierul de configurare php.ini) astfel nct s resping din start aceste atacuri,
interpretnd anumite forme de string-uri ca secvene maliioase i genernd.
secvene SQL adecvate, anulndu-le astfel potenialul distructiv.
Unul dintre principiile de baz ale unei injectri SQL poate fi descris succint
de urmtorul mod de construcie al string-ului de interogare:
String_interogare=comand_SQL_cu_conditii_logice. OR
secventa_conditionala malitioasa, ultima secven condiional introdus de la
tastatur fiind tot timpul adevrat (iar condiia logic OR face ca ntreaga secven
condiional s fie ndeplinit).
Pentru o nelegere a acestui tip de atac, se considera o exemplificare
concret. Fie tabelul TEST (MySQL) cu structura i datele descrise n figura 2.17.
De asemenea, se consider o aplicaie WEB care permite interogarea dup
coloanele CNP i NUME, permind afiarea linie corespunztoare datelor introduse,
interesnd afiarea informaiei aferente coloanei PIN_SECRET. Aplicaia necesit un
formular HTML pentru introducerea datelor de interogare (CNP i NUME), respectiv
un script PHP de interogare efectiv:
- Formular introducere date interogare:
<form action="temp2.php" method="POST">
CNP---><input name="param1" size=13> <br>
Nume--><input name="param2" size=13> <br>
<input type="Submit" Value="Cauta!"></form>
- Script interogare (PHP):
<?php
$query1=mysql_connect(localhost,root,);
mysql_select_db(test);
$param1=$_POST[param1];
$param2=$_POST[param2];
$query = "SELECT * FROM test WHERE cnp=$param1 and
nume=$param2";
echo $query;
$interoghez=mysql_query($query);
print(<table align=center BORDER="2">);
print ("<tr>");
echo <th BGCOLOR="Silver">ID</th>;
102 PHP - 2
104 PHP - 2
105
106 PHP - 2
Pe baza exemplului anterior, analiznd functiile specifice (OCILogon,
OCIParse, OCIExecute, OCIFetch, OCIResult, OCIFreeStatement, OCILogoff), se pot
remarca cteva deosebiri fa de cazul operrii cu MySQL. Totui, mai exist un set
de funcii (destinate Oracle) a cror sintax, respectiv funcionalitate, este foarte de
apropiat de cea a setului folosit pentru MySQL, facnd extrem de facil
transpunerea unui script opernd cu MySQL ntr-un script opernd cu Oracle. Se
consider urmtorul exemplu n acest sens:
<?php
$connection = OCI_connect("student", "student","orcl");
$stmt = OCI_Parse($connection, "SELECT * FROM angajati");
OCI_Execute($stmt);
echo "<table border=4 align=center>";
echo "<tr>";
echo "<th>ID</th>";
echo "<th>NUME</th>";
echo "<th>SALAR</th>";
echo "</tr>";
while($row=OCI_Fetch_row($stmt))
{
print (" <tr>\n".
" <td>$row[0]</td>\n".
" <td>$row[1]</td>\n".
" <td>$row[2]</td>\n".
" </tr>\n");
}
OCI_Free_Statement($stmt);
OCI_close($connection);
?>
Se pot remarca similitudinile sintactice i funcionale ale noilor funcii
utilizate, comparativ cu cele destinate MySQL-ului, aa cum este prezentat
comparativ i n tabelul 2.2:
Tabel 2.2.
Oracle
OCI_Connect
MySQL
MySQL_Connect
OCI_Parse + OCI_Execute
OCI_Fetch_Row,
OCI_Fetch_Array,
OCI_Fetch_Assoc,
OCI_Fetch_Object
Oci _Num_Rows
OCI_Close
MySQL_Query
MySQL _Fetch_Row,
MySQL_Fetch_Array,
MySQL_Fetch_Assoc,
MySQL_Fetch_Object
MySQL _Affected_Rows
MySQL_Close
107
108 PHP - 2
- dac toate cele trei comenzi se ncheie cu succes (deci nu se execut nici o
comand die care conduce la ieirea din script i implicit, prin folosirea parametrului
OCI_NO_AUTO_COMMIT, la invalidarea oricrei modificri n baza de date), prin
comanda de finalizare a tranzaciei OCI_COMMIT noile date sunt salvate n baza de
date (COMMIT pe toate comenzile);
- dac una dintre comenzi eueaz (chiar dac altele anterioare au reuit), o
comand die de prsire a scriptului este executat (ne mai ajungndu-se la
execuia comenzii OCI_COMMIT) i toate eventualele modificri ale bazei de date
efectuate prin apelul scriptului sunt anulate (ROLLBACK pe toate comenzile).
Utilizarea uneia sau alteia dintre soluiile propuse rmne la latitudinea
programatorului.
109
"SELECT
FROM
angajati
where
while(OCIFetch($stmt)) {
$id= OCIResult($stmt, "ID");
$nume= OCIResult($stmt, "NUME");
$salar= OCIResult($stmt, "SALAR");
print (" <tr>\n".
" <td>$id</td>\n".
" <td>$nume</td>\n".
" <td>$salar</td>\n".
" </tr>\n");
}
?>
</table>
<?php
OCIFreeStatement($stmt);
OCILogoff($connection);
}
?>
n cadrul script-ului de mai sus se putea utiliza, ca i variant alternativ, o
structur if-else-end if de forma urmtoare, oarecum similar cu cea anterioar:
<?php if ( condiie ): ?>
cod HTML i/sau PHP (ncuibat, ncadrat n delimitatori)
<?php else: ?>
cod HTML i/sau PHP (ncuibat, ncadrat n delimitatori)
<?php endif; ?>
110 PHP - 2
111
112 PHP - 2
print(<table BORDER="1" align=center >);
$coln=ibase_num_fields($query);
print (" <tr>\n");
//nr. de cimpuri
2.7. Grafic
PHP-ul dispune un set de funcii extrem de puternice pentru crearea i
manipularea elementelor de grafic i a imaginilor, oferind astfel utilizatorului
faciliti deosebite i n domeniul graficii (2d).
Realizarea unor aplicaii grafice cu PHP implic utilizarea unor biblioteci
suplimentare (fiiere .dll). [1][20] Astfel, n cazul de fa, s-a utilizat biblioteca
PHP_GD2.DLL configurnd corespunztor fiierul php.ini (extension= php_gd2.dll).
De regul, formatul imaginilor manipulate (jpg, gif, png etc) depinde de versiunea
bibliotecii grafice suplimentar utilizate
n cele ce urmeaz, fr a detalia toate cele cteva zeci de funcii dedicate
crerii i manipulrii imaginilor, respectiv a elementelor specifice graficii, se va
realiza o trecere n revist a doar ctorva dintre ele, prin exemplificarea a dou
aplicaii.
O prim aplicaie face apel la cteva funcii privind crearea /manipularea
unei imagini .jpg. Codul complet este prezentat n continuare, iar efectul rulrii
acestui script este descris n figura 2.23 [1]:
<?php
// Anterior: setare ca fiier extensie activ (n php.ini): php_gd.dll
// Creare imagine nou
$im = ImageCreate (500, 100) or die (Cannot Initialize new GD image stream);
// deschiderea unei imagini existente
//
$im = ImageCreateFromJPEG(leopard.jpg)
//
or die (Cannot Initialize new GD image stream);
// linia urmtoare nu-i are sensul pentru o imagine surs dat
$background_color=ImageColorAllocate($im,1,255,25);
$text_color = ImageColorAllocate ($im, 230, 14, 191);
//ImageString dimensiunea scrisului,- poziia pe orizontal (pixeli),
poziia
//pe vertical (pixeli)
ImageString($im,10,100,35, A Simple Text String, $text_color);
// Salvare imagine prelucrat sau creat i afiare
ImageJpeg ($im,tinta.jpg);
echo <img src=tinta.jpg >;
114 PHP - 2
// Creare unei FUNCII care va fi apelat
function LoadJpeg($imagine, $text)
{
$im1 = ImageCreateFromJPEG($imagine)
or die (Cannot Initialize new GD image stream);
$text_color = ImageColorAllocate ($im1, 23, 14, 191);
ImageString ($im1, 10, 10, 35, $text, $text_color);
ImageJpeg ($im1,a.jpg);
echo <img src=a.jpg >;
}
// Apel funcie
LoadJpeg(leopard.jpg,Ceva de afisat);
?>
2.7. Grafica
115
116 PHP - 2
- calculul funcie i afiarea prin linii succesive (For, ImageLine);
- salvare i afiare imagine grafic (ImageJpeg, <img>).
2.7. Grafica
117
118 PHP - 2
// Scrie n fiier (suprascriere) sau fputs($theFile, $hits);
$a=fwrite($fp,$hits,26);
echo <p> Sunteti vizitatorul cu numarul ;
echo $hits; ?>
Aplicaia ncepe prin precizarea unui nume pentru fiierul (de tip text) care
va memora contorul de accese (practic un numr ntreg, incrementat dup fiecare
acces). n exemplul de fa, numele ales pentru acest fiier este counter.nr
($filename=counter.nr;).
n cazul n care localizarea fiierului nu este implicit n directorul curent,
este necesar precizarea cii complete de localizare a fiierului. Spre exemplu:
$filename=http://localhost/scripts/test/counter.nr;
//sau
$filename =c:\\text\\counter.nr;
Urmeaz apoi deschiderea pentru citire a acestui fiier, utiliznd funcia
fopen(). Fiierul trebuie s fie creat anterior, n caz contrar (adic fiierul nu exist)
operaia terminndu-se printr-un avertisment (warning). Deja s-a fcut apel la o
prim funcie de lucru cu fiiere, cu sintaxa uzual:
int fopen (string filename, string mode);
Funcia returneaz un identificator de tip ntreg. Primul parametru al funciei
este un string reprezentnd numele fiierului care va fi deschis (putnd include i
calea spre acesta), iar al doilea parametru reprezint modul n care se face
deschiderea fiierului, putnd lua urmtoarele valori prezentate n tabelul urmtor:
Tabel 2.3.
r
r+
w
w+
a
a+
119
unde primul parametru reprezint identificatorul fiierului din care se citete, iar al
doilea parametru -numrul de bytes citii. n cazul de fa, numrul 26 s-a ales pur
aleator. Se observ c funcia returneaz chiar string-ul pe care l citete.
Se realizeaz apoi o incrementare a contorului (mai precis a coninutului
variabilei n care s-a memorat contorul citit din fiier). De remarcat modul n care se
foreaz la tip ntreg coninutul variabilei ((int)$hits)), operaie care permite
startarea procesului de contorizare fr ca n fiierul creat s existe o valoare iniial
(zero). Dac se dorete o forare la tipul float, se utilizeaz o construcie de forma
(float)$variabila.
Urmeaz nchiderea fiierului: fclose($fp)(acesta fiind deschis iniial doar
pentru citire). n acest moment se dispune (ntr-o variabil) de numrul de accesri
ale paginii curente. Ceea ce mai rmne de fcut este o actualizare a contorului i n
fiierul n care acesta este pstrat i eventual, o afiare a acestuia pe ecran. Pentru
aceasta, este necesar o redeschidere a fiierului, dar de data asta, pentru o
operaie de scriere (mai precis, o operaie de suprascriere):
$fp = fopen($filename,w);
Se scrie variabila contor actualizat n fiier, utiliznd funcia fwrite() cu
sintaxa urmtoare:
int fwrite (int fp, string string [,int length])
Primul parametru al funciei reprezint identificatorul fiierului n care se va
face scrierea, al doilea parametru irul de caractere scris, iar ultimul parametru
(opional) numrul de bytes scrii (dac acest numr este mai mare dect lungimea
string-ului de scris, scrierea se oprete cnd se ajunge la finalul string-ului, caz
implicit n lipsa parametrului opional). n locul funciei fwrite() se putea folosi
funcia fputs(), cu aceeai parametrii i cu o aciune identic. n finalul scriptului s-a
fcut i o afiare pe ecran a numrului de accese la pagina curent.
n exemplul prezentat s-a realizat o suprascriere a coninutului fiierului la
fiecare accesare a scriptului. Secvena urmtoare prezint o operaie de adugare a
unui text ntr-un fiier, pe un rnd nou (simbolul \n), rndurile fiind separate ntre
ele printr-o linie liber:
// deschidere pentru scriere (adugare)
$fp = fopen($filename1,a+);
// adugare cu cte un rnd gol
fwrite($fp,\n adaugat\n,20);
O situaie des ntlnit este cea n care sunt generate fiiere n format PDF
(fig.2.25), ca alternativ pentru stocarea i/sau tiprirea n formate predefinite a
unor date.
Crearea unui fiier PDF implic utilizarea bibliotecii extensie php_pdf.dll,
acesta trebuind a fi activat (prin setarea corespunztoare n fiierul php.ini). [20]
Exist i alte soluii n acest sens, implicnd utilizarea altor biblioteci externe, chiar
mai performante, dar cea bazat pe extensia implicit oferit de PHP, fiind i cea mai
la ndemn, este considerat n continuare pentru o scurt exemplificare. Codul
urmtor (cu comentariile corespunztoare explicrii comenzilor folosite i aciunilor
efectuate) prezint modul n care se creeaz un document PDF avnd dou pagini
(soluia putnd fi generalizat pentru oricte pagini). Sunt punctate, prin
comentariile aferente, cteva elemente de baz viznd setarea paginii, poziionarea
informaiei n pagin, formatarea textului, grafic, inserarea de imagini:
120 PHP - 2
<?php
// creare identificator fiier
$mypdf = PDF_new();
// creare fiier PDF i deschidere cu precizare locaie
// dac fiierul exist, este suprascris
PDF_open_file($mypdf, "c:\wamp\www\pdf\gen01.pdf");
// creare pagina 1 cu setare dimensiuni
PDF_begin_page($mypdf, 595, 842);
// cutare font text
$myfont= PDF_findfont($mypdf, "Times-Roman", "host", 0);
// setare font text
PDF_setfont($mypdf, $myfont, 22);
//scriere text
cu fontul setat i la locaia precizat
PDF_show_xy($mypdf, "Text exemplu n fisier.", 50, 750);
PDF_show_xy($mypdf, "Creat cu PHP.", 50, 730);
// ncrcare imagine (preciznd sursa i tipul imaginii)
$myimage = PDF_load_image($mypdf,"gif", "c:\wamp\www\pdf\logo_i.gif", "");
// inserare imagine (preciznd locaia n pagin i scara dimensional)
PDF_place_image($mypdf, $myimage, 150, 600, 1.0);
// trasare linie (setare grosime, punct start, punct final)
pdf_setlinewidth($mypdf, 10);
PDF_moveto($mypdf, 150, 550);
PDF_lineto($mypdf, 450, 550);
pdf_stroke($mypdf);
PDF_end_page($mypdf);
121
122 PHP - 2
accesibile din orice pagin a site-ului (cazul implementrii unui co virtual de
cumprturi specific aplicaiilor Web gen magazin on-line);
- asigurarea accesul securizat (parolat) la paginile unui site Web, printr-un
transfer i purtare a parolei de acces prin fiecare pagin securizat, accesat de
clientul vizitator;
- diverse situaii impunnd expirarea valabilitii unor date (folosind
mecanismul de nchidere temporizat a unei sesiuni).
Mecanismul de operare cu sesiuni permite transferarea sigur, comod i
aproape implicit (necesitnd doar o linie de cod, repetat n fiecare script al siteului) a unui numr practic nelimitat de parametri ntre o mulime de pagini Web
(care constituie un site unitar).
Exemplu: Fie urmtoarele dou fiiere script PHP, prezentate n tabelul 2.3.
Primul script starteaz o sesiune, crendu-se un fiier sesiune cu numele specificat,
n care se va memora coninutul unei variabile $var (atribuit explicit ulterior startarii
sesiunii n cadrul scriptului). n acest moment, fiierul sesiune va conine (vezi
tabelul 2.4): numele variabilei (var), tipul i lungimea coninutului (s:4) string 4 -,
precum i coninut efectiv: string-ul ceva.
n scriptul a.php este prevzut un hyperlink ctre un al doilea script b.php,
n
care,
sesiunea
curent
fiind
n
continuare
activ
(comanda
session_register("var")), se asigur disponibilitatea coninutului variabile $var (care
este i afiat pe ecran).
Tabel 2.4.
Script a.php
<?php
session_register("var");
$var="ceva";
echo "<a href=b.php>mai departe";
?>
Script b.php
<?php
session_register("var");
echo $var;
echo "<a href=a.php>back";
session_destroy();
?>
Script a.php
<?php
session_start();
$_SESSION[var]="ceva";
echo "<a href=b.php>mai departe";
?>
Script b.php
<?php
session_start();
$var=$_SESSION[var];
echo $var;
session_destroy();
?>
Script a.php
<?php
session_start();
$_SESSION['var[1]']="ceva";
$_SESSION['var[2]']="ceva1";
echo "<a href='b.php'>mai departe";
?>
Script b.php
<?php
session_start();
echo $_SESSION['var[1]'];
echo $_SESSION['var[2]'];
session_destroy();
?>
124 PHP - 2
Ca o concluzie, o variabil sesiune este salvat ntr-o resurs de tip fiier
sesiune (de tip text) stocat pe partea de server Web, fiind vizibil n ntreaga
aplicaie Web (n toate scripturile PHP ale aplicaiei site). Pentru o variabil sesiune
denumit VAR, referirea n scriptul PHP se face sub forma $_SESSION[VAR],
respectiv $_SESSION[VAR[indice]] - dac este vorba despre un variabil array.
126 PHP - 2
checkbox-ul este implicit selectat (bifat).
Formularul astfel construit, trimite - n caz de selecie (bifare) a casetei
checkbox - variabila $check=id (name=check, value=id) spre un alt script (a.php).
Scriptul urmtor arat modul n care poate fi verifucat rezultatul aciunii asupra unei
casete INPUT-checkbox (selecie sau neselectie). n script apare funcia empty care
permite o verificare practic a selectrii sau nu a casetei. Funcia empty testeaz
dac variabila transmis ca parametru nu are un coninut (returnnd TRUE pentru
neselecie, practic coninut vid, respectiv FALSE pentru selecie). Funcia isset va
returna TRUE doar dac variabila are o valoare setat (selectat), respectiv FALSE
n caz contrar.
<?php
echo $check;
if (empty($check))
echo "Variabila vida <br>";
if (isset($check))
echo "Variabila este setata <br>";
?>
O situaie special este cea n care mai multe casete sunt selectate simultan
(cazul INPUT checkbox), sau mai multe opiuni sunt selectate simultan (cazul
SELECT cu atributul MULTIPLE). Codul urmtor permite ilustrarea acestei situaii, iar
problema care se pune este legat de modul n care scriptul PHP apelat tie s preia
i interpreteze aceti parametri cu valori multiple.
<form METHOD="GET" ACTION="apelat.php">
<SELECT MULTIPLE NAME="meserie[]">
<OPTION selected VALUE="Inginer"> Inginer
<OPTION VALUE="Sofer" > Sofer
<OPTION VALUE="Dentist"> Dentist
</SELECT>
Auto: <input type="checkbox" name="vehicol[]" value="Dacia" /> Autoturism
Dacia
<input type="checkbox" name="vehicol[]" value="Ford" /> Ford <p>
<input TYPE="SUBMIT" VALUE="Cauta">
</form>
Scriptul PHP necesit, ntr-un astfel de caz, trimiterea parametrilor ca iruri
array (meserie[],vehicol[]), iar preluarea i interpretarea valorilor singulare se poate
127
face folosind construcia foreach, specific extragerii elementelor unui ir. Codul de
prealuarea a acestor valori multiple este prezentat n continuare (construciile if
permind evitarea unor mesaje de avertizare n cazul n care nici o selecie nu este
realizat) .
<?php
$sir=$_GET[meserie];
if ($sir) {
// TRUE -dac s-a fcut o selecie
foreach ($sir as $element)
{
echo $element;
}}
$sir1=$_GET[vehicol];
if ($sir1)
// sau echivalent: if(!(empty($sir1)), ! fiind operator de negare logic
{
foreach ($sir1 as $element)
{
echo $element;
}} ?>
128 PHP - 2
echo "<p>";
$produs1=urldecode($produs1);
echo 3 .$produs1;
?>
are urmtorul rezultat:
1 un
2 un+sir+ceva+mai+lung
3 un sir ceva mai lung
129
130 PHP - 2
<?php
// verificarea operaie upload valid
if(is_uploaded_file($HTTP_POST_FILES[userfile] [tmp_name]))
{
// transfer efectiv
copy($HTTP_POST_FILES[userfile][tmp_name],
c:\\php\\loaded\\.$HTTP_POST_FILES[userfile][name]);
echo OK upload valid;
}
else
{ echo operaie euata;
}
?>
n prima variant, funcia is_uploaded_file()cu sintaxa:
bool is_uploaded_file (string filename)
returneaz TRUE dac fiierul filename a fost transferat printr-o operaie
valid de upload via HTTP POST.
Funcia COPY realizeaz un transfer al
fiierului temporar upload-uit la o locaie dorit. Primul parametru al comenzii COPY
(tabloul special $HTTP_POST_FILES) localizeaz fiierul surs (verificarea unei surse
de upload fiind realizat prin funcia is_uploaded_file), iar cel de-al doilea este
practic destinaia.
- a doua variant:
<?php
// upload direct
move_uploaded_file($HTTP_POST_FILES[userfile] [tmp_name],
c:\\php\\loaded\\.$HTTP_POST_FILES[userfile][name]);
?>
n a doua variant, funcia move_uploaded_file() cu sintaxa:
bool move_uploaded_file (string filename, string destination), nglobeaz ambele
operaii executate n varianta unu, fcnd att verificarea anterior menionat, ct i
transferul la o locaie dorit. Dac verificarea operaiei upload nu este valid
(FALSE), nici o aciune nu este efectuat. Numele indicilor variabilei tablou
($HTTP_POST_FILES) [userfile] [tmp_name] [name]) sunt alese de ctre
programator.
131
132 PHP - 2
print ($var."<br>");
// afiare
134 PHP - 2
Avantajul major al utilizrii serviciilor Web const n faptul c, anumite
funcionaliti dorite i deja existente ca implementare, pot fi integrate direct n
cadrul unei aplicaii, ne mai trebuind a fi codate, fiind rapid accesibile prin simple
apeluri la componente deja existente. [14]
Un serviciu Web dispune de cteva proprieti intrinseci, putndu-se
enumera urmtoarele:
- este o component software de sine stttoare (auto-ncapsulat i autodescriptiv), apelabil (consumabil) dintr-o alt aplicaie (Web sau Windows
desktop);
- are ca element de baza pentru transferul informaiei formatul XML;
- comunica utiliznd protocoale deschise SOAP (Simple Object Access
Protocol - protocol standard pentru transmiterea de mesaje ntre diferite module,
definind regulile de procesare a unui mesaj, convenii de apelare a procedurilor la
distan (Remote Procedure Call - RPC) i de reprezentare a raspunsurilor la aceste
apeluri;
- vizibilitate asigurat de sistemul UDDI (Universal Description, Discovery
and Integration), ca sistem de baz pentru localizarea serviciilor Web, acesta
fcndu-le public existena pentru a putea fi consumate;
- autodescriere asigurat de metoda WSDL (Web Services Description
Language) care asigur o descriere a interfeei pentru utilizarea serviciului, crend
documentele care descriu metodele serviciului, parametri i argumentele acceptate
ale acestora, date returnate etc.)
Pot fi de asemenea punctate cteva proprieti funcionale:
- permit crearea de aplicaii independente de platform (sisteme de operare,
instrumente, limbaje de programare folosite);
- implementeaz componente care pot comunica ntre ele (indiferent de
platform);
- un serviciu Web furnizeaz informaii pentru descoperirea i descrierea lui
(i a metodelor lui, parametrilor de apelare, date returnate etc.).
Limbajul PHP (ca i alte limbaje de programare Web) permite operarea cu
serviciile Web, oferind n acest sens biblioteca extensie php_soap.dll (necesitnd
activarea ei prin configurarea corespunztoare n fiierul php.ini). Problematica
serviciilor Web este tratat la ora actual intr-o mulime de cri i site-uri dedicate
unele chiar exclusiv acestui subiect [14] [15] [26]. n paragraful de fa nu se va
intra n detalii privind modul de creare a serviciilor Web utiliznd PHP-ul, fiind oferit
o simpl exemplificare privind consumarea unui serviciu Web. Pentru cazul tratat s-a
considerat apelul unui serviciu Web oferind cursul valutar curent, disponibil pe
Internet la adresa:
http://www.infovalutar.ro/curs.asmx?wsdl
Codul unui posibil script PHP care realizeaz consumarea acestui serviciu
este prezentat n continuare, cu comentariile de rigoare [27]:
<?php
// Configurare php.ini -> php_soap.dll
// Instaniere obiect SOAP
$client = new SoapClient("http://www.infovalutar.ro/curs.asmx?WSDL");
// Apel metod cu data ultimei actualizri (fr parametri)
$result = $client->lastdateinserted();
// afiare dat - se apeleaz singura proprietate pe care o are obiectul returnat
135
136 PHP - 2
137
138 PHP - 2
instane. n limbajul PHP pentru aceasta operaie, se utilizeaz instruciunea,
cuvntul cheie new.
- Deci prima linie din secvena de cod anterioar creeaz un nou obiect
Obiect1 prin instanierea clasei Clasa1.
- n continuarea se face un apel al metodei setMessage ($Obiect1>setMessage) pasndu-i un parametru, metoda care permite setarea proprietii
message. Linia urmtoare apeleaz metoda getMessage (fr parametrii), care
afieaz un mesaj i returneaz o valoare (a proprietii message, afiat pe ecran
folosind echo).
- Valoarea returnat putea fi evident memorat ntr-o variabil ($var n cazul
de fa).
- n acest caz, setarea proprietii message a fost realizat prin apelul unei
metode. Setarea unei proprieti a unui obiect se poate face i prin atribuirea direct
a unei valori ctre proprietatea referit ($Obiect1->message="Setare directa a
proprietatii) sau chiar printr-o iniializare n definiia clasei (vezi proprietatea
$data). Toate comenzile de afiare (echo) au fost utilizate doar pentru a evidenia
modul de referire a atributelor/metodelor obiectului.
Observaie: n cazul limbajul PHP nu se limiteaz accesul la proprieti. Implicit
toate proprietile sunt de tip public, neputnd fi declarate private sau protected.
Orice proprietate declarat n definiia clasei poate fi referit n exteriorul ei printr-o
construcie de tipul: $Obiect->nume_proprietate;
O metod special a unei clase este aa numita metod constructor. O
metoda constructor are acelai nume cu al clasei, fiind apelata automat la crearea
unui obiect (realiznd operaii de iniializare, crearea de alte obiecte necesare
obiectului n cauza etc.). Un constructor se declar similar cu celelalte metode,
singura deosebire fiind ca are acelai nume ca i clasa. n PHP definirea unei metode
constructor nu este obligatorie. Clasa anterior creata nu avea definit un constructor
(unele proprieti fiind ns iniializare direct odat cu declararea lor).
Pentru exemplificare, se va crea un constructor pentru Clasa1, care va afia
un mesaj i va iniializa proprietatea $message. Definiia anterioar a clasei se va
completa cu nc o metod (avnd acelai nume cu al clasei):
function Clasa1()
{
echo "Obiect creat<br>";
$this->message = "initializare_obiect1";
}
O simpl secven de creare a obiectului va apela imediat metoda
constructor:
$Obiect1 =new Clasa1();
echo $Obiect1->message;
iar rezultatul va fi:
Obiect creat
initializare_obiect1
Pentru ca o clas deja creat s poate fi instaniat n mai multe scripturi
PHP, fr a se face o replicare (copiere) a codului clasei n fiecare script, de regul
definiiile claselor sunt pstrate n fiiere distincte de cele n care sunt create
obiectele. Pentru cazul de fa, spre exemplu, ntr-un fiier clase.php este salvat
139
definiia clasei, n timp ce ntr-un alt fiier PHP (obiect.php spre exemplu) se face
instanierea clasei (i utilizarea obiectului):
<?php
// fiier obiect.php
include("clase.php");
$Obiect1 =new Clasa1();
echo $Obiect1->data;
?>
Evident fiierul clase.php poate conine definiiile mai multor clase.
O caracteristic important a OOP o reprezint motenirea care permite
crearea unei relaii ierarhice ntre clase, folosind subclase. O subclasa, practic
motenete proprietile i metodele unei superclase. Prin intermediul motenirii, pe
lng elementele motenite (proprieti i metode), n cadrul noii clase se pot
construi i aduga noi elemente (proprieti sau metode). Astfel, pornind de la clase
de baza simple se pot deriva clase mai complexe i mai specializate pentru o
anumit aplicaie. Utilizarea motenirii crete gradul de reutilizare i lizibilitate al
codului surs, avantaj important al OOP (reducndu-se substanial munca
programatorului n cazul n care aceleai metode pot fi scrise doar o singur dat
ntr-o superclas, n loc s fie scrise de mai multe ori n subclase separate). Pe baza
superclasei Clasa1 (n acelai fiier script), se construiete prin derivarea acesteia o
nou subclasa Clasa2 (utiliznd cuvntul cheie extends), care motenete toate
proprietile i metodele superclasei, dar n acelai timp are i alte noi proprieti i
metode:
class Clasa2 extends Clasa1
{
var $message2="gama";
function getMessage()
{
echo "mesajul nou pentru obiectul 2 este<br>";
return $this->message2;
}
function plus()
{
echo "<br>ceva nou<br>";
}
}
De remarcat c, n cadrul subclasei Clasa2 se definete o metod avnd un
nume similar cu al unei metode din superclasa (getMessage), realizndu-se n cadrul
subclasei o suprascriere a metodei motenite, precum i o nou metod (plus). De
asemenea, noua clas are i o proprietate n plus ($message1).
O secven de instaniere i utilizare a obiectelor subclasei se poate face prin liniile
de cod urmtoare:
$Obiect2 =new Clasa2();
$Obiect2->plus();
$Obiect2->setMessage("beta");
echo $Obiect2->message."<br>";
echo $Obiect2->getMessage();
are rezultatul urmtor:
140 PHP - 2
Obiect creat
ceva nou
beta
mesajul nou pentru obiectul 2 este
gama
Crearea obiectului prin instanierea subclasei Clasa2 conduce i la
motenirea constructorului corespunztor (afindu-se Obiect creat). Apelul metodei
plus conduce la afiarea mesajului ceva nou. Apelul metodei motenite setMessage
permite setarea proprietii motenite message. Apelul metodei suprascrise
getMessage (plasat ntr-un echo), conduce la afiarea ultimelor dou rnduri.
Observaie: Mecanismul de motenire funcioneaz ntr-un singur sens, subclasa
(copil) motenete de la superclasa (printe). Orice modificare a clasei printe este
automat preluat i de clasa copil.
O alt caracteristic important a OOP o reprezint polimorfismul, prin
intermediul cruia clase diferite pot conine metode cu acelai nume, dar cu
comportamente diferite. Chiar n exemplul cu motenire, superclasa respectiv
subclasa conin metode cu acelai nume (getMessage), dar funcionaliti diferite.
Se consider nc un exemplu. n acelai script cu definiia clasei Clasa1, fie definiia
unei clase Clasa3:
class Clasa3
{
var $message;
function setMessage($param)
{
$this->message = $param;
echo "Clasa 3";
return $this->message;
}
}
La o instaniere a claselor i folosire a obiectelor create:
$Obiect1 =new Clasa1();
$Obiect3 =new Clasa3();
$Obiect1->setMessage("Setarea proprietate folosind o metoda:");
echo $Obiect1->getMessage();
$Obiect3->setMessage("Setarea proprietate clasei 3");
rezultatele sunt:
Obiect creat
Mesajul pentru obiectul 1 este:
Setarea proprietate folosind o metoda:
Clasa 3
Observaie: n PHP 4 nu este permis suprancrcarea metodelor (suprancrcare
overload- o aceeai metod avnd n cadrul aceleai clase definiii multiple, fiecare
cu un numr diferit de parametrii de intrare). ncepnd cu PHP 5 este introdus
experimental o funcie overload() pentru a putea beneficia de acest avantaj.
141
142 PHP - 2
}
}?>
Scriptul n care se face un apel la aceast clas pentru realizarea unei
conexiuni la o baz de date MySQL poate conine urmtorul cod:
<?php
include("clase.php");
$Obiect2=new Clasa2("localhost","root","parola", "baza");
$db=$Obiect2->returnez;
// referire identificator conectare
//cod interogare
.
.
.
?>
3.1. JavaScript
143
3.1. JavaScript
145
3.1. JavaScript
147
3.1. JavaScript
function afiseaza_text(text)
{
form1.descriere.value=text;
}
149
function miscare()
{
x_curent=event.x;
y_curent=event.y;
if (in_zona(x_curent,y_curent,0,0,161,50))
afiseaza_text("Programare in JavaScript");
else if (in_zona(x_curent,y_curent,100,60,161,90))
afiseaza_text("Autorii cartii");
else if (in_zona(x_curent,y_curent,0,120,161,199))
afiseaza_text("Publicata in Editura Sams");
else
afiseaza_text("Alege o zona de imagine!"+" x: "+x_curent+" y:
"+y_curent);
}
</SCRIPT>
</HTML>
3.1. JavaScript
151
onMouseMove="javascript:miscare()">
- Scriptul JavaScript se modific /completeaz astfel:
Direct n secvena public executat la ncrcarea aplicaiei se adaug linia:
document.ceva.onmousemove = miscare1;
unde miscare1 este o nou funcie (construit pe scheletul deja existentei funcii
miscare), fiind apelat doar de browsere Mozilla la o deplasare a mouse-ului n
interiorul paginii, doar pe obiectul cu numele ceva (practic doar pe imaginea referit
prin eticheta IMG). Astfel, scriptul JavaScript va debuta cu secvena urmtoare:
<SCRIPT LANGUAGE="JavaScript">
<!-var x_curent, y_curent;
document.ceva.onmousemove = miscare1;
// document.onmousemove = miscare;
Dac se folosete linia comentat, funcia miscare1 intercepteaz
coordonatele mouse-ului de pe tot ecranul (i nu doar de pe zona limitat, impus
de coordonatele etichetei IMG cu numele ceva).
Funcia miscare1 se construiete pornind de la funcia miscare existent,
modificndu-se liniile citind coordonatele curente ale mouse-ului (parametru de
intrare e avnd semnificaia evenimentului onmousemove interceptat i avnd o
aciune definit prin secvena de cod JavaScript anterior precizat):
function miscare1(e)
{
x_curent=e.pageX;
y_curent=e.pageY;
...
Restul codului aplicaiei rmne nemodificat. Problema major rezolvat prin
modificrile anterioare a fost cea de a citi coordonatele curente ale mouse-ului
utiliznd o secven de cod JavaScript compatibil cu browserele Mozilla,
completnd totodat scriptul astfel nct aplicaia s poat rula adecvat pe ambele
tipuri de browsere.
Observaie: Deseori util pentru rezolvarea unor probleme de compatibilitate ale
limbajului JavaScript cu diverse tipuri de browsere, urmtoarea secven de cod
permite o identificare i afiare a numelui unui browser (utiliznd funcia JavaScript
navigator.appName [36]):
<html>
<body>
<div id="afis"></div>
<script type="text/javascript">
nume = "Nume Browser: " + navigator.appName + "</p>";
document.getElementById("afis").innerHTML=nume;
</script>
</body></html>
Codul anterior afiseaz Netscape ca nume pentru browser-ele familiei
Mozilla, respectiv Microsoft Internet Explorer pentru cealalt familie.
Exist o mulime de evenimente JavaScript, fiecare putnd fi ataate
diverselor elemente-etichete HTML, conducnd la o interaciune dinamic a acestora
cu utilizatorul. Tabelul 3.1 prezint doar o foarte scurt selecie a unor astfel de
evenimente, numite i evenimente HTML DOM (Document Object Model),
precizndu-se aciunea la care sunt declanate, respectiv eticheta HTML de care pot
Etichet
HTML
INPUT
FORM
Atribut Eveniment
onclick
onblur
onmousemove
onkeypress
ondblclick
onclick
onkeydown
onsubmit
onmouseover
SELECT
TEXTAREA
onchange
onmousemove
onfocus
onclick
onmouseout
Descriere
Click mouse pe caset
Pierdere focus caset (onLeave)
Deplasare mouse pe caseta INPUT
Apsare i lsare tast n caset
Dublu click n caseta
Click mouse pe formular (pe orice element
al acestuia)
Apsare o tast n formular (pe orice
element al acestuia)
Apsare buton SUBMIT
Pointer
mouse
se
mic
deasupra
formularului (deasupra oricrui element
din formular)
Schimbare opiune (selecie)
Deplasare mouse pe caseta SELECT
Focus pe o anumit opiune
Click mouse pe caset
Pointer mouse prsete caset
3.1. JavaScript
153
3.1. JavaScript
155
50);
50);
50);
50);
function afisez()
{
// random - numere intre 0 si 1, floor - rotunjire la cel mai apropiat ntreg
var contor=Math.floor(Math.random() * 4 );
document.imagine.src = imagini[contor].src;
document.myForm.numar.value = descriere[contor];
myForm.nume.value = contor;
//ambele forme (cu i fr document)
}
</script>
name=nume
var1=myForm.nume.value;
var1=
document.getElementById("nume")
.value;
var1=
document.getElementById("nume").
value;
* Doar pe Internet Explorer (Nu i pe
Mozilla !!!)
3.2. AJAX
3.2.1. Introducere n AJAX - comparaie cu tehnologia tradiional
JavaScript, ca limbaj de programare WEB (rulnd pe partea de client),
permite o mulime de aciuni care fac interfaa cu utilizatorul mult mai prietenoas.
Astfel, se pot implementa validri ale datelor introduse prin formulare, operare cu
imagini (vezi exemplele din paragrafele anterioare) meniuri, mesaje gen popup etc.
Fiind un limbaj de programare rulnd pe partea de client, JavaScript nu permite ns
transferul informaiei ntre browser-ul
(clientul) Web i serverul Web (fiind
interpretat uneori chiar diferit de diversele tipuri de browsere). Dac se dorete
preluarea unor date de la un server de baze de date sau trimiterea unor informaii
spre un script PHP (rulnd partea de server Web), codul HTML, mai precis un
formular HTML (FORM) ofer metodele GET i POST pentru comunicarea (transferul)
de parametri spre server, realiznd astfel un apel parametrizat al unor scripturi. n
momentul n care user-ul apsa un buton de tip Submit, eventualii parametri sunt
transferai spre server, ateptndu-se un rspuns din partea scriptului apelat, avnd
ca rezultat afiarea unei noi pagini integrnd informaia returnat (fig.3.6.a). Dac
serverul Web rspunde mai puin rapid (din diverse motive), utilizatorul are de
ateptat un anumit timp pn la ncrcarea i afiarea complet a noii pagini.
AJAX
(acronimul
pentru
Asynchronous
JavaScript
And
XML,
reprezentnd practic o grupare de tehnologii, gen JavaScript, XML, CSS, DOM, HTML
i DHTML), ncerc s remedieze aceast problem, lsnd codul JavaScript s
comunice direct cu serverul Web, prin utilizarea un obiect special JavaScript numit
XMLHttpRequest (sau un ActiveXObject).[16] Cu ajutorul acestui obiect, codul
JavaScript poate trimite sau primi informaii de la/spre server, fr a fi necesar
rencrcarea complet a paginii Web (printr-un eventual Reload), fcnd astfel
posibil un schimb bidirecional, asincron, de date cu serverul (practic cu scripturi
rulnd server-side). Astfel, o secven specific de cod JavaScript (rulnd pe partea
de client), poate comunica cu cod rulnd pe partea de server Web (fig.3.6.b).
Descrierile prezentate n figurile 3.6.a, respectiv 3.6.b permit o analiz comparativ
ntre o abordare clasic a modului de realizarea a apelurilor ntre diversele
componente, respectiv o abordare AJAX.
3.2. AJAX
159
3.2. AJAX
161
}
}
// Funcie care preia date de la server Web
ajaxRequest.onreadystatechange = function(){
if(ajaxRequest.readyState == 4)
document.myForm.time.value = ajaxRequest.responseText;
}
//Apel i pasare date spre server Web
ajaxRequest.open("GET", "serverTime.php", true);
ajaxRequest.send(null);
}
</script>
<form name='myForm'>
Name: <input type='text' onBlur="ajaxFunction()" name='username' /> <br />
<b>Afisare cu AJAX</b><br>
Time: <input type='text' name='time' />
</form>
<b>Afisare fara AJAX </b><br>
<?php include 'serverTime.php'; ?>
</body>
</html>
Partea de cod clasic HTML-JavaScript, implementeaz un formular cu dou
casete INPUT, prsirea primei casete (evenimentul onblur, echivalentul lui onLeave
din alte limbaje) conducnd (prin apelul funciei AJAX aferente ajaxFunction) la
completarea n cea de-a doua caset a timpului citit de pe server, prin apelul
asincron implicit al scriptului rulat pe partea de server serverTime.php:.
<?php
echo date("H:i:s");
?>
Apelul asincron putea fi declanat i la un eveniment onClick chiar pe caseta
a doua n care se afieaz timpul, dar n acest caz aplicaia va reaciona doar la un
eveniment declanat strict de mouse (nu i de tastatur):
<input type='text' name='time' onClick="ajaxFunction()" />
Exemplul anterior permite apelul asincron i refresh-ul datelor afiate ntr-un
element de tip caseta INPUT. n unele situaii ns, se dorete refresh-ul unei zone
bine delimitate de pe ecran, spre exemplu utiliznd o etichet de tip DIV. n acest
caz, n partea de cod HTML (eliminndu-se caseta INPUT time), dup formular se
poate prevedea o astfel de zon DIV (cu un ID bine precizat, prin care aceasta poate
fi referit):
<div id="Elem_DIV"><b> <?php include 'serverTime.php'; ?></b><br></div>
De asemenea, codul JavaScript pentru referirea zonei DIV de afiare/refresh
implic urmtoarea modificare aferent metodei AJAX (responseText) care
intercepteaz i proceseaz rspunsul serverului:
ajaxRequest.onreadystatechange = function()
{
if(ajaxRequest.readyState == 4)
document.getElementById('Elem_DIV').innerHTML=
ajaxRequest.responseText;
}
Fig.3.8.a Grafic dinamic (o zon DIV dinamic, dou zone DIV statice)
3.2. AJAX
163
3.2. AJAX
165
// Functie de receptie
ajaxRequest.onreadystatechange = function()
{
if(ajaxRequest.readyState == 4)
{
var ajaxDisplay = document.getElementById('ajaxDiv');
ajaxDisplay.innerHTML = ajaxRequest.responseText;
setTimeout('ajaxFunction()',1000);
}
}
3.2. AJAX
Client
(Browser)
Apel HTTP (web)
[A]
167
Server
(WEB)
Script HTML +
JavaScript
Script HTML +
apel AJAX
Script PHP
JavaScript
(+HTML)
Eveniment
(onClick,
[B1]
onMouseMove, etc)
[B]
[B2]
MySQ
DATE
L
(tag DIV)
3.2. AJAX
169
Afiare
(interogare
PHP)- fr AJAX (nu se
face Refresh!)
Afiare (interogare
PHP)- cu AJAX (Refresh
periodic, automat, doar
a zonei DIV)
3.2. AJAX
171
$user = "root";
$pass = "parola";
$baza = "baza";
//Conectare la server i selectare baz de date
mysql_connect($host, $user, $pass);
mysql_select_db($baza) or die(mysql_error());
$query = "SELECT * FROM tabel1 order by nume";
$result = mysql_query($query) or die(mysql_error());
//Afiare cap tabel
$sir= "<table border=1>";
$sir .= "<tr>";
$sir .= "<th>Nume</th>";
$sir .= "<th>Varsta</th>";
$sir .= "<th>Sex</th>";
$sir .= "<th>Salar</th>";
$sir .= "</tr>";
// Afiare date
while($row = mysql_fetch_array($result)){
$sir .= "<tr>";
$sir .= "<td>$row[0]</td>";
$sir .= "<td>$row[1]</td>";
$sir .= "<td>$row[2]</td>";
$sir .= "<td>$row[3]</td>";
$sir .= "</tr>";
}
echo "Interogare: " . $query . "<br />";
$sir .= "</table>";
echo $sir; ?>
Observaie: n mod normal fiierul Start.PHP nu trebuia s includ cod PHP
(motivele au fost expuse deja, fiind vorba de o simpl exemplificare comparativ
ntre modul de interogare i afiare clasic, respectiv modul bazat pe folosirea unui
apel asincron JavaScript + AJAX). Fr secvena de cod PHP, coninnd doar cod
HTML i JavaScript, numele fiierului putea fi Start.HTML.
Aplicaia prezentat, n care secvena AJAX apeleaz scriptul PHP serverside folosind metoda GET, funcioneaz doar pe browsere din familia Mozilla (pe
Internet Explorer, AJAX cu GET nu funcioneaz). Prin schimbarea metodei de apel
n POST, funcionalitatea acesteia este extins i pentru browserele familiei Internet
Explorer. Aceast schimbare, din punct de vedere al codului JavaScript aferent
nucleului AJAX, implic nlocuirea secvenei de cod urmtoare (specifice metodei
GET):
xmlHttp.open("GET","ajax-example1.php",true);
xmlHttp.send(null);
cu urmtoarea secven de cod aferent metodei POST:
var params = "";
// string vid de parametri
xmlHttp.open("POST","ajax-example1.php",true);
xmlHttp.setRequestHeader("Content-type", "application/
x-www-form-urlencoded");
xmlHttp.setRequestHeader("Content-length", params.length);
3.2. AJAX
173
3.2. AJAX
175
= "<table border=1>";
.= "<tr>";
.= "<th>Nume</th>";
.= "<th>Varsta</th>";
.= "<th>Sex</th>";
.= "<th>Salar</th>";
.= "</tr>";
while($row = mysql_fetch_array($qry_result)){
$display_string .= "<tr>";
$display_string .= "<td>$row[nume]</td>";
$display_string .= "<td>$row[varsta]</td>";
$display_string .= "<td>$row[sex]</td>";
$display_string .= "<td>$row[salar]</td>";
$display_string .= "</tr>";
}
echo "Query: " . $query . "<br />";
$display_string .= "</table>";
echo $display_string;
?>
Observaie. Rencrcarea informaiei interogate folosind cod JavaScript i AJAX se
poate face i la apariia altor evenimente ataat unor elemente HTML.Spre exemplu,
n formular poate apare o linie de genul:
Varsta maxima: <input type='text' id='varsta' onmousemove='ajaxFunction()' />
<br />
Sau pentru zona de afiare DIV:
<div id='ajaxDiv' onmousemove='ajaxFunction()'> Afisare rezultate </div>
3.2. AJAX
177
Codul aferent celor dou fiiere script implementnd aplicaia este urmtorul:
Script HTML+JavaScript
<html>
<body>
<script language="javascript" type="text/javascript">
// Secventa AJAX (JavaScript)
// inclusiv identificare tip browser
function ajaxFunction(){
3.2. AJAX
179
</div>
</body></html>
Scriptul anterior afieaz casetele de selecie (vezi fig. 3.12).
Script PHP+HTML - ajax-example10.php realizeaz interaciunea cu MySQL,
pasnd rezultatul spre secvena AJAX.
<?php
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "parola";
$dbnume = "baza";
//Conectare la server i selecie baz de date
mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbnume) or die(mysql_error());
// preluare parametri interogare (pasai de scriptul AJAX)
$sex = $_GET['sex'];
$varsta = $_GET['varsta'];
$nume = $_GET['nume'];
//Afisare date (filtrare date tabela MySQL)
//Filtrare iniial doar dup coloana sex (varsta nefiind selectat,
//fiind necesar umplerea SELECT-ului aferent ei!)
$query1 = "SELECT * FROM tabel1 WHERE sex = '$sex' ";
if(is_numeric($varsta))
$query1 .= " AND varsta <= $varsta ";
//Executare interogare
$qry_result =mysql_query($query1) or die(mysql_error());
//Afiare date tabelat (cap tabel, urmat de linii date)
$display_string = "<table border=1>";
$display_string .= "<tr>";
$display_string .= "<th>nume</th>";
$display_string .= "<th>varsta</th>";
$display_string .= "<th>Sex</th>";
$display_string .= "<th>salar</th>";
$display_string .= "</tr>";
while($row = mysql_fetch_array($qry_result))
{
$display_string .= "<tr>";
$display_string .= "<td>$row[nume]</td>";
$display_string .= "<td>$row[varsta]</td>";
$display_string .= "<td>$row[sex]</td>";
$display_string .= "<td>$row[salar]</td>";
$display_string .= "</tr>";
}
$display_string .= "</table>";
echo $display_string;
//afiare linie de date
Bibliografie
1. Ioan Filip - Tehnologii de programare a aplicaiilor Internet cu baze de date,
Editura Orizonturi Universitare, Timioara, 2003.
2. Peter Belesis, Arman Danesh s.a. - Dynamic HTML, Sams.net Publishing,
Indianapolis, USA, 1998.
3. Kris Jamsa, Ken Cope - "Programarea aplicaiilor Internet", Editura All
Educational SA, Bucureti, 1998.
4. Louis Kahn, Laura Logan - "Build Your Own Web Site", Microsoft Press 1996.
5. Jon Duckett - Beginning Web Programming With HTML, XHTML, and CSS, John
Wiley & Sons, 2004.
6. Ian S. Graham - HTML Stylesheet Sourcebook, Wiley, 1997.
7. Brett McLaughlin - What Is HTML5?, O'Reilly Media, 2011.
8. Darren Levy - HTML/CSS / JavaScript: From Beginner to Whiz, Amazon Digital
Services, 2011.
9. Julie Meloni, Michael Morrison - Sams Teach Yourself HTML and CSS in 24
Hours, Sams, 2009.
10. Stig Sther Bakke, Alexander Aulbach s.a. -PHP Manual, PHP Documentation
Group (http://www.php.net/docs.php), 2003.
11. MySQL 5.0 Reference Manual (dev.mysql.com/doc/refman/5.0/en/), 2012.
12. Kevin Yank - Build Your Own Database Driven Web Site Using PHP & MySQL,
Copyright 2009 SitePoint Pty. Ltd., USA, 2009.
13. Ioan Filip - Sisteme de gestiune a bazelor de date, Editura Orizonturi
Universitare, Timioara, 2007.
14. Ethan Cerami - Web Services Essentials, O'Reilly Media, 2002.
15. Adam Trachtenberg, David Sklar - PHP Cookbook, O'Reilly Media, 2006.
16. Phill Ballard -AJAX n lectii de 10 minute, EdituraTeora, Bucuresti, 2007.
17. John Pollock - JavaScript, A Beginner's Guide, Third Edition, McGraw-Hill
Osborne, 2009.
18. Phil Ballard, Michael Moncur - Sams Teach Yourself Ajax, JavaScript, and PHP
All in One, Sams, 2008.
19. www.php.net/
20. php.net/manual/en/index.php
21. www.wampserver.com/en
22. www.zdnet.com/blog/carroll/ajax-vs-desktop-development/1519
23. www.prologue.ro/blog-Web-design/flash-vs-html-5/
24. langpop.com/
25. www.phpromania.net/articol/10/Tipuri_de_date_Variabile_Constante_Operatori_
Definire_functii_.html
26. www.herongyang.com/PHP/php_soap.html
27. blog.claudiupersoiu.ro/2009/05/24/
28. www.scottnichol.com/nusoapintro.htm
29. searchsoa.techtarget.com/definition/object-oriented-programming
30. www.w3schools.com/js/js_intro.asp
31. www.tizag.com/ajaxTutorial/ajax-mysql-database.php
182
32.
33.
34.
35.
36.
37.
38.
Bibliografie
www.openjs.com/articles/ajax_xmlhttp_using_post.php
www.codelifter.com
www.w3schools.com/js/js_events.asp
www.w3schools.com/jsref/dom_obj_event.asp
www.w3schools.com/js/tryit.asp?filename=try_nav_all
www.mysql.com
www.handy-html.com/create-a-simple-css-dropdown-menu/