Sunteți pe pagina 1din 30

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

despre modul de generare a listei membrilor pentru programul banchetului anual al Ligii istorice precum !i
despre modul de generare a catalogului tip"rit al Ligii# $otu!i %&' furnizeaz" multe alte caracteristici utile#
Seciunile urm"toare trateaz" despre unele din acestea (ntr-un mod mai detaliat astfel (nc)t s" putei utiliza
scripturile Perl nu numai pentru rularea unor simple instruciuni S*L*+$#
$ratarea erorilor
Scriptul dump,members a acti-at atributul de tratare a erorilor .aise*rror atunci c)nd a in-ocat metoda connect
/0 astfel (nc)t erorile s" cauzeze terminarea imediat" a e1ecuiei scriptului cu un mesa2 de eroare# *1ist" !i alte
metode de tratare a erorilor# %e e1emplu putei -erifica personal apariia erorilor (n loc de a cere programului
%&' s" e1ecute aceast" operaie#
Pentru a -edea cum se poate controla modul de tratare a erorilor (n %&' s" e1amin"m mai (ndeaproape
argumentul final al funciei connect/0# +ele dou" atribute rele-ante sunt .aise*rror !i Print*rror3
4 %ac" .aise*rror este acti-at /adic" prime!te o -aloare diferit" de zero0 %&' apeleaz" funcia die/0 pentru a
tip"ri un mesa2 !i pentru a-!i termina e1ecuia dac" se produce -reo eroare (ntr-o metod" %&'#
4 %ac" Print*rror este acti-at %&' apeleaz" funcia 5arn/0 pentru a afi!a un mesa2 atunci c)nd se produce o
eroare %&' dar scriptul (!i continu" e1ecuia#
(n mod prestabilit .aise*rror este dezacti-at !i Print*rror este acti-at (n acest caz dac" apelul la funcia
connect /0 e!ueaz" %&' afi!eaz" un mesa2 dar (!i continu" e1ecuia# 6stfel folosind metoda prestabilit" de
tratare a erorilor pe care o obinei dac" omitei al patrulea argument al funciei connect /0 putei c"uta erori (n
acest mod3 7dbh 8 %&'-9connect /7dsn 7user,name Spass5ord0
or e1it /:0;
%ac" se produce -reo eroare funcia connect /0 returneaz" undef pentru a indica e!ecul ceea ce declan!eaz"
apelul la e1it/0# <u trebuie s" afi!ai un mesa2 de eroare deoarece %&' -a fi afi!at de2a unul#
%ac" specificai (n mod e1plicit -alorile prestabilite ale atributelor operaiei de -erificare a erorilor apelul la
funcia connect /0 se prezint" astfel3 7dbh 8 %&'-9connect /7dsn 7user,name 7pass5ord
= .aise*rror 89 > Print*rror 89 :?0 or e1it /:0;
*ste ce-a mai mult de scris dar un cititor ocazional -a sesiza mai rapid care este metoda de tratare a erorilor
utilizat"#
%ac" dorii s" c"utai personal erorile si s" -" afi!ai propriile mesa2e dezacti-ai at)t .aise*rror c)t si
Print*rror3
7dbh 8 %&'-9connect /7dsn 7user,name 7pass5ord
= .aise*rror 89 > Print*rror 89 0?0 or die @<u se poate conecta la ser-er3 7%&'33err /7%&'33errstr0An@;
BiC 9C D-@ - C C
fr 44 #DD#C:--D#@CEr 4
+apitolul F 'nterfaa 6P' pentru Perl %&' 30:
Bariabilele 7%&' 3 3 err !i 7%&' 3 3 errstr folosite (n apelul la funcia die / 0 prezentat anterior sunt utile pentru
construcia mesa2elor de eroare# 6ceste -ariabile conin codul de eroare !i !irul de eroare asem"n"tor cu funciile
mysGl,errno=0 respecti- mysGl,error / 0 din interfaa 6P' pentru +#
%ac" nu dorii dec)t ca %&' s" trateze erorile (n locul dumnea-oastr" astfel (nc)t s" nu fie necesar s" le -erificai
personal acti-ai .aise*rror3
7dbh 8 %&'-9connect /7dsn 7user,name Spass5ord = .aise*rror 89 : ?0; 6ceasta reprezint" de departe
metoda cea mai simpl" !i este cea folosit" de scriptul dump2nembers# 6cti-area atributului .aise*rror poate fi
inadec-at" dac" dorii s" e1ecutai un program personal de cur"enie atunci c)nd scriptul (!i (ncheie e1ecuia
de!i (n acest caz putei efectua operaiile dorite redefinind -ariabila de manipulare 7S'H=,%'*,?#
Un alt moti- pentru care dorii s" e-itai acti-area atributului .aise*rror este acela c" %&' afi!eaz" informaii de
natur" tehnic" (n mesa2ele sale dup" cum urmeaz"3
disconnect /%&'3 3db8I6SI/>1:JFaaeK0 0 in-alidates : acti-e statement# *ither destroy statement handles or
call finish on them before disconnecting# /'nstruciunea ### in-alideaz" l instruciune acti-"# %istrugei -ariabilele
de manipulare pentru instruciuni sau apelai funcia finish / 0 pentru acestea (nainte de deconectare#0
6cestea constituie informaii utile pentru un programator dar nu este genul de lucruri pe care utilizatorul
cotidian dore!te s" le -ad"# (n acest caz este mai bine s" -erificai personal apariia erorilor astfel (nc)t s" putei
afi!a mesa2e mai semnificati-e pentru persoanele care -or utiliza scriptul# 6lternati- putei lua (n considerare
redefinirea -ariabilei de manipulare 7S'H= , %'* , ?# 6cest lucru poate fi util deoarece -" permite s" acti-ai
.aise*rror pentru simplificarea procedurii de tratare a erorilor dar !i s" (nlocuii mesa2ele de eroare prestabilite
pe care le prezint" %&' cu propriile dumnea-oastr" mesa2e# Pentru a -" furniza propria -ariabil" de manipulare ,
%'* , (nainte de a e1ecuta -reun apel %&' procedai astfel3
7S'H= , %'* , ? 8 sub =die @Scuze s-a produs o eroareBn@; ?; %e asemenea putei declara o subrutin" (n
maniera uzual" !i putei stabili -aloarea -ariabilei de manipulare folosind o referin" la subrutin"3
sub die,handler
=
die @Scuze s-a produs o eroareAn@;
7S'H=,%'*,? 8 ALdie,handler;
+a alternati-" la transferul (n form" literal" al atributelor operaiei de tratare a erorilor (n cadrul apelului la
funcia connect / 0 acestea pot fi definite folosind o funcie hash !i transfer)nd o referin" la hash# Unii sunt de
p"rere c" Me1tinderea@ -alorilor atributelor (n acest mod faciliteaz" citirea si editarea scripturilor dar cele dou"
metode sunt identice din punct de -edere funcional# 'at" un e1emplu care prezint" modul de utilizare al -alorii
hash al unui atribut3
30N Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL Oattr8
Print*rror 89 > .aise*rror 89 >
0;
7dbh 8 %&'-9connect /7dsn 7user,name Spass5ord AOattr0
or die @<u se poate conecta la ser-er3 7%&'33err /7%&'33errstr0An@; Scriptul urm"tor intitulat dump,membersN
ilustreaz" modul de scriere a unui script atunci c)nd dorii s" -erificai personal apariia erorilor si s" -" scriei
propriile mesa2e dump2nem-bersN prelucreaz" aceea!i interogare ca !i dump2nembers dar dezacti-eaz" (n mod
e1plicit Print*rror !i .aise*rror dup" care testeaz" rezultatul fiec"rui apel %&'# +)nd se produce o eroare
scriptul in-oc" subrutina bail,out/0 care afi!eaz" un mesa2 respecti- coninutul -ariabilelor 7%&'33 err !i 7%&'33
errstr (nainte de a-si (ncheia e1ecuia3
PQ RusrRbinRperl
P dutnp,membersN - afi!eaz" lista membrilor Ligii istorice
use %&'; use strict;
my /7dsn0 8 @%&'3mysGl3samp,db3localhost@; P nume sursa date my /7user,name0 8 @paul@; P numele
utilizatorului my /7pass5ord0 8 @secret@ P parola
P -ariabile pentru baza de date si instruciune
P tablou pentru r)ndurile returnate de interogare
P atributele de tratare a erorilor
my /7dbh 7sth0; my /Sary0; my /Oattr0 8
Print*rror 89 > .aise*rror 89 >
P conectarea la baza de date
7dbh 8 %&'-9connect /7dsn 7user,name Spass5ord AOattr0 or bail,out /@<u se poate conecta la baza de
date@0;
P emiterea interog"rii
7sth 8 7dbh-9prepare /@S*L*+$ nume prenume sufi1 email
# @strada ora! stat cod,postal telefon T.>M membru@
@>.%*. &U nume@0
or bail,out /@<u poate prepara interogarea@0; 7sth-9e1ecute /0
or bail,out /@<u poate e1ecuta interogarea@0;
+apitolul F 'nterfaa 6P' pentru Perl %&' 303
P cite!te rezultatele interog"rii 5hile /Sary 8 7sth-9fetchro5,array/00
=
print 2oin /@At@ Sary0 @An@;
?
7%&'33err 88 >
or bail,out /@*roare in timpul reg"sirii@0;
P cur"enie 7sth-9finish /0
or bail,out /@<u poate finaliza interogarea@0;
7dbh-9disconnect /0
or bail,out /@<u se poate deconecta de la baza de date@0; e1it /00;
P subrutina bail,out/0 - afi!eaz" cod de eroare si !irul de eroare
apoi isi (ncheie e1ecuia
sub bail,out
my /7message0 8 shift;
die @7messageAn*rror 7%&'33err /7%&'33errstr0An@0;
Tuncia bail,out/0este similar" cu funcia print,error/0 pe care am folosit-o pentru scrierea programelor + din
capitolul V cu deosebirea c" bail,out /0 (!i (ncheie e1ecuia nu returneaz" controlul apelantului# bail,out /0 -"
scute!te de efortul de a scrie numele -ariabilelor 7%&'33 err !i 7>&'33 errstr de fiecare dat" c)nd dorii s" scriei
un mesa2 de eroare# %e asemenea prin (ncapsularea afi!"rii mesa2elor (ntr-o subrutin" putei schimba (n mod
uniform formatul mesa2elor dumnea-oastr" de eroare (n (ntreg scriptul efectu)nd o modificare (n subrutin"#
Scriptul dump2nembers include dup" ciclul de preluare a r)ndurilor un test pe care scriptul dump2nembers nu-:
conine# %eoarece dump,membersN nu-!i (ncheie automat e1ecuia dac" se produce -reo eroare (n tabloul
fetchro5,array /0 este mai prudent s" se determine dac" ciclul s-a terminat datorit" citirii complete a setului de
(nregistr"ri /terminare normal"0 sau datorit" producerii unei erori# +iclul se (ncheie (n ambele situaii desigur
dar (n cazul apariiei unei erori datele de ie!ire ale scriptului -or fi trunchiate (n absena unei -erific"ri a
apariiei erorilor persoana care ruleaz" scriptul nu -a a-ea nici cel mai mic indiciu c" s-ar fi (nt)mplat ce-aQ
%ac" -erificai personal apariia erorilor nu uitai s" testai rezultatul ciclurilor de preluare#
30K Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
$ratarea interog"rilor care nu returneaz" nici un set de rezultate
'nstruciuni precum %*L*$* '<S*.$ .*PL6+* si UP%6$* care nu returneaz" r)nduri sunt relati- simplu
de prelucrat (n comparaie cu instruciuni precum S*L*+$ %*S+.'&* *WPL6'< !i SI>X care returneaz"
r)nduri# Pentru a prelucra o instruciune care nu este de tip S*L*+$ transferai-o funciei do/0 folosind -ariabila
de manipulare pentru baze de date# Metoda do/ 0 prepar" !i e1ecut" interogarea (ntr-o singur" etap"# %e e1emplu
pentru a introduce rubrica aferent" unui membru nou pe nume +ornel Basile cu data e1pir"rii 3 iunie N00N
putei proceda astfel3
7ro5s 8 7dbh-9do /@'<S*.$ membru / nume prenume e1pirare 0@
# @ B6LU*S /C Basile: C+ornel: CN00N-V-3C0@0;
Metoda do/ 0 returneaz" un num"r al r)ndurilor afectate respecti- undef dac" se produce -reo eroare# > eroare
se poate produce din di-erse moti-e# /%e e1emplu interogarea este deformat" sau dumnea-oastr" nu a-ei
permisiunea de a obine acces la tabel#0 Pentru o -aloare returnat" diferit" de undef fii atent la situaia (n care nu
este afectat nici un r)nd# +)nd sur-ine o atare situaie funcia do/0 nu returneaz" num"rul 0; (n schimb
returneaz" !irul @>*>@ /notaia !tiinific" folosit" (n Perl pentru zero0# @>*>@ are -aloarea > (ntr-un conte1t
numeric dar este considerat ca Made-"rat@ (n teste condiionale astfel (nc)t s" poat" fi deosebit cu u!urin" de
undef# %ac" funcia do/ 0 ar fi returnat > atunci ar fi fost mai dificil s" se fac" diferena dintre apariia unei erori
/undef0 !i cazul (n care nu a fost afectat nici un r)nd# Putei -erifica apariia unei erori folosind oricare din
urm"toarele teste3
if /idefined /7ro5s00 = P eroare ?
if /Q7ro5s0 = P eroare ?
(n conte1te numerice @>*>@ are -aloarea 0# Programul urm"tor -a afi!a corect num"rul r)ndurilor pentru orice
-aloare a -ariabilei 7ro5s diferit" de undef3
if /Q7ro5s0
=
prin @eroareAn@;
? else
Y
7ro5s Z8 0; P con-ersie forat" la num"r daca @>*>@
prin @7ro5s r)nduri afectateAn@;
? ,
%e asemenea putei afi!a -aloarea -ariabilei 7ro5s folosind un format Od cu funcia printf / 0 pentru a fora o
con-ersie implicit" la un num"r3 if /Q7ro5s0 =
prin @eroareAn@;
? else
print @Od 7ro5s r)nduri afectateAn@ 7ro5s;
+apitolul F 'nterfaa 6P' pentru Perl %&' 30[
Metoda do /0 este echi-alent" cu prepare /0 urmat" de e1ecute /0# 'nstruciunea '<S*.$ anterioar" poate fi
emis" !i astfel nu numai prin apelarea funciei do /03
7sth 8 7dbh-9prepare/@'<S*.$ membru /nume#prenumee1pirare0@ # @ B6LU*S/CBasileCC+ornelCCN00N-V-
3C0@0;
7ro5s 8 7sth-9e1ecute /0;
$ratarea interog"rilor care returneaz" un set de rezultate
6ceast" seciune furnizeaz" mai multe informaii despre numeroase opiuni pe care le a-ei la dispoziie (n
-ederea e1ecut"rii ciclului de preluare a r)ndurilor pentru interog"rile S*L*+$ /sau pentru alte interog"ri de tip
S*L*+$ care returneaz" r)nduri precum %*S+.'&* *WPL6'< si SI>X0# %e asemenea se discut" despre
obinerea num"rului de r)nduri ale unui rezultat modul de tratare a seturilor de rezultate pentru care nu este
necesar nici un ciclu respecti- despre reg"sirea Mdintr-o mi!care@ a unui (ntreg set de rezultate#
Scrierea ciclurilor de preluare a r)ndurilor
Scriptul dump2nembers reg"sea date folosind o sec-en" standard de metode %&'3 pre-pare/0 pentru a permite
dri-erului s" pre-proceseze interogarea e1ecute/0 pentru a (ncepe e1ecuia interog"rii f etchro5,array /0 pentru
a prelua fiecare r)nd al setului de rezultate respecti- finish/0 pentru a elibera resursele alocate interog"rii#
prepare/0 e1ecuteQ0 !i finish/0 sunt componente oarecum standard ale prelucr"rii oric"rei interog"ri care
returneaz" r)nduri# $otu!i pentru preluarea r)ndurilor f etchro5,array /0 este numai o opiune din alte
numeroase metode /-ezi tabelul F#30#
$abelul F#3 Metode %&' pentru preluarea r)ndurilor
<umele metodei
fetchro5,array/0
fetchro5,arrayref/0
fetch/0
fetchro52iashref/0
Baloare returnat"
$ablou cu -alorile din r)nd
.eferin" la un tablou cu -alorile din r)nd
Similar cu f etchro5,arrayref /0
.eferin" la -alorile hash ale -alorilor din r)nd care conin si numele coloanei drept cheie
*1emplele urm"toare prezint" modul de utilizare a fiec"rei metode de preluare a r)ndurilor# *1emplele parcurg
ciclic r)ndurile unui set de rezultate !i pentru fiecare r)nd afi!eaz" -alorile din coloane separate prin -irgule#
*1ist" metode mai eficiente de a scrie codul de afi!are (n anumite situaii dar e1emplele sunt astfel scrise pentru
a ilustra sinta1a necesar" accesului la -alorile indi-iduale din coloane#
f etchro5,array / 0 este folosit" dup" cum urmeaz"3 5hile /Sary 8 7sth-9fetchro5,array /00
7delim 8
+ontinuare
30V Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
+ontinuare
for /7i 8 0; 7i Y Sary; 7iZZ0
=
prin 7delim # 7ary\7i]; 7delim 8 @@;
?
prin @An@;
?
Tiecare apel la funcia fetchro5,array/0 returneaz" un tablou de -alori din r)nd respecti- un tablou -id dac" nu
mai e1ist" r)nduri#
+a alternati-" la atribuirea -alorii returnate unei -ariabile de tip tablou putei prelua -alorile din coloane (ntr-un
set de -ariabile scalare# Putei face aceasta dac" dorii s" lucrai cu nume de -ariabile care sunt mai semnificati-e
dec)t 7ary \0] 7ary\ : ] etc# S" presupunem ca dorii s" reg"sii -alorile numelor !i ale adreselor de e-mail (n
-ariabile# Tolosind f etchro5,array/0 putei selecta si prelua r)nduri astfel3
7sth 8 7dbh-9prepare /@S*L*+$ nume prenume sufi1 email@ # @strada ora! stat cod,postal telefon
T.>M membru@ # @>.%*. &U nume@0;
7sth-9e1ecute /0;
5hile //7nume 7prenume 7sufi1 7email0 8 7sth-9fetchro5,array/00
=
P se e1ecuta operaii cu -ariabilele
?
+)nd folosii o list" de -ariabile (n acest mod trebuie s" -" asigurai c" interogarea dumnea-oastr" selecteaz"
coloanele (n ordinea corect" desigur# %&' nu cunoa!te ordinea (n care sunt denumite coloanele (n instruciunea
dumnea-oastr" S*L*+$ deci dumnea-oastr" trebuie s" atribuii -ariabilele corect# %e asemenea putei
determina ca -ariabilele indi-iduale s" primeasc" (n mod automat -alorile coloanelor atunci c)nd selectai un
r)nd folosind o tehnic" cunoscut" sub numele de asociere a parametrilor# %espre aceasta -om discuta mai
detaliat (n seciunea M+)mpuri de (nlocuire !i asocierea parametrilor@# fetchro5,arrayref /0 este similar" cu
fetchro5,array/0 dar (n loc de a returna un tablou care conine -alorile coloanelor pentru r)ndul curent pur si
simplu returneaz" o referin" la tablou respecti- undef atunci c)nd nu mai e1ist" r)nduri# Se folose!te astfel3
5hile /7ary,ref 8 7sth-9fetchro5,arrayref/00
7delim 8 @@; for /7i 8 0; 7i
=
prin Sdelim 7delim 8 @@;
?
prin @An@;
S=7ary,ref?;
7ary,ref-9\7i];
+apitolul F 'nterfaa 6P' pentru Perl %&' 30F
*lementele tabloului sunt accesibile prin intermediul referinei la tablou 7ary,ref# 6ceasta este oarecum
asem"n"tor cu determinarea entit"ii indicate de un pointer deci folosii 7ary,ref -9\7i] (n loc de 7ary\7i]# Pentru
a trata referina ca tablou complet folosii construcia S=7ary,ref ?#
fetchro5,arrayref /0 nu este adec-at" pentru preluarea -ariabilelor (ntr-o lista# %e e1emplu ciclul urm"tor nu
funcioneaz"3
5hile //7nume Sprenume 7sufi1 7email0 8 S=7sth-9fetchro5,arrayref/0?0
=
P se utilizeaz" -ariabilele intr-un anumit mod
?
6t)ta timp c)t fetchro5,arrayref /0 preia efecti- un r)nd ciclul funcioneaz" corect# +)nd (ns" r)ndurile se
termin" f etchro5,arrayref /0 returneaz" undef iar S=undef ? nu este o -ariabil" corect"# /*ste similar cu
(ncercarea de determinare a entit"ii indicate de un pointer <ULL (ntr-un program +#0
+ea- de-a treia metod" de preluare a r)ndurilor f etchro52iashref /0 se folose!te astfel3 5hile /Shashref 8 7sth-
9fetchro52iashref/00
=
Sdelim 8 @@;
foreach 7^ey /^eys /O=7hashref?00
=
prin 7delim # 7hashref-9=7^ey?; 7delim 8 @@;
?
prin @An@;
?
Tiecare apel la funcia f etchro52iashref /0 returneaz" o referin" la un hash al -alorilor unui r)nd ordonate dup"
numele coloanelor respecti- undef dac" nu mai sunt r)nduri (n acest caz -alorile coloanelor nu sunt dispuse
(ntr-o ordine anumit"; membrii funciilor hash din Perl nu sunt ordonai# +u toate acestea elementele hash sunt
ordonate (n funcie de numele coloanei deci Shashref -" ofer" o singur" -ariabil" prin intermediul c"reia putei
obine acces la orice -aloare de coloan" (n funcie de nume# 6ceasta -" permite s" e1tragei -alori /sau orice
subset de -alori0 !i nu trebuie s" cunoa!tei ordinea (n care interogarea S*L*+$ a reg"sit coloanele# %e e1emplu
dac" dorii s" obinei acces la c)mpurile cu numele si adresa de e-mail procedai astfel3
5hile /Shashref 8 7sth-9fetchro5,hashref/00
=
7delim 8 @@;
foreach 7^ey /@nume@ @prenume@ @sufi1@ @email@0
=
prin 7delim # 7hashref-9=7^ey?; 7delim 8 @@;
?
prin @An@;
't# K S
30_ Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Tuncia f etchro52iashref /0 este util" mai ales c)nd dorii s" transferai `nei funcii un r)nd de -alori f"r" a
impune funciei s" cunoasc" ordinea (n care au fost denumite coloanele (n instruciunea S*L*+$ (n acest caz
-ei apela funcia f etchro52iashref =0 pentru reg"sirea r)ndurilor !i -ei scrie o funcie care obine acces la
-alorile din hash-ul r)ndului folosind numele coloanelor# .einei urm"toarele pericole atunci c)nd folosii f
etchro52iashref /03
4 %ac" a-ei ne-oie de ma1imum de performan" f etchro5,hashref /0 nu este cea mai bun" opiune deoarece
nu este la fel de eficient" ca fetchro5,array/0 sau fetchro5,arrayref/0#
4 <umele coloanelor folosite ca -alori cheie (n hash respect" m"rimea literelor folosite la scrierea coloanelor (n
instruciunea S*L*+$ (n MySQL numele coloanelor nu sunt sensibile la diferena (ntre ma2uscule si minuscule
deci interogarea -a a-ea acela!i efect indiferent de m"rimea literelor folosite pentru scrierea numelor coloanelor#
%ar numele elementelor hash cheie din Perl sunt sensibile la diferena (ntre ma2uscule !i minuscule fapt ce -"
poate pro-oca probleme# Pentru a e-ita posibile probleme legate de neconcordane (ntre m"rimile literelor putei
cere funciei f etchro52iashref /0 s" foreze scrierea numelor coloanelor folosind o anumit" m"rime de liter"
transfer)n-du-i acesteia un atribut <6M*,lc sau <6M*,uc3
7hash,ref 8 7sth-9fetchro52iashref /C<6M*,lcC0;
P folose!te nume scrise cu minuscule 7hash,ref 8 7sth-9fetchro52iashref /C<6M*,ucC0;
P folose!te nume scrise cu ma2uscule
4 Iash-ul conine c)te un element pentru fiecare nume distinct de coloan"# %ac" efectuai o unire care returneaz"
coloane din mai multe tabele cu nume care se suprapun nu -ei putea a-ea acces la toate -alorile din coloane# %e
e1emplu dac" emitei urm"toarea interogare f etchro52iashref /0 -a returna un hash a-)nd un singur element3
S*L*+$ a#nume b#nume T.>M a b XI*.* a#nume 8 b#nume
%eterminarea num"rului de r)nduri returaate de o interogare
+um putei determina num"rul de (nregistr"ri returnate de o interogare S*L*+$ sau de tip S*L*+$a >
modalitate este aceea de a num"ra r)ndurile pe m"sur" ce le preluai desigur# %e fapt aceasta este singura
metod" portabil" de a cunoa!te num"rul de r)nduri pe care le returneaz" o interogare S*L*+$# Utiliz)nd dri-erul
MySQL putei apela metoda ro5s/0 folosind -ariabila de manipulare a instruciunii dup" in-ocarea funciei e1e-
cute /0 dar acest procedeu nu este portabil la alte motoare de baze de date# <ici m"car (n MySQL ro5s /0 nu
returneaz" rezultatul corect dec)t atunci c)nd ai preluat toate r)ndurile dac" ai acti-at atributul
mysGl,use,result# /Pentru mai multe informaii -ezi 6ne1a H#0 %eci puteri la fel de bine num"ra r)ndurile pe
m"sur" ce le preluai#
Preluarea rezultatelor compuse dintr-un singur r)nd
<u este necesar s" rulai un ciclu pentru obinerea rezultatelor dac" setul de rezultate const" dintr-un singur r)nd#
S" presupunem c" dorii s" scriei un script count2nembers care -" indic" num"rul curent al membrilor Ligii
istorice# +odul pentru efectuarea interog"rii are urm"torul aspect3
3 +apitolula 'nterfaa 6PQ pentru Pert %&' 30J
P emite interogarea
7sth 8 7dbh-9prepare /@S*L*+$ +>U<$ /D0 T.>M membru@0 ; 7sth-9e1ecute /0;
P cite!te rezultatele interog"rii apoi face cur"enie Scount 8 7sth-9fetchro5,array /0;
7sth-9finish /0;
7count 8 @nedeterminat@ if 'defined- /bcount0;
prin @7countAn@;
'nstruciunea S*L*+$ -a returna un singur r)nd deci nu este necesar un ciclu; -om apela funcia
fetchro5,array/ 0 numai o dat"# (n plus deoarece select"m o singur" coloan" nu este necesar" nici m"car
atribuirea -alorii returnate unui tablou# +)nd funcia f etchro5,array / 0 este apelat" (ntr-un conte1t scalar /unde
se a!teapt" o singur" -aloare nu o list" (ntreag"0 -a returna -aloarea din prima coloan" a r)ndului respecti-
undef dac" nu mai e1ist" r)nduri disponibile#
Un alt tip de interog"ri pentru care este de a!teptat cel mult o singur" (nregistrare este cel care conine L'M'$ :
pentru limitarea num"rului de r)nduri returnate# > utilizare comun" a acestui atribut este pentru returnarea
r)ndului care conine -aloarea minim" respecti- ma1im" a unei anumite coloane# %e e1emplu interogarea
urm"toare afi!eaz" numele si data na!terii pre!edintelui american care s-a n"scut cel mai recent3
7Guery 8 @S*L*+$ nume prenume data,nastere@
# @T.>M pre!edinte >.%*. &U data,nastere %*S+ L'M'$ :@;
7sth 8 7dbh-9prepare /7Guery0;
7sth-9e1ecute /0 ;
P cite!te rezultatele interog"rii apoi face cur"enie /7nume Sprenume 7data,nastere0 8 7sth-9fetchro5,array
/0; 7sth-9finish /0 ;
if /C#defined /7nume00
= @ C C ##### - C
print @'nterogarea nu a returnat nici un rezultatBn@;
? 4@C l;
else
c
prin @Pre!edintele n"scut cel mai recent3 @C bnume Sprenume /7data,nastere0An@;
? C 3 C @ 3 C @4C@44C44C @C ######
6lte tipuri de interog"ri pentru care nu este necesar nici un cichi de preluare sunt cele care folosesc M6W/0 sau
M'</0 pentru a sdecta o singur" -aloare# %ar (n toate aceste situ"rii o modalitate chiar mai simpl" de a obine
un rezuhat cu un singur r)nd este de a folosiCmetoda cu -ariabila de manipulare pentru baze de date select
ro5,array / 0 care combina funciile prepare / 0 e1ecute / 0 si rutina de preluare a r)ndurilor (ntr-un singur apel#
Tuncia selectro5,array /0 returneaz" un tablou /nu o referin"0 respecti- un
3:0 Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
tablou -id (n cazul apariiei unor erori# *1emplul anterior poate fi scris astfel folosind funcia selectro5,array/03
7Guery 8 @S*L*+$ nume prenume data,nastere@
# @ T.>M pre!edinte >.%*. &U data,nastere %*S+ L'M'$ :@;
/7nume 7prenume 7data,nastere0 8 7sth-9selectro5,array /SGuery0;
if /'defined /7nume00
=
prin @'nterogarea nu a returnat nici un rezultatAn@;
?
else
=
print @Pre!edintele n"scut cel mai recent3
7nume Sprenume /7data,nastere0An@; ?
Lucrul cu seturi de rezultate complete
+)nd folosii un ciclu de preluare %&' nu furnizeaz" -reo modalitate de c"utare aleatoare (n setul de prelucrare
!i nici o metod" de prelucrare a r)ndurilor (n orice alt" ordine dec)t cea (n care le-a returnat ciclul# %e asemenea
dup" ce preluai un r)nd r)ndul anterior se pierde dac" nu luai m"suri pentru a-: p"stra (n memorie# 6ceast"
comportare nu este (ntotdeauna adec-at"3
4 Putei dori s" prelucrai r)nduri (ntr-o ordine non-sec-enial"# S" consider"m o situaie c)nd dorii s" alc"tuii
un chestionar care se bazeaz" pe datele despre pre!edinii americani menionate (n tabelul pre!edinte al Ligii
istorice# %ac" dorii s" punei (ntreb"ri (ntr-o alt" ordine la fiecare prezentare a chestionarului putei selecta toate
r)ndurile din tabelul pre!edinte# 6poi putei selecta r)nduri (ntr-o ordine aleatoare pentru a -aria ordinea
pre!edinilor despre care punei (ntreb"rile# Pentru a selecta un r)nd (n mod aleator trebuie s" a-ei acces
simultan la toate r)ndurile#
4 Putei dori s" folosii numai un subset al r)ndurilor returnate subset selectat aleator# %e e1emplu pentru a
prezenta o (ntrebare cu opiuni multiple cu pri-ire la locul na!terii unui pre!edinte putei selecta aleator un r)nd
pentru a selecta pre!edintele /si r"spunsul corect0 iar apoi alegei alte r)nduri din care s" e1trageri opiunile
eronate#
4 Putei dori s" obinei (ntregul set de rezultate chiar dac" (l prelucrai (n ordine sec-enial"# 6cest l acru poate fi
necesar dac" trebuie s" e1ecutai mai multe parcurgeri ale r)ndurilor# %e e1emplu (ntr-un calcul statistic putei
parcurge o dat" setul de rezultate pentru a e-alua unele propriet"i numerice generale ale datelor dumnea-oastr"
iar apoi parcurgei r)ndurile din nou e1ecut)nd o analiz" cu un caracter mai specific#
Putei obine acces la setul de rezultate (n totalitatea sa (n dou" moduri diferite# Putei efectua ciclul de preluare
obi!nuit !i sal-ai fiecare r)nd pe m"sur" ce (l preluai fie putei folosi o metod" care returneaz" un (ntreg set de
rezultate dintr-o dat"# 'ndiferent cum procedai -ei obine o matrice care conine un r)nd pentru fiecare r)nd al
setului de rezultate respecti- num"rul de coloane pe care le-ai selectat# Putei prelucra elementele matricei (n
orice ordine dorii de oric)te ori dorii# *1punerea urm"toare descrie ambele metode#
+apitolul F 'nterfaa 6P' pentru Perl %&' 3::
> modalitate de a folosi un ciclu de preluare pentru capturarea setului de rezultate este de a folosi funcia f
etchro5,array /0 !i de a sal-a un tablou cu referine la r)nduri# Programul urm"tor procedeaz" (ntr-un mod
similar cu ciclul de preluare-afisare din scriptul dump,members cu deosebirea c" sal-eaz" toate r)ndurile apoi
afi!eaz" matricea pentru a ilustra modul de determinare a num"rului de r)nduri !i coloane din matrice precum !i
modul de acces la membrii indi-iduali ai matricei my />matri10 8 /0; P tablou de referine la tablou
5hile /my Sary 8 7sth-9fetchro5,array /00 P preia fiecare r)nd =
push /dmatri1 t Sary ]0; P sal-eaz" referina la r)ndul preluat ? 7sth-9finish /0;
P determina dimensiunile matricei
my /gro5s0 8 scalar /dmatri10;
my /Scols0 8 /7ro5s 88 > a > 3 scalar /S=7matri1\0]?00;
for /my 7i 8 0; 7i Y 7ro5s ; 7iZZ0 P afi!eaz" fiecare r)nd
=
my /7delim0 8 @@;
for /my 72 8 0; 73 Y 7cols ; 7]CZZ0
=
prin 7delim # 7matri1\7i]\72]; 7delim 8 @@;
?
prin @An@; ?
+)nd stabilii dimensiunile matricei num"rul r)ndurilor trebuie s" fie determinat primul deoarece calculul
num"rului de coloane depinde de faptul dac" matricea este -id" sau nu# %ac" 7ro5s este > matricea este -id" !i
7cols de-ine de asemenea 0# (n caz contrar num"rul coloanelor poate fi calculat ca fiind num"rul elementelor din
tabloul aferent unui r)nd folosind sinta1a S=7matri1\7i]? pentru a a-ea acces la r)ndul 7i (n totalitatea sa#
(n e1emplul anterior am preluat fiecare r)nd apoi am sal-at o referin" la acesta# 6i putea presupune c" este mai
eficient s" apelai funcia fetchro5,arrayref /0 (n loc s" reg"sii direct referinele la r)nduri3
my /dmatri10 8 /0; P tablou de referine la tablou
5hile /my dary,ref 87sth-9fetchro5,arrayref /00
=
P acest procedeu nu funcioneaz"
push /dmatri1 Sary,ref0; P sal-eaz" referina la r)ndul preluat
?
7sth-9finish /0;
3:N Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Metoda de mai sus nu funcioneaz" deoarece fetchro5,arrayref /0 refoloseste tabloul spre care indic" referina#
Matricea rezultant" este un tablou de referine unde fiecare referin" indic" spre acela!i r)nd - r)ndul reg"sit
ultimul# +a atare dac" dorii s" preluai r)nd cu r)nd folosii f etch ro5,ar ray /0 (n loc de f etchro5,arrayref /0#
+a alternati-" la utilizarea unui ciclu de preluare putei folosi una dintre metodele %&' care returneaz" (ntregul
set de rezultate# %e e1emplu f etchall,arrayref /0 returneaz" o referin" la un tablou de referine unde fiecare din
aceste referine indic" spre coninutul unui r)nd al setului de rezultate# *ste puin dar ca efect -aloarea
returnat" este o referin" la o matrice# Pentru a folosi f etchall,arrayref /0 apelai prepare /0 !i e1ecute /0 apoi
reg"sii rezultatul astfel3
my /7matri1,ref0; P referina la un tablou de referine
7matri1,ref 8 7sth-9fetchall,arrayref /0; P preia toate r)ndurile
P determina dimensiunile matricei
my /Sro5s0 8 /Sdefined /7matri1,ref0 a > 3 scalar /S=7matri1,ref900;
my /7cols0 8 /7ro5s 88 > a > 3 scalar /0=7matri1,ref-9\00?00;
for /my 7i 8 0; 7i Y 7ro5s; 7iZZ0
my /7delim0 8 @@;
for /my 72 8 0; 72 Y 7cols; 7]ZZ0
prin 7delim # 7matri1,ref-9\7i]\72]; 7delim 8 @#@;
P afi!eaz" fiecare r)nd
prin @An@;
Tuncia fetchall,arrayref /0 returneaz" o referin" la un tablou -id dac" setul de rezultate este -id# .ezultatul este
undef dac" sur-ine o eroare deci dac" atributul .aise*rror nu este acti-at nu uitai s" -erificai -aloarea
returnat" (nainte de a (ncepe s" o folosii#
<um"rul de r)nduri !i de coloane este determinat de faptul dac" matricea este sau nu -id"# %ac" dorii s" obinei
acces la un (ntreg r)nd 7i al matricei ca la un tablou folosii sinta1a S=7matri1,ref-9\i]?#
*ste categoric mai simplu s" se foloseasc" f etchall,arrayref /0 pentru a reg"si un set de rezultate dec)t s" se scrie
un ciclu de preluare a r)ndurilor de!i sinta1a pentru accesul la elementele tabloului de-ine puin mai complicat"#
> metod" similar" cu fetchall,arrayref /0 dar care e1ecut" mai multe operaii este selectall,arrayref /0# 6ceast"
metod" e1ecut" automat (ntreaga sec-en" format" din prepare/0 e1ecute=0 ciclul de preluare !i finish/0# Pentru
a folosi selectall,arrayref/0 transferai interogarea direct acestei funcii folosind -ariabila de manipulare pentru
baze de date3
+apitolul F 'nterfaa 6P' pentru Perl %&' 3:3 my /7matri1,ref0; P referina la tablou de referine
7matri1,ref 8
7dbh-9selectall,arrayref /@S*L*+$ nume prenume sufi1@ # @email strada ora! stat cod,postal telefon
T.>M @ # @membru >.%*. &U nume@0;
P determina dimensiunile matricei
my /7ro5s0 8 /tdefined /7matri1,ref0 a > 3 scalar /S=7matri1,ref?00;
my /7cols0 8 /Sro5s 88 > a > 3 scalar /S=7matri1,ref-9\0]?00;
for /my 7i 8 0; 7i Y 7ro5s; 7i-n-0 P afi!eaz" fiecare r)nd
my /7delim0 8 @@;
for /my 72 8 0; 72 Y 7cols;
prin 7delim # 7matri1,ref-9\7i]\72]; 7delim 8 @@;
prin @An@;
Berificarea -alorilor <ULL
+)nd reg"sii date dintr-o baz" de date poate fi necesar s" facei diferena (ntre -alorile coloanelor care sunt
<ULL !i -alorile zero sau !irurile -ide# 6cest lucru este u!or de f"cut deoarece %&' returneaz" -alorile <ULL
ca undef# $otu!i trebuie s" fii sigur c" folosii testul corect# %ac" (ncercai urm"torul fragment de program -a
afi!a @fals e@ de toate cele trei ori3
7col,-al 8 undef; if /Q7col,-al0 = prin @fal!iAn@; ?
7col,-al 8 0; if /l7col,-al0 = prin @fal!iAn@; ?
7col,-al 8 @@; if /Q7col,-al0 = prin @falsQAn@;? %e asemenea !i acest fragment afi!eaz" @falsQ@ la ambele
teste3
7col,-al 8 undef; if /7col,-al eG @@0 = prin @falsQAn@; ?
7col,-al 8 @@; if /7col,-al eG @@0 = prin @falslAn@; ? 6cest fragment are acela!i efect3
7col,-al 8 @@;
if /7col,-al eG @@0 = prin @falsQAn@; ?
if /7col,-al eG 88 00 = prin @falsQAn@; ?
Pentru a face diferena (ntre -alorile <ULL si -alorile diferite de <ULL din coloane folosii def ined/0# %up" ce
ai aflat c" o -aloare nu reprezint" <ULL putei face diferena (ntre alte tipuri de -alori folosind testele adec-ate#
%e e1emplu3
if //defined /7col,-al0 = print @<ULL6nC; ?
elsif /7col,-al eG @@0 = print @sir -idAn@; ?
elsif /7col,-al 88 00 = prin @zeroAn@; ?
else = print @alta -aloareAn@; ?
3:K Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
*ste important s" efectuai testele (ntr-o ordine corespunz"toare deoarece at)t a doua c)t !i a treia comparaie
sunt ade-"rate dac" 7col,-al este un !ir -id# %ac" in-ersai ordinea acestor comparaii -ei identifica (n mod
incorect !irurile -ide ca fiind zero
Probleme legate de ghilimele
P)n" acum am construit interog"ri (n cel mai elementar mod cu putin" folosind !iruri (ncadrate (ntre ghilimele
simple# 6cest fapt creeaz" o problem" la ni-elul le1ical al limba2ului Perl atunci c)nd !irurile dumnea-oastr"
(ncadrate (ntre ghilimele conin -alori de asemenea (ncadrate (ntre ghilimele# %e asemenea putei a-ea probleme
la ni-elul SQL c)nd dorii s" inserai sau s" selectai -alori care conin ghilimele bac^slash-uri sau date binare#
%ac" specificai o interogare sub forma unui !ir Perl delimitat prin ghilimele trebuie s" modificai semnificaia
tuturor apariiilor caracterului de citare (n interiorul !irului de interogare3
7Guery 8 C'<S*.$ absente B6LU*S/:KAC:JJJ-J-:VAC0C;
SGuery 8 @'<S*.$ absente -6LU*SU#Biggg-g-ieBC0@;
6t)t Perl c)t si MySQL -" permit s" (ncadrai !iruri (ntre ghilimele folosind ghilimele simple sau duble deci
uneori putei e-ita modificarea semnificaiei unor caractere prin combinarea semnelor cit"rii3
SGuery 8 C'<S*.$ absente -6LU*S/:K@:JJJ-J-:V@0C;
7Guery 8 @'<S*.$ absente B6LU*S/:KC:JJJ-J-:VC0@;
+u toate acestea cele dou" tipuri de ghilimele nu sunt echi-alente (n Perl# .eferinele la -ariabile sunt
interpretate numai (n interiorul ghilimelelor duble# +a atare ghilimelele simple nu sunt foarte utile atunci c)nd
dorii s" construii interog"ri prin (nglobarea referinelor la -ariabile (n !irul de interogare# %e e1emplu dac"
-aloarea -ariabilei 7-ar este :K urm"toarele dou" !iruri nu sunt echi-alente3
@S*L*+$ D T.>M membru XI*.* id 8 7-ar@
CS*L*+$ D T.>M membru XI*.* id 8 7-arC
birurile sunt interpretate dup" cum urmeaz"; e-ident primul !ir este cel care poate fi trimis unui ser-er MySQL3
@S*L*+$ D T.>M membru XI*.* id 8 :K@
CS*L*+$ D T.>M membru XI*.* id 8 7-arC
> alternati-" la (ncadrarea !irurilor (ntre ghilimele duble const" (n utilizarea construciei GG=? care indic"
programului Perl s" trateze (ntreg te1tul cuprins (ntre GG= si ? ca pe un !ir (ncadrat (ntre ghilimele duble#
/H)ndii--" c" GG (nseamn" ghilimele duble#0 %e e1emplu urm"toarele dou" linii sunt echi-alente3
7data 8 @:JJJ-J-:V@;
7data 8 GG=:JJJ-J-:V?;
Putei construi interog"ri f"r" a acorda prea mare atenie ghilimelelor dac" folosii GG=? deoarece putei folosi
ghilimelele /simple sau duble0 (n cadrul !irului de interogare f"r" a fi necesar s" le modificai semnificaia# %e
asemenea referinele la -ariabile sunt interpretate# 6mbele propriet"i ale construciei GG=? sunt prezentate (n
urm"toarea interogare3
7id #8 :K;
7data 8 @:JJJ-J-:V@;
7interogare 8 GG='<S*.$ absente B6LU*S/7id@7data@0?;
+apitolula 'nterfaa 6P' pentru Perl %&' 3:[
<u trebuie s" folosii paranteze acolade ca delimitatori pentru construcia GG# 6lte forme precum GG/0 !i GGR R
sunt de asemenea utilizabile cu condiia ca delimitatorul de (nchidere s" nu fie coninut (n interiorul !irului# *u
prefer GG=? deoarece este mai puin probabil ca paranteza acolad" s" apar" (n te1tul !irului interog"rii dec)t
paranteza# rotund" sau caracterul R dup" cum este mai puin probabil s" fie confundat" cu finalul !irului de
interogare dec)t ultimele dou" caractere# %e e1emplu paranteza rotund" apare (n cadrul instruciunii '<S*.$
prezentate anterior deci GG/0 nu este o construcie util" pentru (ncadrarea (ntre ghilimele a !irului interog"rii#
+onstrucia GG=? se poate e1tinde pe mai multe r)nduri ceea ce este util dac" dorii ca !irul interog"rii s" ias" (n
e-iden" (n raport cu liniile de program Perl (ncon2ur"toare3
7id 8 U;
7data 8 @:JJJ-J-:V@;
Sinterogare 8 GG=
='<S*.$ absente B6LU*S/7id@7data@0
?;
6cest lucru este de asemenea util dac" dorii pur !i simplu s" formatai interogarea pe linii multiple pentru a o
face mai u!or de citit# %e e1emplu instruciunea S*L*+$ din scriptul dump2nembers se prezint" astfel3
7sth 8 7dbh-9prepare /@S*L*+$ nume prenume sufi1 email@ # @strada ora! stat cod,postal telefon T.>M
membru@ # @>.%*. &U nume@0;
Tolosind construcia GG=? interogarea poate fi scris" astfel3 7sth 8 7dbh-9prepare /GG= S*L*+$
nume prenume sufi1 email strada ora! stat cod,postal telefon T.>M membru >.%*. &U nume
?0;
*ste la fel de ade-"rat c" !irurile (ncadrate (ntre ghilimele duble se pot !i ele e1tinde pe mai multe linii# %ar eu
prefer mai mult construcia GG=? pentru scrierea de !iruri pe linii multiple# 6tunci c)nd g"sesc (ntr-o linie ni!te
ghilimele duble f"r" corespondent prima mea reacie este3 M<u cum-a e o eroare de sinta1"a@ 6poi pierd
-remea c"ut)nd ghilimelele corespondente#
+onstrucia GG=? se ocup" de problemele legate de ghilimele la ni-elul le1ical al limba2ului Perl astfel (nc)t s"
putei insera cu u!urin" ghilimele (ntr-un !ir f"r" ca Perl s" protesteze# $otu!i trebuie s" -" g)ndii !i la sinta1a
la ni-el SQL# S" lu"m (n considerare aceast" (ncercare de a insera o (nregistrare (n tabelul membru3
7nume 8 @>CMalley@;
7prenume 8 @&rian@;
7data,e1pirare 8 @N00N-J-:@;
7ro5s 8 7dbh-9do /GG=
+ontinuare
3:V Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
+ontinuare
'<S*.$ membru /numeprenumedata,e1pirare0 B6LU*S/C7numeCCSprenumeCC7data,e1pirareC0
?0;
birul pe care funcia do /0 (l trimite ser-erului MySQL se prezint" astfel3
'<S*.$ membru /numeprenumedata,e1pirare0
B6LU*S+>CMalleyC C&rianC CN00N-J-:C0
6ceasta nu este o interogare SQL corect" deoarece un caracter de tip ghilimele simple apare (n interiorul unui
!ir delimitat prin ghilimele simple# 6m (nt)lnit o problem" similar" (n capitolul V# 6colo am rezol-at problema
cu a2utorul funciei mysGl,escape,string/0# %&' furnizeaz" un mecanism similar3 pentru fiecare -aloare cu
ghilimele pe care dorii s" o folosii literal (ntr-o instruciune apelai metoda Guote /0 si folosii (n schimb
-aloarea returnat" de aceasta#
*1emplul anterior poate fi scris (ntr-un mod mai adec-at astfel3 7nume 8 7dbh-9Guote /@>CMalley@0; 7prenume
8 7dbh-9Guote /@&rian@0; 7data,e1pirare 8 7dbh-9Guote /@N00N-J-:C0; 7ro5s 8 7dbh-9do /GG=
'<S*.$ membru /numeprenumedata,e1pirare0 B6LU*S/7nume7prenume7data,e1pirare0
?0;
6cum !irul pe care funcia do/0 (l trimite ser-erului MySQL se prezint" astfel ghilimelele care apar (n interiorul
!irului fiind Mcamuflate@ adec-at pentru ser-er3
'<S*.$ membru /numeprenumedata,e1pirare0
B6LU*S/C>BMalleyC C&rian: CN00N-J-:C0
>bser-ai c" atunci c)nd facei referire la 7nume !i 7prenume (n !irul interog"rii nu ad"ugai ghilimele de
delimitare; metoda Guote /0 le furnizeaz" automat# %ac" ad"ugai ghilimele interogarea dumnea-oastr" -a a-ea
prea multe ghilimele a!a cum se poate -edea (n e1emplul urm"tor3
7-alue 8 @paul@;
7Guoted,-alue 8 7dbh-9Guote /7-alue0;
prin @ ### XI*.* nume 8 7Guoted,-alueAn@; prin @ ### XI*.* nume 8 C7Guoted,-alueCAn@; 6ceste
instruciuni furnizeaz" urm"toarele date de ie!ire3 ### XI*.* nume 8 CpaulC ### XI*.* nume 8 CCpaulCC
+)mpuri de (nlocuire !i asocierea parametrilor
(n seciunile anterioare am construit interog"ri prin plasarea -alorilor ce urmau a fi inserate (n baza de date sau
folosite drept criterii de selecie direct (n !irul interog"rii# 6cest lucru nu este necesar# %&' -" permite s" plasai
(ntr-un !ir de interogare indica-
+apitolula 'nterfaa 6P' pentru Peri %&' 3:F
toare speciale denumite c)mpuri de (nlocuire iar apoi s" furnizai la e1ecutarea interog"rii -alorile ce -or fi
folosite (n locul acestor indicatoare# Principalul moti- pentru aceast" operaie (l constituie (mbun"t"irea
performanelor mai ales atunci c)nd e1ecutai (n mod repetat o interogare (n cadrul unui ciclu#
+a o ilustrare a modului de lucru a c)mpurilor de (nlocuire s" presupunem c" (ncepei un nou semestru la !coal"
!i dorii s" !tergei tabelul ele- pentru catalogul dumnea-oastr" si apoi s"-: iniializai cu noii ele-i folosind o
list" a numelor ele-ilor incluse (ntr-un fi!ier (n lipsa c)mpurilor de (nlocuire putei !terge coninutul curent al
tabelului !i (nc"rcai noile nume astfel3
7dbh-9do /GG= %*L*$* T.>M ele- ? 0; P !terge r)ndurile e1istente 5hile /Y90
P adaug" r)nduri noi
=
chomp;
7, 8 7dbh-9Guote /7,0;
7dbh-9do /GG= '<S*.$ ele- S*$ nume 8 7,?0; ?
6cest procedeu este ineficient deoarece forma elementar" a interog"rii '<S*.$ este aceea!i de fiecare dat" iar
funcia do/0 apeleaz" prepare /0 !i e1ecute /0 de fiecare dat" pe parcursul ciclului# %e asemenea este mai
eficienta apelarea funciei prepare /0 o singur" dat" pentru a configura instruciunea '<S*.$ (nainte de a
introduce ciclul precum si in-ocarea funciei e1ecute /0 o singur" dat" (n cadrul ciclului# 6stfel se e-it" toate
in-oc"rile funciei prepare /0 cu o singur" e1cepie# %&' ne permite acest lucru astfel3 7dbh-9do /GG= %*L*$*
T.>M ele- ? 0; P !terge r)ndurile e1istente 7sth 8 7dbh-9prepare /GG= '<S*.$ ele- S*$ nume 8 a ?0;
5hile /Y90 P adaug" r)nduri noi
=
chomp; 7sth-9e1ecute /7,0;
? 7sth-9finish/0;
>bser-ai semnul (ntreb"rii din interogarea '<S*.$# 6cela este c)mpul de (nlocuire# +)nd este in-ocat" funcia
e1ecute /0 transferai -aloarea care -a lua locul c)mpului de (nlocuire atunci c)nd interogarea este trimis" la
ser-er (n general dac" apelai funcia do /0 (n cadrul unui ciclu este mai bine s" in-ocai prepare /0 anterior
ciclului respecti- e1ecute/0 (n interiorul acestuia#
+)te-a aspecte de reinut despre c)mpurile de (nlocuire3
4 <u delimitai caracterul c)mp de (nlocuire cu ghilimele (n interiorul !irului interog"rii# %ac" o facei acesta nu
-a fi recunoscut drept c)mp de (nlocuire#
4 <u folosii metoda Guote /0 pentru a specifica -alorile c)mpului de (nlocuire; (n caz contrar -ei obine
ghilimele suplimentare (n -alorile pe care le inserai#
4 (ntr-un !ir al unei interog"ri pot e1ista mai multe c)mpuri de (nlocuire dar nu uitai s" transmitei funciei
e1ecute /0un num"r de -alori egal cu indicatoarele pentru c)mpurile de (nlocuire#
3:_ Partea a l0-a Utilizarea interfeelor de programare ale sistemului MySQL
4 Tiecare c)mp de (nlocuire trebuie s" specifice o singur" -aloare nu o list" de -alori# %e e1emplu nu putei
prepara !i e1ecuta o instruciune ca aceasta3 7stti 8 7dbh-9prepare /GG==
'<S*.$ membru nume prenume B6LU*S/a0
?0;
7sth-9e1ecute /@6dams&illN003-0J-:J@0; $rebuie s" procedai astfel3 7sth 8 7dbh-9prepare /GG==
'<S*.$ membru nume prenume B6LU*S/aaa0
?0;
7sth-9e1ecute /@6dams@@&ill@@N003 -0J-:J@0;
4 Pentru a specifica <ULL ca -aloare a c)mpului de (nlocuire folosii undef#
4 <u (ncercai s" folosii un c)mp de (nlocuire pentru cu-intele cheie# <u -ei reu!i deoarece -alorile din
c)mpurile de (nlocuire sunt prelucrate automat de funcia Guote /0# +u-)ntul cheie -a fi plasat (n interogare
delimitat prin ghilimele iar interogarea -a e!ua datorit" unei erori de sinta1"#
Pentru unele motoare de baze de date -ei obine o cre!tere suplimentar" a performanei din ad"ugarea
c)mpurilor de (nlocuire (n afar" de o eficien" crescut" a ciclurilor# 6numite motoare memoreaz" (n cache
interog"rile preparate precum !i planul generat de acestea pentru e1ecutarea eficient" a interog"rilor# 6stfel
dac" aceea!i interogare este primit" de ser-er mai t)rziu -a putea fi refolosit" f"r" a se genera un nou plan de
e1ecuie# Memorarea (n cache a interog"rilor este util" mai ales pentru instruciuni S*L*+$ comple1e deoarece
generarea unui plan bun de e1ecuie poate necesita timp# +)mpurile de (nlocuire -" ofer" o posibilitate de
localizare mai rapid" a interog"rii (n cache deoarece aceste c)mpuri confer" interog"rilor un caracter mai
generic dec)t cele construite prin (nglobarea anumitor -alori din coloane direct (n !irul de interogare# Pentru
MySQL c)mpurile de (nlocuire nu (mbun"t"esc performanele (n acest mod deoarece interog"rile nu sunt
memorate (n cache# $otu!i -" putei scrie propriile interog"ri folosind c)mpurile de (nlocuire; dac" se (nt)mpl"
s" portai un script %&' la un motor care folose!te o zon" cache pentru interog"ri scriptul dumnea-oastr" se -a
e1ecuta mai eficient dec)t (n absena c)mpurilor de (nlocuire#
+)mpurile de (nlocuire -" permit s" inserai -alori (ntr-un !ir de interogare (n momentul e1ecuiei interog"rii# +u
alte cu-inte putei parametriza Mdatele de intrare@ ale interog"rii# %e asemenea %&' furnizeaz" o operaie
corespunz"toare la ie!ire denumit" asociere a parametrilor care -" permite s" parametrizai Mdatele de ie!ire@
prin reg"sirea automat" a -alorilor coloanelor (n -ariabile atunci c)nd preluai un r)nd f"r" a trebui s" atribuii
personal -alori -ariabilelor#
S" presupunem c" a-ei o interogare care reg"se!te numele membrilor din tabelul membru# Putei cere
programului %&' s" atribuie unor -ariabile Perl -alorile coloanelor selectate# +)nd preluai un r)nd -ariabilele
sunt actualizate automat cu -alorile din coloana corespunz"toare# 'at" un e1emplu care prezint" modul de
asociere a coloanelor la -ariabile !i apoi modalitatea de acces la acestea (n cadrul ciclului de preluare3 7sth 8
7dbh-9prepare /GG=
+apitolul F 'nterfaa 6P' pentru Perl %&' 3:J
S*L*+$ nume prenume sufi1
T.>M membru
>.%*. &U nume prenume
?0;
7sth-9e1ecute /0;
7sth-9bind,col /: A7nume0;
7sth-9bind,col /N A7prenume0;
7sth-9bind,col /3 A7sufi10;
prin @7nume Sprenume 7sufi1An@ 5hile 7sth-9fetch;
Tiecare apel la funcia bind,col /0 trebuie s" specifice un num"r de coloan" !i o referin" la -ariabila pe care
dorii s" o asociai la coloan"# <umerele coloanelor (ncep de la :# bind,col/0 trebuie apelat" dup" e1ecute =0#
+a alternati-" la apelurile indi-iduale la funcia bind,col /0 putei transmite toate referinele la -ariabile (ntr-un
singur apel la funcia bind,columns /03 7sth 8 7dbh-9prepare /GG=
S*L*+$ nume prenume sufi1
T.>M membru
>.%*. &U nume prenume
?0;
7sth-9e1ecute /0;
7sth-9bind,columns /A7nume A7prenume A7sufi10;
prin @7nume 7prenume 7sufi1An@ 5hile 7sth-9fetch;
Specificarea parametrilor de cone1iune
Modalitatea cea mai direct" de a stabili o cone1iune cu ser-erul este de a specifica toi parametru de cone1iune
atunci c)nd in-ocai metoda connect /03
7data,source 8 @Q&'3mysG'3nume,baza,de,clate3nume,gazda@;
7dbh-9connect /7data,source nume,utilizator paroNa0; %ac" omitei parametrii de cone1iune %&' e1ecut"
urm"toarele operaii3
4 %ac" sursa de date nu este definit" sau dac" este !irul -id se folose!te -ariabila de mediu %&:,%S<# %ac"
numele de utilizator !i parola nu sunt definite /dar nu !i dac" acestea sunt alc"tuite dintr-un !ir -id0 se folosesc
-ariabilele de mediu %&',US*. !i %&',P6SS# Sub Xindo5s dac" numele de utilizator nu este definit se
folose!te -ariabila US*.#
4 %ac" omitei numele gazdei aceasta are ca -aloare prestabilit" localhost#
4 %ac" specificai undef sau un !ir -id pentru numele de utilizator acesta are ca -aloare prestabilit" numele
dumnea-oastr" U<'W de deschidere a sesiunii de lucru# Sub Xindo5s numele de utilizator prestabilit este
>%&+#
4 %ac" (n locul parolei specificai undef sau un !ir -id nu este trimis" nici o parol"#
Putei specifica anumite opiuni (n sursa de date prin ata!area lor la partea iniial" a !irului fiecare opiune fiind
precedat" printr-un caracter punct !i -irgul"# %e e1emplu putei folosi opiunea mysGl,read,def ault,f ile pentru
a preciza un nume al c"ii de acces spre un fi!ier cu opiuni3
3N0 Partea a ll-a Utilizarea interfeelor da programare ale sistemului MySQL
7data,source 8
@%&'3mysGl3samp,db;mysGl,read,default,file8RuRpauiymy#cnf@2 +)nd scriptul se e1ecut" -a citi fi!ierul (n
c"utarea parametrilor de cone1iune# S" presupunem c" RuRpaulRmy #cnf are urm"torul coninut3
\client]
host8pit--iper#sna^e#net ;
user8paul
pass5ord8secret 9
6poi apelul la funcia connect /0 -a (ncerca s" se conecteze la ser-erul MySQL din calcu-- latorul pit-
-iper#sna^e#net !i se -a conecta ca utilizatorul paul cu parola secret# %ac" dorii s" permitei ca scriptul
dumnea-oastr" s" fie utilizat de orice persoan" care dispune de un fi!ier cu opiuni configurat (n mod
corespunz"tor specificai sursa de date astfel; #
7daa,source 8
4%&'3mysGl3samp,db;mysGl,read,default,fUe87*<B=I>M*?R#my#cnf@; 7*<B=I>M*? conine calea de
acces spre catalogul de baz" al utilizatorului care ruleaz" scriptul deci numele gazdei numele utilizatorului si
parola pe care le folose!te seriptul f -or fi e1trase din fi!ierul cu opiuni al fiec"rui utilizator# Scriind un script (n
acest mod l nu trebuie s" (nglobai literalmente parametrii de cone1iune (n script#
%e asemenea putei folosi opiunea mysGl,read,default,group pentru a specifica un f grup din fi!ierul cu
opiuni# 6ceasta determin" (n mod automat citirea fi!ierului 2Gy# cnf al utilizatorului !i -" permite s" specificai
un grup de opiuni care -a fi citit al"turi de f grupul \client]# %e e1emplu dac" a-ei opiuni care sunt specifice
scripturilor dum- l nea-oastr" %&' le putei meniona (ntr-un grup \dbi] dup" care folosii o -aloare al sursei de
date ca aceasta3
7data,source 8 C 449Y4#
@%&'3mysGl3samp,db;mysGl,read,default,group8dbi@; Y
mysGl,read,default,file !i mysGl,read,default,gpoup necesit" MySQL 3#NN#:0 sau g2 -ersiune mai recent"
precum !i%&%33mysGl :#N:#0V sau mai recent# Pentru mai multef detalii pri-ind opiunile pentru specificarea
!irului surs" de date -ezi 6ne1a H# Pentmf mai multe informaii despre #formatul fi!ierelor cu opiuni MySQL
-ezi 6ne1a M.eferin" de program MySQL@# D9D
Utilizarea unui fi!ier cu opiuni nu -" (mpiedic" s" specificai parametrii de cone1iune f (n apelul la funcia
connect /0 /de e1emplu dac" dorii ca scriptul s" se conecteze ca unf anumit utilizator0# >rice -alpare e1plicit" a
numelui gazdei a numelui de utilizator saiif a parolei specificate (n apelul la funcia connect /0 -a redefini
parametrii de cone1i- aflai (n fi!ierul cu opiuni# t0e e1emplu putei dori ca scriptui dumnea-oastr" sa analizeze
opiunile - -host - -u!ier !i - -pass5ord din linia de comand" !i s" foloseasc"Q -alori dac" sunt date cu prioritate
fa" de orice -aloare din fi!ierul cu o2piuni# fapt este util deoarece este modalitatea standard de comportare a
clienilor MySQL# Y atare scripturile dumnea-oastr" %&' -or manifesta aceea!i comportarG#CQ
Pentru celelalte scripturi (n linie de comand" pe care le -om crea (n acest capitol folosi linii de program standard
pentru stabilireaEQ respecti- (ntreruperea cone1iunii -oi prezenta o singur" dat" aici astfel (nc)t s" ne putem
concentra asupra corpului pri cipal al fiec"rui script atunci c)nd (l -om scrie3
;## +apitolulR 'nterfaa 6P' pentru Peri %&' 3N:
PQ RusrRbinRperl
use %&'; C C@i;; @ C@ C---C;i #CC4C@CC C@CC@C
use strict; 4 @iB CC CCC CC @@C C CDC C3C @C3 @
E analizeaz" parametrii de cone1iune din linia de@comanda P daca ace!tia sunt dai # 9
-use-beteptritong; #33#34##;4Y43;###3 #4aC 4 4
7HetopI3 3Lbng3 3i20norecase `E 0; X opti)nileQ simt -sensibile la
P difeCrerft)C intre itr)2ir!cule sil mihusCcCule @ A
P toi p)r)metCrii prestabiliiC lipseCsc C CCD
my /chostcftame Cilusercame 7faass50rd0 8 /undcf Cundef Cundef 0;
;P Y(e>ptibns nu pac sa: permit" forma -uuser,nameC #
P numai -uRuseriXaMeKa0Cc 4YC9C@4C444C44 4C 3--CCi- ;- C4 #4@4C4444 ##### C- D Het>ptions/
P 8s (nseamn" ca dup" opiune este necesar un argument !ir
33 #C @hostR-h8(s(@ C -#`;#Ei;#Ct- 9 # Q444D9 A7host,nafne #### 434###4
- Y@uEerRi<_@ CL #ii-;#- R##- c89 A7use$D,name 44 4 3
P 3s (nseamn" ca dup" opiune argumentul !ir este opional @pass5ordRp3s@ 89 A7pass5ord
or
P solicit" parola daca opiunea #Ceste specif picataC @f"r" -aloare if C/defined /fpass5p-dc LL (7pass5prd03 C c
# @C @# ?r# C@
CC C :@ @C @
=
P dez!cti#-efaza rfeflcctarea dsrcnu interfereaz"tuSi open /$iy @RdeyRtty@0 pr die# /@<u#poate deschide
termina2#ulAn@0; system /@stty -echo Y Rde-RttyR@0; print S$%*.. C'ntroducei parola3 @;
chomp /Spass5ord 8 Y$$U90; CaIii9e C @#-ifCXur 4CC# -rucBiUi # 9#9C94@49 #system /as2ttyceo^p;YA
/fd`-RttyiC0cnQi ; t
#prin
sursD K`D datei
my /7dsn0 8 @%&'3mysGl3samp,db@;
, ## 2 ## +ontinuare
3NN Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
+ontinuare
7dsn #8 @3hostname87host,name@ if 7host,name;
7dsn #8 @;mysGl,read,default,file87*<B=I>M*?R#my#cnf@;
P conectare la ser-er
my /Oattr0 8 / .aise*rror 89 : 0;
my /7dbh0 8 %&'-9connect /7dsn 7user,name 7pass5ord AOattr0; 6cest program iniializeaz" %&' caut"
parametrii de cone1iune (n linia de comand" !i apoi stabile!te cone1iunea cu ser-erul MySQL folosind parametri
din linia de comand" sau parametri din fi!ierul gRmy# cnf al utilizatorului care ruleaz" scriptul# (n cazul (n care
configurai fi!ierul my# cnf (n catalogul dumnea-oastr" de baz" nu -a trebui s" introducei nici un parametru de
cone1iune atunci c)nd rulai scripturile# /<u uitai s" configurai modul astfel (nc)t nimeni altcine-a s" nu mai
poat" citi fi!ierul# Pentru instruciuni consultai 6ne1a *#0
Partea final" a scripturilor noastre -a fi de asemenea identic" pentru toate scripturile; pur si simplu se suspend"
cone1iunea si se (ncheie e1ecuia programului3
7dbh-9disconnect /0;
e1it /00;
+)nd -om a2unge la seciunea de programare Xeb MUtilizarea %&' (n aplicaii Xeb@ -om modifica puin
programul de configurare a cone1iunii dar ideea de baz" -a r"m)ne aceea!i#
%epanare
+)nd dorii s" depanai un script %&' care nu funcioneaz" adec-at de obicei se folosesc dou" tehnici fie
separat fie (n tandem# Mai (nt)i putei M(mpr"!tia@ instruciuni de afi!are pe tot cuprinsul scriptului
dumnea-oastr"# 6stfel -" putei a2usta datele de ie!ire ale procesului de depanare conform preferinelor dar
trebuie s" ad"ugai instruciunile manual (n al doilea r)nd putei folosi funcionalit"ile de urm"rire ale
programului %&'# 6ceasta este o opiune mai general" dar mai sistematic" !i care intr" (n aciune imediat dup"
ce ai acti-at-o# %e asemenea -" prezint" informaii despre funcionarea dri-erului pe care nu le putei obine
altfel#
%epanarea folosind instruciuni de afi!are
> (ntrebare frec-ent" (n lista de coresponden" pentru MySQL este urm"toarea3 M6m o interogare care
funcioneaz" bine c)nd o e1ecut (n mysGl dar care nu funcioneaz" din scriptul %&'# +um -ine astaa@ *ste ce-a
obi!nuit ca un script %&' s" emit" o alt" interogare dec)t cea dorit" de operator# %ac" afi!ai o interogare (nainte
de a o e1ecuta poate -ei fi surprins s" -edei ceea ce trimitei efecti- ser-erului# S" presupunem c" o interogare
pe care o tastai se prezint" astfel /f"r" caracterul punct !i -irgul" de terminare03
'<S*.$ membru /numeprenume0data,e1pirare0
B6LU*S/@Basile@C+ornel@@N00N-V-3@0 6poi (ncercai acela!i lucru (ntr-un script %&'3
+apitolul F 'nterfaa 6P' pentru Perl %&' 3N3
7nume 8 @Basile@; 7prenume 8 @+ornel@; 7data,e1pirare 8 @N00N-V-3@; 7Guery 8
GG=
'<S*.$ membru /numeprenumedata,e1pirare0 B6LU*S/7nume7prenume7data,e1pirare0
?;
7ro5s 8dbh-9do /7Guery0;
'nterogarea nu -a funciona chiar dac" este aceea!i cu prima# %ar este oarea (ncercai s" o afi!ai3
prin @7GueryAn@;
lata rezultatul3
'<S*.$ membru /numeprenumedata,e1pirare0
B6LU*S/Basile+ornelN00N-V-30
%in aceste date de ie!ire putei obser-a c" ai uitat s" scriei ghilimelele (n 2urul -alorilor din coloane (n lista
B6LU*S /0# Modalitatea corect" de specificare a interog"rii este aceasta3
7nume 8 7dbh-9Guote =@Basile@0;
7prenume 8 7dbh-9Guote /@+ornel@0;
7data,e1pirare 8 7dbh-9Guote /@N00N-V-3@0;
7Guery 8
GG=
'<S*.$ membru /numeprenumedata,e1pirare0 B6LU*S/7nume7prenume7data,e1pirare0 ?;
6lternati- -" putei specifica interogarea folosind c)mpuri de (nlocuire !i transferai direct metodei do /0 -alorile
ce urmeaz" a fi inserate3
7nume 8 @Basile@;
Sprenume 8 @+ornel@;
7data,e1pirare 8 @N00N-V-3@;
7Guery 8
GG=
'<S*.$ membru /numeprenumedata,e1pirare0 B6LU*S/aaa0
?;
7ro5s 8dbh-9do /7Guery undef 7nume 7prenume 7data,e1pirare0; %in p"cate atunci c)nd procedai astfel
nu putei -edea care este aspectul interog"rii complete folosind o instruciune de afi!are deoarece -alorile din
c)mpurile de (nlocuire sunt e-aluate numai c)nd in-ocai metoda do/0# +)nd folosii c)mpuri de (nlocuire
urm"rirea poate fi o metod" de depanare mai util"#
3NK Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
%epanarea prin urm"rire
Putei cere programului %&' s" genereze informaii de urm"rire /depanare0 atunci c)nd (ncercai s" determinai
moti-ul pentru care un script nu funcioneaz" corect# <i-elurile de urm"rire -ariaz" de la > /ine1istent0 la J
/aport ma1im de informaii0 (n general ni-elurile de urm"rire l !i N sunt cele mai utile# > urm"rire de ni-el N -"
prezint" te1tele interog"rilor pe care le e1ecutai /inclusi- rezultatul inseriei -alorilor (n c)mpurile de (nlocuire0
rezultatul apelurilor la funcia Guote /0 etc# 6ceasta poate fi de mare a2utor (n depistarea unei probleme#
Putei controla ni-elul de urm"rire din interiorul scripturilor indi-iduale folosind metoda trace /0 sau putei
configura -ariabila de mediu %&',$.6+* pentru a influena urm"rirea tuturor scripturilor %&' pe care le rulai#
Pentru a folosi apelul la funcia trace/0 transferai un argument ni-el de urm"rire !i opional un nume de fi!ier#
%ac" nu specificai nici un nume de fi!ier toate datele de ie!ire ale procesului de urm"rire a2ung la S$%*..; (n
caz contrar a2ung la fi!ierul denumit# +)te-a e1emple3
%&' -9trace /:0 Urm"rire de ni-el l cu ie!ire (n S$%*..
%&'-9trace /N @trace#out@0 Urm"rire de ni-el N cu ie!ire (n Mtrace#out@
%&' -9trace /00 %ezacti-area datelor de ie!ire ale urm"ririi
+)nd funcia este in-ocat" sub forma %&'-9trace/0 sunt urm"rite toate operaiile %&'# Pentru o abordare mai
detaliat" putei acti-a urm"rirea la ni-elul -ariabilei de manipulare indi-iduale# 6cest lucru este util c)nd !tii
bine unde se afl" o anumit" problem" (n scriptul dumnea-oastr" si nu dorii s" parcurgei datele de ie!ire ale
procesului de urm"rire pentru a afla tot ceea ce s-a produs p)n" (n momentul respecti-# %e e1emplu dac" a-ei
probleme cu o anumit" interogare S*L*+$ putei urm"ri -ariabila de manipulare pentru instruciuni asociat"
interog"rii3
7sth-9 7dbh-9prepare /GG= S*L*+$ ### ?0;
7sth-9trace /:0;
P creeaz" -ariabila de
P manipulare a instruciunii
P acti-eaz" urm"rirea
P instruciunii 7sth-9e1ecute /0;
%ac" specificai un argument nume de fi!ier (n orice apel la funcia trace/0 indiferent dac" pentru (ntreg scriptul
%&' sau pentru o -ariabil" de manipulare indi-idual" toate datele de ie!ire ale procesului de urm"rire a2ung la
fi!ierul respecti-#
(n -ederea acti-"rii urm"ririi la ni-el global pentru toate scripturile %&' pe care le rulai configurai -ariabila de
mediu %&',$.6+* din interpretorul dumnea-oastr"# Sinta1a necesar" depinde de interpretorul pe care (l
folosii3
O seten- %&',$.6+* -aloare Pentru csh tcsh
7 %&l,$I6+*8-aloare Pentru sh^shbash 7 e1port %&'e$.6+*
+3A9 set %&' $.6+*8-aloare Pentru Xindo5s
+apitolula 'nterfaa 6P' pentru Perl %&' 3N[
Tormatul pentru -aloare este acela!i pentru toate interpretoarele3 un num"r n pentru acti-area urm"ririi la ni-elul
n cu ie!ire (n S$%*..; un nume de fi!ier pentru acti-area urm"ririi de ni-el N cu ie!ire (n fi!ierul denumit
respecti- n8nume,f isier pentru acti-area urm"ririi de ni-el n cu ie!ire (n fi!ierul denumit# 'at" c)te-a e1emple
care folosesc sinta1a csh3
O seten- %&',$.6+* : Urm"rire de ni-el l cu ie!ire (n S$%*..
O seten- %&',$.6+* :8trace#out Urm"rire de ni-el l (n Mtrace#out@ O seten- %&',$.6+* trace#out
Urm"rire de ni-el N (n Mtrace#out@
%ac" acti-ai urm"rirea (ntr-un fi!ier din interpreter nu uitai s" o dezacti-ai dup" ce ai rezol-at problema#
%atele de ie!ire de la depanare sunt ane1ate la fi!ierul de urm"rire f"r" a-: suprascrie deci fi!ierul poate de-eni
foarte mare dac" nu suntei atent# *ste total contraindicat s" definii %&',$.6+* (ntr-un fi!ier de pornire din
interpretor precum # cshrc #login sau #profileQ Sub U<'W putei dezacti-a urm"rirea folosind oricare din
urm"toarele comenzi /sinta1" csh03
O seten- %&'e$.6+* >
O unseten- %&',$.6+* Pentru sh ^sh sau bash procedai astfel3
7 %&',$.6+*80
7 e1port %&'e$.6+* (n Xindo5s putei dezacti-a caracteristica de urm"rire folosind oricare din aceste
programe3
+3A9 unset %&',$.6+*
+3A9 set %&',$.6+*80
Utilizarea metadatelor aferente setului de rezultate
Putei folosi %&' pentru a obine accesul la metadatele setului de rezultate adic" la informaii descripti-e despre
r)ndurile selectate de o interogare# Pentru a obine aceste informaii obinei accesul la atributele -ariabilei de
manipulare pentru instruciuni asociat" cu interogarea care a generat setul de rezultate# Unele din aceste atribute
sunt furnizate ca atribute %&' standard care sunt disponibile pentru toate dri-erele de baze de date /precum
<UM,>T,R'*L%S num"rul coloanelor din setul de rezultate0# 6ltele specifice sistemului MySQL sunt
furnizate de %&%33mysGl dri-erul MySQL pentru %&'# 6ceste atribute precum mysGl,ma1,length care indic"
l"imea ma1im" a -alorilor din fiecare coloan" nu sunt aplicabile altor motoare de baze de date# (n m"sura (n
care folosii oricare dintre atributele specifice MySQL riscai ca scripturile dumnea-oastr" s" de-in" neportabile
pe alte baze de date# Pe de alt" parte pot facilita obinerea informaiilor pe care le dorii#
$rebuie s" solicitai metadatele la momentul adec-at (n general atributele setului de rezultate nu sunt
disponibile pentru V instruciune S*L*+$ dec)t dup" ce ai in-ocat p repare /0 si e1ecute/0# (n plus atributele pot
de-eni in-alide dup" ce in-ocai f inish/0#
S" -edem cum se poate folosi unul din atributele metadatelor MySQL !i anume mysGl,ma1,length (n
con2uncie cu atributul de ni-el %&' <6M* care conine numele coloanelor din interogare# Putem combina
informaiile furnizate de aceste atribute pentru a scrie un script bo1,out care genereaz" date de ie!ire ale
interog"rilor S*L*+$ (n
3NV Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
acela!i stil M(ncasetat@ pe care (l obinei c)nd rulai programul client mysGl (n mod interacti-# +orpul principal al
scriptului bo1,out este urm"torul /putei (nlocui instruciunea S*L*+$ cu oricare alta; rutinele de scriere a
datelor de ie!ire sunt independente de interogarea (n sine03
my /7sth0 8 7dbh-9prepare /GG=
S*L*+$ nume prenume ora! stat
T.>M pre!edinte >.%*. &U nume prenume
7sth-9e1ecute /0;
P atributele trebuie sa fie disponibile
P dup" acest apel
P l"imile ma1ime efecti-e ale -alorilor coloanelor din
P setul de rezultate
my /S5id0 8 S=7sth-9=mysGl,ma1,length??;
P num"r de coloane
my /7ncols0 8 scalar /S5id0;
P a2usteaz" l"imile coloanelor in cazul in care antetele
P coloanelor sunt mai late dec)t -alorile datelor for /my 7i 8 0; 7i Y 7ncols; 7iZZ0
=
my /7name,5id0 8 length /7sth-9=<6M*?-9\7i]0;
75id\7i] 8 7name,5id if 75id\7i] Y 7name,5id;
P afi!eaz" datele de ie!ire print,dashes /A75id 7ncols0; print,ro5 /7sth-9=<6M*9 Ae5id Sncols0;
print,dashes /Ah5id 7ncols0; 5hile /my 7ary,ref 8 7sth-9fetch0
=
print,ro5 /7ary,ref AS5id Sncols0;
P r)nd de liniute
P antete de coloana
P r)nd de liniute
P -alori date din r)nd
P r)nd de liniute
print,dashes /AS5id 7ncols0;
7sth-9finish/0;
%up" ce interogarea a fost iniiat" cu e1ecute/0 putem prelua metadatele de care a-em ne-oie# 7sth-9=<6M*? !i
7sth-9=mysGl,ma1,length? ofer" numele coloanelor !i l"imea ma1im" a -alorilor din fiecare coloan"# Baloarea
fiec"rui atribut este o referin" la un tablou care conine c)te o -aloare pentru fiecare coloan" a setului de
rezultate (n ordinea (n care sunt specificate coloanele (n interogare#
+apitolul F 'nterfaa 6P' pentru Perl %&' 3NF
+alculele r"mase sunt foarte asem"n"toare celor folosite pentru programul clients prezentat (n capitolul V# %e
e1emplu pentru a pre-eni alinierea eronat" a datelor de ie!ire -om a2usta l"imile coloanelor de 2os (n sus dac"
numele unei coloane este mai lat dec)t oricare din -alorile datelor din coloan"#
Tunciile de ie!ire print2dashes/0 !i print,ro5/0 sunt scrise dup" cum urmeaz"# bi acestea sunt similare
programului corespunz"tor din clients3 sub print,dashes
my /75id,ary,ref 0 8 shift; my /7cols0 8 shift;
P l"imile coloanelor
P num"rul de coloane
prin @Z@;
for /my 7i 8 0; 7i Y 7cols; 7iZZ0
=
prin @-@1 /75id,ary,ref-9\7i]ZN0 # @Z@;
?
prin @An@;
P afi!eaz" un r)nd de date#
P /nu aliniaz" la dreapta coloanele numerice0
sub print,ro5
=
my /7-al,ary,ref0 8 shift;
my /75id,ary,ref0 8 shift;
my /7cols0 8 shift;
P -alorile din coloane
P l"imile coloanelor
P num"rul de coloane
prin @l:;
for /my 7i 8 0; 7i 7cols; 7iZZ0
printf @ O-Ds l@ 75id,ary,ref-9t7i]
defined /7-al,ary,ref-9\7i] a 7-al,ary,ref-9\7i]
prin @An@; %atele de ie!ire ale scriptului bo1,out sunt urm"toarele3
@ <ULL @;
nume prenume oras stat
6dams eohn &raintree M6
6dams eohn Quincy &raintree M6
6rthur +hester 6# Tairfield B$
&uchanan eames Mercersburg P6
&ush Heorge X# Milton M6
3N_ Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Urm"torul nostru script folose!te metadatele referitoare la coloane pentru a produce date de ie!ire (ntr-un alt
format# 6cest script sho52nember -" permite s" e1aminai rapid datele pri-ind membrii Ligii istorice f"r" a
introduce nici o interogare# %ac" se d" numele unui membru intrarea selectat" este afi!at" astfel3 O sho5
member artel
nume3
prenume3
sufi13
data,e1pirare3
email3
strada3
ora!3
stat3
cod,postal3
telefon3
interese3
membru id3
6rtel Mi^e
N003-0K-:V nti^e,arteli9-enus# org KNVK Lo-ering .d# Miami TL
:NFFF
0F[-JV:-0F:N
drepturile ci-ile(n-""m)ntr"zboiul re-oluionar V3
%e asemenea putei in-oca sho52nembers folosind identificatorul de membru sau utiliz)nd un model care s"
corespund" mai multor nume de familie# +omenzile urm"toare afi!eaz" intrarea pentru num"rul N3 si intr"rile
pentru membrii ale c"ror nume de familie (ncepe cu litera +3 O sho52nember N3 O sho52nember cO
+orpul principal al scriptului sfio52nember este prezentat mai 2os# Scriptul folose!te atributul <6M* pentru a
determina etichetele de utilizat pentru fiecare r)nd al datelor de ie!ire respecti- atributul <UM,>T,T'*L%S
pentru a afla num"rul de coloane pe care (l conine setul de rezultate3
my /7count0 80; P num"rul de intr"ri afi!ate pana acum my /Slabei0 8 /0; P tabloul cu etichetele de
coloana my /7label,5id0 80;
5hile /S6.HB0
P ruleaz" interogarea pentru fiecare argument
P din linia de comanda
my /7arg0 8 shift /S6.HB0; my /7sth 7clause Saddress0;
P in mod prestabilit se caut" dup" nume; caut" dup"
P identificator daca argumentul este numeric Sclause 8 @nume L'i* @ # 7dbh-9Guote /7arg0;
Sclause 8 @membru,id 8 @ # 7dbh-9Guote /7arg0 if 7arg48- R@AdR;
P emite interogarea
+apitolula 'nterfaa 6P' pentru Perl %&' 3NJ
7sth 8 7dbh-9prepare /GG= S*L*+$ D T.>M membru XI*.* Sclause C >.%*. &U nume prenume
7sth-9e1ecute /0;
P obine numele coloanelor de utilizat in etichete si determina
P l"imea ma1ima a numelor coloanelor pentru formatare /facei
P aceasta numai la prima parcurgere a ciclului0 if /7label,5id 8800
Slabel 8 3=7sth-9=<6M*??; foreach my Slabei /Slabei0
7label,5id 8 length /Slabei0 if 7label,5id Y length /Slabei0
P cite!te si afi!eaz" rezultatele interog"rii apoi face cur"enie
5hile /my Sary 8 7sth-fetchro5,array /00
=
P afi!eaz" linie noua inainte de intrarea a doua
P si de intr"rile ulterioare print @An@ if ZZ7count 9 :;
foreach /my 7i 8 0; 7i Y 7sth-9=<UM,>T,T'*L%S?; 7iZZ0
=
P afi!eaz" eticheta si -aloarea daca e1ista printf @O-Ds@ 7label,5idZ: 7label\7i] # @3@; prin @ @ # 7ary\7i] if
7ary\7i]; prin @An@;
7sth-9finish /0;
? #
.olul scriptului sho5,member este de a prezenta (ntregul coninut al unei intr"ri indiferent care sunt c)mpurile#
Tolosind S*L*+$ D pentru a reg"si toate coloanele !i atributul <6M* pentru a afla care sunt acestea scriptul
respecti- -a funciona f"r" modific"ri chiar dac" sunt ad"ugate sau eliminate coloane din tabelul membru#
%ac" nu dorii dec)t s" aflai care sunt coloanele pe care le conine un tabel f"r" a reg"si -reun r)nd putei emite
aceast" interogare3 4
S*L*+$ D #T.>M nume tabel XI*.* :80
330 Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
%up" ce in-ocai prepare /0 !i e1ecute/0 ca de obicei putei obine numele coloanelor din S=7sth-9=<6M*??#
.einei totu!i c" de!i acest mic truc de utilizare a unei interog"ri M-ide@ funcioneaz" pentru MySQL nu este
portabil !i nu se poate aplica tuturor motoarelor de baze de date#
Pentru mai multe informaii pri-ind atributele furnizate de %&' !i de %&%33mysGl consultai 6ne1a H# *ste la
latitudinea dumnea-oastr" s" determinai dac" dorii s" obinei un ma1im de portabilitate e-it)nd atributele
specifice sistemului MySQL sau s" beneficiai de ele cu preul reducerii portabilit"ii#
Utilizarea %&'
P)n" acum ai -"zut un num"r de concepte implicate (n programarea %&' deci s" trecem la unele din lucrurile pe
care doream s" le putem face (n ceea ce pri-e!te baza noastr" de date demonstrati-"# Scopurile noastre au fost
schiate la (nceput (n capitolul l M'ntroducere (n MySQL !i SQL@# +ele care -or fi abordate prin scrierea
scripturilor %&' din capitolul de fa" sunt enumerate aici#
Pentru proiectul de e-iden" a rezultatelor !colare dorim s" putem reg"si puncta2e pentru orice chestionar sau
test dat#
Pentru Liga istoric" dorim s" putem e1ecuta urm"toarele operaii3
4 Henerarea catalogului membrilor (n diferite formate# %orim o list" numai cu nume care -a fi utilizat" (n
programul editat cu ocazia banchetului anual (ntr-un format care se poate folosi pentru generarea catalogului
tip"rit#
4 'dentificarea acelor membri ai Ligii care trebuie s"-!i pl"teasc" (n cur)nd cotizaia urmat" de trimiterea unui
mesa2 e-mail pe adresa acestora pentru a-i anuna#
4 *ditarea intr"rilor aferente membrilor# /La urma urmelor -a trebui s" le actualiz"m datele de e1pirare dup" ce
ace!tia (!i achit" cotizaiile#0
4 'dentificarea membrilor cu interese comune#
4 Publicarea catalogului pe 'nternet#
Pentru unele din aceste sarcini -om scrie scripturi care ruleaz" de la linia de comand"# Pentru celelalte -om crea
scripturi (n seciunea urm"toare MUtilizarea %&' (n aplicaiile Xeb@ pe care le putei folosi (n con2uncie cu
ser-erul dumnea-oastr" de Xeb# La sf)r!itul capitolului -om mai r"m)ne cu un num"r de sarcini ne(ndeplinite#
Le -om rezol-a !i pe acestea (n capitolul _ M'nterfaa 6P' pentru PIP@#
Henerarea catalogului Ligii istorice
Unul dintre scopurile noastre este de a genera informaii din catalogul Ligii istorice (n diferite formate# +el mai
simplu format pe care (l -om genera este o list" cu numele membrilor pentru programul banchetului anual#
6ceasta poate fi un listing (n format te1t simplu# Lista -a de-eni o parte a documentului mai mare folosit pentru
a crea programul deci tot ceea ne trebuie este o entitate care poate fi Mlipit"@ (n documentul respecti-# Pentru
catalogul (n format acceptabil pentru tipar este necesar" o reprezentare mai adec-at" dec)t aceea (n format te1t
simplu deoarece dorim un te1t cu o format)re estetic"# > opiune rezonabil" aici este .$T /.ich $e1t Tormat0
un format creat de Microsoft !i
+apitolul F 'nterfaa 6P' pentru Perl %&' 33:
acceptat de numeroase procesoare de te1t# Xord este un asemenea program desigur dar .$T este acceptat !i de
multe alte programe precum XordPerfect !i 6ppleXor^s# %iferitele procesoare de te1t accept" .$T (n moduri
diferite dar -om folosi un subset elementar al specificaiei .$T complete care trebuie s" fie acceptat de orice
procesor de te1te care prezint" chiar !i cel mai redus ni-el posibil de compatibilitate cu .$T#
Procedurile pentru generarea formatelor de catalog de tip list" pentru banchet respecti- .$T sunt (n esen"
acelea!i3 emitei o interogare pentru reg"sirea intr"rilor si apoi rulai un ciclu care preia si formateaz" fiecare
intrare# %atorit" acestei asem"n"ri fundamentale ar fi interesant s" e-it"m scrierea a dou" scripturi diferite (n
acest sens s" scriem un singur script intitulat gen,cat care poate genera date de ie!ire din catalog (n diferite
formate# Putem structura scriptul dup" cum urmeaz"3
:# (nainte de a scrie coninutul intr"rilor efectuai toate iniializ"rile necesare pentru formatul datelor de ie!ire#
Pentru lista membrilor care se -a insera (n programul pentru banchet nu este necesar" nici o iniializare special"
dar -a trebui s" scriem un limba2 de control iniial pentru -ersiunea .$T#
N# Preluai !i afi!ai fiecare intrare formatat" adec-at pentru tipul datelor de ie!ire dorit#
3# %up" ce toate intr"rile au fost prelucrate efectuai toate operaiile necesare de cur"enie !i de terminare a
programului# %in nou pentru lista de la banchet nu este ne-oie de operaii de manipulare speciale dar pentru
-ersiunea .$T este necesar un limba2 de control al (nchiderii#
(n -iitor -om folosi acest script pentru a scrie date de ie!ire (n alte formate deci (l -om face e1tensibil prin
configurarea unei Mcutii de distribuie@ - o combinaie cu un element pentru fiecare format al datelor de ie!ire#
Tiecare element specific" funcii care genereaz" date de ie!ire (n mod adec-at pentru un format dat3 o funcie de
iniializare o funcie de scriere a intr"rilor !i o funcie de cur"enie3
P cutie de distribuie care conine funcii de formatare
P pentru fiecare format al datelor de ie!ire my /Ocutie,distributie0 8
@banGuet@ 89
P funcii pentru lista de banchet
@init@ 89 undef P nu este necesara nici
P o iniializare
@entry@ 89 ALformat,banGuet,entry @cleanup@ 89 undef P cur"enia nu este necesara
?
@rtf@ 89
=
@init@ 89 ALrtf,init
@entry@ 89 BLformat,rtf,entry
@cleanup@ 89 ALrtf,cleanup ?
P funcii pentru formatul .$T
33N Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Tiecare element din cutia de distribuie include un nume de format drept cheie /(n cazul nostru MbanGuet@ !i
Mrtf@0# Bom scrie scriptul astfel (nc)t dumnea-oastr" s" specificai numai formatul dorit (n linia de comand"
atunci c)nd (l rulai3
O gen,cat banGuet
O gen,cat rtf
Prin configurarea unei Mcutii de distribuie@ (n acest mod putem ad"uga cu u!urin" funcionalitatea unui nou
format3
:# Scriei trei funcii de formatare#
N# 6d"ugai la cutia de distribuie un element nou care indic" spre aceste funcii#
3# Pentru a produce date de ie!ire (n noul format in-ocai gen,cat si specificai numele formatului (n linia de
comand"#
Programul pentru selectarea intr"rii adec-ate din Mcutia de distribuie@ (n conformitate cu primul argument din
linia de comand" este prezentat mai 2os !i se bazeaz" pe faptul c" numele formatelor datelor de ie!ire reprezint"
cheile din hash-ul Ocutie,distribu-tie# %ac" (n cutia de distribuie nu e1ista o asemenea cheie formatul este
incorect# <u este necesar" codarea hard a numelor formatelor (n program; dac" la cutia de distribuie este
ad"ugat un format nou acesta este detectat automat# %ac" (n linia de comand" nu este specificat nici un nume de
format sau este precizat un format incorect scriptul produce un mesa2 de eroare si afi!eaz" o list" a numelor
permise3
P -erifica daca a fost specificat un argument in linia de comanda S6.HB 8 8 :
or die @Utilizare 3 gen,cat tip,format AnTormate permise3@ # 2oin /@ @ sort /^eys /Ocutie,distributie000 #
@An@;
P determina intrarea adec-ata din cutia de distribuie din
P argumentul liniei de comanda; daca nu este g"sita nici o
P intrare tipul de format a fost incorect
my /7func,hashref 0 8 7cutie,distributie=76.HB\0]?;
defined /7func,hashref 0
or die @Tormat necunoscut3 76.HB\0] AnTormate permise3 @
# 2oin /@ @ sort /^eys /Ocutie,distributie00 0 # @An@;
%ac" (n linia de comand" este specificat un nume de format corect programul precedent configureaz" funcia 7f
unc,hashref # Baloarea sa -a fi o referin" spre hash care indic" spre funciile de scriere a datelor de ie!ire pentru
formatul selectat# 6poi putem rula interogarea de selecie a intr"rii# 6poi in-oc"m funcia de iniializare
prelu"m !i afi!"m intr"rile !i in-oc"m funcia de cur"enie3
P emite interogarea
my /7sth0 8 7dbh-9prepare /GG=
S*L*+$ D T.>M membru >.%*. &U nume prenume
7sth-9e1ecute
+apitolul F 'nterfaa 6P' pentru Peri %&' 333
Pin-oca funcia de iniializare daca e1ista -reuna L=7func,hashref-9=init?? if defined /7func,hashref -9=init?0
;
P preia si afi!eaz" intr"rile daca e1ista -reo funcie de
P formatare de datelor de intrare
if /defined /7func,hashref -9=entry?0 0 =
5hile /my 7entry,ref 8 7sth-9fetchro5,hashref /@<6M*,lc@00 =
P transmite referina la intrare funciei de formatare L=7f unc2iashref -9=entry?? /7entry,ref 0 ;
7sth-9finish /0;
P in-oca funcia de cur"enie daca e1ista -reuna L=7func,hashref -9=cleanup?? if defined /7func,hashref
-9=cleanup?0 ; +iclul de preluare a intr"rilor folose!te fetchro52iashref /0 dintr-un anumit moti-# %ac" ciclul
prelua un tablou funciile de formatare ar fi trebuit s" cunoasc" ordinea coloanelor# > putei determina prin
accesul la atributul 7sth-9=<6M*? /care conine numele coloanelor (n ordinea (n care au fost returnate0 dar de
ce s" -" obosiia Tolosind o referin" la hash funciile de formatare pot denumi e1act coloanele de care au
ne-oie folosind construcia 7entry,ref -9/nume,coloana0# 6cest procedeu nu este deosebit de eficient dar este
u!or si poate fi folosit pentru orice format pe care dorim s"-: gener"m deoarece !tim c" toate c)mpurile de care
a-em ne-oie se g"sesc (n hash#
$ot ce ne r"m)ne de f"cut este s" scriem funciile pentru fiecare format al datelor de ie!ire /adic" pentru funciile
denumite de intr"rile din cutia de distribuie0#
Henerarea listei cu membri pentru programul banchetului anual
Pentru acest format al datelor de ie!ire a-em ne-oie pur si simplu de numele membrilor# <u sunt necesare
apeluri la funcii de iniializare sau cur"enie# <e trebuie numai o funcie de formatare a intr"rii3 sub
format,banGuet,entry
=
my /7entry,ref0 8 shift; my /7nume0;
7nume 8 7entry,ref -9=prenume? # @ @ # 7entry,ref -9=nume?; if /7entry,ref -9=sufi1?0 P numele are un sufi1
=
P f"r" -irgule pentru sufi1ele ' '' ''' etc#
7nume #8 @@ unless 7entry,ref -9=sufi1? 8- R6\'BW]Z7R;
+ontinuare
33K Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
+ontinuare
7nume #8
@ @ # 7entry,ref-9=sufi1? if 7entry,ref-9=sufi1?;
print @7numeAn@;
6rgumentul funciei format,banGuet,entry/0 este o referin" la hash-ul -alorilor din coloane aferente unui r)nd#
Tuncia al"tur" numele !i prenumele plus un e-entual sufi1# Poanta este c" sufi1e precum Mer#@ sau MSr#@ trebuie
precedate de o -irgul" !i de un spaiu (n timp ce sufi1ele de forma M''@ sau M'''@ trebuie s" fie precedate numai
de un spaiu3
Michael 6l-is 'B
+larence *lgar er#
&ill Matthe5s Sr#
Mar^ Uor^ ''
%eoarece literele ' B !i W acoper" toate generaiile de la prima la a 3J-a: putem determina dac" -om insera sau
nu o -irgul" folosind urm"torul test3
7nume #8 @@ unless 7hash,ref-9=sufi1? 8- R@\'BW]Z7R;
Programul aferent funciei format,banGuet,entry/0 care al"tur" numele si prenumele ne -a fi necesar !i pentru
-ersiunea .$T a catalogului# $otu!i (n loc de a duplica programul respecti- (n funcia f ormat,rtf,entry /0 (l
-om M(nghesui@ (ntr-o funcie3
sub format,name
my /7entry,ref0 8 shift; my /7nume0;
7nume 8 7entry,ref-9=prenume? # @ C # 7entry,ref-9=nume?; if /7entry,ref-9=sufi1?0 P numele are un sufi1
P f"r" -irgule pentru sufi1ele ' '' ''' etc#
7nume #8 @@ unless 7entry,ref-9=sufi1? 8- r\'BW]Z7R;
7nume #8 @ @ # 7entry,ref-9=sufi1? if 7entry,ref-9=sufi1?;
return @7nume@;
Prin inseria (n funcia format,name/0 a programului care determin" !irul numelui funcia f
ormat,banGuet,entry/0 se reduce aproape la zero3 sub format,banGuet,entry
printf @OsAn@ format,name /7,\0]0;
: Pentru c" echi-alentul (n cifre romane al num"rului K0 este WL# - <#$#
+apitolul F 'nterfaa 6P' pentru Perl %&' 33[ Henerarea catalogului (n format tip"rit
Henerarea -ersiunii .$T a catalogului este puin mai complicat" dec)t generarea listei cu membri pentru
programul editat cu ocazia banchetului# Un moti- ar fi acela c" trebuie s" afi!"m mai multe informaii din fiecare
intrare# Un al doilea moti-3 este necesar" inseria unui limba2 de control .$T la fiecare intrare pentru a obine
efectele dorite# Un cadru minimal pentru un document .$T se prezint" astfel3
=Artf>
=Afonttbl =Af> $imes;??
Aplain Af> AfsNK
###coninutul documentului se insereaz" aici###
?
%ocumentul (ncepe si se termin" cu paranteze acolade# +u-intele cheie .$T (ncep cu un bac^slash iar primul
cu-)nt cheie al documentului trebuie s" fie Artfn unde n este num"rul de -ersiune al specificaiei .$T c"reia (i
corespunde documentul# Pentru e1emplul nostru -ersiunea > este suficient"#
(n cadrul documentului specific"m o tabel" de fonturi pentru a indica fontul care se -a folosi la intr"ri#
'nformaiile din tabela cu fonturi sunt prezentate (ntr-un grup alc"tuit din paranteze acolade care includ un
cu-)nt cheie iniial Afonttbl !i unele informaii despre fonturi# $abela de fonturi prezentat" (n cadru define!te
num"rul de font > ca fiiiyi (n $imes# /6-em ne-oie de un singur font dar putei folosi mai multe dac" dorii ca
documentul s" aib" un aspect mai estetic#0
Urm"toarele c)te-a directi-e configureaz" stilul de formatare prestabilit3 Aplain selecteaz" formatul simplu Af >
selecteaz" fontul > /pe care :-am definit ca $imes (n tabela cu fonturi0 iar AfsNK configureaz" dimensiunea
fontului la :N puncte /num"rul de dup" f s indic" dimensiunea (n 2um"t"i de punct0# <u este necesar s"
configurai margini de pagin"; ma2oritatea procesoarelor de te1te -or furniza -alori prestabilite rezonabile#
Pentru a alege o abordare foarte simpl" putem afi!a fiecare intrare ca o serie de linii cu o etichet" pe fiecare
linie# %ac" informaiile corespunz"toare unei anumite linii din datele de ie!ire lipsesc linia este omis"# /%e
e1emplu linia M*mail3@ nu este afi!at" pentru membrii care nu dispun de adres" de e-mail#0 Unele linii /precum
linia M6dresa3@0 sunt alc"tuite din informaii plasate (n mai multe coloane /strad" ora! stat cod po!tal0 astfel
(nc)t scriptul s" poat" mane-ra mai multe combinaii de -alori care lipsesc# 'at" un e1emplu al formatului datelor
de ie!ire pe care (l -om folosi3
<une3 Mi^e 6rtel
6dresa3 KNVK Le-ering .d# Miami TL :NFFF
$elefon3 0F[-JV:-0F:N
*mail3 mi^e,artelS-enus#org
'nterese3 %repturi ci-ile*ducaie."zboiul re-oluionar Pentru intrarea formatat" prezentat" mai sus
reprezentarea .$T este urm"toarea3
Ab <ume3 Mi^e 6rtelAb>Apar
6dresa3 KNVK Lo-ering .d# Miami TL :NFFFApar
$elefon3 0F[-JV: -0F:NApar
*mail3 mi^e,artelS-enus#orgApar
'nterese3 %repturi ci-ile*ducaie."zboiul re-oluionarApar
33V Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Pentru ca linia care conine numele s" fie scris" cu aldine delimitati-o Y3u Ab /urmat" de un spaiu0 pentru
acti-area scrierii cu aldine respecti- A b> pentru a dezacti-a aceast" caracteristic"# Tiecare linie conine un
indicator de paragraf /Apar0 la sf)r!it pentru a indica procesorului de te1te s" se deplaseze pe linia urm"toare# <u
este foarte complicat#
Tuncia de iniializare insereaz" limba2ul de control .$T iniial /obser-ai cele dou" bac^slash-uri pentru a obine
un singur bac^slash (n datele de ie!ire03 sub rtf,init
print @=AArtf>An@;
print @=AAfonttbl =AAf> $imes;??An;@
print @AAplain AAf> AAfsNKAnC;
Similar funcia de cur"enie insereaz" limba2ul de control final /nu c-ar fi din cale-afar" de multQ03
sub rtf,cleanup
prin @?An@;
6de-"rata munc" este la formatarea intr"rii dar chiar si aceast" operaie este relati- simpl"# Principalele
complicaii apar la formatarea !irului de adrese si la determinarea liniilor de ie!ire care trebuie afi!ate3 sub
format,rtf,entry
my /7entry,ref0 8 shift; my /7adresa0;
printf @AAb <ume3 OsAAb>AAparAn@ format2iame /7entry,ref0;
Sadresa 8 @ @;
Sadresa #8 7entry,ref-9=strada? if 7entry,ref-9=strada?;
7adresa #8 @ @ # 7entry,ref-9=oras? if 7entry,ref-9=oras?;
7adresa #8@@# 7entry,ref-9=stat? if 7entry,ref-9=stat?;
Sadresa #8 @ @ # 7entry,ref-9=cod? if 7entry,ref-9=cod?;
prin @6dresa3 7adresaAAparAn@ if 7adresa;
prin @$elefon3 7entry,ref-9=telefon?AAparAn@ if 7entry,ref-9=telefon??;
prin @*mail3 7entry,ref-9=email?AAparAn@ if 7entry,ref-9=email??;
prin @'nterese3 7entry,ref-9=interese?AAparAn@
if 7entry,ref-9=interese??; prin @AAparAn@;
%esigur nu suntei obligat s" folosii acest stil particular de formatare# Putei schimba e modul de afi!are al
oric"ruia dintre c)mpuri astfel (nc)t s" fie posibil" modificarea stilu- f lui catalogului dumnea-oastr" tip"rit
aproape dup" dorin" prin simpla modificare al funciei format,rtf,entry/0# jin)nd cont de forma original" a
catalogului /documenta creat cu procesorul de te1te0 nu este ce-a chiar at)t de simpluQ
+apitolul F 'nterfaa 6P' pentru Perl %&' 33F
Scriptul gen,cat este acum complet# Putem genera catalogul (n oricare din formatele de ie!ire prin rularea unor
comenzi precum aceasta3
O gen,cat banGuet 9 nume#t1t
O gen,cat rtf 9 catalog#rtf
Sub Xindo5s pot rula gen,cat iar fi!ierele sunt gata pentru a fi utilizate din interiorul unui procesor de te1te
bazat pe Xindo5s# Sub U<'W a! putea rula aceste comenzi si apoi (mi pot trimite mie personal fi!ierele de
ie!ire ca fi!iere ata!ate la mesa2ele de e-mail astfel (nc)t s" le pot prelua din calculatorul meu Macintosh !i apoi
s" le (ncarc (ntr-un procesor de te1te# Se (nt)mpl" s" folosesc programul de post" mutt care permite specificarea
fi!ierelor ata!ate (n linia de comand" folosind opiunea -a# (mi pot trimite mie (nsumi un mesa2 cu ambele fi!iere
ata!ate dup" cum urmeaz"3
O mutt -a nune#t1t -a catalog#rtf paulSsna^e#net
bi alte programe de po!t" pot permite crearea fi!ierelor ata!ate# 6lternati- fi!ierele pot fi transferate !i prin alte
metode cum ar fi T$P# (n orice caz dup" ce fi!ierele au a2uns acolo unde dorim citirea listei numelor !i inseria
sa (n documentul care conine programul pentru banchetul anual respecti- citirea fi!ierului .$T (n orice
procesor de te1te care (nelege formatul .$T constituie operaii simple#
%&' a facilitat e1tragerea informaiilor dorite din MySQL iar funcionalit"ii de prelucrare a te1telor din Perl au
simplificat inseria acelor informaii (n formatul pe care dorim s"-: -edem# MySQL nu furnizeaz" nici o
modalitate specific" de formatare a datelor de ie!ire dar aceasta nu conteaz" datorit" u!urinei cu care se pot
integra caracteristicile sistemului MySQL de manipulare a bazelor de date (ntr-un limba2 ca Perl care dispune de
e1celente posibilit"i de manipulare a te1telor#
l 4 D
*1pedierea (n!tiin"rilor pentru plata cotizaiilor
+)nd catalogul Ligii istorice este p"strat ca document creat cu un procesor de te1te determinarea membrilor care
trebuie anunai c" trebuie s"-!i achite cotizaiile este o acti-itate consumatoare de timp si e1pus" la erori# 6cum
c)nd a-em informaiile (ntr-o baz" de date s" -edem cum putem automatiza puin procesul de (n!tiinare pentru
plata cotizaiilor# %orim s"-i identific"m prin e-mail pe membrii care trebuie s"-!i achite cotizaiile astfel (nc)t
s" nu mai fie necesar s"-i contact"m telefonic sau prin po!ta clasic"#
+eea ce trebuie s" facem este s" determin"m membrii care sunt obligai s"-!i achite cotizaia (ntr-un anumit
inter-al de timp# 'nterogarea pentru aceast" operaie necesit" calculul unei date ceea ce este relati- simplu3
S*L*+$ ### T.>M membru
XI*.* data,e1pirare Y %6$*,6%%/+U..*<$,%6$* '<$*.B6L limita %6U0 limita indic" mar2a de zile
pe care dorim s" o acord"m pentru plata cotizaiei# 'nterogarea selecteaz" intr"rile acelor membrilor care trebuie
s"-si achite cotizaia (ntr-un inter-al mai mic dec)t num"rul de zile specificat# +a un caz special o -aloare a
limitei egal" cu > descoper" membrii care trebuiau s"-!i achite cotizaia (n trecut /adic" membrii### care nu mai
sunt membri de fapt0#
4C#@- C-fC i#
33_ Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
%up" ce am identificat (nregistr"rile care se preteaz" la notific"ri ce facem cu elea > opiune ar fi e1pedierea
unui mesa2 direct din acela!i script dar este util s" putem pre-izualiza lista (nainte de a trimite mesa2ele# %in
acest moti- -om folosi o abordare (n dou" etape3
4 *tapa :3 .ulai un script denumit need,rene5al /impune re(nnoirea0 pentru identificarea membrilor care trebuie
s"-!i achite cotizaia# Putei pur !i simplu e1amina aceast" list" sau o putei folosi ca date de intrare (n a doua
etap" pentru a e1pedia (n!tiin"rile de plat" a cotizaiei#
4 *tapa N3 .ulai un script denumit rene5al,notif y /notificare pentru re(nnoire0 care trimite membrilor prin e-
mail o (n!tiinare de plat" a cotizaiei# Scriptul trebuie s" indice membrii f"r" adrese de e-mail astfel (nc)t s" (i
putei contacta prin alte mi2loace#
Pentru prima parte a acestei sarcini scriptul need,rene5al/0 trebuie s"-i identifice pe membrii care trebuie s"-!i
achite cotizaia# 6cest lucru se poate face astfel3
P limita prestabilita este 30 de zile; reinitializeaza daca
P este dat un argument numeric my /7limita0 8 30;
7limita 8 shift/e6.HB0 if S/6.HB0 LL 6.HB\0] 8- rAdZ7R;
5arn @Utilizeaz" o limita de 7limita zileAn@;
my /7sth0 8 7dbh-9prepare /GG= S*L*+$
membru,id email nume prenume data,e1pirare
$>,%6US /data,e1pirare0 - $>,%6US /+U..*<$,%6$*0 6S zile
T.>M membru
XI*.* data,e1pirare Y %6$*,6%%/+U..*<$,%6$* '<$*.B6L a %6U0
>.%*. &U data,e1pirare nume prenume
E3
7sth-9e1ecute /7limita0; P transfera limita ca -aloare
P pentru c)mpul de (nlocuire
5hile /my 7hash,ref 8 7sth-9fetchro5,hashref /00
=
print 2oin /@At@
7hash,ref -9=membru,id? 7hash,ref -9=email? 7hash,ref -9=nume? 7hash,ref -9=prenume? 7hash,ref
-9=data,e1pirare? 7hash,ref -9=zile? # @ zile@ # @An@;
7sth-9finish
+apitolul F 'nterfaa 6P' pentru Perl %&' 33J
%atele de ie!ire ale scriptului need,rene5al se prezint" oarecum astfel /dumnea-oastr" -ei obine rezultate
diferite deoarece rezultatele sunt determinate (n raport cu data curent" care -a fi diferit" pentru dumnea-oastr"
c)nd citii aceast" carte (n raport cu data la care a fost scris" cartea03
_J g#ste-eSpluto#com Harner Ste-e :JJJ-0_-03 -3N zile
:_ yor^,mar^Searth#com Uor^ Mar^ :JJJ-0_-NK -:: zile
_N 2ohn,ed5ardsS-enus#org *d5ards eohn :JJJ-0J-:N _ zile >bser-ai c" unii membri trebuie
s"-!i achite cotizaia (ntr-un num"r negati- de zile ceea ce (nseamn" c" nu mai sunt membriQ /6sta se (nt)mpl"
c)nd folosii o e-iden" manual" a (nregistr"rilor; oamenii scap" printre degete# 6cum c)nd a-em informaiile
(ntr-o baz" de date descoperim c" am omis c)te-a persoane (nainte#0
+ea de-a doua parte a sarcinii de (n!tiinare pri-ind plata cotizaiilor implic" utilizarea unui script rene5al,notif
y care e1pediaz" notific"ri prin e-mail# Pentru a facilita puin utilizarea acestui script (l putem determina s"
M(neleag"@ trei categorii de argumente din linia de comand"3 numere de identificare a membrilor adrese de e-
mail si nume de fi!iere# 6rgumentele numerice indic" -alorile identificatorilor de membru iar argumentele care
conin caracterul h semnific" adrese de e-mail# >rice alte argumente sunt interpretate ca fiind numele unui fi!ier
care trebuie citit pentru a se g"si numerele de identificare sau adresele de e-mail# 6ceast" metod" -" permite s"
specificai membrii (n funcie de num"rul de identificare sau de adresa de e-mail ceea ce putei face fie direct
din linia de comand" fie prin menionarea lor (ntr-un fi!ier /(n particular putei folosi datele de ie!ire ale
scriptului need,rene5al ca date de intrare pentru scriptul rene5al,notif y#0
Pentru fiecare membru care urmeaz" a primi o (n!tiinare scriptul caut" intrarea corespunz"toare din tabelul
membru e1trage adresa de e-mail si trimite un mesa2 la adresa respecti-"# %ac" nu e1ist" nici o adres" de e-mail
(n intrarea respecti-" scriptul rene5al,notif y genereaz" un mesa2 pentru a -" a-ertiza c" ace!ti membri trebuie
contactai (ntr-un alt mod#
Pentru a trimite mesa2e de e-mail scriptul rene5al,notif y deschide un canal spre programul sendmail !i
determin" trecerea mesa2ului de e-mail prin canalul respecti-#N +alea de acces spre programul sendmail este
configurat" ca parametru aproape de (nceputul scriptului# Poate c" -ei fi obligat s" modificai aceast" cale
deoarece amplasarea programului sendmail -ariaz" de la un sistem la altul3
P schimba calea conform configuraiei sistemului dumnea-oastr"
my /7sendmail0 8 @RusrRlibRsendmail -t -oi@;
+iclul principal de prelucrare a argumentului funcioneaz" dup" cum urmeaz"# %ac" (n linia de comand" nu au
fost specificate argumente citim ca date de intrare datele de intrare standard /S$%'<0# (n caz contrar prelucr"m
fiecare argument transfer)ndu-: funciei interpret,argument /0 pentru a fi clasificat ca num"r de identificare
adres" de e-mail sau nume de fi!ier3
if /S6.HB 8 8 >0 P nu sunt argumente cite!te S$%'< P pentru a obine -alorile
+ontinuare
N 6cest procedeu nu este funcional pentru Xindo5s care nu dispune de programul sendmail# Ba trebui s" g"sii
un modul de e1pediere a mesa2elor de e-mail !i s"-: folosii pe acela# - <#6#
3K0 Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
+ontinuare
read,file /ADS$>'<0;
else
5hile /my 0arg 8 shift /36.HB00
=
P interpreteaz" argumentul cu recursi-itatea numelui de fi!ier interpret,argument /7arg :0;
Tuncia read,f ile/ 0 cite!te coninutul unui fi!ier /care se presupune c" este de2a deschis0 !i e1amineaz" primul
c)mp al fiec"rei linii# /%ac" aliment"m scriptul rene5al2iotif y cu datele de ie!ire ale scriptului need,rene5al
fiecare linie are mai multe c)mpuri dar noi dorim s" o e1amin"m numai pe prima#0 sub read,file
=
my /7fh0 8 script;
my /7arg0;
5hile /defined /7arg 8 Y7fh900
=
P elimina tot ce este plasat dincolo de coloana :
P inclusi- caracterul linie noua 7arg 8- sRAs#DRRs;
P interpreteaz" argumentul f"r" recursi-itatea
P numelui de fi!ier interpret,argument /7arg 00;
Tuncia interpret,argument/0 clasific" fiecare argument pentru a determina dac" este un num"r de identificare o
adres" de e-mail sau un nume de fi!ier# Pentru numerele de identificare si adresele de e-mail caut" (n intrarea de
membru corespunz"toare si o transfer" scriptului notify2nemberQ# $rebuie s" fim ateni la membrii specificai (n
funcie de adresa de e-mail# *ste posibil ca doi membri s" aib" aceea!i adres" /de e1emplu soul !i soia0 !i nu
dorim s" trimitem un mesa2 cui-a pentru care mesa2ul respecti- nu este -alabil# Pentru a e-ita aceast" situaie
c"ut"m identificatorul de membru care l corespunde unei adrese de e-mail pentru a ne asigura c" este unul
singur# %ac" adresa l corespunde mai multor numere de identificare a-em un echi-oc !i (l -om ignora dup"
afi!area unui mesa2 de a-ertizare#
%ac" un argument nu apare sub forma unui num"r de identificare sau al unei adrese de e-mail se presupune c"
este numele unui fi!ier care trebuie citit pentru obinerea altor;
+apitolul F 'nterfaa 6P' pentru Perl %&' 3K:
date de intrare# bi (n acest caz trebuie s" fim ateni - nu dorim s" citim un fi!ier dac" de2a citim un alt fi!ier
pentru a e-ita posibilitatea unui ciclu infinit3 sub interpret,argument
=
my /7arg 7recurse0 8 S,;
my /7Guery 7ary,ref0;
if /7arg 8- R@AdZ7R0
=
notify2nember /7arg0;
?
elsif /7arg8g RkR0
P identificatorul numeric de membru
P adresa de e-mail
P obine identificatorul de membru asociat cu adresa
P /trebuie sa fie unul singur0
7Guery 8GG= S*L*+$ membru,id T.>M membru XI*.* email 8 a ?; 7ary,ref 8 7dbh-9selectcol,arrayref
/7Guery undef 7arg0; if /scalar /S=ary,ref90 88 00
= 4
5arn @6dresa de e-mail 7arg nu corespunde nici unei intr"ri3 se ignoraAn@;
?
elsif /scalar /S=ary,ref90 9 :0
=
5arn @6dresa de e-mail 7arg corespunde mai multor intr"ri3 se ignoraAn@;
else
notify2nember /7ary,ref-9\0]0;
else
P nume de fi!ier
if /Q7recurse0
else
5arn @numele de fi!ier 7arg se afla in interiorul unui fi!ier3 se ignoraAn@;
open /'< 7arg0 or die @<u poate deschide 7arg3 7lAn@;
+ontinuare
3KN Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
+ontinuare
read,file /AD'<0; close /'<0;
?
Programul aferent funciei notify,member/0 care trimite efecti- (n!tiinarea de plat" a cotizaiei este prezentat
(n continuare# %ac" se do-ede!te c" persoana membru nu are adres" de e-mail nu se poate face nimic dar notif
y,member/0 afi!eaz" un a-ertisment astfel (nc)t s" !tii c" trebuie s" contactai persoana respecti-" (ntr-un alt
mod# Putei in-oca sho52nember cu num"rul de identificare a persoanei membru prezentat (n mesa2 pentru a
-edea intrarea (n totalitate - pentru a afla de e1emplu care este num"rul de telefon !i adresa persoanei membru#
P anuna membrul ca trebuie sa-si pl"teasc" in cur)nd cotizaia
sub notify2nember
=
my /7membru,id0 8 shift;
my /7Guery 7sth Sentry,ref kcol,name0;
5arn @6nuna 7membru,id###An@;
7Guery 8 GG= S*L*+$ D T.>M membru XI*.* membru,id 8 a ?;
7sth 8 7dbh-9prepare /SGuery0;
7sth-9e1ecute /7membru,id0;
Scol,name 8 h=7sth-9=<6M*??;
7entry,ref 8 7sth-9fetchro5,hashref /0;
7sth-9finish /0;
if /Q7entry,ref0 P nu a fost g"sit nici un membruQ
=
5arn @ <u a fost g"sita
<'+' > '<$.6.* pentru membrul 7member,idQAn@;
return;
?
open />U$ @ f Ssendmail@0
or die @<u poate deschide programul de postaAn@;
print >U$ `*>T; $o3 7entry,ref-9=email?
Sub2ect3 <ecesitatea plaii cotizaiei la Liga istorica &una ziua# Ba trebui ca in cur)nd sa -a achitai cotizaia de
membru al Ligii istorice# Speram ca -ei g"si c)te-a minute pentru a contacta secretariatul Ligii (n -ederea
achit"rii cotizaiei# +oninutul intr"rii l dumnea-oastr" din catalogul cu membri este prezentat mai 2os# Ba rugam
f sa reinei mai ales data e1pir"rii# Mulumim#
+apitolul F 'nterfaa 6P' pentru Perl %&' 3K3
*>T
foreach my Scol2iame /Scol2iame0
printf >U$ @Os3 OsAn@ Scol2iame Sentry2cef-9=7col2iame?; close />U$0;
Putei realiza chiar si mesa2e mai atr"g"toare; de e1emplu putei ad"uga o coloan" la tabelul membru care s"
conin" data trimiterii ultimei (n!tiin"ri# 6stfel nu -ei trimite (n!tiin"ri prea frec-ent (n forma (n care este
acum -om presupune c" nu -ei rula programul mai frec-ent dec)t o dat" pe lun"#
+ele dou" scripturi sunt acum terminate deci le putei folosi astfel3
O need,rene5al 9 2un^
O /e1aminai fi!ierul 2un^ pentru a -edea daca arata bine0
O rene5al2iotify 2un^
Pentru a trimite notific"ri membrilor indi-iduali (i putei specifica (n funcie de num"rul de identificare sau de
adresa de e-mail3
O need,rene5al :_ g#ste-eSpluto#con
*ditarea intr"rilor corespunz"toare membrilor Ligii istorice
%up" ce (ncepem s" trimitem (n!tiin"ri de plat" a cotizaiei putem presupune c" unele din persoanele pe care le-
am anunat (!i -or achita cotizaia# +)nd se -a (nt)mpla acest lucru -om a-ea ne-oie de o modalitate de a
actualiza intr"rile lor cu date noi de e1pirare (n capitolul urm"tor -om crea o modalitate de a edita (nregistr"rile
membrilor dintr-un bro5ser Xeb dar aici -om crea un script (n linie de comand" edit2nember care -" permite s"
actualizai intr"rile folosind o metod" simpl" de a solicita noile -alori pentru fiecare component" a intr"rii#
Scriptul funcioneaz" astfel3
4 %ac" este in-ocat f"r" argumente (n linia de comand" edit2nember presupune c" dorii s" introducei un
membru nou solicit" informaiile iniiale care -or fi amplasate (n intrarea corespunz"toare membrului si creeaz"
o intrare nou"#
4 %ac" este in-ocat cu un identificator numeric de membru (n linia de comand" edit2nember caut" coninutul
curent al intr"rii apoi solicit" actualiz"ri pentru fiecare coloan" (n parte# %ac" introducei o -aloare pentru o
coloan" (nlocuie!te -aloarea curent"# %ac" ap"sai pe tasta *nter coninutul coloanei nu se modific"# /%ac" nu
cunoa!tei num"rul de identificare al unui membru putei rula sho52nember nume pentru a afla care este
acesta#0
Probabil c" editarea unei (ntregi intr"ri (n acest mod este o munc" inutil" dac" nu dorii dec)t s" actualizai data
pl"ii cotizaiei unui membru# Pe de alt" pane un script ca acesta furnizeaz" si o modalitate simpl" uni-ersal"
de a actualiza orice component" a unei intr"ri f"r" a cunoa!te limba2ul SQL# /Un caz special este acela (n care
edit2nember nu -" -a permite s" modificai c)mpul membru,id deoarece acesta este atribuit (n mod automat la
crearea unei intr"ri si nu trebuie modificat ulterior#0
3KK Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
Prima informaie pe care edit2nember trebuie s" o cunoasc" rezid" (n numele coloanelor din tabelul membru3
P obine numele coloanelor din tabelul membru
my /7sth0 8 7dbh-9prepare /GG= S*L*+$ D T.>M membru XI*.* : 8 > ?0;
7sth-9e1ecute /0;
my /Scol,name0 8 S=7sth-9=<6M*??;
7sth-9finish /0; 6poi putem introduce ciclul principal3
if /S6.HB 88 00 P daca nu e1ista argumente P creeaz" o intrare noua
ne52nember /AScol,name0 ;
else
my /kid0;
P in caz contrar editeaz" intr"rile folosind
P argumente precum identificatorii de membru
P sal-eaz" S6.HB apoi goleste-: pentru a citi din S$%'<
P nu folose!te argumente precum numele de fi!iere Sid 8 06.HB;
06.HB 8 /0;
P pentru fiecare -aloare a identificatorului
P caut" intrarea si apoi o editeaz" 5hile /my 7id 8 shift /3id00
=
my /7entry,ref 0;
7sth 8 7dbh-9prepare /GG=
S*L*+$ D T.>M membru XI*.* membru,id 8 a
7sth-9e1ecute
7entry,ref 8 7sth-9fetchro5,hashref /0;
7sth-9finish /0;
if /Q7entry,ref0
=
5arn @<ici un membru nu are identificatorul 8 7idAn@;
ne1t;
?
edit,member /AScol,name 7entry,ref0;
+apitolula 'nterfaa 6P' pentru Perl %&' 3K[
Programul pentru crearea unei noi intr"ri de membru este prezentat (n continuare# Programul solicit" -alori
pentru fiecare coloan" a tabelului membru apoi emite o instruciune S*L*+$ pentru a ad"uga o (nregistrare
nou"3 P creeaz" o noua (nregistrare de membru
sub ne52nember
=
my /7col,name,ref 0 8 shift;
my /7entry,ref 0 ;
my /7col,-al 7Guery 7delim0;
return unless prompt /@+reez o intrare nouaa @0 8- R@yRi;
P cere -alori noi; utilizatorul tasteaz" -alori noi @nuli@ pentru a
P introduce o -aloare <ULL @e1it@ pentru a para!i programul prematur# foreach my /7col,name0
/S=7col,name,ref ?0
=
ne1t if 7col,name eG @membru,id@; P ignora c)mpul cheie 7col,-al 8 col,prompt /7col,name @@ 00;
ne1t if 7col,-al eG @ @ ; P utilizatorul a ap"sat *nter return if 7col,-al 8- R@e1it7Ri; P inchidere prematura
7col,-al 8 undef if 7col,-al 8- R6null7Ri; 7entry,ref-9=7col,name? - 7col,-al;
?
P afi!eaz" -alorile cere confirmarea (nainte de inserie sho52nember /7col,name,ref 7entry,ref0;
return unless prompt /@Anlnserez aceasta intrarea @0 8- R@yRi;
P construie!te o interogare '<S*.$ apoi o emite# 7Guery 8 @'<S*.$ '<$> membruC;
7delim 8 @ S*$ @; P pune @S*$@ inaintea primei coloane @@
P inaintea celorlalte foreach my 7col,name /S=col,name,ref?0
=
P specifica -alori numai pentru coloane care au primit o -aloare ne1t if 'defined /7entry,ref-9=7col,name90 ;
P funcia Guote /0 citeaz" undef drept cu-)ntul <ULL
P /f"r" ghilimele0 adic" e1act ceea ce dorim#
7 Guery #8 sprintf /@Os Os8Os@ 7delim 7col,name
7dbh-9Guote /7entry,ref -9=7col,name?00 ; 7delim 8 @ @ ;
5arn @6-ertisment3 intrarea nu a fost inserataaAn@ unless 7dbh-9do /7Guery0 88:;
3KV Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
.utinele de solicitare utilizate de ne5,member/ 0 se prezint" astfel3 P pune o (ntrebare cere un r"spuns
sub prompt
=
my /7str0 8 shift;
print S$%*.. 7str; chomp /7str 8 YS$%'<90; return /7str0;
P solicita -aloarea unei coloane; afi!eaz" -aloarea curenta
P in solicitare daca 7sho5,current are -aloarea @ade-"rat@
sub col,prompt
=
my /7name 7-al 7sho5,current0 8 S,;
my /7prompt 7str0;
Sprompt 8 7name;
Sprompt #8 @ \7-al]@ if 7sho5,current;
Sprompt #8 @3 @;
print S$%*.. 7prompt;
chomp /7str 8 YS$%'<90;
return /7str a 7str 3 7-al0; ?
Moti-ul pentru care funcia col,prompt/0 preia un argument 7sho5,current este acela c" -om folosi aceast"
funcie !i pentru solicitarea -alorilor coloanelor din intr"rile e1istente aferente membrilor atunci c)nd scripul
este utilizat pentru actualizarea unei intr"ri# 7sho5,current -a fi > c)nd cre"m o intrare nou" deoarece nu e1ist"
-alori curente de afi!at (n acest din urm" caz promptul -a afi!a -aloarea curent" pe care utilizatorul o poate
accepta pur si simplu prin ap"sarea tastei *nter# Programul pentru editarea intr"rii aferente unui membru
e1istent este similar" cu aceea 2 pentru crearea unui membru nou# $otu!i a-em o intrare de lucru deci rutina de
soliei-3 tare afi!eaz" -alorile intr"rii curente iar funcia edit,member/0 emite o instruciuneA UP%6$* nu o
instruciune '<S*.$3
P editeaz" coninutul curent al unei intr"ri
sub edit2nember
my /7col,name,ref 7entry,ref0 my /7col,-al SGuery 7delim0;
+apitolul F 'nterfaa 6P' pentru Perl %&' 3KF
P afi!eaz" -alorile iniiale cere permisiunea de a continua
P si de a edita
sho52nember /7col,name,ref 7entry,ref0;
return unless prompt /@An*ditez aceasta intrarea @0 8- R6yRi;
P solicita -alori noi; utilizatorul tasteaz" -aloarea noua
P pentru a inlocui -aloarea e1istenta @nuli@ pentru a
P introduce o -aloare <ULL @e1it@ pentru a para!i prematur
P programul respecti- *nter pentru a accepta -aloarea e1istenta foreach my 7col,name /S=7col,name,ref?0
ne1t if 7col,name eG @membru,id@; P ignora c)mpul cheie 7col,-al 8 7entry,ref-9=7col,name?; 7col,-al 8
@<ULL@ unless defined /7col,-al0; 7col,-al 8 col,prompt /7col,name 7col,-al :0; return if 7col,-al 8-
RDe1it7Ri; P inchidere prematura 7col,-al 8 undef if 7col,-al 8- RDnull7Ri; 7entry,ref-9=7col,name? 8 7col,-al;
P afi!eaz" -alorile noi cere confirmare inainte de actualizare sho52nember /7col2iame2gef 7entry2gef0;
return unless prompt /@An6ctualizez aceasta intrarea @0 8- R6yRi;
P construie!te o interogare UP%6$* iar apoi o emite# 7Guery 8 @UP%6$* membru@;
7delim 8 @ S*$ @; P pune @S*$@ inaintea primei coloane @@
P inaintea celorlalte foreach my 7col2iame /S=col2iame2Def?0
ne1t if Scol2iame eG @membru,id@; P ignora c)mpul cheie
P funcia Guote/0 citeaz" undef drept cu-)ntul <ULL
P /f"r" ghilimele0 adic" e1act ceea ce dorim#
7 Guery #8 sprintf /@Os Os8Os@ 7delim Scol2iame
7dbh-9Guote /7entry2gef-9=7col2iame?00; 7delim 8 @@;
SGuery 8 @ XI*.* membru,id 8 a@;
5arn @6-ertisment3 intrarea nu a fost actualizat)aAn@
unless 7dbh-9do /7Guery undef 7entry,ref-9=membru,id?0 88 :;
3K_ Partea a ll-a Utilizarea interfeelor de programare ale sistemului MySQL
> problem" a funciei edit2nember este aceea c" nu e1ecut" -alid"ri ale -alorilor de intrare# Pentru ma2oritatea
c)mpurilor din tabelul membru nu prea a-ei ce -alida - acestea nu sunt nimic altce-a dec)t c)mpuri !ir# %ar
trebuie -erificate -alorile datelor de intrare pentru coloana data,e1pirare pentru a e1ista sigurana c" sunt date si
nu altce-a (ntr-o aplicaie de uz general pentru introducerea datelor probabil c" -ei dori s" e1trageri informaii
despre un tabel pentru a determina tipurile tuturor coloanelor sale# 6poi putei s" formulai restricii de -alidare
pe baza acestor tipuri ceea ce este prea complicat pentru ceea ce -reau eu s" prezint aici deci -oi ad"uga un
artificiu rapid la funcia col,prompt /0 pentru a -erifica formatul datelor de intrare (n cazul (n care numele
coloanei este @data,e1pirare@# > -erificare minimal" a -alorii datei se poate face astfel3
sub col,prompt
=
my /7name 7-al 7sho5,current0 8 h,;
my /7prompt 7str0;
if 7sho5,current;
loop3
Sprompt 8 7name;
7prompt #8 @ \7-al]
Sprompt #8 @3 @;
print S$%*.. 7prompt;
chomp /7str 8 YS$%'<90;
P e1ecuta o -erificare rudimentara a datei de e1pirare
if /7str LL 7nume eG @data,e1pirare@0
P -erifica formatul
P datei de e1pirare
7str 8- rAdZrAd]AdZrAd]AdZ7R or goto loop;
return /7str a 7str 3 7-al0;
Modelul testeaz" cele trei sec-ene de cifre separate prin caractere non-cifrice# 6ceasta este numai o -erificare
parial" deoarece nu detecteaz" -alori precum @:JJJ-:K-JN@ ca fiind incorecte# Pentru a (mbun"t"i scriptul
putei insera -erific"ri mai riguroase ale datelor !i alte -erific"ri precum obligati-itatea e1istenei unor -alori
ne-ide (n c)mpurile care conin numele !i prenumele#
6lte (mbun"t"iri pot consta din omiterea actualiz"rii dac" nu e1ist" coloane modificateE; respecti- de a anuna
utilizatorul dac" (nregistrarea a mai fost modificat" de altcine-a (n timp ce utilizatorul respecti- o edita# Putei
face aceasta sal-)nd -alorile originale ale coloanelor care compun intr"rile membrilor si apoi scriind
instruciunea UP%6$* pentru a actualiza numai acele coloane care s-au modificat# %ac" nu s-a modificat nici o
coloan" instruciunea nici m"car nu mai trebuie emis"# %e asemenea se poate scrie clauza XI*.* astfel (nc)t
s" includ" 6<% nume,coloana 8 -aloare,coloana pentru fiecare -aloare original" din coloan"# 6cest procedeu
-a cauza e!ecul instruciunii UP%6$* dac"
+apitolul F 'nterfaa 6P' pentru Perl %&' 3KJ
o alt" persoan" a modificat (nregistrarea ceea ce reprezint" un indiciu al faptului c" dou" persoane (ncearc" s"
modifice intrarea simultan#
'dentificarea membrilor cu interese comune ai Ligii istorice
Una din (ndatoririle secretarului Ligii istorice este de a prelucra cererile pro-enite de la membrii care doresc o
list" cu ali membri care manifest" un interes particular (ntr-un anumit episod din istoria Statelor Unite cum ar fi
Marea +riz" sau -iaa lui 6braham Lincoln# Localizarea unor asemenea membri este destul de u!oar" c)nd
catalogul se afl" sub forma unui document creat cu un procesor de te1te folosind funcia Tind /g"sire0 a
procesorului de te1te# $otu!i generarea unei liste care s" fie compus" numai din intr"rile corespunz"toare ale
membrilor este mai dificil" deoarece implic" o mulime de operaii de copiere !i lipire# +u MySQL aceast"
operaie de-ine cu mult mai simpl" deoarece putem rula o interogare astfel3
S*L*+$ D T.>M member XI*.* interese L'i* @OlincolnO@
>.%*. &U nume prenume
%in p"cate rezultatele nu arat" prea frumos dac" rul"m aceast" interogare din clientul mysGl# S" alc"tuim un mic
script %&' denumit interese# Mai (nt)i scriptul -erific" pentru a se asigura c" e1ist" cel puin un argument
denumit (n linia de comand" deoarece (n caz contrar nu dispune de criterii de c"utare# 6poi pentru fiecare
argument scriptul ruleaz" o c"utare a-)nd drept criteriu coloana interese a tabelului membru3
S6.HB or die3 @Utilizare3 cu-)ntul cheie intereseAn@;
cauta2nembri /shift /S6.HB00 5hile S6.HB;
Pentru a c"uta !irul determinat de cu-)ntul cheie inser"m caractere de (nlocuire O /procent0 la fiecare cap"t al
acestuia astfel (nc)t !irul s" poat" fi g"sit oriunde (n coloana interese# 6poi afi!"m intr"rile care satisfac criteriul
de c"utare3
sub cauta2nembri
my /7interese0 8 shift; my /7sth 7numar0;
prin @+aut" rezultatele pentru cu-)ntul cheie3 7interesAnAnA@; 7sth 8 7dbh-9prepare /GG=
S*L*+$ D T.>M membru XI*.* interese L'i* a
>.%*. &U nume prenume
?0;
P caut" !irul oriunde in c)mpul @interese@
7sth-9e1ecute /@O@ # Sinterese # @O@0;
7numar 8 0;
5hile /my 7hash,ref 8 7sth-9fetchro5,hashref /00
=
format,entry /7hash,ref 0 ; ZZ7numar;
?
prin @6u fost g"site 7numar intrariAnAn@;

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

  • Mysql 350
    Mysql 350
    Document28 pagini
    Mysql 350
    Lupu Adrian
    Încă nu există evaluări
  • Mysql 250
    Mysql 250
    Document29 pagini
    Mysql 250
    gabrielgabor22
    Încă nu există evaluări
  • Mysql 150
    Mysql 150
    Document30 pagini
    Mysql 150
    Lucian Musteata
    Încă nu există evaluări
  • Mysql 100
    Mysql 100
    Document32 pagini
    Mysql 100
    Виктор Которобай
    Încă nu există evaluări