Sunteți pe pagina 1din 28

350 Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL

Funcia f ormatentry !" nu este prezentat# aici$ %n esen#& este asem#n#toare cu funcia f ormatrtfentry !" din
scriptul gencat& dar f#r# cu'intele de control ()F$
Pu*licarea pe +nternet a catalogului Ligii istorice
%n seciunea urm#toare& ,Utilizarea -.+ %n aplicaiile /e*0& 'om %ncepe s# scriem scripturi care se conecteaz# la
ser'erul MySQL pentru a e1trage informaii 2i pentru a scrie acele informaii %n forma paginilor /e* care apar %n
*ro3serul /e* al unui client$ 4ceste scripturi genereaz# cod 5)ML %n mod dinamic& %n conformitate cu cerinele
clientului& %nainte de a a6unge la acel punct& s# %ncepem s# ne g7ndim la 5)ML inser7nd un program -.+ care
genereaz# un document 5)ML static& ce poate fi %nc#rcat %n ar*orele cu documente al unui ser'er /e*$ Un
candidat *un %n acest sens este un catalog al Ligii istorice pe care %l creai %n format 5)ML& deoarece unul din
scopurile noastre era oricum pu*licarea pe +nternet a catalogului$
%n general& un document 5)ML are o structur# care este oarecum asem#n#toare cu urm#toarea8
95)ML:
95;4-:
9)+)L;:)itlul paginii mele9<)+)L;:
9<5;4-:
9.=->:
95?:)itlu de ni'el ?9<5?:
$$$ coninutul corpului documentului$$$
%nceputul documentului %nceputul capului documentului titlul documentului sf7r2itul capului documentului
%nceputul corpului documentului @ un titlu de ni'el l
9<.=->: A@ sf7r2itul corpului documentului
9<5)ML: A@ sf7r2itul documentului
Pentru a genera catalogul %n acest format& nu este necesar s# scriei un %ntreg script$ B# reamintii c#& atunci c7nd
am scris scriptul gencat& am folosit un cadru e1tensi*il astfel %nc7t s# putem insera programul pentru generarea
catalogului %n formate suplimentare$ 4ceasta %nseamn# c#& pentru a ad#uga programe pentru generarea de date de
ie2ire %n format 5)ML& tre*uie s# scriem funciile de iniializare 2i ,cur#enie0 a documentului& precum 2i o
funcie pentru formatarea intr#rilor indi'iduale$ 4poi& tre*uie s# cre#m un element de tip ,cutie de distri*uie0
care s# indice spre aceste funcii$ ScCia de document prezentat# anterior se poate %mp#ri destul de simplu %n
seciuni de prolog si epilog& care pot fi manipulate de funciile de iniializare& respecti' cur#enie& precum 2i %ntr-
o parte de mi6loc& care poate fi generat# de funcia de formatare a intr#rilor$ Funcia de iniializare 5)ML
genereaz# toate elementele documentului& p7n# la titlul de ni'el l& iar funcia de cur#enie genereaz# eticCetele de
%ncCidere 9<.=->: 2i 9<5)ML:8
su* Ctmlinit
prin 095)ML:Dn0E
FapitolulG +nterfaa 4P+ pentru Perl -.+ 35?
prin 095;4-:Dn0E
prin 09)l)L;:Fatalogul mem*rilor Ligii istorice9<)+)L;:Dn0E
prin 09<5;4-:Dn0E
prin 09.=->:Dn0E
prin 095?:Fatalogul mem*rilor Ligii istorice9<5?:Dn0E
su* Ctmlcleanup
H
prin 09<.=->:Dn0E prin 09<5)ML:Dn0E
I
4de'#rata munc#& de o*icei& rezid# %n formatarea intr#rilor$ -ar nici m#car aceasta nu este prea grea$ Putem
copia funcia formatrtfentry!"& ne asigur#m c# toate caracterele speciale din cadrul intr#rii sunt codificate 2i
%nlocuim cu'intele de control ()F cu eticCetele de marcare 5)ML8
su* formatCtmlentry
H
my !Jentryref" K sCiftE
my !Jadresa"E
L codeaza caracterele speciale din 5)ML foreacC my JMey !Meys !NHentryref I""
Jentryref -:HMeyI Jentryref -:HMeyI K Jentryref-:HMeyI Jentryref-:HMeyI K
- s<O<OampE<gE
- s<D0<OPuotE<gE
- s<:<OgtE<gE
- s<<OltE<gE
printf 09S)(=QR: Qume8 Ns9<S)(=QR:9.(:Dn0&
formatname !Jentryref " E Jadresa K 0 0E
Jadresa $K Jentryref-:HstradaI if Jentryref -:HstradaIE Jadresa $K 0& 0 $ Jentryref -:HorasI if Jentryref-
:HorasIE Jadresa $K 0& 0 $ Jentryref-:HstatI if Jentryref -:HstatIE Jadresa $K 0 0 $ Jentryref -:HcodI if
Jentryref -:HcodIE prin 04dresa8 Jadresa9.(:Dn0 if SadresaE prin 0)elefon8 Jentryref -:HtelefonI9.(:Dn0
if Jentryref -:HtelefonIE prin 0;mail8 Jentryref-:HemailI9.(:Dn0
if Jentryref -:HemailIE prin 0+nterese8 Jentryref -:HintereseI9.(:Dn0
if Jentryref -:HintereseIE prin 09<.(:n0E
35S Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
4cum& 'om ad#uga la cutia de distri*uie un alt element& care indic# spre funciile de scriere 5)ML& iar
modific#rile aduse scriptului gencat au fost finalizate8
L cutie de distri*uie care conine funcii de formatare
L pentru fiecare format al datelor de ie2ire my !Ncutiedistri*utie" K
0*anPuet0
L funcii pentru lista de *ancCet
0init0 K: undef& L nu este necesara nici
L o iniializare
0entry0 K: DOformat*anPuetentry& 0cleanup0 K: undef L cur#enia nu este necesara
0rtf K:
L funcii pentru formatul ()F
0in it0
0entry0
0cleanup0
K: DOrtfinit&
K: DOformatrtfentry&
K: DOrtfcleanup
0Ctml0 K:
L funcii pentru formatul 5)ML
0init0 K: DOCtmlinit&
0entry0 K: DOformatCtmlentry&
0cleanup0 K: DOCtmlcleanup
I
"E $ $ -Ei
Pentru a genera catalogul %n format 5)ML& rulai urm#toarea comand# 2i instalai l fi2ierul de ie2ire rezultant %n
ar*orele cu documente al ser'erului dumnea'oastr# /e*8 l
N gencat Ctml : catalog$Ctml F7nd actualizai catalogul& putei rula comanda din nou& pentru a actualiza
'ersiuneaT electronic# a acestuia$ = alt# strategie este s# configurai o sarcin# a utilitarului cron care l s# se
e1ecute periodic$ 4stfel& catalogul %n 'ersiune electronic# 'a fi actualizat automat$ + -e e1emplu& pot folosi o
intrare cronta* ca aceasta& pentru a rula gencat %n fiec#rei diminea# la ora U8
V
= U A A A <u<paul<sampd*<gencat : <usr<local<apacCe<Ctdocs<catalog$CtmlT Utilizatorul %n numele c#ruia
ruleaz# aceast# sarcin# cron tre*uie s# ai*# at7t permisiu6V nea de a e1ecuta scripturile localizate %n catalogul meu
sampd*& c7t si permisiunea de al scrie fi2iere %n ar*orele cu documente al ser'erului /e*$
W&T
Fapitolul X +nterfaa 4Pt pentru Perl -.+ 353
Utilizarea -.+ %n aplicaii /e*
Scripturile -.+ pe care le-am scris p7n# acum au fost concepute pentru a fi utilizate din interpreter %ntr-un mediu
*azat pe linii de comand#& dar -.+ este util 2i %n alte conte1te& cum ar fi %n cazul dez'olt#rii aplicaiilor *azate pe
/e*$ F7nd scriei scripturi -.+ care pot fi in'ocate din *ro3serul dumnea'oastr# /e*& descCidei noi si
interesante posi*ilit#i de a interaciona cu *azele dumnea'oastr# de date$
-e e1emplu& dac# afi2ai date %n format ta*elar& putei transforma cu u2urin# fiecare titlu de coloan# %ntr-o
leg#tur# !linM"& pe care o putei selecta pentru a sorta din nou datele din coloana respecti'#$ 4ceasta '# permite s#
'izualizai datele %ntr-un alt mod cu un singur clic& f#r# a introduce nici o interogare$ Sau& putei furniza un
formular %n care un utilizator poate introduce criterii pentru c#utarea %ntr-o *az# de date& iar apoi afi2ai o pagin#
care conine rezultatele c#ut#rii$ Funcionalit#i simple ca aceasta pot a'ea un impact semnificati' asupra
ni'elului de interacti'itate pe care %l furnizai pentru accesul la coninutul *azelor dumnea'oastr# de date$ %n
plus& de regul# caracteristicile de afi2are ale *ro3serelor /e* sunt superioare celor ale unei ferestre terminal&
deci datele de ie2ire arat# 2i ele frec'ent mai *ine$
%n aceast# seciune& 'om crea urm#toarele scripturi *azate pe /e*8
@ Un *ro3ser general pentru ta*elele din *aza de date sampd*$ 4ceast# aplicaie nu este legat# de 'reo operaie
specific# pe care dorim s# o efectu#m cu *aza de date& dar ilustreaz# numeroase concepte de programare %n /e*
2i furnizeaz# o modalitate con'ena*il# de e1aminare a informaiilor pe care le conin ta*elele$
@ Un *ro3ser de puncta6e& care ne permite s# e1amin#m rezultatele o*inute la orice test sau cCestionar$ ;ste un
mi6loc rapid de e1aminare a rezultatelor de la e'enimentele de tip e1aminare 2i este util atunci c7nd tre*uie s#
sta*ilim cur*a rezultatelor la un test& astfel %nc7t s# putem acorda lucr#rilor note de tip literal$
@ Un script pentru identificarea mem*rilor Ligii istorice care manifest# interese comune$ 4ceast# operaie se
poate realiza permi7nd utilizatorului s# introduc# o e1presie de c#utare& iar apoi c#ut7nd e1presia respecti'# %n
c7mpul interese al ta*elului mem*ru$ -e6a am scris un script %n linie de comand# care e1ecut# aceast# operaie&
dar o 'ersiune *azat# pe /e* furnizeaz# un punct de referin# instructi'& permi7nd o comparaie %ntre dou#
a*ord#ri ale aceleia2i sarcini$
Bom scrie aceste scripturi folosind modulul Perl FRLpm& care reprezint# modalitatea cea mai simpl# de a lega
scripturi -.+ la /e*$ !Pentru instruciuni cu pri'ire la procurarea modulului FR+$pm& 'ezi 4ne1a 4$" Modulul
FR+$pm este astfel denumit deoarece '# a6ut# s# scriei scripturi care folosesc protocolul Fommon Rate3ay
+nterface& care define2te modul %n care un ser'er /e* comunic# cu alte programe$ Modulul FR+$pm se ocup# de
detaliile pe care le incum*# un num#r de operaii comune de %ntreinere& cum ar fi colectarea 'alorilor
parametrilor transferai scriptului dumnea'oastr# de c#tre ser'erul /e* ca date de intrare$ -e asemenea& FR+$pm
furnizeaz# metode con'ena*ile de generare a datelor de ie2ire %n format 5)ML& ceea ce reduce posi*ilitatea de a
scrie programe 5)ML cu malformaii %n comparaie cu a scrie personal eticCete 5)ML *rute$
35U Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Bei %n'#a suficient de multe despre FR+$pm %n capitolul de fa# pentru a '# scrie propriile dumnea'oastr#
aplicaii /e*& dar& desigur& nu am descris toate funcionalit#ile sale$ Pentru a %n'#a mai multe despre acest
modul& consultai 'olumul =fficial Ruide to Programming 3itC FR+$pm& de Lincoln Stein !YoCn /iley& ?ZZ["
sau e1aminai documentaia electronic# la adresa8
Cttp8<<stein$csCl$org<///<soft3are<FR+<
Fonfigurarea ser'erului 4pacCe pentru scripturile FR+
%n afar# de -.+ 2i FR+$pm& mai a'em ne'oie de %nc# o component# pentru scrierea scripturilor *azate pe /e*& 2i
anume un ser'er /e*$ +nstruciunile din aceast# seciune sunt orientate %n direcia utiliz#rii scripturilor cu
ser'erul 4pacCe& dar pro*a*il c# putei folosi un alt ser'er& dac# dorii& printr-o oarecare adaptare a
instruciunilor$
-iferitele componente ale unei instal#ri a ser'erului 4pacCe se g#sesc& de o*icei& %n catalogul <usr<local<apacCe$
Pentru e1punerea de fa#& cele mai importante su*cataloage ale acestui catalog sunt Ctdocs !pentru ar*orele de
documente 5)ML"& cgi-*in !pentru scripturile e1ecuta*ile 2i programele care 'or fi in'ocate de c#tre ser'erul
/e*" 2i conf !pentru fi2ierele de configurare"$ 4ceste cataloage pot a'ea un alt amplasament pe sistemul
dumnea'oastr#& %n acest caz& operai modific#rile adec'ate la notele care urmeaz#$
)re*uie s# '# asigurai c# cgi-*in nu se afl# %n interiorul ar*orelui de documente 4pacCe& astfel %nc7t scripturile
din cadrul s#u s# nu poat# fi solicitate su* form# de te1t simplu$ 4ceasta este o m#sur# de precauie$ Qu dorii ca
programe client r#u intenionate s# '# e1amineze scripturile %n c#utarea unor *re2e de securitate& prin ,aspirarea0
te1tului scripturilor si studierea acestuia$
Pentru a instala un script FR+ %n 'ederea utiliz#rii cu ser'erul 4pacCe& inserai-? %n catalogul cgi-*in& dup# care
transferai dreptul de proprietate a fi2ierului c#tre utilizatorul pentru care ruleaz# ser'erul 4pacCe 2i modificai-i
modul astfel %nc7t s# fie e1ecuta*il 2i s# poat# fi citit numai de c#tr$e acel utilizator$ -e e1emplu& dac# ser'erul
4pacCe ruleaz# ca un utilizator cu numele 333& folosii urm#toarele comenzi8
N cCo3n 333 numescript
N cCmod 500 numescript Pro*a*il c# 'a tre*ui s# rulai aceste comenzi ca 333 sau ca root$ -ac# nu a'ei
permisiunea de a instala scripturi %n catalogul cgi-*in& putei cere administratorului de sistem si i efectueze
aceast# operaie %n numele dumnea'oastr#$
-up# ce scriptul a fost instalat& %l putei solicita din *ro3serul dumnea'oastr# e1pediindY ser'erului /e* adresa
U(L adec'at#& %n mod caracteristic& adresa U(L se prezint# astfel8$\
Cttp8<? numele$gazdei$d'<cgi-*inlnumescript
Solicitarea scriptului din *ro3serul dumnea'oastr# de /e* determin# e1ecuia acest de c#tre ser'erul /e*$
-atele de ie2ire ale scriptului '# sunt trimise %napoi& iar rezultat apare ca o pagin# /e* %n *ro3serul
dumnea'oastr#$
-ac# dorii s# folosii scripturi FR+ cu modperl pentru a o*ine performane mai *unel iat# ce a'ei de f#cut8
Fapitolul X +nterfaa 4P+ pentru Perl -.+ 355
?$ Berificai dac# dispunei cel puin de urm#toarele 'ersiuni ale programelor necesare8 Perl 5$00U& FR+$pm S$3]
2i modY-erl ?$0X$
S$ 4sigurai-'# c# modperl este compilat %n e1ecuta*ilul dumnea'oastr# 4pacCe$
3$ Fonfigurai un catalog pentru stocarea scripturilor$ ;u folosesc <usr<local<apacCe<cgi-perl$ Fatalogul cgi-perl
nu tre*uie s# se afle %n interiorul ar*orelui de documente al ser'erului dumnea'oastr# 4pacCe& din acelea2i
moti'e de securitate ca 2i catalogul cgi-*in$
U$ Ferei ser'erului 4pacCe s# asocieze scripturile care se g#sesc %n catalogul cgi-perl cu modperl8
4lias <cgi-perl< <usr<local<apacCe<cgi-perl
9Location <cgi-perl:
Set5andler perl-script
Perl5andler 4pacCe88(egistry
=ptions ;1ecFR+ 9<Location:
-ac# folosii o 'ersiune curent# a ser'erului 4pacCe care utilizeaz# un singur fi2ier de configurare& plasai toate
aceste directi'e %n fi2ierul Cttpd$conf$ -ac# 'ersiunea dumnea'oastr# de 4pacCe folose2te a*ordarea mai 'ecCe
cu trei fi2iere pentru informaia de configurare& plasai directi'a 4lias %n fi2ierul srm$conf& respecti' liniile
Location %n fi2ierul access$conf$
Qu acti'ai directi'ele modperl& PerlSend5eader sau PerlSetup;n' pentru catalogul cgi-perl$ 4cestea sunt
manipulate automat de FR+$pm& iar acti'area lor poate induce conflicte de prelucrare$
4dresa U(L a unui script mod-perl este similar# cu aceea a unui script FR+ standard$ Singura diferen# este
aceea c# specificai cgi-perl %n loc de cgi-*in8
Cttp8<<numele$gazdei$ d'<cgi-perl<numescript
Pentru mai multe informaii& 'izitai regiunea modperl a sitului /e* 4pacl e& de la urm#toarea adres#8
Cttp8<<perl<apacCe<org<
= scurt# introducere %n FR+$pm
Pentru a scrie un script Perl care folose2te modulul FR+$pm& plasai o linie use l7ng# %nceputul scriptului& apoi
creai un o*iect FR+ care '# ofer# acces la metodele si 'aria*ilele modulului FR+$pm8
use FR+E
my !Jcgi" K ne3 FR+E
Scripturile noastre FR+ folosesc caracteristicile modulului FR+$pm prin in'ocarea metodelor utiliz7nd 'aria*ila
Jcgi$ -e e1emplu& pentru a genera un titlu de ni'el l& 'om folosi metoda C? !" astfel8
prin Jcgi-:C? !0)itlul meu0"E
35] Partea a ll-a Utitizarea interfeelor de programare ale sistemului MySQL
-e asemenea& FR+$pm accept# un stil de utilizare care '# permite s#-i apelai& metodele ca funcii& f#r#
construcia iniial# Jcgi-:$ Qu folosesc aici sinta1a respecti'#& deoarece notaia Jcgi-: este mai asem#n#toare cu
modul de utilizare a modulului -.+& precum 2i $ deoarece %mpiedic# apariia unor conflicte %ntre numele
funciilor din modulul FR+$pm 2i numele oric#ror altor funcii pe care +e definii$
Berificarea parametrilor de intrare 2i scrierea datelor de ie2ire
Una dintre operaiile pe care FR+$pm le e1ecut# automat este tratarea tuturor detaliilor ,ur7te0 implicate %n
colectarea informaiilor de intrare furnizate de ser'erul /e* scrip-tului dumnea'oastr#$ Pentru a o*ine acele
informaii& tot ce a'ei de f#cut este s# in'ocai metoda pa r am !"$ Putei o*ine numele tuturor parametrilor
disponi*ili astfel8
my !^param" K Jcgi-:param !"E Pentru a reg#si 'aloarea unui anumit parametru& denumii parametrul care '#
intereseaz#8
if !TJcgi-:param !0parametrul6neu0""
prin 0parametrul6neu nu este configuratDn0 E
else
printf 0Baloarea parametrului parametrul6neu8 NsDn0& Jcgi-:param !0parametrul6neu0"E
-e asemenea& FR+$pm furnizeaz# metode pentru generarea datelor de ie2ire care tre*uie trimise *ro3serului
client$ S# consider#m urm#torul document 5)ML8
95)ML:
95;4-:
9)+)L;:)itlul paginii mele9<)+)L;:
9<5;4-:
9.=->:
95?:)itlu de ni'el ?9<5?:
9P:Paragraf ?$
9P:Paragraf S$ @ N
9<.=->:
9<5)ML: 4cest program folose2te Jcgi pentru a produce un document ecCi'alent8
prin Jcgi-:Ceader !"E
prin Jcgi-:startCtnrl !-title K: 0)itlul paginii mele0"E
prin Jcgi-:C? !04ntetul paginii mele0"E
prin Jcgi-:p !"E
prin 0Paragraf ?$Dn0E
prin Jcgi-:p !"E
prin 0Paragraf S$Dn0E
prin Jcgi-:endCtml !"E
FapitolulG +nterfaa 4P+ pentru Perl -.+ 35X
Unul dintre a'anta6ele utiliz#rii modulului FRLpm pentru generarea datelor de ie2ire %n loc de a scrie personal
cod 5)ML *rut sunt acelea c# putei g7ndi %n unit#i logice& nu folosind eticCete indi'iduale de marcare& iar
codul dumnea'oastr# 5)ML are mai puine 2anse de a conine erori$ !Moti'ul pentru care am spus c# ,are mai
puine 2anse0 este acela c# FR+$pm nu '# 'a %mpiedica s# facei lucruri *izare& cum ar fi includerea unei liste
%ntr-un titlu$" -e asemenea& pentru te1tele !altele dec7t eticCetele" pe care le scriei& FR+$pm furnizeaz#
modificarea automat# a semnificaiei unor caractere !escaping" precum 9 sau :& care sunt speciale pentru 5)ML$
Utilizarea metodelor modulului FR+$pm de generare a datelor de ie2ire nu '# %mpiedic# s# scriei personal cod
5)ML *rut& dac# dorii$ Putei com*ina cele dou# metode& com*in7nd apelurile la metodele FR+$pm cu
instruciuni de afi2are care genereaz# eticCete literale$
Modificarea automat# a semnificaiei te1telor 5)ML si U(L
-ac# scriei te1te - diferite de te1tele eticCetelor - cu a6utorul mefoddor FR+$pm& precum startCtml!" sau ti? !"&
programul modific# automat semnificaia caracterelor speciale din te1t$ -e e1emplu& dac# generai un titlu
folosind urm#toarea instruciune& caracterul O din te1tul titlului 'a fi con'ertit %n OampE de c#tre FR+$pm8
prin Jcgi-:st7rtCtml H-title K: 04& . O F0"E
-ac# scriei te1te - altele dec7t te1tele eticCetelor - f#r# a folosi metoda modulului FR+$pm de generare a datelor
de ie2ire& pro*a*il c# tre*uie s# le trecei mai %nt7i prin funcia escape5)ML!"& pentru a '# asigura c#
semnificaia tuturor caracterelor speciale a fost modificat# %n mod corespunz#tor$ 4cest fapt este de asemenea
ade'#rat atunci c7nd construii adrese U(L care pot conine caraPtere speciale& de2i& %n acest caz& tre*uie s#
folosii %n scCim* metoda escape !"$ ;ste important s# folosii metoda de codare adec'at#& deoarece fiecare
metod# trateaz# diferite seturi de caractere drept caractere speciale si codific# acele caractere speciale folosind
formate care difer# unele de altele$ S# lu#m %n considerare urm#torul script Perl scurt8
LT <usr<*in<perl
use FR+E
Jcgi K ne3 FR+E
Js K 019K y& corectG0E
prin Jcgi-:escape5)ML !Js" $0Dn0E
prin Jcgi-:escape !Js" $0Dn0E
L codificare pentru
L utilizare ca te1t 5)ML
L codificare pentru
L utilizare intr-un U(L
-ac# rulai acest script& 'a produce urm#toarele date de ie2ire& de unde putei o*ser'a c# procedeul de codificare
pentru te1tul 5)ML nu este acela2i ca %n c#zuT adreselor U(L8
1OltEKy& corectG
1N3FN3-yNSFNS0corectN3F
35[ Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL Scrierea paginilor cu utiliz#ri
multiple
Unul din principalele moti'e pentru scrierea scripturilor *azate pe /e* care genereaz# cod 5)ML& %n loc de a
scrie documente 5)ML statice& este acela c# un script poate produce diferite categorii de pagini& %n funcie de
modul %n care este in'ocat$ )oate scripturile FR+ pe care le 'om scrie au aceast# proprietate$ Fiecare din aceste
scripturi funcioneaz# astfel8
?$ F7nd solicitai pentru prima dat# scriptul de la *ro3serul dumnea'oastr#& acesta genereaz# o pagin# iniial#&
care '# permite s# selectai tipul de informaie dorit$
S$ F7nd efectuai o selecie& scriptul este re-in'ocat& dar de data aceasta reg#se2te 2i afi2eaz# %ntr-o a doua pagin#
informaiile specifice pe care le-ai solicitat$
Principala pro*lem#& %n acest caz& este c# dorii ca selecia pe care o efectuai din prima pagin# s# determine
coninutul celei de-a doua pagini& dar& %n mod normal& paginile /e* sunt independente unele de altele& dac# nu
realizai unele aran6amente speciale$ )rucul este de a determina scriptul s# genereze pagini care atri*uie unui
parametru o 'aloare care indic# urm#toarei in'oc#ri a scriptului ceea ce dorii$ F7nd in'ocai scriptul pentru
prima dat#& parametrul nu are nici o 'aloareE acest fapt indic# scriptului s# prezinte pagina sa iniial#$ F7nd
indicai informaiile pe care dorii s# le 'edei& pagina in'oc# din nou scriptul& dar cu parametrul configurat la o
'aloare care indic# scriptului ce are de f#cut$
;1ist# diferite moduri de transfer al instruciunilor de la o pagin# %napoi la un script$ = modalitate este de a
furniza utilizatorului un formular pe care acesta s#-? completeze$ F7nd utilizatorul trimite formularul& coninutul
formularului este trimis ser'erului /e*$ Ser'erul transmite informaiile scriptului& care poate afla datele trimise
de utilizator in'oc7nd metoda param !"$ 4stfel 'om proceda pentru cel de-al treilea script FR+ al nostru !cel care
per- @ mite utilizatorului s# introduc# un cu'7nt cCeie pentru a c#uta %n catalogul Ligii istorice"$ D
Un alt mod de specificare a instruciunilor c#tre un script este de a transfera informaiile l ca parte a adresei U(L
pe care o trimitei ser'erului /e* atunci c7nd solicitai scriptul$ \ 4stfel 'om proceda pentru scripturile de
na'igare %n ta*elele din *aza de date sampd*& Y respecti' de na'igare prin ta*elele cu puncta6e$ 4ceast# metod#
se *azeaz# pe faptul c# l scriptul genereaz# o pagin# care conine Ciperleg#turi$ Prin selectarea unei leg#turi se l
in'oc# din nou scriptul& dar se specific# o 'aloare a parametrului care indic# scriptului ce V are de f#cut& %n
scCim*& scriptul se in'oc# singur %n diferite moduri& pentru a furniza l diferite categorii de rezultate& %n funcie de
leg#tura pe care o selecteaz# utilizatorul$ l
Un script %2i poate permite s# se auto-in'oce e1pediind *ro3serului o pagin# care conine l o Ciperleg#tur# spre
propriul s#u U(L$ -e e1emplu& un script denumit scriptul6neu Y poate scrie o pagin# care s# conin# aceast#
leg#tur#8 i
94 5(;FK0<cgi-*in<scriptulmeu0:Flic pe mineT9<4: Y
F7nd utilizatorul e1ecut# clic pe te1tul ,Flic pe mineT0& *ro3serul utilizatorului trimitf i o cerere pentru
scriptul6neu %napoi la ser'erul /e*$ -esigur& aceast# aciune nu 'a f#cea dec7t s# determine scriptul s# trimit#
din nou aceea2i pagin#& deoarece nu au fost furnizatesl alte informaii$ )otu2i& dac# ata2ai un parametru la U(L&
acel parametru este trimis %napoiT ser'erului /e* atunci c7nd utilizatorul selecteaz# leg#tura$ Ser'erul in'oc#
scriptul& iaifl scriptul poate apela funcia param !" pentru a detecta c# parametrul a fost configurat sil poate
%ntreprinde o aciune %n funcie de 'aloarea parametrului$ m
Fapitolul X +nterfaa 4P+ pentru Perl -.+ 35Z
Pentru a ata2a un parametru la sf7r2itul adresei U(L& ad#ugai un caracter G urmat de o perecCe nume-'aloare$
Pentru a ata2a mai muli parametri& separai-i prin caractere O$ -e e1emplu8
<cgi-*in<scriptulmeuGnumeK'aloare
<cgi-*in<scriptulmeuGnumeK'aloareOnumeSK'aloareS
Pentru a construi o adres# U(L cu parametri ata2ai care face referire la sine %ns#2i& un script FR+ tre*uie s#
%nceap# prin a apela metoda scriptnane !" pentru a-si o*ine propriul U(L& iar apoi tre*uie s# ata2eze parametri
la adres#& astfel8
Jurl K Jcgi-:scriptname !"E L o*ine U(L pentru script
Jurl $K 0GnumeK'aloare0E L adaug# primul parametru
Jurl $K 0OnumeSK'aloareS0E L adaug# al doilea parametru
-up# ce adresa U(L a fost construit#& putei genera o eticCet# de Ciperleg#tur# 94: care conine adresa& folosind
metoda a!" a modulului FR+$pm8
prin Jcgi-:a !H_Cref K: JurlI& 0Flic pe minei0"E
Pentru a 'edea mai limpede care este modul de funcionare al acestei metode& 'om e1amina un scurt script FR+$
F7nd este in'ocat pentru prima dat#& scriptul urm#tor& denumit f lipf lop& prezint# o pagin# denumit# Pagina 4&
care conine o singur# Ciperleg#tur#$ Prin selectarea leg#turii scriptul 'a fi in'ocat din nou& dar parametrul pagina
este astfel configurat %nc7t %i indic# s# afi2eze pagina .$ `i pagina . conine o leg#tur# cu scriptul& dar f#r# nici o
'aloare pentru parametrul pagina$ Fa atare& selectarea leg#turii %n pagina . determin# afi2area din nou a paginii
iniiale$ +n'oc#rile ulterioare ale scriptului determin# afi2area alternati'# a paginilor 4 si .$
use FR+E
my !Jcgi" K ne3 FR+E
my !Jurl" K Jcgi-:scriptname !"E L propriul U(L al acestui script
print Jcgi-:Ceader !"E
if !Jcgi-:param !0pagina0" ne 0*0" L afi2eaz# pagina 4
print Jcgi-:startCtml !-title K: 0Flip-Flop8 Pagina 40"E prin 04ceasta este pagina 4$9.(:Pentru a selecta
pagina .& 0E Jurl $K 0GpaginaK*0E L ata2eaz# parametrul
L pentru a selecta pagina . print Jcgi-:a !H-Cref K: JurlI& 0clic aici0"E
else L afi2eaz# pagina .
print Jcgi-:startCtml !-title K: 0Flip-Flop8 Pagina .0"E prin 04ceasta este pagina .$9.(:Pentru a selecta
pagina 4& 0E print Jcgi-:a !H-Cref K: JurlI& 0clic aici0"E
prin Jcgi-:endCtml!"E
3]0 Partea a +t-a Utilizarea interfeelor de programare ale sistemului MySQL
-ac# apare %nc# un client care solicit# scriptul f lipf lop& 'a fi prezentat# pagina iniial#& deoarece diferitele
*ro3sere ale clienilor nu interacioneaz# unele cu altele$
Baloarea 'aria*ilei Jurl a fost configurat# %ntr-o manier# destul de ,ca'alereasc#0 %n e1emplele precedente$ ;ste
prefera*il s# folosii metoda escape !" pentru a codifica numele 2i 'alorile parametrilor dumnea'oastr# atunci
c7nd le ata2ai la un U(L& %n cazul %n care conin caractere speciale$ +at# o modalitate mai *un# de a construi un
U(L cu parametri ata2ai8
L o*ine U(L pentru script
L adaug# primul parametru Jcgi-:escape !0'aloare0""E
L adaug# al doilea parametru
Jurl K Jcgi-:scriptname !" Jurl $K sprintf !0GNsKNs0&
Jcgi-:escape !0nume0"& Jurl $K sprintf !0ONsKNs0&
Jcgi-:escape !0numeS0"& Jcgi-:escape !0'aloareS0""E
Fonectarea la ser'erul MySQL din scripturile /e*
Scripturile %n linie de comand# pe care le-am prezentat %n seciunea anterioar#& ,Utilizarea -.+0& foloseau un
pream*ul identic pentru sta*ilirea unei cone1iuni cu ser'erul MySQL$ Scripturile noastre FR+ parta6eaz# si ele o
anumit# parte de program& %ns# puin diferit#8
use -.+E
use FR+E
use strictE
L )oi parametrii de cone1iune presta*ilii lipsesc
my !JCostname& Jusername& Jpass3ord" K !undef& undef& undef"E my !d*name" K 0sampd*0E
L construie2te sursa de date
my !Jdsn" K 0-.+8mysPl8Jd*name0E
Jdsn $K 08CostnameKJCostname0 if JCostnameE
Jdsn $K 0EmysPlreaddefaultfileK<usr<local<apacCe<conf<sampd*$cnf0E
L conectare la ser'er
my !Nattr" K ! (aise;rror K ? "E
my !Jd*C" K -.+-:connect !Jdsn& Jusername& Spass3ord& DNattr"E 4cest pream*ul difer# de cel folosit
pentru scripturile %n linie de comand# din urm#- 6 toarele moti'e8
@ 4cum& prima seciune conine o instruciune use FR+$
@ Qu mai analiz#m argumentele din linia de comand#$
@ Programul caut# parametrii de cone1iune %ntr-un fi2ier cu opiuni& dar nu folose2te fi2ie
$ my$ cnf din catalogul de *az# al utilizatorului care ruleaz# scriptul !cu alte cu'inte& cata6 logul de *az# al
utilizatorului ser'erului /e*"$ Ser'erul /e* poate rula scripturi pent o*inerea accesului la alte *aze de date si
nu a'em nici un moti' s# presupunem c#
Fapitolul X +nterfaa 4P+ pentru Perl -.+ 3]?
acele scripturi 'or folosi aceia2i parametri de cone1iune& %n scCim*& 'om e1amina fi2ierul cu opiuni stocat %ntr-o
alt# locaie !<usr<local<apacCe<conf <sampd*$cnf"$ -ac# dorii s# folosii un alt fi2ier& modificai calea de acces la
fi2ierul cu opiuni$
Scripturile in'ocate printr-un ser'er /e* ruleaz# ca utilizator al ser'erului /e*& nu ca dumnea'oastr# personal$
4cest fapt ridic# unele pro*leme de securitate& deoarece dumnea'oastr# pierdei controlul dup# ce acesta este
preluat de ser'erul /e*$ )re*uie s# atri*uii proprietatea asupra fi2ierului cu opiuni utilizatorului %n numele
c#ruia ruleaz# ser'erul /e* !poate 333& nimeni sau altcine'a similar" si s# configurai modul la 'aloarea U00
sau ]00& astfel %nc7t nici un alt utilizator s# nu-l mai poat# citi$ -in p#cate& fi2ierul poate fi totu2i citit de orice
persoan# care poate instala un script ce 'a fi e1ecutat de ser'erul /e*$ )ot ce are de f#cut respecti'ul este s#
scrie un script care descCide %n mod e1plicit fi2ierul cu opiuni si %i afi2eaz# coninutul %ntr-o pagin# /e*$
-eoarece scriptul persoanei respecti'e ruleaz# ca utilizator al ser'erului /e*& 'a a'ea permisiuni complete de
citire a fi2ierului$
-in acest rnoti'& este prudent s# creai un utilizator MySQL care are pri'ilegii numai de citire !S;L;F)" asupra
*azei de date sampd*& apoi menionai %n fi2ierul sampd*$cnf numele 2i parola utilizatorului respecti'& nu pe
acelea ale dumnea'oastr#$ 4stfel& nu riscai s# permitei scripturilor s# se conecteze la *aza dumnea'oastr# de
date ca utilizator care are permisiunea de a modifica ta*elele din *aza de date respecti'#$ Fapitolul ??&
,4dministrarea general# a sistemului MySQL0& e1pune modul de creare a unui cont de utilizator MySQL cu
pri'ilegii limitate$
4lternati'& putei aran6a ca e1ecuia scripturilor s# ai*# loc prin mecanismul su;b;F din 4pacCe$ 4cesta '#
permite s# e1ecutai un script ca un anumit utilizator de %ncredere& dup# care scrie scriptul pentru a o*ine
parametrii de cone1iune dintr-un fi2ier cu opiuni care poate fi citit numai de c#tre utilizatorul respecti'$ Putei
proceda astfel cu scripturile care necesit# acces de scriere la *aza de date& de e1emplu$
= alt# metod# const# %n a scrie un script care s# solicite un nume de utilizator 2i o parol# de la utilizatorul
clientului& respecti' s# foloseasc# aceste 'alori pentru a sta*ili o cone1iune cu ser'erul MySQL$ 4ceast# soluie
este mai adec'at# pentru scripturi pe care le creai %n scopuri administrati'e dec7t pentru scripturile de uz
general& %n orice caz& reinei c# unele metode de solicitare a numelui 2i a parolei pot fi atacate de orice persoan#
care poate insera un program de spiona6 !%n original sniffer - Q$)$" %n reea %ntre dumnea'oastr# 2i ser'er$
42a cum '-ai dat seama din paragrafele anterioare& securitatea scripturilor /e* poate fi un aspect delicat$
Fategoric& constituie un su*iect despre care tre*uie s# citii mai mult& deoarece este un su*iect de mare
an'ergur#& care nu poate fi tratat aici dup# cum o merit#$ Putei %ncepe cu materialul dedicat securit#ii din
manualul 4pacCe$ -e asemenea& este util# seciunea cu %ntre*#ri frec'ente !F4Q" despre /e*& de la adresa8
Cttp8<<333$33$org<Security<FaP<
3]S Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Un *ro3ser pentru *aza de date sampd*
Pentru prima noastr# aplicaie *azat# pe /e*& 'om crea un script simplu - denumit samp*ro3se - care '#
permite s# 'edei care sunt ta*elele din *aza de date sampd*& precum 2i s# e1aminai %n mod interacti'
coninutul acestor ta*ele din *ro3serul dumnea'oastr# de /e*$ Scriptul samp66ro3se funcioneaz# astfel8
@ F7nd solicitai pentru prima dat# samp*ro3se de la *ro3serul dumnea'oastr#& acesta se conecteaz# la ser'erul
MySQL& reg#se2te o list# cu ta*elele din *aza de date sampd* 2i trimite *ro3serului o pagin# %n care fiecare
ta*el este prezentat su* forma unei leg#turi pe care o putei selecta$ F7nd selectai numele unui ta*el din aceast#
pagin#& *ro3serul dumnea'oastr# trimite o cerere ser'erului /e*& solicit7nd scriptului samp*ro3se s# afi2eze
coninutul acelui ta*el$
@ -ac# samp*ro3se prime2te un nume de ta*el de la ser'erul /e* atunci c7nd este in'ocat& reg#se2te coninutul
ta*elului respecti' 2i prezint# informaiile *ro3serului dumnea'oastr# /e*$ )itlul fiec#rei coloane de date este
numele coloanei din ta*el$ )itlurile sunt prezentate su* form# de leg#turiE dac# selectai una din ele& *ro3serul
dumnea'oastr# trimite o cerere ser'erului /e* pentru a afi2a acela2i ta*el& dar ta*elul 'a fi acum sortat %n funcie
de coloana pe care ai selectat-o$
Un a'ertisment8 ta*elele din *aza de date sampd* sunt relati' mici& deci trimiterea %ntregului coninut al unui
ta*el c#tre *ro3serul dumnea'oastr# nu reprezint# o pro*lem#$ -ac# editai sampd* astfel %nc7t s# afi2eze
ta*ele dintr-o alt# *az# de date& care conine ta*ele mari& tre*uie s# luai %n considerare ad#ugarea unei clauze
L+M+) la instruciunile de reg#sire a r7ndurilor$
%n corpul principal al scriptului samp*ro3se& cre#m o*iectul FR+ 2i scriem partea iniial# a paginii /e*$ 4poi&
'erific#m dac# tre*uie sau nu s# afi2#m un anumit ta*el& %n funcie de 'aloarea parametrului nume6ta*el8 my
!Jcgi" K ne3 FR+E
L scrie partea iniiala a paginii
my !Stitlu" K 0Jd*name *ro3ser de *aze de date0E prin Jcgi-:Ceader !"E
print Jcgi-:startCtml !-title K: Jtitlu"E prin Jcgi-:C? !Jtitle"E
L parametri de c#utat in U(L
my !Jnumeta*el" K Jcgi-:param !0nume6ta*el0"E
my !Jcoloanasortare" K Jcgi-:param !0coloanasortare0"E
L daca Jnumeta*el nu are nici o 'aloare& afi2eaz# o lista
L cu ta*ele pe care se poate e1ecuta clic$ 4ltfel& afi2eaz#
L coninutul ta*elului dat$ Parametrul Jnumecoloana& daca
L are o 'aloare& arata coloana in funcie de care se 'a sorta& if !TJnumeta*el"
Fapitolul X +nterfaa 4P+ pentru Perl -.+ 3]3
afiseazalistata*ele!" I else
H
afiseazata*el !Jnumeta*el& Jcoloanasortare"E I prin Jcgi-:endCtml !"E
;ste u2or de aflat 'aloarea unui parametru& deoarece FR+$pm e1ecut# toate operaiile de determinare a
informaiilor pe care ser'erul /e* le transmite scriptului$ )re*uie numai s# apel#m funcia param !" cu numele
parametrului care ne intereseaz#& %n corpul principal al scriptului samp*ro3se& parametrul respecti' este
numeta*el$ -ac# parametrul nu este definit sau este 'id& aceasta este in'ocarea iniial# a scriptului si se afi2eaz#
lista cu ta*ele& %n caz contrar& se afi2eaz# coninutul ta*elului desemnat de parametrul numeta*el& sortat %n
funcie de 'alorile din coloana determinat# de parametrul coloanasortare$ -up# afi2area informaiilor adec'ate&
apel#m funcia endCtml!" pentru a insera eticCetele 5)ML de %ncCidere$
Funcia afiseazalistata*ele!" genereaz# pagina iniial#$ Funcia afiseazalistata-*ele !" reg#se2te lista cu ta*ele
si scrie un ta*el 5)ML cu o singur# coloan#& care conine %n fiecare celul# numele unui ta*el din *aza de date8
su* afiseazalist7ta*ele
H
my !Jaryref& Jurl"E
prin 0Selectai un ta*el e1ecut7nd clic pe numele lui89.(:9.(:Dn0E
L reg#se2te referina la un ta*lou dintr-o singura coloana&
L alc#tuit din numele ta*elelor
Jaryref K Jd*C-:selectcolarrayref !PPH S5=/ )4.L;S F(=M Jd*name I"E
L afi2eaz# ta*elul cu un cCenar prin 09)4.L; .=(-;(:Dn0E prin 09)(:Dn0E
afiseazacelula !0)50& 0Qunele ta*elului0& ?"E
prin 09<)(:Dn0E
foreacC my Jnumeta*el !^HJaryref:"
H
Jurl K Jcgi-:scriptname !"E
Jurl $K sprintf !0Gnumeta*elKNs0& Jcgi-:escape !Jnumeta*el""E
prin 09)(:Dn0E
afiseazacelula !0)-0& Jcgi-:a !H-Cref K: JurlI& Jnumeta*el"& 0"E
prin W9<)(:Dn0E
I
prin 09<)4.L;:Dn0E
3]U Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Pagina generat# de funcia afiseazalistata*ele!" conine leg#turi care se prezint# astfel8
<cgi-*in<samp*ro3seGnumeta*el K a*sente
<cgi-*in<samp*ro3seGnumeta*el K e'eniment
<cgi-*in<samp*ro3seGnumeta*el K mem*ru
-ac# parametrul numeta*el are o 'aloare atunci c7nd este in'ocat scriptul samp*ro3se& scriptul transfer#
'aloarea funciei afiseazata*el!"& al#turi de numele coloanei %n funcie de care se 'or sorta rezultatele$ -ac# nu
este specificat# nici o coloan#& sortarea se 'a efectua %n funcie de prima coloan# !putem face referire la coloane
dup# poziia acestora& deci aceast# operaie se poate e1ecuta u2or folosind o clauz# =(-;( .> ? "8 su*
afiseazata*el!"
H
my !Jnumeta*el& Jcoloanasortare" K eE
my !JstC& Jurl"E
L daca nu este specificata coloana de sortare&
L folose2te prima coloana Jcoloanasortare K 0?0 unless JcoloanasortareE
L prezint# o leg#tura care readuce utilizatorul la
L pagina cu lista ta*elelor
print Jcgi-:a !H-Cref K: Jcgi-:scriptname !"I& 04fi2eaz# lista cu ta*ele0"E prin 09.(:9.(:Dn0E
JstC K Jd*C-:prepare !PPH
S;L;F) A F(=M Jnumeta*el =(-;( .> Jcoloanasortare
JstC-:e1ecute!" E
prin 09.: Foninutul ta*elului Jnumeta*el89<.:9.(:Dn0 E
L afi2eaz# ta*elul cu un cCenar prin 09)4.L; .=(-;(:Dn0E
L folose2te numele coloanelor pentru capetele de ta*elE
L transforma fiecare cap#t de ta*el intr-o leg#tura& care
L sorteaz# datele in funcie de coloana corespunz#toare prin 09)(:Dn0E
foreacC my Jnumecoloana !^HJstC-:HQ4M;I:"
H
Jurl K Jcgi-:scriptname !"E
Jurl $K sprintf !0Gnumeta*elKNs0 & Jcgi-:escape !Jnumeta*el""E
Jurl $K sprintf ! 0 OcoloanasortareKNs 0 & Jcgi-:escape !Jnumecoloana""E
Sa6ll6ygig6i6ai
FaprtoCil X +nterfaa 4P+ pentru Perl -.+ 3]5
afiseazacelula !0)50& Jcgi-:a !H-Cref K: JurlI& Jnumecoloana"& 0"E I print 09<)(:Dn0E
L afi2eaz# r7ndurile din ta*el
3Cile !my ^ary K JstC-:fetcCro3array!""
H
print 09)(:Dn0E
foreacC my J'al !^ary"
H
afiseazacelula !0)-0& J'al& ?"E
I
print 09<)(:Dn0E
JstC-:finisC !"E print 09<)4.L;:Dn0E
= pagin# de afi2are a ta*elelor asociaz# capetele de coloan# cu leg#turile care determin# afi2area din nou a
ta*eluluiE aceste Mg#turi includ un parametru Jcoloanasortare& care specific# %n mod e1plicit coloana %n funcie
de care se 'a efectua sortarea$ -e e1emplu& pentru o pagin# care afi2eaz# coninutul ta*elului e'eniment&
leg#turile de tip cap de coloan# se prezint# astfel8
<cgi-*in<samp*ro3seGnumeta*el G e'enimentOcoloanasortareKdata <cgi-*in<samp*ro3seGnumeta*el K
e'enimentOcoloanasortareKtip <cgi-*in<samp*ro3seGnumeta*el K
e'enimentOcoloanasortareKe'enimentid 4t7t af iseazalistata*el!"&& c7t 2i af iseazata*el!" folosesc funcia
af iseazacelu-la !"& o funcie utilitar# care afi2eaz# o 'aloare su* forma unei celule %ntr-un ta*el 5)ML$ 4ceast#
funcie folose2te un mic truc& prin care transform# 'alorile 'ide %ntr-un spaiu ne%ntrerupti*il !On*spE"& deoarece&
%ntr-un ta*el cu cCenar& celulele 'ide nu afi2eaz# cCenarele %n mod adec'at$ +nseria %n celul# a unui spaiu
ne%ntrerupti*il rezol'# pro*lema& af iseazacelula!" mai preia un al treilea parametru& care controleaz#
codificarea sau nu a 'alorii din celuia$ 4cest lucru este necesar deoarece afiseazacelula!" este apelat# pentru a
afi2a unele 'alori din celule care au fost de6a codificate& cum ar fi capetele de coloan# care conin informaii
despre U(L$
L afi2eaz# o 'aloare in celula unui ta*elE insereaz# spatii l L neintreruptiteile in celulele 0'ide0 pentru a
permite afi2area cCenarelor
l su*
+ my
su* afi2eaz# celula
my !JeticCeta& J'aloare& Jcodare" K ^E
Fontinuare
3]] Partea a ??-a Utilizarea interfeelor de programare ale sistemului MySQL
Fontinuare
J'aloare K Jcgi-:escape5)ML !J'aloare" if JcodareE
J'aloare K 0On*spE0 unless S'aloareE
prin 09JeticCetaJ'aloare<JeticCeta:Dn0E I
-ac# dorii s# scriei un script mai general& putei modifica scriptul samp*ro3se astfel %nc7t s# parcurg# mai
multe *aze de date$ -e e1emplu& scriptul poate %ncepe prin a afi2a o list# cu *azele de date din ser'er& nu o lista
cu ta*ele dintr-o anumit# *az# de date$ 4poi& putei alege o *az# de date pentru a o*ine o list# a ta*elelor sale 2i
putei continua %ncep7nd din acest punct$
.ro3serul de parcurgere a puncta6elor
din cadrul proiectului de e'iden# a rezultatelor 2colare
-e fiecare data c7nd introducem puncta6ele o*inute la un test& tre*uie s# gener#m o list# ordonat# cu puncta6e&
astfel %nc7t s# putem determina cur*a de notare 2i s# putem atri*ui note literale$ (einei c# nu 'om face dec7t s#
afi2#m aceast# list#& pentru a determina unde se g#se2te limita de acordare a fiec#rei note literale$ 4poi& 'om
trece notele pe lucr#rile ele'ilor %nainte de a le %napoia acestora$ Qu 'om %nregistra notele ele'ilor %n *aza de
date& deoarece notele de la sf7r2itul perioadei de e1aminare se *azeaz# pe puncta6e numerice& nu pe note literale$
Mai reinei c#& %ntr-un sens strict& tre*uie s# dispunem de o modalitate de a introduce puncta6ele %nainte de a crea
o metod# de a le reg#si$ 4m l#sat scriptul pentru introducerea puncta6elor %n capitolul urm#tor& %ntre timp& de6a
a'em %n *aza de date numeroase seturi de puncta6e& %nc# din prima parte a perioadei de e1aminare$ Qe putem
folosi scriptul cu aceste puncta6e& cCiar %n a*sena unei metode con'ena*ile de introducere a puncta6ului$
Scriptul nostru de parcurgere a puncta6elor& score*ro3se& prezint# unele asem#n#ri cu samp*ro3se& dar este
destinat scopului mai concret de e1aminare a puncta6elor pentru un test sau pentru un cCestionar dat$ Pagina
iniial# prezint# o list# a posi*ilelor e'enia mente de e1aminare din care se poate alege 2i permite utilizatorului s#
%l selecteze pe oricare dintre acestea& pentru a 'edea puncta6ele asociate e'enimentului$ Puncta6ele pentru un
e'eniment dat sunt sortate %n funcie de 'aloare& %n ordine descresc#toare& deci putei 6 afi2a rezultatul 2i %l putei
folosi pentru a determina cur*a de notare$
Scriptul score*ro3se tre*uie s# e1amineze un singur parametru& 2i anume e'eni-Y mentid& pentru a determina
dac# a fost specificat sau nu un anumit e'eniment$ -ac# nu&f score*ro3se afi2eaz# r7ndurile ta*elului
e'eniment& astfel %nc7t utilizatorul s# poat#l selecta un e'eniment& %n caz contrar& afi2eaz# puncta6ele asociate
e'enimentului ales8
L parametrul care ne indica e'enimentul pentru care
L tre*uie afi2ate puncta6ele
my !Je'enimentid" K Jcgi-param !0e'enimentid0"E
L daca e'enimentid are o 'aloare& afi2eaz# lista cu e'enimenteE
L altfel& afi2eaz# puncta6ele pentru e'enimentul dat$
Fapitolul X +nterfaa 4P+ pentru Perl -.+ 3]X
if ! TJe'enimentid"
H
afiseazae'enimente !"
I
else
H
afiseazapuncta6e !Je'enimentid" E
I
Funcia afiseazae'enimente!" e1trage informaii din ta*elul e'eniment 2i le afi2eaz# %n form# ta*elar#& folosind
numele coloanelor din interogare drept capete de coloan# pentru ta*el& %n cadrul fiec#rui r7nd& 'aloarea
e'enimentid este afi2at# su* forma unei leg#turi care poate fi selectat# pentru a declan2a o interogare care
reg#se2te puncta6ele corespunz#toare e'enimentului$ 4dresa U(L pentru fiecare e'eniment este pur si simplu
calea de acces spre scriptul score*ro3se& la care este ata2at un parametru ce specific# num#rul e'enimentului8
<cgi-*in<score*ro3seGe'enimentidKnumar Funcia afiseazae'enimente! " se scrie astfel8
su* afiseazae'enimente
H
my !JstC& Jurl"E
prin 0Selectai un e'eniment e1ecut7nd clic pe num#rul sau89.(:9.(:Dn0E
L o*ine lista cu e'enimente JstC K Jd*C-:prepare !PPH
S;L;F) e'enimentid& data& tip
F(=M e'eniment
=(-;( .> e'enimentid
JstC-:e1ecute !"E
L afi2eaz# ta*elul cu un cCenar prin 09)4.L; .=(-;(:Dn0E
L folose2te numele coloanelor drept capete de coloana in ta*el prin 09)(:Dn0E
foreacC my Jnumecoloana !^HJstC-:HQ4M;I:"
H
afiseazacelula !0)50& Jnumecoloana& ?"E
I
prin 09<)(:Dn0E
L asociaz# fiecare identificator de e'eniment cu o leg#tura
L care 'a afi2a puncta6ele de la acel e'enimentE returneaza
L r7ndurile folosind un CasC pentru a facilita referirea la
Fontinuare
3][ Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Fontinuare
L 'aloarea coloanei e'enimentid in funcie de nume$ 3Cile !my JCasCref K JstC-:fetcCro3CasCref !""
H
prin 09)(:Dn0E
Jurl K Jcgi-:scriptname!"E
Jurl $K sprintf !0Ge'enimentidKNs0&
Jcgi-:escape !JCasCref-:He'enimentidI""E afiseazacelula !0)-0& Jcgi-:a !H-Cref K: JurlI&
JCasCref-:He'enimentidI"& 0"E afiseazacelula !0)-0& JCasCref-:HdataI"& ?"E afiseazacelula !0)-0&
JCasCref-:HtipI"& ?"E prin 09<)(:Dn0E
I
JstC-:finisC !"E
prin !09<)4.L;:Dn0"
I
F7nd utilizatorul selecteaz# un e'eniment& *ro3serul trimite o cerere pentru scriptul score*ro3se& la care este
ata2at# o 'aloare a identificatorului de e'eniment$ score*ro3se g#se2te setul de parametri e'enimentid 2i
apeleaz# funcia af iseazapuncta6e!" pentru a afi2a toate puncta6ele o*inute la e'enimentul specificat$ -e
asemenea& pagina afi2eaz# te1tul 04fi2eaz# lista cu e'enimente0 ca o leg#tur# orientat# %napoi la pagina iniial#&
astfel %nc7t utilizatorul poate re'eni cu u2urin# la pagina care conine lista cu e'enimente$ 4dresa U(L pentru
aceast# leg#tur# face referire la scriptul score*ro3se& dar nu specific# nici o 'aloare pentru parametrul
e'enimentid$ Funcia afiseazapuncta6e!" este prezentat# %n listingul urm#tor8
su* afiseazapuncta6e
H
my !Je'enimentid" K sCiftE
my !JstC"E
L un U(L f#r# nici un parametru e'enimentid 'a determina
L afi2area listei cu e'enimente$
print Jcgi-:a !H-Cref K: Jcgi-:scriptname !"I&
04fi2eaz# lista cu e'enimente0"E prin 09.(:9.(:Dn0E
L selecteaz# puncta6ele pentru e'enimentul dat JstC K Jd*C-:prepare !PPH
S;L;F)
ele'$nume& e'eniment$data& puncte$puncte& e'eniment$tip F(=M
ele'& puncte& e'eniment
Fapitolul X +nterfaa 4P+ pentru Perl -.+ 3]Z
/5;(;
ele'$ele'+d K puncte$ ele'id 4Q- puncte$ e'enimentid K e'eniment$ e'enimentid 4Q- e'eniment$
e'enimentid K G =(-;( .>
e'eniment$ data 4SF& e'eniment$ tip 4SF& puncte$ puncte -;SF I JstC-:e1ecute !Je'enimentid" E L
transfera identificatorul
L de e'eniment ca 'aloare
L pentru c7mpul de inlocuire
prin 09.:Puncta6e pentru e'enimentul Je'enimentid<9.:9.(:Dn0 E
L afi2eaz# ta*elul cu un cCenar prin 09)4.L; .=(-;(:Dn0E
L utilizeaz# numele coloanelor drept capete de coloana ale ta*elului prin 09)(:Dn0E
foreacC my Jnumecoloana !^HJstC-:HQ4M;I:"
H
afiseazacelula !0)50& Jnume6Eoloana& ?"E
I
prin 09<)(:Dn0E
3Cile !my ^ary K JstC-:fetcCro3array !""
H
prin 09)(:Dn0E
afiseazacelula !0)-0& sCift !^ary"& ?" 3Cile ^aryE
prin 09<)(:Dn0E
JstC-:finisC !"E
prin 09<)4.L;:Dn0E I
+nterogarea pe care o ruleaz# scriptul afiseazapuncta6e!" este foarte similar# celei pe care am creat-o cu mult
timp %n urm#& %n capitolul l& %n seciunea ,(eg#sirea informaiilor din mai multe ta*ele0& care prezenta metode de
scriere a unirilor& %n acel capitol& am cerut puncta6ele o*inute la o anumit# dat#& deoarece datele sunt mai
semnificati'e dec7t 'alorile identificatorilor de e'eniment$ -impotri'#& c7nd folosim score*ro3se& cunoa2tem
cu e1actitate identificatorul de e'eniment$ 4ceasta nu deoarece folosim ca reper identificatorul de e'eniment
!ceea ce nu facem"& ci fiindc# scriptul ne prezint# o list# cu asemenea identificatori& din care tre*uie s# alegem$
Se poate o*ser'a c# acest dp de interfa# reduce necesitatea de a cunoa2te anumite detalii$ Qu tre*uie s#
cunoa2tem un identificator de e'enimentE tre*uie numai s# recunoa2tem e'enimentul de care a'em ne'oie$
3X0 PateA a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
+dentifierc mem*rilor Ligii istorice care manifest# interese comune
Scripturile simdP*ro3se 2i score*ro3se permit utilizatorului s# opereze o selecie prin prezentarea ineSi liste
cu opiuni %ntr-o pagin# iniial#& unde fiecare opiune este o leg#tur# care re-in'o8#8 scriptul& de data aceasta cu o
anumit# 'aloare a unui parametru$ = alt# modalitate de a- permite utilizatorilor s# opteze este de a insera %ntr-o
pagin# un formular care coninem c7mp ce poate fi editat$ 4cest procedeu este mai adec'at atunci c7nd domeniul
opiunilor posi*ile nu este limitat la un set de 'alori u2or de determinat$ Urm#torul nostru script demonstreaz#
aceasta metod# de a solicita date de intrare de la utilizator$
%n seciunea,UYtilizarea -.+0& am construit un script %n linie de comand# pentru a g#si pe mem*rii Li6iilistorice
care manifest# unmumit interes$ )otu2i& mem*rii Ligii nu au acces la acest scriptE secretarul Ligii tre*uie si
ruleze scriptul 2i apoi s# e1pedieze prin e-mail rezultatul nemd*rului care a solicitat lista& 4r fi interesant ca
aceast# posi*ilitate de c#utare s# fie pus# li dispoziia mai multor mem*ri& astfel %nc7t ace2tia s# o poat# folosi
personal$ Scrierea unnisccript /e* este o modalitate de a rezol'a pro*lema$
Scriptul defa8#& intitulat interese& afi2eaz# un mic formular %n care utilizatorul poate introduce ti Fu'7nt cCeie&
iar apoi caut# %n ta*elul mem*ru pentru a g#si mem*rii corespunz#tori Gi af.2eaz# rezultatele$ F#utarea se
e1ecut# ad#ug7nd caracterul de %nlocuire N !procent" l% am*ele e1tremit#i ale or7itului cCeie& astfel %nc7t acesta
s# poat# fi g#sit oriunde %ncadflrul 'alorilor din coloanainterese$
Formularul caAre folose2te cu'7ntul cCeie este afi2at %n fiecare pagin#& astfel %nc7t utilizatorul s# peatSi introduce
imediat o noua c#utare& cCiar din acele pagini care afi2eaz# rezultatelec#u-it#rii$ %n plus& 2irul de c#utare din
pagina anterioar# este afi2at su* form# de cu'7nt tCe -ie& astfel %nc7t& dac# utilizatorul dore2te s# ruleze o c#utare
similar#& 2irul s# poat# ficdi-tat$ 4stfel& nu este necesara reintroducerea unei mari cantit#i de te1t8
L paratet rul de c#utat
my !Jiite res" K Jcgi-:param !0interes0"E
L 4fisiazsa un formular pentru introducerea cu'intelor cCeie$ +n plus& daca
L 'arifcla Jinteres este definita& caut# si afi2eaz# o lista a mem*rilor
L carenaimifesta acel interes$ =*ser'ai ca 'aloarea curenta a 'aria*ileiT
L Jint%rees este afi2at# ca 'aloare presta*ilita a c7mpului 0interes0
L din formular$
prin U6giastarraform !-metCoiK: 0P=S)0"E prin Scgi-ae1tfield ! -name K: 0interes0&
@'alue K: Jinteres&
@size K: U0"E
print Scg6i-au*mit ! -name K: W*uton0& -'alue K: 0Faut#0"E print Jc]0i-:endf orm !"E
L ruleazAa o c#utare daca a fost specificat un cu'7nt cCeie cauta6efln*ri !Jinteres" if SinteresE
Fapitolul X +nterfaa 4P+ pentru Perl -.+ 3X?
Scriptul %2i comunic# lui %nsu2i informaiile %ntr-un mod u2or diferit fa# de samp*ro3se sau score*ro3se$
Parametrul interes nu este ad#ugat la sf7r2itul unui U(L$ %n scCim*& informaiile din formular sunt codificate de
c#tre *ro3ser 2i trimise ca parte a unei cereri P=S)$ )otu2i& pentru FR+$ pm nu are nici o importan# modul de
transmitere a informaieiE 'aloarea parametrului este o*inut# tot prin apelarea funciei param!"$
Funcia pentru e1ecutarea c#ut#rii 2i pentru afi2area rezultatelor este prezentat# %n listin-gul urm#tor$ Funcia care
formateaz# intrarea& f ormatCtmlentry !"& nu a fost prezentat#& deoarece este similar# celei din scriptul gencat8
su* cauta6nem*ri
H
my !Jinteres" K sCiftE my !JstC& Jnumar"E
printf 0(ezultatele c#ut#rii pentru cu'7ntul cCeie8 Ns9.(:9.(:Dn0& Jcgi-:escapeCtml !Jinteres"E
JstC K Jd*C-:prepare !PPH
S;L;F) A F(=M mem*ru /5;(; interese L+f; G =(-;( .> nume& prenume
I"E
L caut# 2irul oriunde in c7mpul 0interese0
JstC-:e1ecute !0N0 $ Jinteres $ 0N0"E
Jnumar K 0E
3Cile !my JCasCref K JstC-:fetcCro3nasCref !""
H
formatCtmlentry !JCasCref"E
__JnumarE I prin Jcgi-:p !04u fost g#site Jnumar intr#ri0"E
F4P+)=LUL o
+nterfaa 4P+ pentru P5P
P5P este un lim*a6 de scripting ce '# permite s# scriei pagini /e* care conin programe %nglo*ate& programe ce
se e1ecut# la fiecare descCidere a paginii 2i care pot genera un coninut dinamic care 'a fi inclus ca parte a
datelor de ie2ire trimise *ro3serului /e* al unui client$ 4cest capitol descrie modul de utilizare a lim*a6ului
P5P pentru a scrie aplicaii *azate pe /e* care folosesc MySQL$ Pentru o comparaie %ntre P5P 2i interfeele
4P+ pentru programarea %n MySQL scrise %n F& respecti' Perl -.g& consultai capitolul 5& ,+ntroducere %n
programarea MySQL0$
;1emplele din capitolul de fa# pornesc de la *aza noastr# de date demonstrati'#& sampd*& folosind ta*elele pe
care le-am creat pentru proiectul de e'iden# a rezultatelor 2colare 2i pentru Liga istoric# %n capitolul l&
,+ntroducere %n MySQL si SQL0$ Bom discuta despre P5P 3& de2i P5P U se afl# de6a la 'ersiunea *eta %n
momentul scrierii acestei c#ri 2i poate c# 'a de'eni de6a disponi*il p7n# c7nd 'ei a6unge s# citii r7ndurile de
fa#$ Fompati*ilitatea cu P5P 3 este unul dintre scopurile de proiectare specificate cu claritate ale 'ersiunii P5P
U& deci aproape toate cele prezentate aici pentru P5P 3 sunt 'ala*ile 2i pentru P5P U$ Un set de note pentru
trecerea la P5P U descrie modific#rile %n raport cu P5P 3$ -ac# folosii P5P U& tre*uie s# citii aceste note$
4cest capitol a fost scris pornind de la presupunerea c# 'ei folosi P5P %n con6uncie cu ser'erul /e* 4pacCe$
.i*lioteca client pentru MySQL scris# %n F 2i fi2ierele antet tre*uie s# fie de asemenea instalateE aceste fi2iere
sunt necesare atunci c7nd construii P5PE %n caz contrar& P5P nu 'a 2ti cum s# o*in# accesul la *azele de date
MySQL$ -ac# tre*uie s# '# procurai oricare dintre aceste programe& consultai 4ne1a 4& ,=*inerea 2i
instalarea programelor0$ +nstruciunile pentru o*inerea scripturilor date ca e1emplu& l create %n acest capitol& se
g#sesc de asemenea %n ane1a respecti'#$ Putei desc#rca scrip- l turile pentru a e'ita s# le introducei personal de
la tastatur#$
Su* UQ+b& P5P se poate folosi cu 4pacCe fie ca modul %ncorporat care este legat %n 6 fi2ierul *inar e1ecuta*il
4pacCe& fie ca interpreter autonom& folosit ca program FRli tradiional$ Su* /indo3s& P5P poate rula numai ca
program autonom %n momentul del fa#& de2i se lucreaz# la dez'oltarea unui modul P5P U 4pacCe& care 'a rula
sum6 /indo3s Q)$
%n ma6oritatea cazurilor& acest capitol descrie funciile P5P numai %n m#sura %n care sunt necesare %n e1punere$
Pentru un listing mai compreCensi' al tuturor funciilor legate MySQL& 'ezi 4ne1a 5& ,(eferin# 4P+ P5P0$ -e
asemenea& pro*a*il c# 'ei dori consultai manualul P5P& care descrie gama complet# de funcii pe care le
furnizeaz2 P5P& inclusi' funciile pentru utilizarea sistemelor de *aze de date diferite de MySQ+
Fapitolul [ +nterfaa 4P+ pentru P5P 3X3
!P5P& ca si -.+& nu este constr7ns s# funcioneze numai cu MySQL$" Manualul este disponi*il din situl /e*
P5P& la adresa Cttp8<<333$pCp$net<$ -e asemenea& acest sit /e* conine notele pentru trecerea de la P5P 3 la
P5P U$
Faracteristicile scripturilor P5P
Qumele fi2ierelor care conin scripturile P5P sunt scrise& %n mod caracteristic& cu o e1tensie care permite
ser'erului dumnea'oastr# de /e* s# le recunoasc# 2i s# e1ecute interpretorul P5P pentru a le prelucra$ -ac#
folosii o e1tensie care nu este recunoscut#& scripturile dumnea'oastr# P5P 'or fi ser'ite %n format te1t simplu$
;1tensia folosit# %n acest capitol este $pCp$ 4lte e1tensii frec'ent folosite sunt $pCp3 2i $pCtml$ Pentru instruciuni
de configurare a ser'erului 4pacCe astfel %nc7t s# recunoasc# e1tensia pe care dorii s# o folosii& consultai
4ne1a 4$ -ac# nu putei controla instalarea ser'erului 4pacCe pe calculatorul dumnea'oastr#& aflai de la
administratorul de sistem care este e1tensia adec'at# pentru a fi utilizat#$
Qoiuni fundamentale despre P5P
Funcia elementar# a lim*a6ului P5P este de a interpreta un script pentru a genera o pagin# /e* care este trimis#
unui client& %n mod caracteristic& scriptul conine o com*inaie %ntre coduri 5)ML& care sunt trimise literal
clientului& si linii de program P5P& care sunt e1ecutate ca program$ -atele de ie2ire produse de program sunt
trimise clientului& indiferent de natura lor& deci clientul nu 'ede niciodat# programul& ci numai datele de ie2ire
rezultante$
F7nd P5P %ncepe s# citeasc# un fi2ier& pur 2i simplu copiaz# tot ceea ce g#se2te acolo %n datele de ie2ire& cu
presupunerea c# fi2ierul conine 5)ML literal$ F7nd interpretorul P5P %nt7lne2te o eticCeta special# de
descCidere& comut# din modul 5)ML %n modul program P5P 2i %ncepe s# interpreteze fi2ierul drept linii de
program P5P care tre*uie e1ecutate$ Sf7r2itul programului este indicat de o alt# eticCet# special#& moment %n
care interpretorul comut# %napoi din modul program %n modul 5)ML$ 4ceasta '# permite s# com*inai un te1t
static !partea de 5)ML" cu rezultate generate dinamic !date de ie2ire ale programului din partea de P5P" pentru
a produce p pagin# care 'ariaz# %n funcie de circumstanele %n care este apelat#$
-e e1emplu& putei folosi un script P5P pentru a prelucra rezultatul unui formular %n care un utilizator a introdus
parametri pentru o c#utare %ntr-o *az# de date$ Parametrii de c#utare pot fi diferii pentru 'ariante diferite de
completare a formularului& deci& arunci c7nd scriptul e1ecut# c#ut#ri& fiecare pagin# rezultant# 'a reflecta o alt#
c#utare$ S# 'edem cum funcioneWaz# aceste procedeu& e1amin7nd un script P5P e1trem de simplu8
95)ML:
9.=->:
Salut& lume
9<.=->:
9<5)ML:
+m-
3XU Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
4cest script nu este foarte interesant& deoarece nu conine nici o linie de program P5PT La ce *unG 'ei %ntre*a$
4ceasta este o %ntre*are logic#$ (#spunsul este c# uneori este util# configurarea unui script care conine numai
cadrul 5)ML pentru pagina pe care dorii s# o generai& care apoi 'a fi ad#ugat la liniile de program P5P$ ;ste
un procedeu a*solut corect 2i interpretorul P5P nu are nici o o*iecie$
Pentru a include linii de program P5P %ntr-un script& acestea se deose*esc de te1tul %ncon6ur#tor cu a6utorul a
dou# eticCete speciale& %n spe# GpCp pentru a %ncepe scriptul& respecti' G pentru a-? %ncCeia$ F7nd interpretorul
P5P %nt7lne2te eticCeta de descCidere GpCp& comut# din modul 5)ML %n modul program P5P si interpreteaz# tot
ceea ce g#se2te drept linii de program P5P p7n# c7nd 'ede eticCeta de %ncCidere G$ Scriptul cuprins %ntre cele
dou# eticCete este interpretat 2i %nlocuit cu datele de ie2ire pe care le genereaz#$ ;1emplul anterior poate fi scris
din nou& pentru a include un mic e1emplu de program P5P& astfel8
95)ML:
9.=->:
9GpCp prin !0Salut& lumeDn0"E G:
9<.=->:
9<5)ML:
%n acest caz& partea de program este redus# la minimum& fiind alc#tuit# dintr-o singur# linie$ F7nd programul este
interpretat& genereaz# rezultatul Salut& lume& care de'ine parte a datelor de ie2ire trimise *ro3serului clientului$
4stfel& pagina /e* produs# de acest script este similar# celei produse %n e1emplul anterior& unde scriptul era
alc#tuit %n totalitate din linii 5)ML$
Putei folosi linii de program P5P pentru a genera orice component# a unei pagini /e*$ -e6a am '#zut una
dintre e1treme& %n care %ntregul script era alc#tuit din 5)ML literal 2i nu coninea nici o linie de program P5P$
Fealalt# e1trem# este un script alc#tuit %n totalitate din linii de program P5P si care nu conine 5)ML literal8
9GpCp
prin !095)ML:Dn0"E prin !09.=->:Dn0"E prin !0Salut& lumeDn0"E prin !09<.=->:Dn0"E prin !09<5)ML:DnW"E
4cest fapt demonstreaz# c# P5P '# ofer# o mare fle1i*ilitate %n ceea ce pri'e2te generareaT datelor de ie2ire$
P5P las# la latitudinea dumnea'oastr# alegerea com*inaiei celei adec'ate %ntre 5)ML 2i liniile de program
P5P$ = alt# do'ad# a fle1i*ilit#ii lim*a6uM P5P const# %n aceea c# nu este necesar s# inserai toate liniile de
program %ntr-un sing loc$ Putei comuta %ntre modul 5)ML si modul program P5P pe tot parcursul script lui&
oricum si oric7nd dorii$
Fapitolul [ +nterfaa 4P+ pentru P5P 3X5
;ticCetele scripturilor P5P
%n afar# de eticCetele folosite pentru e1emplele din acest capitol& P5P %nelege 2i alte eticCete de script$ Le putei
'edea %n liniile de program P5P pe care le scriu alte persoane sau le putei folosi personal$ P5P recunoa2te patru
stiluri de eticCete8
@ Stilul de eticCet# presta*ilit$ 4cesta este stilul pe care P5P este configurat s#-l foloseasc# %n mod presta*ilit8
9GpCp prin !0Salut& lumeDn0"E G:
@ Stil cu eticCet# de descCidere scurt#$ 4cesta este asem#n#tor stilului presta*ilit& cu e1cepia faptului c# eticCeta
de descCidere este mai scurt#8
9G prin !0Salut& lumeDn??"E G:
@ Stil compati*il 4SP$ 4cest stil este comun %n mediile 4cti'e Ser'er Pages8
9N print !0Salut& lumeDn0"E N:
@ Stil de eticCet# SF(+P)$ 4cest stil este util dac# folosii un editor 5)ML care nu agreeaz# nici unul din
celelalte stiluri de eticCete$ Fategoric se folose2te mai mult te1t& dar stilul poate fi necesar c7nd un editor nu '#
accept# programul P5P deoarece folosii alte stiluri de eticCete8
9SF(+P) L4QRU4R;K0pCp0: prin !0Salut& lumeDn0"E 9<SF(+P):
Stilul cu eticCet# de descCidere scurt# 2i stilul compati*il 4SP nu sunt acti'ate %n mod presta*ilit$ Pentru mai
multe instruciuni pentru acti'area acestor eticCete& consultai 4ne1a 5$
Scripturi P5P autonome
;ste posi*il s# scriei scripturi P5P autonome& pe care le putei in'oca din linia de comand#& a2a cum procedai
cu un script de interpreter sau cu un script Perl& lat# un e1emplu8
LT <usr<local<*in<pCp -P
9GpCp prin !0Salut& lumeDn0"E G:
Scriptul anterior poate fi denumit salut$ pCp& poate de'eni e1ecuta*il folosind comanda cCmod _1 2i poate fi
in'ocat din interpreter8
N salut$pCp
Salut& lume
%n acest capitol nu 'om scrie nici un script autonom$ )oate e1emplele au fost scrise pornind de la premisa c# 'or
fi in'ocate de c#tre un ser'er /e* pentru a genera o pagin# /e*$
Scriptul urm#tor este ce'a mai su*stanial& dar relati' scurt& 2i prezint# modul simplu %n care putei o*ine acces
la o *az# de date MySQL din P5P& respecti' modul %n care putei folosi rezultatele unei interog#ri %ntr-o pagin#
/e*$ Scriptul urm#tor a fost prezentat foarte succint %n capitolul 5 si reprezint# un fundament simplu al unei
pagini de *az# a sitului Ligii istorice$ Pe parcurs& 'om ad#uga scriptului un plus de comple1itate& dar& pentru
moment& nu face dec7t s# afi2eze un scurt mesa6 de salut si num#rul actual al mem*rilor Ligii8
95)ML:
95;4-:
9)+)L;:Liga istorica americana9<)+)L;:
9<5;4-:
Fontinuare
3X] Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Fontinuare
9.=->:
9P:.ine ai 'enit la situl /e* al Ligii istorice$
9GpCp
JlinM K ^mysPlpconnect !0pit-'iper$snaMe$net0& 0paul0& 0secret0"
or e1it !"E mysPlselectd* !0sampd*0"
or e1it !"E Jresult K mysPlPuery !0S;L;F) F=UQ)!A" F(=M mem*ru0"
or e1it !"E if !Jro3 K mysPlfetcCarray !Jresult""
ecCo 09P:+n prezent& Liga are 0 $ Jro3d0\ $ 0 mem*ri0E mysPlfreeresult !Jresult"E
9<.=->:9<5)ML:
Mesa6ul de %nt7mpinare este numai un te1t static& deci cel mai u2or este s#-? scriei pur 2i simplu su* form# de
5)ML literal$ Pe de alt# parte& num#rul mem*rilor este dinamic 2i se modific# %n timp&Wdeci tre*uie determinat
instantaneu prin interogarea ta*elului mem*ru din *aza de date sampd*$
)e1tul programului delimitat de eticCetele de descCidere 2i de %ncCidere a scriptului e1ecut# o operaie simpl#$
Mai %nt7i& descCide o cone1iune cu ser'erul MySQL 2i transform# sampd* %n *az# de date presta*ilit#$ 4poi&
trimite o interogare ser'erului pentru a determina num#rul de mem*ri ai Ligii istorice din momentul respecti'
!pe care %l e'alu#m ca fiind num#rul de r7nduri din ta*elul mem*ru"$ (ezultatul interog#rii este afi2at ca parte a &
unui mesa6 care conine num#rul de mem*ri& iar apoi este eliminat$
-ac# %n orice moment al acestui proces se produce 'reo eroare& scriptul %2i %ncCeie pur % si simplu e1ecuia$ Qu
sunt generate nici un fel de date de ie2ire pri'ind eroarea produs#fl deoarece acestea pot fi derutante pentru cei
care 'iziteaz# situl /e*$?
S# defalc#m scriptul pe componente& pentru a 'edea care este modul de funcionare an
fiec#reia$ Prima etap# const# %n conectarea la ser'er folosind funcia mysPlpconnect !yll
JlinM K ^mysPlpconnect W!0pit-'iper$snaMe$net0& 0paul0& 0secret0"
or e1it !"E
Funcia mysPlpconnect!" preia ca argumente numele gazdei& numele utilizatorului sil parola si returneaz# un
identificator de leg#tur# %n cazul %n care cone1iunea a fost sta-? *ilit# cu succes& respecti' F4LS; dac# se
produce 'reo eroare$ -ac# nu reu2e2te %ncercare2l de cone1iune& scriptul nostru apeleaz# funcia e1it !"& care
termin# imediat e1ecuii scriptului& caz %n care nu mai sunt generate alte date de ie2ire$
? -ac# generai %ntreaga pagin# /e* prin intermediul liniilor de program P5P& oprirea programului % caz de
eroare f#r# afi2area nici unor date de ie2ire %i poate agasa pe cei care '# citesc paginile& de unele *ro3sere 'or
afi2a o caset# de dialog cu mesa6ul ,aceast# pagin# nu conine nici un fel de datcAV caset# care tre*uie eliminat#$ -
Q$4$
Fapitolul [ +nterfaa 4P+ pentru P5P 3XX
-ar ce %nseamn# caracterul h din faa apelului la funcia mysPlpconnect!" G 4cesta este caracterul ,Lini2te& '#
rog0$ Unele funcii P5P scriu un mesa6 de eroare %n caz de e2ec& pe l7ng# returnarea unui cod de stare& %n cazul
funciei mysPlpconnect!"& o %ncercare ratat# de cone1iune determin# apariia %n pagina /e* care este trimis#
c#tre *ro3serul clientului a unui mesa6 ca acesta8
/arning8 MySQL Fonnection Failed8 4ccess denied for user8
Wpaul^pit-'iper$snaMe$netW !Using pass3ord8 >;S"S$
4sta nu-i frumosE persoana care ne 'iziteaz# situl nu 'a 2ti cum s# procedeze cu acest mesa6$ +nseria caracterului
^ %n faa apelului la funcia mysPlpconnect!" elimin# acest mesa6 de eroare& astfel %nc7t s# putem alege singuri
modul de tratare a erorilor& pe *aza 'alorii returnate$ Pentru scriptul curent& cel mai *un lucru %n cazul unei erori
este de a nu genera nici un fel de date de ie2ire legate de num#rul mem*rilor& %n acest caz& pagina 'a conine
numai mesa6ul de %nt7mpinare$ &$
Putei folosi caracterul ^ cu orice funcie P5P: dar& dup# e1periena mea& apelul iniial la funcia
mysPlpconnect! "are cele mai mari 2anse s# e2uezeE ca atare& e1emplele din acest capitol elimin# numai
mesa6ele generate de funcia respecti'#$
Poate c# nu '# con'ine c# numele 2i parola sunt %nglo*ate %n script& %n '#zul tuturor$ 4r cam fi cazul$$$ ;ste
ade'#rat c# numele 2i parola nu apar %n pagina /e* care este transmis# clientului& deoarece coninutul scriptului
este %nlocuit de datele sale de ie2ire$ )otu2i& dac# ser'erul /e* sufer# o eroare de configurare si nu reu2e2te s#
recunoasc# faptul c# scriptul dumnea'oastr# tre*uie prelucrat de P5P& 'a trimite scriptul su* form# de te1t
simplu& iar parametrii dumnea'oastr# de cone1iune 'or fi e1pu2i$ Bom a*orda %n cur7nd aceast# pro*lem#& %n
seciunea ,Utilizarea funciilor si a fi2ierelor include0$
+dentificatorul de leg#tur# returnat de funcia mysPlpconnect !" poate fi transferat c#tre alte numeroase apeluri
la funcii cone1e MySQL din interfaa 4P+ pentru P5P$ )otu2i& pentru asemenea& apeluri& identificatorul este
%ntotdeauna opional$
mysPlpconnect!"sau mysPlconnect!"
= funcie care este similar# cu mysPlpconnect !" este mysPlconnect !"$ 4m*ele preiau ca argumente numele de
gazd#& numele utilizatorului 2i parola 2i am*ele returneaz# F4LS; pentru a indica reu2ita sau e2ecul %ncerc#rii de
cone1iune$ -iferena dintre cele dou# apeluri este c# mysPlpcon-nect !" sta*ile2te o cone1iune persistent#& %n
timp ce mysPlconnect !" sta*ile2te o cone1iune non-persistent#$ = cone1iune persistent# difer# de o cone1iune
non-persistent# %n sensul c# prima nu este %ncCis# la terminarea scriptului$ -ac# un alt script P5P este e1ecutat
ulterior de acela2i proces 4pacCe copil 2i apeleaz# funcia mysPlpconnect !" cu acelea2i argumente& cone1iunea
este refolosit#$ 4cest procedeu este cu mult mai eficient dec7t sta*ilirea fiec#rei cone1iuni pornind de la zero$
-e e1emplu& putei apela mysPlselectd*!" folosind oricare din urm#toarele forme8 mysPlselectd*
!Jd*name& JlinM"E mysPlselectd* !Jd*name"E
S %n traducere 4'ertisment8 cone1iune MySQL ratat#8 accesul interzis pentru utilizatorul$$$ !Folose2te parol#8
-4"$ - Q$)$
3X[ Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
-ac# omitei argumentul linM din orice apel P5P legat de MySQL care preia un asemenea argument& apelul
folose2te cone1iunea descCis# cel mai recent$ 4stfel& dac# scriptulW dumnea'oastr# descCide numai o singur#
cone1iune& nu tre*uie s# specificai niciodat# %n mod e1plicit un argument linM %n nici unul din apelurile
dumnea'oastr# MySQL - cone1iunea respecti'# 'a fi cea presta*ilit#$ Situaia este complet diferit# de
programarea %n MySQL folosind interfeele 4P+ %n F sau -.+& pentru care nu e1ist# o asemenea 'aloare
presta*ilit#$
4m scris programul de cone1iune %n scriptul nostru de creare a unei pagini de *az# simple dup# cum se poate
'edea mai 6os& pentru a clarifica tipul de 'aloare returnat de funcia mysPlpconnect!"8
JlinM K ^mysPlpconnect !0pit-'iper$snaMe$net0& 0paul0& 0secret0"
or e1it !"E
)otu2i& nu folosim parametrul JlinM nic#ieri %n cadrul scriptului& deci programul ar fi putut fi scris mai simplu
astfel8
^mysPlpconnect !0pit-'iper$snaMe$net0& 0paul0& 0secret0"
or e1it !"E
Presupun7nd c# sta*ilirea cone1iunii a reu2it& urm#toarea etap# este selectarea unei *aze de date8
mysPlselectd* !0sampd*-"
or e1it H"E
-ac# apelul la funcia mysPlselectd*!" e2ueaz#& scriptul %2i %ncCeie e1ecuia %n t#cere$ = eroare este
impro*a*il# %n acest moment& dac# am reu2it s# ne conect#m la ser'er 2i dac# *aza de date e1ist#& dar este
prudent s# 'erific#m apariia e'entualelor pro*leme 2i s# lu#m m#surile adec'ate$ -up# ce ai selectat *aza de
date& putem trimite interogarea spre ser'er& e1tragem rezultatul& %l afi2#m 2i eli*er#m memoria alocat# setului de
rezultate8 Jresult K mysPlPuery !0S;L;F) F=UQ)!A" F(=M mem*ru0"
or e1it !"E if !Jro3 K mysPlfetcCarray !Jresult""
ecCo 09P:+n prezent& Liga are 0 $ Jro3d0\ $ 0 mem*ri0E mysPlfreeresult !Jresult"E
Funcia mysPlPuery!" trimite interogarea la ser'er pentru a fi e1ecutat#$ +nterogarea nitY tre*uie s# se termine cu
un caracter punct 2i 'irgul# 2i nici cu grupul de caractere DPGW$ Funcia mysPlPuery!" returneaz# F4LS; dac#
interogarea a fost ilegal# sau dac# nu aD putut fi e1ecutat# dintr-un moti' oarecare& %n caz contrar& returneaz# un
identificator s setului de rezultate$ 4cest identificator este o 'aloare pe care o putem folosi pentru o*ine
informaii despre setul de rezultate$ Pentru interogarea noastr#& setul de rezultai V const# dintr-un singur r7nd cu
o singur# 'aloare din coloan#& reprezent7nd num#rul mem*ri$ Pentru a o*ine aceast# 'aloare& transfer#m
identificatorul setului de rezultat funciei mysPlfetcCarray!" pentru a prelua r7ndul& atri*uim r7ndul 'aria*ilei
Jro3 sil o*inem accesul la primul element !care se %nt7mpl# s# fie si singurul" su* forma Jro3d0\$f
F7nd am terminat cu setul de rezultate& eli*er#m memoria alocat# acestuia transfer7ndu-funciei mysPlf
reeresult!"$ -e fapt& acest apel nu este necesar %n scriptul nost deoarece P5P eli*ereaz# automat memoria
alocat# tuturor seturilor de rezultate acti'e l terminarea e1ecuiei unui script$
Fapitolul [ +nterfaa 4P+ pentru P5P 3XZ
Funcia mysPlfreeresult!" este util# mai ales %n scripturile care e1ecut# interog#ri foarte mari sau un num#r
mare de interog#ri 2i pre'ine utilizarea unei cantit#i e1cesi'e de memorie$
Pentru a folosi scriptul nostru& tre*uie s#-? instal#m unde'a& %n acest capitol& am adoptat con'enia prin care Liga
istoric# american# %2i are propriul s#u catalog& denumit lisua3& situat la ni'elul cel mai de sus al ar*orelui de
documente 4pacCe& deci scriptul paginii de *az# poate fi instalat su* forma lisua<inde1$pCp %n ar*orele respecti'$
Bom crea scripturi si pentru proiectul de e'iden# a rezultatelor 2colare& deci %i 'om atri*ui acestuia catalogul
e'id$ -ac# gazda silului /e* este pit-'iper$snaMe$net& paginile din aceste dou# cataloage au adrese U(L care
%ncep astfel8
Cttp8<<pit - 'iper$snaMe$net<lisua<
Cttp8<<pit-'iper$snaMe$net<e'id<
-e e1emplu& paginile de *az# din fiecare catalog pot fi denumite inde1$ pCp 2i pot fi accesi*ile astfel8
Cttp8<<pit-'iper$snaMe$net<lisua<inde1$pCp
Cttp8<<pit-'iper$snaMe$net<e'id<inde1$pCp
Utilizarea funciilor 2i a fi2ierelor include
Scripturile P5P difer# de scripturile -.+& prin aceea c# scripturile P5P sunt localizate %n ar*orele cu documente
al ser'erului dumnea'oastr# de /e*& %n timp ce scripturile -.+ se g#sesc& %n mod caracteristic& %ntr-un catalog
cgi-*in care se afl# %n afara ar*orelui cu documente$ 4stfel& apare o pro*lem# de securitate8 o eroare de
configurare a ser'erului poate determina afi2area accidental# pentru clieni& su* form# de te1t simplu& a paginilor
localizate %n ar*orele cu documente$ 4ceasta %nseamn# c# numele de utilizator 2i parolele pentru sta*ilirea
cone1iunilor cu ser'erul MySQL sunt %ntr-un pericol mai mare de a fi e1puse lumii e1terioare dac# sunt folosite
%ntr-un script P5P dec7t dac# se folosesc %ntr-un script -.+$
Baria*ile %n P5P
%n P5P putei declara 'aria*ile prin simpla utilizare a acestora$ Scriptul nostru de creare a unei pagini de *az#
folose2te trei 'aria*ile& 2i anume JlinM& Jresult 2i Jro3& din care nici una nu este declarat# nic#ieri$ !;1ist#
conte1te %n care tre*uie s# declarai 'aria*ilele& cum ar fi atunci c7nd facei referire la o 'aria*il# glo*al# %n
interiorul unei funcii& dar despre aceasta 'om discuta ulterior$"
Baria*ilele sunt sim*olizate printr-un identificator precedat de sim*olul dolarului !J"$ 4ceast# notaie este
'ala*il# indiferent de 'aloarea pe care o reprezint# 'aria*ila& de2i pentru ta*louri 2i o*iecte tre*uie s# mai
ad#ugai 2i alte elemente pentru a o*ine accesul la elementele indi'iduale ale unei 'alori$ -ac# o 'aria*il# J1
reprezint# o singur# 'aloare& cum ar fi un num#r sau un 2ir& se poate o*ine acces la aceasta su* forma J1$ -ac#
J1 reprezint# un ta*lou cu indici numerici& elementele sale sunt accesi*ile su* forma J1d=\& J1d ? \ etc$ -ac# J1
reprezint# un ta*lou cu indici asociati'i precum 0gal*en0 sau 0mare0& elementele sale sunt accesi*ile su* forma
J1 dW gal*en0 \ sau J1 d0 mare0 Y$
)a*lourile P5P pot ayea at7t elemente numerice& c7t 2i elemente asociati'e$ -e e1emplu& at7t J1 d ? \ c7t 2i J1 d0
m# re0 \ pot reprezenta elemente ale aceluia2i ta*lou$ -ac# J1 reprezint# un o*iect& are propriet#i care sunt
accesi*ile su* forma J1-numeproprietate$ -e e1emplu& J1-gal*en 2i J1-mare pot fi propriet#i ale 'aria*ilei J1$
Qumerele nu se pot folosi ca nume de propriet#i& deci J1-? nu este o construcie corect# %n P5P$
W 4*re'iere personal# pentru Liga +storic# a Statelor Unite ale 4mericii$ - Q$)$
3[0 Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Scriptul nostru iniial pentru construcia paginii de *az# a Ligii istorice este e1pus la aceast# pro*lem#& deoarece
conine 'alorile literale ale numelui de utilizator si ale parolei MySQL$ S# mut#m ace2ti parametri de cone1iune
%n afara scriptului& folosind dou# dintre caracteristicile lim*a6ului P5P8 funcii 2i fi2iere include$ Bom scrie o
funcie sampd*connect !" pentru a sta*ili cone1iunea& respecti' 'om plasa funcia %mr-un fi2ier include - un
fi2ier care nu face pane din scriptul nostru principal& dar la care se poate face referire din acesta$ Unele a'anta6e
ale aceste a*ord#ri sunt8
@ Programul de sta*ilire a cone1iunii este mai u2or de scris$ Qu a'em ne'oie s# scriem toi parametrii 2i putem
cere funciei sampd*connect !" s# selecteze *aza de date automat dup# conectare& astfel %nc7t o funcie s#
e1ecute atri*uiile a dou# funcii P5P$ 4stfel& scripturile de'in mai u2or de %neles& deoarece atenia
dumnea'oastr# se poate concentra asupra aspectelor caracteristice ale scriptului& f#r# a fi deturnat# de programul
de configurare a cone1iunii$
@ Fi2ierul include este accesi*il din scriptul nostru& dar poate fi deplasat %n afara ar*orelui cu documente 4pacCe$
Fa atare& coninutul s#u de'ine inaccesi*il clienilor 2i ace2tia nu mai pot a'ea acces la parametrii de cone1iune&
cCiar dac# ser'erul /e* sufer# o eroare de configurare$ Utilizarea unui fi2ier include este o *un# strategie pentru
ascunderea oric#ror categorii de informaii importante& care nu dorii s# fie trimise %n afara sitului de c#tre
ser'erul dumnea'oastr# de /e*$
4ceasta nu %nseamn#& totu2i& c# numele si parola sunt sigure din toate punctele de 'edere$ Utilizatorii care pot
descCide o sesiune de lucru la gazda ser'erului /e* pot fi capa*ili s# citeasc# fi2ierul include %n mod direct& dac#
nu luai nici o m#sur# de precauie$ Fonsultai seciunea ,Fonectarea la ser'erul MySQL din scripturile /e*0 din
capitolul X& ,+nterfaa 4P+ pentru Perl -.+0 2i reinei m#surile de precauie descrise acolo pentru instalarea
fi2ierelor de configurare -.+ astfel %nc7t acestea s# fie prote6ate de ali utilizatori$ 4celea2i m#suri de precauie
se aplic# 2i %n cazul utiliz#rii fi2ierelor 9 include din P5P$
+nfluente ling'istice %n P5P
-ac# a'ei e1perien# cu programarea %n F& pro*a*il ai o*ser'at c# numeroase construcii sintactice din 6 scriptul
nostru sunt foarte similare celor pe care le folosii pentru programarea %n F$ -e fapt& sinta1a P5f5 deri'# %n mare
m#sur# din F& deci asem#narea nu este o coinciden#$ -ac# a'ei oarecare cuno2tine de F' D le 'ei putea
transfera %n mare m#sur# %n P5P$ -e fapt& dac# nu suntei sigur cu pri'ire la modul de scriegf V a unei e1presii sau
structuri de control %n P5P& %ncercai s# o scriei %n F 2i este posi*il s# fie corect#$ ?f
-e2i P5P deri'# cu prec#dere din F& sunt prezente 2i elemente de Ya'a 2i Perl$ Putei constata acest lucrtf \ din
sinta1a comentariilor& care permite oricare din urm#toarele trei forme8
L Fomentariu in stil Perl$de la L pana la sf7r2itul liniei
<< Fomentariu in stil F__ sau Ya'a& de la << pana la sf7r2itul liniei
<A Fomentariu in stil F& intre slasC-stea pana la sea-slasC A<
4lte asem#n#ri cu Perl includ operatorul $ de concatenare a 2irurilor !inclusi' $K drept operator de i catenare
aditi'#"& precum 2i modalitatea %n care referinele la 'aria*ile 2i sec'enele escape sunt in pretate %n interiorul
gCilimelelor du*le& dar nu 2i %n interiorul gCilimelelor simple$
Fapitolul [ +nterfaa 4P+ pentru P5P 3[?
@ Fi2ierul include poate fi folosit %n mai multe scripturi$ 4stfel este promo'at# reutilizarea programelor& iar liniile
de program de'in mai u2or de %ntreinut$ -e asemenea& permite efectuarea cu u2urin# de modific#ri glo*ale %n
fiecare script care o*ine acces la fi2ier$ -e e1emplu& dac# mut#m *aza de date sampd* de la pit-'iper la *oa& nu
tre*uie s# modific#m o mulime de scripturi indi'iduale& ci numai argumentul ,numele gazdei0 din apelul la
funcia mysPlpconnect!" din fi2ierul include care conine funcia sampd*!"$
Pentru a folosi fi2iere include& tre*uie s# a'ei unde s# le punei 2i tre*uie s# cerei lim*a6ului P5P s# le caute$
-ac# sistemul dumnea'oastr# dispune de6a de o asemenea locaie& o putei folosi$ -ac# nu& folosii urm#toarea
procedur# pentru a sta*ili o locaie a fi2ierului include8
?$ Freai un catalog %n care 'ei stoca fi2ierele P5P include$ 4cest catalog nu tre*uie s# se afle %n interiorul
ar*orelui cu documente al ser'erului /e*T ;u folosesc un catalog include pentru P5P <usr<local<apacCe<pCp& care
se afl# la acela2i ni'el ca 2i ar*orele meu cu documente !<usr<local<apacCe<Ctdocs"& dar nu %n interiorul acestuia$
S$ Freai referine la fi2ierele include cu numele complet al c#ii de acces sau indicai lim*a6ului P5P cataloagele
%n care s# le caute$ Ultima metod# este mai con'ena*il#& deoarece& dac# folosim numele de *az# al fi2ierului&
P5P %l 'a g#si automat$U Pentru a indica lim*a6ului P5P unde s# caute& modificai fi2ierul de iniializare P5P
!<usr<local<li*<pCp3$ini %n sistemul meu" pentru a scCim*a 'aloarea parametrului includepatC$ -ac# acesta nu are
nici o 'aloare& atri*uii-i calea de acces complet# a noului catalog include8
includepatC K 0<usr<local<apacCe<pCp0
-ac# includepatC are de6a o 'aloare& ad#ugai noul catalog la 'aloarea respecti'#8 includepatC K
0'aloarecurenta8<usr<local<apacCe<pCp0
3$ Freai fi2ierul include pe care dorii s#-? folosii si inserai-? %n catalogul include$ Fi2ierul tre*uie s# ai*# un
nume distincti'E pentru noi& numele sampd*$ inc este suficient$ Foninutul fi2ierului este prezentat %n listingul
urm#tor$ Pentru scripturile pe care le scriem aici& c7nd ne conect#m la ser'erul MySQL& 'om folosi %ntotdeauna
*aza de date sampd*& deci funcia de cone1iune sampd*connect !" poate selecta automat acea *az# de date$
Funcia returneaz# un identificator de leg#tur# dac# reu2e2te s# se conecteze 2i dac# selecteaz# *aza de date&
respecti' F4LS; dac# se produce 'reo eroare$ Funcia nu afi2eaz# nici un mesa6 dac# se produce o eroare& ceea
ce permite apelantului s#-2i %ncCeie discret e1ecuia sau s# afi2eze un mesa6& %n funcie de circumstane8
9GpCp
L sampd*$inc
L funciile comune ale *azei de date demonstrati'e sampd*
L se conecteaz# cu ser'erul MySQL folosind numele si parola
L noastr# ultrasecrete function saropd*connect !"
Fontinuare
d Fi2ierele include diiG P5P sunt oarecum asem#n#toare cu fi2ierele antet din F& inclusi' su* aspectul c# P5P le
'a c#uta %n numeroase cataloage& e1act a2a cum pre-procesorul F caut# fi2ierele antet F %n mai multe cataloage$ -
Q$4$
3[S Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Fontinuare
i
JlinM K ^my sPlpconnect!0 pit -'iper$ snaMe$ net 0& 0paul0& 0secret0"E if !SlinM OO mysPlselectd*
!0sampd*0""
return !JlinM"E return !F4LS;"E
=*ser'ai c# fi2ierul sampd*$inc este delimitat prin eticCetele =pCp si G:$ 4ceasta deoarece P5P %ncepe citirea
fi2ierelor include %n modul 5)ML F#r# eticCete& P5P 'a trimite fi2ierul ca te1t simplu& f#r# a-? interpreta drept
program P5P$ -ac# intenionai s# includei cod 5)ML literal %n fi2ier& nici o pro*lem$ -ar& dac# fi2ierul conine
linii de program P5P& tre*uie s# delimitai codul folosind eticCetele de script$
U$ Pentru a face referire la un fi2ier dintr-un script& folosii o linie a aceasta8 include !0sampd*$inc0" E
F7nd P5P 'ede linia respecti'#& caut# fi2ierul 2i %i cite2te coninutul$ )oate componentele fi2ierului de'in
accesi*ile pentru componentele urm#toare ale scriptului$
-up# ce am configurat fi2ierul nostru include sampd* $ inc& puten modifica pagina de *az# a Ligii istorice astfel
%nc7t s# fac# referire la fi2ierul includea s# se conecteze la ser'erul MySQL apel7nd funcia sampd*connect! "8
95)ML:
95;4-:
9)+)L;:Liga istorica americana9<)+)L;:
9<5;4-:
9.=->:
9P:.ine ai 'enit in situl /e* al Ligii istorice$
9GpCp
include !0sampd*$inc0"E
sampd*connect ! "
or e1it !" E Jresult K mysPlPuery !0S;L;F) F=UQ)!A" F(=M mem*ru0"
or e1it !" E if !Jro3 K mysPlfetcCarray !Jresult""
include !" sau rePuire !"
P5P are o funcionalitate rePuire ! " care este similar# cu include ! " $ =3e*irea %ntre ele este 9 %n cazul funciei
include ! " & fi2ierul este citit 2i e'aluat la fiecare e1ecuie a iistruciunii include ! " $ l cazul funciei rePuire !"&
fi2ierul este prelucrat o singur# dat# !de fapt& cottutul fi2ierului %nlocuie instruciunea rePuire !""$ 4ceasta
%nseamn# c#& dac# dorii s# citii un alt fi6ier de fiecare dat# c7nd i e1ecutai programul sau a'ei un ciclu care
parcurge un set de fi2iere& a'tine'oie de include !Y deoarece putei configura o 'aria*il# cu numele fi2ierului pe
care dorii s#-l iridei 2i s# folosii '7ri la ca argument al funciei include ! " $
l56iOaMW$-t8B-&-ua-88a1aiW&EE$-&&a$&Bb&
r
ecCo 09p:in prezent& Liga are mysPlfreeresult !Jresult"E
Fapitolul [ +nterfaa 4P+ pentru P5P 0 $ Jro3d0\ $ 0 mem*ri0E
3[3
9<.=->:9<5)ML:
Poate credei c# nu am economisit un num#r cCiar at7t de mare de linii de program %n pagina de *az# folosind un
fi2ier include$ 42teptai puin$$$ Fi2ierul sampd*$inc 'a fi util 2i pentru alte funcii si %l putem folosi ca un
depozit con'ena*il pentru di'erse alte lucruri$ -e fapt& mai putem crea cCiar acum alte dou# funcii care 'or fi
inserate %n fi2ierul respecti'$ Fiecare script pe care %l scriem 'a genera un set oarecum stereotip de eticCete
5)ML la %nceputul paginii& respecti' un alt set la sf7r2itul acesteia& %n loc de a le scrie literal %n fiecare script&
putem scrie funcii Ctml*egin ! " si Ctmlend ! " care scriu eticCetele automat$ Funcia Ctml*egin!" poate
prelua dou# argumente& care specific# titlul paginii si antetul acesteia$ Fodul pentru cele dou# funcii se prezint#
astfel8
L Scrie eticCetele 5)ML iniiale pentru pagina$ Se presupune
L ca e'entualele caractere speciale din 'aria*ilele Jtitlu si
L Jantet& daca e1ista& sunt codificate in mod corespunz#tor$
function Ctml*egin !Jtitlu& Jantet"
H
prin !095)ML:Dn0"E prin !095;4-:Dn0"E if !Stitlu"
prin ! 09)+)L;:JtitluA<)+)L;:Dn0 " E prin !09<5;4-:Dn0"E prin !09.=->:Dn0"E if !Jantet"
prin !095S:Jantet9<5S:Dn0"E
L scrie eticCetele 5)ML finale ale paginii$
function Ctmlend !"
H
prin !09<.=->:9<5)ML:Dn0"E
I
4poi& putem modifica pagina de *az# a Ligii istorice astfel %nc7t s# foloseasc# cele dou# noi funcii si s# ai*# ca
atare urm#torul aspect8
9GpCp
include ! 0 sampd* $ inc 0 " E
Jtitlu K 0Liga istorica americana0E
Ctml*egin !Jtitlu& Jtitlu"E
G:
Fontinuare
3[U Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Fontinuare
9P:.ine ai 'enit in situl /e* al Ligii istorice$
9GpCp sampd*connect !"
or e1it !"E Jresult K mysPlPuery !0S;L;F) F=UQ)!A" F(=M mem*ru0"
or e1it !"E if !Jro3 K mysPlfetcCarray !Jresult""
ecCo 09P:+n prezent& Liga are 0 $ Jro3d0\ $ 0 mem*ri0E mysPlfreeresult !Jresult"E
Ctmlend !"E
G:
=*ser'ai c# programul a fost %mp#rit %n dou# componente& iar te1tul 5)ML literal al mesa6ului de %nt7mpinare
este inserat %ntre cele dou# p#ri$
Utilizarea funciilor pentru generarea componentelor iniial# 2i final# ale paginii ne ofer# o posi*ilitate
important#$ -ac# dorim s# modific#m aspectul antetului sau al su*solului tuturor paginilor care folosesc aceste
funcii& putem include pur 2i simplu %n funcii unele linii de program$ Fiecare script care 'a folosi funciile 'a fi
automat afectat$ -e e1emplu& putei dori s# scriei un mesa6 ,-repturile de autor rezer'ate L+SU40 %n partea de
6os a fiec#rei pagini din situl /e* al Ligii istorice$ = funcie de final de pagin#& cum este Ctmlend !"& constituie
o modalitate simpl# de a face aceast# scCim*are$
= pagin# cu o interogare simpl#
Scriptul pe care ?-am %nglo*at %n pagina de *az# a silului Ligii istorice ruleaz# o interogare & care returneaz# un
singur r7nd$ Urm#torul nostru script prezint# modul de prelucrare a D unui set de rezultate compus din mai multe
linii$ Scriptul preia 2i afi2eaz# coninutul ta*elu- \ lui mem*ru$ 4cesta este ecCi'alentul P5P al scriptului -.+
dump6nem*ers pe care ?-am creat6 %n capitolul X& deci %l 'om denumi dump6nem*ers$ pCp$ 4cest script este
diferit de 'ersiunea i -.+ prin aceea c# este destinat utiliz#rii %ntr-un mediu /e*& nu de la linia de comand#$
-inDV acest moti'& tre*uie s# produc# date de ie2ire %n format 5)ML& nu doar s# scrie un simplul te1t delimitat
prin ta*ulatori$ Pentru a alinia %n mod estetic liniile si coloanele& 'om seriei %nregistr#rile mem*rilor %ntr-un ta*el
5)ML$ Scriptul se prezint# astfel8
9GpCp
L dump6nem*ers$pCp - afi2eaz# lista mem*rilor Ligii istorice
include !0samp6d*$inc0"E
Jtitlu K 0Lista mem*rilor Ligii istorice americane0E Ctml*egin !Stitlu& Jtitlu"E
samp6d*connect !"
or die !0Qu se poate conecta la ser'er0"E
Fapitolul [ +nterfaa 4P+ pentru P5P 3[5
L emite interogarea
SPuery K 0S;L;F) nume& prenume& sufi1& email&0
$ 0strada& ora2& stat& codpostal& telefon0
$ 0F(=M mem*ru =(-;( .> nume0E Jresult K mysPlPuery !JPuery"
or die !0Qu poate e1ecuta interogarea0"E
prin !09)4.L;:Dn0"E
L cite2te rezultatele interog#rii& apoi face cur#enie 3Cile !Jro3 K mysPlfetcCro3 !Jresult""
H
prin !09)(:Dn0"E
for !Ji K 0E Ji 9 mysPlnumfields !Sresult"E Ji__"
H
L modifica semnificaia caracterelor speciale si afi2eaz# printf !09)-:Ns9<)-:Dn0& CtmlspecialcCars !Jro3!i\""E
I
prin !09<)(:Dn0"E
I
mysPlfreeresult !Jresult"E
prin !09<)4.L;:Dn0"E
Ctmlend !"E
G:
4cest script folose2te funcia die!" pentru a afi2a un mesa6 si pentru a termina e1ecuia scriptului dac# se produce
'reo eroare$5 4ceasta este o alt# modalitate de tratare a erorilor dec7t aceea folosit# %n pagina de *az# a Ligii
istorice& unde e1ecuia scriptului s-a %ncCeiat %n t#cere& %n scriptul dump6nem*ers$pCp& ne a2tept#m s# 'edem un
anumit rezultat& deci este logic s# afi2#m un mesa6 de eroare prin care se indic# apariia unei pro*leme$
Scriptul poate fi instalat %n catalogul lisua si este accesi*il su* forma Cttp8<<pi$t-
'iper$snaMe$net<lisua<dumpmem*ers$pCp$ 4poi& putem ad#uga o leg#tur# la noul nostru script %n pagina de *az#
a Ligii istorice& astfel %nc7t pu*licul s# fie la curent cu acesta8
9GpCp
include !0sampd*$inc0"E
Jtitlu K 0Liga istorica americana0E Ctml*egin !Jtitlu& Jtitlu"E
9P:.ine ai 'enit la situl /e* al Ligii istorice$
Fontinuare
? Funcia die !" este similar# cu funcia e1it !"& dar afi2eaz# un mesa6 %nainte de a-2i %ncCeia e1ecuia$ - Q$4$
3[] Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Fontinuare 9GpCp sampd*connect !"
or e1it !"E Jresult K mysPlPuery !0S;L;F) F=UQ)!A" F(=M mem*ru0"
or e1it !"E if !Jro3 K mysPlfetcCarray !Jresult""
ecCo 09P:+n prezent& Liga are 0 $ Jro3d0\ $ 0 mem*ri0E mysPlfreeresult !Sresult"E
Putei consulta catalogul cu mem*ri 94 5(;FK0dumpmem*ers$pCp0:aici9<4:$
9GpCp Ctmlend !"E
Prelucrarea rezultatelor interog#rii
%n aceast# seciune& 'om e1amina mai detaliat modul de e1ecutare a interog#rilor 6 MySQL si manipularea
seturilor de rezultate& %n P5P& toate interog#rile sunt emise prin 6 apelarea funciei mysPlPuery ! "& care preia ca
argumente un 2ir de interogare 2i un iden-% tificator de leg#tur#$ +dentificatorul de leg#tur# este opional& deci
pufcei in'oca funcial mysPlPuery ! " folosind oricare dintre urm#toarele forme8
Jresult K mysPlPuery !JPuery& linM"E L folose2te cone1iunea
L e1plicita Jresult K mysPlPuery !JPuery"E Lfoloseste cone1iunea
L presta*ilita
Pentru interog#rile care nu returneaz# r7nduri !interog#ri de tip non-S;L;F)& prec -;L;);& +QS;()&
(;PL4F; si UP-4);"& funcia mysPlPuery!" returneaz# )(U; sau F4LS pentru a indica reu2ita sau e2ecul
interog#rii$ Pentru o interogare reu2it#& putei apeli funcia mysPlaf f ectedro3s ! " pentru a determina c7te
r7nduri au fost modifica !adic# 2terse& inserate& %nlocuite sau actualizate& dup# caz"$
Pentru instruciunile S;L;F)& mysPlPuery!" returneaz# un identificator al setului rezultate sau F4LS; pentru a
indica reu2ita& respecti' e2ecul interog#rii$ Pentru o int gare reu2it#& folosii identificatorul setului de rezultate
pentru a o*ine alte informatE despre setul de rezultate$ -e e1emplu& putei afla num#rul de r7nduri 2i de coloane
9 setul de rezultate& respecti' putei prelua r7ndurile incluse %n set$
F7nd mysPlPuery!" returneaz# F4LS; !adic# zero"& %nseamn# c# o interogare a e2uai cu alte cu'inte& s-a
produs o eroare 2i interogarea nu a putut fi nici m#car e1ecutat#$ interogare poate e2ua din mai multe moti'e8
Fapitolul [ +nterfaa 4P+ pentru P5P 3[X
@ Poate conine malformaii sau o eroare de sinta1#$
@ +nterogarea poate fi corect# su* aspect sintactic& dar poate fi lipsit# de sens din punct de 'edere semantic& cum
ar fi %ncercarea de a selecta dintr-un ta*el o coloan# pe care acesta nu o conine$
@ Qu a'ei suficiente pri'ilegii pentru a efectua interogarea$
@ Razda ser'erului MySQL a de'enit inaccesi*il#& datorit# unor pro*leme %n reea$
%n fiecare din aceste cazuri !mai sunt 2i altele"& funcia mysPlPuery !" returneaz# F4LS;$ -ac# dorii s#
cunoa2tei moti'ul erorii& apelai una din funciile mysPlerror!" sau mysPlerrno!" pentru a o*ine 2irul
mesa6ului de eroare sau codul numeric al erorii$ !Bezi ,)ratarea erorilor0$"
-ou# din cele mai comune gre2eli care se comit %n utilizarea funciei mysPlPuery !" sunt aceea de a crede c#
'aloarea returnat# este un num#r de r7nduri& respecti' c# 'aloarea returnat# conine datele returnate de
interogarea dumnea'oastr#$ Qici una din aceste afirmaii nu este ade'#rat#$
)ratarea interog#rilor care nu returneaz# nici un set de rezultate
Programul urm#tor folose2te funcia -;L;); pentru a ilustra modul de prelucrare al unei interog#ri care nu
returneaz# nici un r7nd8
Jresult K mysPlPuery !0-;L;); F(=M mem*ru /5;(; mem*ruid K ?UZ0"E
if !TJresult"
print !0interogarea a esuatDn0"E
else
printf!0num#r de r7nduri 2terse8 NdDn0& mysPlaffectedro3s !""E -ac# e1ist# un mem*ru al c#rui identificator
este ?UZ& MySQL 2terge %nregistrarea 2i funcia mysPlPuery !" returneaz# )(U;$ Fe se %nt7mpl#& %ns#& dac# un
asemenea mem*ru nu e1ist#G %n acest caz& mysPlPuery !" returneaz# tot )(U;T 4cest fapt %i 'a surprinde pe
aceia care persist# %n gre2eala de a crede c# 'aloarea returnat# de mysPlPuery !" este un num#r de r7nduri$ Qu
este$ Baloarea returnat# este )(U; %n am*ele situaii deoarece interogarea este corect#& indiferent dac# 2terge sau
nu 'reun r7nd$ Qum#rul de r7nduri afectat de interogare este cu totul si cu totul altce'a$ Pentru a o*ine 'aloarea
respecti'# dup# o interogare reu2it#& apelai funcia mysPlaffectedro3s!"$
)ratarea interog#rilor care returneaz# un set de rezultate
;1emplul urm#tor furnizeaz# o scCi# general# a modului de prelucrare a interog#rilor S;L;F)8
Sresult K mysPlPuery !0S;L;F) A F(=M mem*ru0"E
if !TJresult"
prin !0interogarea a esuatDn0"E
else H
printf !0num#rul de r7nduri returnate8 NdDn0 mysPlnumro3s !Sresult""E
Fontinuare
3[[ Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Fontinuare
3Cile !Jro3 K mysPlfetcCro3 !Sresult""
H
for !Ji K 0E Ji 9 mysPlnumfields !Jresult"E Ji__"
H
if !Ji : 0"
prin !B"E prin !Jro3dJi\"E
I
prin !0Dn0"E
I
mysPlfreeresult !Sresult"E
Qu presupunei ca mysPlPuery ! " 'a reu2i
%n lista de coresponden# referitoare la P5P& utilizatorii %ncep#tori de P5P %ntrea*# de ce apare urm#torul mesa6
de eroare la e1ecuia unui script8
/arning8 = is not a MySQL result inde1 in file on line n
4cest mesa6 arat# c# o 'aloare egal# cu zero a identificatorului setului de rezultate a fost transferat# unei funcii
oarecare !cum ar fi o funcie de preluare a r7ndurilor" care presupune un set de rezultate 'alid$ 4ceasta %nseamn#
c# un apel anterior la my sPlPuery ! " a retumat zero& adic# F4LS;$ Fu alte cu'inte& interogarea mysPlPuery ! "
a e2uat si autorul scriptului nu s-a deran6at s# 'erifice 'aloarea returnat# %nainte de a o folosi la alte funcii$ F7nd
folosii mysPlPuery ! "& testai %ntotdeauna 'aloarea returnat#$
-ac# interogarea e2ueaz#& rezultatul este F4LS; 2i afi2#m un mesa6 %n acest sens$ !;ste posi*il s# e1iste 2i alte
r#spunsuri mai adec'ate la apariia unei erori& %n funcie de cirW cumstane$" -ac# interogarea reu2e2te& funcia
mysPlPuery ! " returneaz# un identificator al setului de rezultate$ 4ceast# 'aloare returnat# este util# %n anumite
moduri !dar nu ca num#r de r7nduriT"$ +dentificatorul setului de rezultate poate fi folftsit %n oricare din
urm#toarele scopuri8
@ Se transfer# funciei mysPlnumro3s ! " pentru a determina num#rul de r7nduri din$ setul de rezultate$
@ Se transfer# funciei mysPlnumf ields ! " pentru a determina num#rul de coloane diJ setul de rezultate$
& ?
@ Se transfer# unei rutine de preluare a r7ndurilor& pentru a prelua r7nduri succesi'e din 6 setul de rezultate$
;1emplul nostru folose2te funcia mysPlf etcCro3! "& dar e1ist# 2i alte opiuni& despre care 'om discuta cur7nd$
@ Se transfer# funciei mysPlfreeresult!"& pentru a eli*era memoria alocat# setului rezultate si pentru a permite
lim*a6ului P5P s# eli*ereze toate resursele alocate ao
P5P furnizeaz# numeroase funcii de preluare a r7ndurilor pentru reg#sirea unui set dei rezultate dup# ce funcia
mysPlPuery ! " a e1ecutat cu succes o interogare S;L;F) !'i ta*elul [$?"$ Fiecare din aceste funcii preia un
identificator al setului de rezultate argument si returneaz# F4LS; atunci c7nd nu mai e1ist# r7nduri$
Fapitolul [ +nterfaa 4P+ pentru P5P 3[Z
)a*elul [$? Funcii P5P de preluare a r7ndurilor
Qumele funciei Baloare retumat#
mysPlf etcCro3!" Un ta*louE elementele sunt accesi*ile prin intermediul indicilor numerici
mysPlf etcCarray !" Un ta*louE elementele sunt accesi*ile prin intermediul indicilor numerici sau
asociati'i
mysPlf etcCo* 6 ect !" Un o*iectE elementele sunt accesi*ile prin intermediul propriet#ilor
Fel mai elementar apel este cel la funcia mysPlf etcCro3!"& care returneaz# urm#torul r7nd al setului de
rezultate su* forma unui ta*lou$ ;lementele ta*loului sunt accesi*ile cu a6utorul indicilor numerici cu 'alori
cuprinse %ntre = 2i mysPlnumfields!" - ?$ ;1emplul urm#tor prezint# modul de utilizare a funciei
mysPlfetcCro3!" %ntr-un ciclu simplu& care preia 2i afi2eaz# 'alorile din fiecare r7nd8
JPuery K 0S;L;F) A F(=M pre2edinte0E
Jresult K mysPlPuery !JPuery" or die !0+nterogarea a e2uat0"E
3Cile !Jro3 K mysPlfetcCro3 !Jresult""
H
for !Ji K 0E Ji 9 mysPlnumfields !Jresult"E Ji__"
H
if !Ji : 0"
prin FDf"E prin !Jro3dJi\"E
I
prin FDn0"6
I
Baria*ila Jro3 este un ta*lou$ ;lementele din acest ta*lou sunt accesi*ile su* forma Jro3dJi\& unde Ji este
inde1ul numeric al coloanei$ -ac# suntei familiarizat cu funcia count !" din P5P& putei fi tentat s# o folosii
pentru a determina num#rul de elemente din ta*lou %n loc de a folosi mysPlnumfields!"$ Qu o facei$ Funcia
count !" num#r# numai elementele din ta*lou care sunt configurate& iar P5P nu configureaz# elemente care
corespund unor 'alori din coloane egale cu QULL$ Funcia count !" este o m#sur# inadec'at# a num#rului de
coloane returnate& deoarece funcia nu are aceast# finalitate$ Fonsideraia este 'ala*il# si pentru celelalte dou#
funcii de preluare a r7ndurilor$
Fea de-a doua funcie de preluareW a r7ndurilor prezentat# %n ta*elul [$?& si anume mysPlf etcCarray !"& este
similar# cu mysPlf etcCro3!"& cu deose*irea c# elementele din ta*loul pe care %l returneaz# sunt accesi*ile at7t
cu a6utorul inde1ului numeric& c7t 2i prin intermediul inde1ului asociati'$ Fu alte cu'inte& putei o*ine acces la
elemente at7t prin num#r& c7t si dup# nume8
JPuery K 0S;L;F) nume& prenume F(=M pre2edinte0E
Sresult K mysPlPuery !JPuery" or die !0+nterogarea a e2uat0"E
3Cile !Jro3 K mysPlfetcCarray !Jresult""
Fontinuare
3Z0 Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL Fontinuare
printf !0Ns NsDn0"& Jro3d0\& Jro3d?\"E printf !0Ns NsDn0"& Jro3d0prenume0\& Jro3d0nume0\"E I
+nformaiile returnate de funcia mysPlfetcCarray!" reprezint# un superset al informaiilor returnate de mysPlf
etcCro3!"$ %n ciuda acestui fapt& diferenele de performan# %ntre cele dou# funcii sunt negli6a*ile si putei apela
la funcia mysPlf etcCarray !" f#r# nici o diminuare semnificati'# a performanelor$
Fea de-a treia funcie de preluare a r7ndurilor& mysPlfetcCo*6ect!"& returneaz# urm#torul r7nd al setului de
rezultate su* forma unui o*iect$ 4ceasta %nseamn# c# o*inei accesul la elementele r7ndului folosind sinta1a
Jro3-numecoloana$ -e e1emplu& dac# reg#sii 'alorile nume 2i prenume din ta*elul pre2edinte& putei o*ine
accesul la aceste coloane folosind sinta1a Jro3-nume 2i Jro3- prenume8
JPuery K 0S;L;F) nume& prenume F(=M pre2edinte0E
Jresult K mysPlPuery !JPuery" or die !0+nterogarea a e2uat0"E
3Cile !Jro3 K mysPlfetcCo*6ect !Sresult""
printf !0Ns NsDn0"& Jro3-:prenume& Jro3-:nume"E
)estarea e1istenei 'alorilor QULL %n rezultatele interog#rii
Pentru a 'erifica dac# o 'aloare dintr-o coloan# retumat# de o interogare S;L;F) este sau nu QULL& folosii
funcia isset!"$ -e e1emplu& dac# r7ndul dumnea'oastr# este inclus %n ta*loul Jro3& funcia isset!Jro3dJi\" are
'aloarea F4LS; dac# e1presia Jro3dJi\corespunde unei 'alori QULL& respecti' )(U; dac# e1presia este
diferit# de QULL$ = funcie cone1# este empty !"& dar aceasta returneaz# acela2i rezultat pentru QULL ca 2i
pentru 2irurile 'ide& deci nu este util# ca test pentru detectarea unei 'alori QULL$
-ac# interogarea dumnea'oastr# conine coloane cu 'alori calculateG -e e1emplu&W putei emite o interogare care
returneaz# 'alori calculate ca rezultat al unei e1presii8
S;L;F) F=QF4)!prenume& 0 0& nume" F(=M pre2edinte = interogare scris# astfel nu poate fi utilizat# cu
funcia mysPlf etcCo*6ect!"$ Qumele\ coloanei selectate este e1presia %ns#2i& care nu constituie un nume 'ala*il
de proprietate$T )otu2i& putei furniza un nume 'ala*il atri*uind coloanei un alias$ +nterogarea urm#toarfti atri*uie
coloanei aliasul numecomplet& care permite accesul la coloan# folosind sinta1ei Jro3-numecomplet& dac#
preluai rezultatele cu a6utorul funciei tnysPlfetcCo*6ect! "f&
S;L;F) F=QF4)!prenume& 0 0& nume" 4S numecomplet F(=M pre2edinte 8&
)ratarea erorilor
Pentru tratarea erorilor& P5P '# pune la dispoziie trei mi6loace8
@ Utilizarea caracterului e pentru a elimina mesa6ele de eroare$ Putei folosi car# terul ^ cu orice funcie care
poate afi2a un mesa6$ 4m procedat astfel c7nd am ape funcia mysPlpconnect!" pentru a %mpiedica apariia
mesa6elor de eroare generate 9 funcia respecti'# %n pagina trimis# clientului$
r
Fapitolul [ +nterfaa 4P+ pentru P5P 3Z?
@ Utilizarea funciei errorreporting!"$ 4ceast# funcie acti'eaz# sau dezacti'eaz# caracteristica de raportare a
erorilor la oricare din urm#toarele ni'ele8
Qi'el de eroare
? S
)ipuri de erori raportate
;rori normale de funcii 4'ertismente normale
U ;rori ale analizorului
[ %n2tiin#ri
Pentru a controla caracteristica de raportare a erorilor& apelai funcia errorreporting ! " cu un argument egal cu
suma ni'elelor pe care dorii s# le acti'ai$ -ezacti'area a'ertismentelor de ni'el l 2i S este suficient# pentru a
elimina mesa6ele pro'enite de la funciile MySQL8
errorreporting!U _ ["E
Pro*a*il c# nu dorii s# dezacti'ai a'ertismentele de ni'el U cu pri'ire la erorile de analiz#E dac# o facei& 'ei
a'ea mari pro*leme la depanarea oric#ror modific#ri pe care le efectuai %n scripturile dumnea'oastr#T -eseori&
a'ertismentele de ni'el [ pot fi ignorate& dar uneori indic# o pro*lem# %n scriptul dumnea'oastr# la care tre*uie
s# fii atent& deci este de dorit ca si acest ni'el s# r#m7n# acti'at$ ;1ist# si ni'elele de eroare ?] si 3S& dar acestea
pro'in de la mecanismul de *az# al lim*a6ului P5P si nu de la funcii& deci %n mod normal nu tre*uie s# '#
preocupe$
@ Utilizarea funciilor mysPlerror!" 2i mysPlerrno!"$ 4ceste funcii raporteaz# informaiile de eroare care sunt
returnate de ser'erul MySQL$ Funciile respecti'e sunt similare cu funciile din interfaa 4P+ pentru F$
mysPlerror!" returneaz# un mesa6 de eroare su* form# de 2ir !un 2ir 'id dac# nu s-a produs nici o eroare"$
mysPlerrno! " returneaz# un num#r de eroare != dac# nu s-a produs nici o eroare"$ 4m*ele funcii preiau ca
argument un identificator de leg#tur#& care specific# o cone1iune cu ser'erul MySQL& si returneaz# informaii de
eroare pentru funcia MySQL cel mai recent in'ocat# din acea cone1iune care returneaz# o stare$ +dentificatorul
de leg#tur# este opionalE dac# lipse2te& se 'a folosi cone1iunea cel mai recent descCis#$ -e e1emplu& putei
raporta o ;roare din mysPlPuery ! " %n urm#torul mod8 if !T!Jresult K mysPlPuery !$$$"""
prin !0errno8 print !0error8
mysPlerrno!"" E mysPlerror!" " E
Bersiunile P5P ale funciilor mysPlerror ! " 2i mysPlerrno ! " difer# de omoloagele lor din F dintr-un important
punct de 'edere& %n F& putei o*ine informaii despre eroare cCiar 2i c7nd o %ncercare de conectare la ser'er
e2ueaz#$ Prin contrast& apelurile P5P nu returneaz# informaii utile pentru o cone1iune dec7t dup# sta*ilirea cu
succes a cone1iunii$ Fu alte cu'inte& dac# o %ncercare de cone1iune e2ueaz#& nu putei folosi mysPlerrno!" sau
mysPlerror! " pentru a afla moti'ul$ -ac# dorii ca pentru e2ecul cone1iunii s# raportai un anumit moti'& nu un
mesa6 generic& tre*uie s# luati m#suri speciale$ Fonsultai 4ne1a 5& ,(eferin# 4P+ P5P0& pentru instruciuni
pri'ind modul %n care s# procedai$
3ZS Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Scripturile din acest capitol afi2eaz# mesa6e de eroare cu un coninut destul de general& precum ,interogarea a
e2uat0& atunci c7nd detecteaz# 'reo eroare$ )otu2i& c7nd dez'oltai un script& deseori 'ei g#si util# ad#ugarea
unui apel la funcia mysPlerror!"& pentru a afla moti'ul specific al unei erori$
Pro*leme legate de gCilimele
F7nd construii 2iruri de interog#ri %n P5P& este necesar s# cunoa2tei pro*lemele legate de gCilimele& ca 2i %n F
sau Perl$ Modalitatea %n care sunt rezol'ate pro*lemele pri'ind gCilimelele este& de asemenea& similar#& de2i
numele funciilor sunt diferite %n lim*a6e diferitei
S# presupunem c# dumnea'oastr# construii o interogare pentru inseria unei noi %nregistr#ri %ntr-un ta*elE putei
delimita prin gCilimele o 'aloare care urmeaz# a fi inserat# %ntr-o coloan# 2ir8
Jnume K 0=WMalley0E
Sprenume K 0.rian0E
Jdatae1pirare K 0S00S-Z-?0E
JPuery K 0+QS;() mem*ru !nume&prenume&datae1pirare"0 $ 0
B4LU;S!WJnumeW&WJprenumeW&WJdatae1pirareW"0
%n acest caz& pro*lema este c# una dintre 'alorile %ncadrate %ntre gCilimele conine alte gCilimele !0 =W Malley0"&
ceea ce are ca rezultat o eroare de sinta1# dac# trimitei interoga- 6 rea la ser'erul MySQL$ Pentru a rezol'a
pro*lema %n F& am fi apelat funcia l mysPlescapestring!"$ %ntr-un script Perl -.+& am fi folosit Puote!"$ P5P
are ] l funcie denumit# addslasCes !"& care e1ecut# cam aceea2i operaie$ -e e1emplu& un apel f la funcia
addslasCes !0=WMalley0" returneaz# 'aloarea 00D WMalley0$ ;1emplul anteri- Y or tre*uie scris dup# cum urmeaz#&
pentru a se pre'eni pro*lemele legate de gCilimele8
Jnume K addslasCes !0=WMalley0"E
Jprenume K addslasCes !0.rian0"E
Jdatae1pirare K addslasCes !0S00S-Z-?0"E
JPuery K 0+QS;() mem*ru !nume&prenume&datae1pirare"0 $ 0
B4LU;S!WJnumeW&WJprenumeW&WJdatae1pirareW"0
Metoda -.+ Puote !" adaug# gCilimele de delimitare la 2irul de interogare$ Func addslasCes !" nu procedeaz#
astfel& deci tre*uie s# preciz#m gCilimelele %n mod e1plic %n 2irul de interogare& %n 6urul 'alorilor care 'or fi
inserate$
Pro*leme pri'ind gCilimelele se produc& de asemenea& c7nd se scriu informaiile care 'c fi prezentate %n paginile
/e*$ -ac# scriei un 2ir care tre*uie s# apar# su* form# 5)ML sau ca pane a unui U(L& cel mai *ine este s# %l
codificai& dac# 2irul poa conine caractere care sunt speciale pentru 5)ML sau %n adrese U(L$ Funciile P+
CtmlspecialcCars !" si urlencode!" pot fi folosite %n acest scop$ Fele dou# funcii su asem#n#toare cu metodele
escape5)ML!"& respecti' escape!" din modulul FR+$pm$
Utilizarea P5P
%n continuarea acestui capitol& 'om a*orda scopurile pe care ni le-am sta*ilit %n capitolt 2i pe care le mai a'em de
%ndeplinit8
Fapitolul [ +nterfaa 4P+ pentru P5P 3Z3
@ Pentru proiectul de e'iden# a rezultatelor 2colare& tre*uie s#& scriem un script care s# ne permit# s# introducem
2i s# edit#m puncta6ele o*inute la teste 2i cCestionare$
@ Pentru Liga istoric#& dorim s# cre#m un cCestionar %n format electronic despre pre2edinii Statelor Unite si s#-i
imprim#m un caracter interacti'& astfel %nc7t %ntre*#rile s# poat# fi generate imediat pentru 'izitatorii sitului /e*$
@ -e asemenea& dorim s# permitem mem*rilor Ligii istorice s#-2i editeze ru*ricile aferente din catalogul %n
'ersiunea electronic#& pentru a p#stra informaiile actualizate 2i pentru a reduce 'olumul edit#rilor pe care le
e1ecut#m personal$
Fiecare dintre aceste scripturi genereaz# mai multe pagini /e* 2i comunic# de la o in'ocare a scriptului la alta
prin intermediul informaiilor %nglo*ate %n paginile pe care le creeaz#$ -ac# nu cunoa2tei conceptul de
comunicaii inter-pagini& putei citi seciunea ,Scrierea paginilor cu destinaie multipl#0 din capitolul X$
+ntroducerea puncta6elor ele'ilor
%n aceast# seciune& ne 'om %ndrepta atenia spre proiectul de e'iden# a rezultatelor 2colare$ 4dresa U(L a
acestei zone%n situl nostru de /e* este Cttp8 < <pit -'iper& snaMe $ net<e'id< si pro*a*il c# 'om scrie pentru aceasta
o scurt# pagin# de *az# inde1 $ pCp$ -eocamdat#& pagina urm#toare este suficient#$ Pagina conine o leg#tur#
spre scriptul score*ro3ser pe care ?-am scris %n capitolul X& deoarece acel script are leg#tur# cu proiectul de
e'iden# a rezultatelor 2colare8
9GpCp
include !0sampd*$inc0" E
Jtitlu K 0Proiect de e'identa a rezultatelor 2colare0E Ctml*egin !Stitlu& Jtitlu"E
94 5(;FK0<cgi-*in<score*ro3se0:Bizualizarea9<4: puncta6elor o*inute la cCestionare si teste
9GpCp
Ctmlend !"
G:
4cum& s# lu#m %n considerare proiectarea si implementarea scriptului scoreentry $pCp& care ne 'a permite s#
introducem un set nou de puncta6e o*inute la cCestionare sau teste& respecti' s# edit#m un set de %nregistr#ri
e1istent$ Ultima funcionalitate este necesar# pentru manipularea puncta6elor ele'ilor care susin un test sau un
cCestionar mai t7rziu dec7t restul clasei& datorit# unei a*sene pe moti' de *oal# sau dintr-un alt moti' !sau -
-oamne fere2teT - %n caz c# am introdus incorect puncta6ul"$ ScCia scriptului pentru introducerea puncta6elor
este urm#toarea8
l $ Pagina iniial# prezint# o list# cu e'enimente de e1aminare cunoscute 2i '# permite s# alegei unul& respecti'
s# specificai necesitatea de creare a unui e'eniment nou$
3ZU Partea a ??-a Utilizarea interfeelor de programare ale sistemului MySQL
S$ -ac# optai pentru crearea unui e'eniment nou& scriptul prezint# o pagin# care '# permite s# specificai data 2i
tipul e'enimentului$ -up# crearea %nregistr#rii aferente e'enimentului& scriptul afi2eaz# din nou pagina cu lista
de e'enimente& pentru a prezenta noul e'eniment$
3$ F7nd alegei un e'eniment& scriptul prezint# o pagin# de introducere a puncta6ului& care conine informaiile
despre e'eniment %n partea de sus !identificator de e'eniment& dat#& tip"& urmat de o list# cu o intrare pentru
fiecare ele'$ Pentru e'enimentele noi& intr#rile 'or fi 'ide$ Pentru e'enimentele e1istente& intr#rile 'or prezenta
puncta6ul fiec#rui ele'$ F7nd selectai *utonul ,)rimite0& puncta6ele 'or fi introduse %n ta*elul puncte$
Scriptul tre*uie s# e1ecute numeroase operaii diferite& ceea ce %nseamn# c# 'a tre*ui s# transfer#m o 'aria*il# de
stare de la o pagin# la alta& pentru ca scriptul s# 2tie ce are de f#cut atunci c7nd este in'ocat& %n P5P& aceast#
operaie este simpl#& deoarece P5P prelucreaz# 'aria*ilele transferate ca parametri U(L si le con'erte2te %n
'aria*ile cu acela2i nume ca 2i parametrii$ -e e1emplu& putem codifica un parametru aciune situat la sf7r2itul
adresei U(L a scriptului nostru astfel8
Cttp8<<pit-'iper$snaMe$net<e'id<scoreentry$pCpGactiuneK'aloare F7nd scriptul scoreent ry$ pCp este in'ocat %n
acest mod& parametrul aciune este codificat su* forma 'aria*ilei Jactiune& care este accesi*il# direct$ 4cest fapt
este 'ala*il si pentru c7mpurile din formulare$ S# presupunem c# un formular conine c7mpuri denumite nume 2i
adresa$ F7nd un client trimite formularul& ser'erul /e* in'oc# un script pentru a prelucra coninutul
formularului$ Scriptul poate afla 'alorile introduse %n formular prin 'erificarea 'alorilor 'aria*ilelor Jnume 2i
Sadresa$ Pentru formulare care conin un num#r mare de c7mpuri& nu este con'ena*il ca toate s# ai*# nume
unice$ P5P simplific# transferul ta*lourilor %n#untrul 2i %n afara formularelor$ -ac# folosii nume de c7mpuri
precum 1 d = \& 1 d ? \ 2i a2a mai departe& P5P le 'a codifica su* form# de elemente ale ta*loului J1$ 4ceste
element sunt accesi*ile su* forma J1d0\& J1d? \ etc$
Bom comunica informaiile de la o in'ocare a scriptului scoreentry$ pCp la urm#toarea folosind %n paginile
noastre un parametru denumit Jactiune& iar 'aloarea sa 'a fi 'erifi-? cat# folosind 'aria*ila Sactiune din scriptul
nostru$ Fadrul scriptului se prezint# astfel8T 9GpCp
L scoreentry$pCp - script de introducere a puncta6elor pentru
L proiectul de e'identa a rezultatelor 2colare
include !0sampd*$inc0"E
L define2te constantele de aciune define !+Q+)+4LP4R;& 0"E
define !S=L+F+);B;Q)& ?"E
define !4--;B;Q)& S"E
define !-+SPL4>SF=(;S& 3"E
define !;Q);(SF=(;S& U"E
<A $$$ funciile se insereaz# aici $$$ A<
Fapitolul [ +nterfaa 4P+ pentru P5P 3Z5
Jtitlu K 0Proiect de e'identa a rezultatelor 2colare -
introducere puncta6e0E Ctml*egin !Jtitlu& Jtitlu"E
sampd*connect!"
or die !0Qu se poate conecta la ser'erul de *aze de date0"
if !empty !Jactiune""
Jactiune K +Q+)+4LP4R;E
s3itcC !Sactiune"
H
case +Q+)+4LP4R;8
displaye'ents !"E
*reaME case S=L+F+);B;Q)8
solicite'entinfo
*reaME case 4--;B;Q)8
addne3e'ent !"E
displaye'ents !"E
*reaME case -+SPL4>SF=(;S8
displayscores !"E *reaM !"E case ;Q);(SF=(;S8 !"
L ce a'em de f#cutG
L prezint# pagina iniiala
L solicita informaii pri'ind noul
L e'eniment
L adaug# un e'eniment nou la *aza de date
L afi2eaz# puncta6ele pentru
L e'enimentul selectat
L introduce puncta6ele noi
L sau pe cele editate enterscores !"E
displaye'ents !"E *reaME default8
die !0Fod de aciune !Jactiune" necunoscut0"E
Ctmlend ! "
G:
Baria*ila Jactiune poate lua numeroase 'alori& pe care le test#m %n instruciunea s3itcC !"$ !Pentru a e'ita s#
folosim numere literale %n script& 'om folosi construcia P5P define!" pentru definirea constantelor$"
+nstruciunea s3itcC !" din P5P este similar# cu omoloaga sa din F$ %n scriptul scoreentry$pCp& aceast#
instruciune este folosit# pentru a determina aciunea care tre*uie %ntreprins# si pentru apelarea funciilor care
implementeaz# aciunea$
3Z[ Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Formularul generat de funcia solicite'entinf o!" conine un c7mp de editare pentru introducerea datelor& o
perecCe de *utoane radio pentru a specifica dac# intrarea este un test sau un cCestionar& precum 2i un *uton
,)rimite0$ F7nd trimitei formularul& este in'ocat scriptul scoreentry$pCp cu aciunea 4--;B;Q)$ Funcia
addne3e'ent!" este apelat# pentru introducerea unui nou r7nd %n ta*elul e'eniment8 function addne3e'ent!"
glo*al Jdata& JtipE
if !empty !Jdata"" L 'erifica introducerea unei date
die !0Qu a fost specificata nici o data0"E JPuery K sprintf !0+QS;() +Q)= e'eniment !data$tip"
B4LU;S!D0NsD0&D0NsDW"& addslasCes !Jdata"& addslasCes !Jtip"E if !TmysPlPuery !JPuery""
die !0Qu a putut adaug# e'enimentul0"E
%n funcia addne3e'ent!"& folosim cu'7ntul cCeie glo*al pentru a o*ine accesul la c7mpurile care sunt utilizate
%n formularul de introducere a e'enimentelor noi !data 2i tip& accesi*ile su* forma 'aria*ilelor Jdata 2i Jtip"$
-up# o 'erificare minimal# de siguran#& pentru a ne asigura c# datele nu sunt 'ide& introducem o nou#
%nregistrare %n 6 ta*elul e'eniment$ Programul principal afi2eaz# din nou lista de e'enimente dup# ce am 6
introdus %nregistrarea de e'eniment& astfel %nc7t s# putei selecta noul e'eniment 2i s# Y putei %ncepe introducerea
puncta6elor$
Funcia displayscores !" se ocup# de c#utarea tuturor puncta6elor e1istente pentru uiil e'eniment dat si afi2eaz#
un formular care afi2eaz# puncta6ele& al#turi de numele ele'ilor%6 function displayscores!"
L selecteaz# punctele pentru e'enimentul dat JPuery K 0 S;L;F)
ele'$ele'id& ele'$nume& e'eniment$data& puncte$puncte0 4S puncte& e'eniment$tip F(=M ele'& e'eniment
L;F) Y=+Q puncte =Q ele'$ele'id K puncte$ele'id
4Q- e'eniment$e'enimentid K puncte$e'enimentid /5;(; e'eniment$e'enimentid K Je'enimentid
=(-;( .> ele'$nume
Sresult K mysPlPuery !JPuery"
or die !0Qu poate e1ecuta interogarea0"E
printf !09F=(M M;)5=-KD0postD0 4F)+=QKD0NsGactiuneKNdOe'enimentidKNdD0:DnV JP5PS;LF&
;Q);(SF=(;S& Je'enimentid"E
r
Fapitolul [ +nterfaa 4P+ pentru P5P 3ZZ
L afi2eaz# puncta6ele intr-un ta*el si afi2eaz# data si tipul
L e'enimentului anterior ta*elului$ )otu2i& nu putem afi2a data si
L tipul dec7t dup# preluarea primului r7nd din setul de rezultate
JneedCeading K ? E
3Cile !Jro3 K mysPlfetcCarray !Jresult""
H
if !JneedCeading"
H
printf !0+dentificator e'eniment8 Ns&
-ata e'eniment8 Ns& )ip e'eniment8 NsDn& Je'enimentid& Jro3d0data0\ & Jro3d0tip0\"E
prin !09.(:9.(:Dn0" E
prin !09)4.L; .=(-;(:Dn0"E
prin !09)(:Dn0"E
displaycell !0)50& 0Qume0& ?"E
displaycell !0)50& 0Puncte0& ?"E
prin !09<)(:Dn0"E
JneedCeading K 0E I
prin !09)(:Dn0"E
displaycell !0)-0& Jro3d0nume0\& ?"E Jcol'al K sprintf !09+QPU) )>P;Kte1t Q4M;KD0 puncte dNs\ D00 &
Jro3d0ele'id0\"E Jcol'al $K sprintf !0 B4LU;KD0NsD0 S+i;K5:9.(:Dn0&
Jro3d 0puncte0\" E
displaycell !0)-0& Jcol'al& 0"E prin !09<)(:Dn0"E
prin !09<)4.L;:Dn0"E
prin !09.(:Dn0"E
prin !09+QPU) )>P;KD0)rimiteD0 Q4M;KD0 *uton D0 B4LU;KD0)rimiteD0:Dn0" E
prin !09<F=(M:Dn0"E I
+nterogarea pe care funcia displayscores! " o folose2te pentru reg#sirea informaiilor pri'ind puncta6ele nu este
o simpl# unire %ntre ta*ele& deoarece aceasta nu 'a selecta un r7nd al unui ele' care nu a o*inut nici un puncta6 la
e'enimentul respecti'& %n particular& pentru un e'eniment nou& unirea respecti'# nu 'a selecta nici o %nregistrare
si 'om a'ea un formular de introducere 'idT -orim s# folosim un L;F) Y=+Q pentru a fora reg#sirea unui r7nd
pentru fiecare ele'& indiferent dac# ele'ul are sau nu un puncta6 %n ta*elul puncte$ ;lementele fundamentale ale
unei interog#ri similare celei pe care funcia displayscores! " o folose2te pentru reg#sirea %nregistr#rilor cu
puncta6e din MySQL au fost date %n capitolul 3& ,Sinta1a si utilizarea SQL %n MySQL0& %n seciunea

S-ar putea să vă placă și