<titlu> z8o24ol
Utilizarea functionalitatilor avansate ale limbajului PHP</titlu>
<titlu>Modulul 14:Accesul la bazele de date relationale</titlu>
<titlu>Scopuri</titlu>
• invatati sa va conectati la un server de baze de date MySQL
• invatati sa executati interogari SQL asupra unei baze de date
MySQL
• invatati sa detectati si sa raportati erori in baza de date
• invatati sa obtineti informatii privind rezultatele interogarilor
SQL
• invatati sa obtineti informatii despre structura unei baze de
date MySQL
• invatati sa va protejati aplicatiile impotriva anumitor
categorii de date rau intentionate introduse de utilizator
• intelegeti caracteristicile inexistente in MySQL furnizate
de instrumente de gestiune a datelor, precum Postgresql, ODBC, LDAP si XML
Datele sunt obiectul celor mai multe operatii de prelucrare, iar sistemele
de gestiune a bazelor de date furnizeaza cele mai complexe si mai puternice
facilitati pentru lucrul cu datele. Ca atare, un programator PHP trebuie sa
dispuna de cunostinte
aprofundate privind sistemele de gestiune a bazelor de date. Acest modul explica
modul de redactare a programelor PHP care folosesc MySQL, sistemul de gestiune
a bazelor de date cel mai frecvent folosit de catre programatorii PHP. De asemenea,
sunt descrise si alte instrumente de gestiune a datelor, inclusiv Postgresql,
ODBC, LDAP si XML.
<titlu>Utilizarea bazelor de date MySQL</titlu>
PHP include o biblioteca de functii care furnizeaza o interfata cu sistemul
MySQL de gestiune de bazelor de date. Folosind aceste functii, un program PHP
poate obtine accesul la datele rezidente intr-o baza de date MySQL si
le poate modifica.
Majoritatea interactiunilor cu o baza de date se desfasoara dupa un model secvential
simplu:
1. Se deschide o conexiune cu serverul MySQL.
2. Se specifica baza de date la care se va obtine accesul.
3. Se emit interogari SQL, se obtine accesul la rezultatele interogarilor si
se executa operatii non-SQL.
4. Se inchide conexiunea cu serverul MySQL.
Aceasta sectiune descrie deschiderea unei conexiuni cu o baza de date, specificarea
bazei de date la care urmeaza a se obtine accesul si inchiderea conexiunii
cu serverul MySQL. De asemenea, se explica modul de detectare a erorilor in
procesul de prelucrare a interogarilor MySQL si modalitatile de raspuns in
cazul aparitiei acestora. In sectiunile urmatoare, se explica modul de
emitere a interogarilor SQL, de acces la rezultatele interogarilor si de executie
a operatiilor non-SQL.
<titlu>Conectarea la serverul MySQL</titlu>
Pentru a va conecta la un server MySQL, invocati functia mysql_connect(), a
carei sintaxa este urmatoarea:
mysql_connect(nume_gazda, nume_utilizator, parola)
unde nume_gazda este numele gazdei pe care ruleaza serviciul MySQL, nume_utilizator
este identificatorul de utilizator MySQL care va fi folosit, iar parola este
parola MySQL asociata identificatorului de utilizator. Functia returneaza false
in caz de esec; in caz contrar, returneaza o valoare - denumita
identificator de legatura - care serveste ca instrument de manipulare pentru
accesul la serverul MySQL. Iata un model de invocare a functiei mysql_connect():
$db = mysql_connect( „localhost”,”php”,”salut”); if (!$db) die („Nu s-a reusit deschiderea bazei de date.”);
Exemplul anterior testeaza valoarea rezultatului returnat de functia mysql_connect()
si incheie executia programului daca PHP nu a reusit sa deschida conexiunea
specificata. Argumentele prezentate in exemplu sunt adecvate pentru conectarea
la un server MySQL care ruleaza pe aceeasi gazda ca si serverul PHP, adica gazda
locala. Identificatorul de utilizator si parola sunt similare celor specificate
in proiec¬tul 13-1 din modulul anterior.
Puteti omite numele gazdei, identificatorul de utilizator si parola, sau toate
cele trei argumente. Daca procedati astfel, vor fi luate in considerare
in mod prestabilit urmatoarele valori:
• Numele gazdei: localhost
• Identificatorul de utilizator: identificatorul de utilizator al procesului
server MySQL
• Parola: o parola vida
De exemplu, instructiunea urmatoare incearca sa stabileasca o conexiune
cu serviciul MySQL care ruleaza pe gazda db.osborne.com, folosind un identificator
de utilizator si o parola prestabilite:
$db = mysql_connect(„db.osborne.com”);
<Sugestie>
In mod prestabilit, functia mysql_connect() incearca sa contacteze
serviciul MySQL prin intermediul portului 3306, portul MySQL standard. Daca
doriti sa obtineti accesul la un server MySQL care ruleaza pe un port non-standard,
puteti atasa un caracter doua puncte si numarul portului dorit la argumentul
care contine numele gazdei; de exemplu, "localhost:3305".</Sugestie>
<titlu>Selectarea bazei de date</titlu>
Dupa ce programul dumneavoastra a obtinut o conexiune cu serverul MySQL, programul
poate specifica baza de date la care va avea acces. Pentru aceasta, invoca functia
mysql_select_db(), care are urmatoarea forma:
mysql_select_db(baza_de_date)
unde baza_de_date este un sir care contine numele bazei de date la care urmeaza
a se obtine acces. Functia returneaza true daca poate obtine accesul la baza
de date, respectiv false in caz contrar.
Puteti testa rezultatul functiei mysql_select_db() folosind un program ca acesta:
$ok = mysql_select_db(„testdb”); if (!$ok)
A die (“Nu poate obtine acces la baza de date testdb.”)
S
Totusi, acest procedeu nu este foarte util pentru a determina cauza sau natura
unei invocari ratate. O metoda mai buna consta in utilizarea functiilor
din biblioteca MySQL de verificare a erorilor, functii descrise in sectiunea
urmatoare, „Detectare aparitiei erorilor".
<titlu>Detectarea aparitiei erorilor</titlu>
Biblioteca MySQL din PHP furnizeaza doua functii de verificare a erorilor, si
anume mysql_errno() si mysql_error(). Fiecare functie returneaza un rezultat
care reflecta eroarea, daca exista, asociata celei mai recente operatii cu MySQL.
Daca programul dumneavoastra executa o secventa de operatii MySQL, iar prima
operatie genereaza o eroare, informatiile despre erorile respective sunt pierdute
in momentul initierii celei de-a doua operarii.
Nici una din cele doua functii nu necesita argumente. Functia mysql_errno()
returneaza un cod numeric de eroare, in timp ce functia mysql_error()
returneaza o descriere textuala a erorii. Daca nu s-a produs nici o eroare,
codul numeric al erorii este zero si descrierea textuala are ca valoare un sir
vid.
Informatiile de eroare sunt disponibile numai daca este activa o conexiune cu
serverul MySQL. Ca atare, nu puteti folosi nici una dintre aceste functii pentru
a raporta erorile asociate functiei mysql_connect().
Iata cum puteti folosi functiile respective pentru a verifica modul de operare
a functiei mysql_select_db ():
mysql_select_db(„testdb”); if (mysql_error())
A die(„<BR> . mysql_errno().”: „.mysql_error().”<BR>”;
S
De exemplu, daca incercati sa obtineti accesul la baza de date inexistenta
testdbx, programul de mai sus va genera urmatorul rezultat:
1044: Access denied for user: ‚php@localhost’ to database ‚testdbx’
(Accesul interzis pentru utizatorul … la baza de date …)
<titlu>Eliminarea mesajelor de eroare si a avertismentelor nedorite</titlu>
Numeroase functii PHP pot produce erori sau mesaje de avertizare care ii
pot deruta pe utilizatorii siturilor Web sau care le pot cauza neplaceri acestora.
PHP furnizeaza functia error_reporting(), care va permite sa eliminari mesajele
nedorite. Functia are urmatoarea forma:
error_reporting(masca)
unde masca specifica tipul mesajelor care vor fi raportate. Daca specificati
zero ca valoare a atributului masca, nu va fi raportat nici un mesaj. Daca specificati
E_ALL ca
valoare a atributului masca, vor fi raportate toate mesajele. De exemplu, pentru
a elimina toate mesajele, invocati functia dupa cum urmeaza:
error_reporting(0);
In general, este util sa permiteti limbajului PHP sa afiseze mesaje de
eroare si de avertisment in faza de dezvoltare a programelor, deoarece
acestea va pot ajuta sa identificati si sa eliminati problemele. Ca atare, in
general trebuie sa eliminati erorile si mesajele de avertisment numai pentru
programele aflate in uz, nu si pentru cele aflate in faza de dezvoltare.
<titlu>Inchiderea conexiunii cu serverul MySQL </titlu>
Pentru a inchide o conexiune cu un server MySQL, invocati functia mysql_close(),
care are urmatoarea forma:
mysql_close()
Functia returneaza true in caz de reusita; in caz contrar, returneaza
false. In general, nu este necesara invocarea functiei mysql_close(),
deoarece PHP inchide automat conexiunile deschise cu bazele de date atunci
cand un script isi incheie executia.
Iata cum se poate folosi functia mysql_close() pentru a inchide o conexiune:
mysql_close() if (mysql_errno())
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
S
<Sfatul specialistului>
Intrebare: Daca PHP inchide in mod automat conexiunile deschise
cu baza de date atunci cand un script isi incheie exe¬cutia,
de ce este necesara invocarea functiei mysql_close()?
Raspuns: Prin inchiderea unui fisier, sunt eliberate resursele alocate,
inchiderea unei conexiuni cu o baza de date elibereaza de asemenea resursele
alocate. Daca inchideti o conexiune cu o baza de date inainte de
sfarsitul progra¬mului dumneavoastra, resursele suplimentare se vor
gasi la dispozitia altor pro¬cese. Ocazional, puteti scrie un program care
obtine accesul la mai multe servere MySQL. Intr-o asemenea situatie, puteti
pastra o singura conexiune deschisa la orice moment de timp dat; functia mysql_close()
va permite sa inchideti o conexiune cu o baza de date anterior deschiderii
unei alte conexiuni.
</Sfatul specialistului>
<Test „la minut">
• Care este functia utilizata pentru a deschide o conexiune cu o baza
de date MySQL?
• Care este functia utilizata pentru a specifica baza de date MySQL la
ca se va obtine accesul folosind o anumita conexiune cu o baza de date?
• Care este functia ce returneaza codul numeric de eroare asociat celei
mai recente operatiuni MySQL? </Test „la minut">
<titlu>Executarea interogarilor UPDATE, INSERT si DELETE</titlu>
Din punctul de vedere al limbajului PHP, exista doua categorii de interogari
SQL
• Interogarile SELECT, care returneaza randuri ale unui tabel
• Interogarile UPDATE, INSERT si DELETE, care nu returneaza randuri
ale unui tabel
Ambele categorii de interogari sunt emise folosind functia mysql_query(), dar
verificarea si prelucrarea celor doua categorii de rezultate ale interogarilor
sunt procese destul de diferite. In sectiunea urmatoare este explicat modul
de utilizare a functiei mysql_query(). De asemenea, este explicat modul de utilizare
a interogarilor care nu returneaza randuri de tabel. Daca va intereseaza
rezultatul invers, examinati o sectiune ulterioara din acest modul, intitulata
„Prelucrarea rezultatelor intero¬garilor SELECT", in care
se explica modul de prelucrare a rezultatelor interogarilor care returneaza
randuri de tabel.
<titlu>Functia mysql_query()</titlu>
Functia mysql_query() executa o interogare specificata. Functia are urmatoarea
forma:
mysql_query(interogare)
unde interogare este un sir care contine interogarea care urmeaza a fi executata
(interogarea nu trebuie sa se incheie cu un caracter punct si virgula).
Functia retur¬neaza true daca serverul a reusit sa execute interogarea;
in caz contrar, returneaza false.
Iata o invocare caracteristica a functiei mysql_query(), care include un program
ce verifica daca interogarea a reusit sau nu:
<nota>
Raspunsuri la test:
• mysql_connect()
• mysql_select_db()
• mysql_errno()</nota>
$interogare = „INSERT INTO angajat
(angajatnr, nume, ore, departament, salariu, data_angajare)
VALUE (4, James Madison, 40, ’Intretinere’, 20000, ’2005-10-01’)”;
$rezultat = mysql_query($interogare); if (mysql_errno())
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
S
Interogarea este compatibila cu structura bazei de date folosita in proiectul
13-1, deci puteti rula atat aceasta interogare, cat si alte interogari
similare, pentru a vedea cum functioneaza.
<titlu>Verificarea interogarilor care nu returneaza randuri de tabel</titlu>
Pentru a verifica daca o interogare UPDATE, INSERT sau DELETE a avut efectul
dorit, puteti folosi functia mysql_affected_rows(), care returneaza numarul
randurilor afectate de interogarea cea mai recenta. Functia are urmatoarea
forma:
mysql_affected_rows()
In cazul in care cea mai recenta interogare UPDATE, INSERT sau
DELETE a esuat, functia returneaza valoarea -1.
Iata cum puteti folosi functia mysql_affected_rows() pentru a determina modul
de functionare a interogarii INSERT date anterior:
$interogare = „INSERT INTO angajat
(angajatnr, nume, ore, departament, salariu, data_angajare)
VALUE (4, James Madison, 40, ’Intretinere’, 20000, ’2005-10-01’)”;
$rezultat = mysql_query($interogare); if (mysql_errno())
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
S if (mysql_affected_rows() != 1)
A die(„<BR>INSERT nu a reusit sa adauge angajatul.”);
S
<Sugestie>
Functia mysql_affected_rows() numara numai randurile efectiv modificate
de catre o interogare UPDATE. Randurile in cazul carora vechea si
noua valoare din coloana sunt identice nu se numara printre randurile
afectate. De asemenea, o interogare DELETE care nu contine o clauza WHERE va
determina functia mysql_affected_rows() sa returneze valoarea zero, indiferent
de numarul randurilor sterse din tabel. </Sugestie>
<titlu>Utilizarea coloanelor de tabel cu auto-incrementare</titlu>
Asa cum s-a aratat in modulul anterior, puteti folosi indicatorul AUTO_INCREMENT
pentru a preciza faptul ca MySQL va repartiza o valoare secventiala unica in
coloana care serveste drept cheie primara a tabelului. De exemplu, urmatoarele
instructiuni SQL creeaza, un tabel cu acelasi tip de coloana:
CREATE TABLE master
( id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, nume VARCHAR(50)
)
;
Cand inserati un rand intr-un tabel in acest mod, puteti
folosi functia mysql_insert_id() pentru a determina valoarea cheii primare atribuite
de MySQL. Functia are forma:
mysql_insert_id()
si returneaza valoarea zero daca interogarea precedenta nu a generat o valoare
AUTO_INCREMENT. Ca atare, functia trebuie apelata la putin timp dupa interogarea
care a inserat randul din tabel, astfel incat o interogare
ulterioara sa nu modifice rezultatul.
Iata cum se poate insera un rand in tabelul master si cum se poate
obtine valoarea cheii primare repartizate de MySQL:
$interogare = „INSERT INTO master (nume) VALUES(’G.W.Bush’)”;
$rezultat = mysql_query($interogare); if (mysql_errno())
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
S echo „<BR>Randuri modificate: „ .mysql_affected_rows(); echo „<BR>ID inserat: „. mysql_insert_id();
<Sfatul specialistului>
Intrebare:Functia mysql_affected_rows() poate returna zero atunci cand
sunt sterse toate randurile asociate unui tabel. Cum se poate afla daca
o operatie de acest gen a reusit?
Raspuns: O modalitate simpla, dar fiabila, de a determina daca stergerea tuturor
randurilor unui tabel a reusit consta in a emite o interogare care
retur¬neaza numarul randurilor existente in tabel. De exemplu:
SELECT COUNT (angajatnr) FROM angajat;
Daca interogarea returneaza valoarea zero, acest fapt demonstreaza stergerea
tuturor randurilor din tabel. </Sfatul specialistului>
<Atentie>
Functia mysql_insert_id() poate returna un rezultat incorect pentru coloanele
de tipul MySQL BIGINT. Sectiunea "Sfatul specialistului" de la sfarsitul
urmatoarei sectiuni,”Prelucrarea rezultatului interogarilor SELECT",
descrie un procedeu de rezolvare a probei. </Atentie>
<Test „la minut">
• Care este functia PHP folosita pentru a emite o interogare
• Care este functia PHP ce returneaza numarul randurilor unui modificate
de o interogare UPDATE, INSERT sau DELETE?
• Care este indicatorul MySQL ce arata ca este necesar ca valoarea unei
chei primare sa fie atribuita de catre MySQL? </Test „la minut">
<titlu>Prelucrarea rezultatelor interogarilor SEECT</titlu>
Spre deosebire de interogarile UPDATE, INSERT si DELETE, interogarile SELEC
returneaza randuri de tabel ca rezultate. Randurile unui tabel sunt
incluse intr-o structura de date numita set de rezultate. Prelucrarea
setului de rezultate returnat de o interogare SELECT implica parcurgerea prin
iteratie a randurilor setului de rezultate.
O modalitate de parcurgere iterativa a randurilor unui set de rezultate
consta in obtinerea numarului de randuri, urmata de deplasarea prin
iteratie, folosind numarul de randuri ca limita pentru o instructiune
for. Pentru a obtine valoarea numarului de randuri, invocati functia mysql_num_rows(),
transferand ca argument valona returnata de functia mysql_query(). De
exemplu:
$interogare = „SELECT * FROM angajat ”;
$rezultat = mysql_query($interogare); if (mysql_errno())
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
S
$numar = mysql_num_rows($rezultat);
Functia mysql_fetch_row() se poate folosi pentru a obtine urmatorul rand
din secventa setului de rezultate, astfel:
for ($i = 0; $i < $numa; $i++)
A
$rand = mysql_fetch_row($rezultat) if (mysql_errno())
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
<nota>
Raspunsuri la test:
• mysql_query()
• mysql_affected_rows()
• AUTO_INCREMENT"</nota>
S
// aici se prelucreaza randul din setul de rezultate
S
Totusi, functia mysql_fetch_row() returneaza true daca un set de rezultate
contine randuri neprelucrate, respectiv false in caz contrar. Ca
atare, in general este mai convenabil sa se omita apelarea functiei mysql_num_rows()
si sa se foloseasca in schimb o instructiune while, astfel:
$interogare = „SELECT * FROM angajat ”;
$rezultat = mysql_query($interogare); if (mysql_errno())
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
S
while ($rand = mysql_fetch_row($rezultat))
A if (mysql_errno())
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
S
// aici se prelucreaza randul din setul de rezultate
S
Valoarea returnata de functia mysql_fetch_row() reprezinta un tablou alcatuit
din toate coloanele randului curent din tabel. Tabloul foloseste indexuri
intregi, unde valoarea primului index este egala cu zero. Pentru a prelucra
coloanele stocate in tablou, folositi o instructiune foreach, care elimina
necesitatea existentei unui index explicit al buclei. De exemplu, iata o instructiune
foreach care pur si simplu afiseaza valoarea din fiecare coloana a tabelului:
while ($rand = mysql_fetch_row($rezultat))
A if (mysql_errno())
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
S foreach ($rand as $coloana)
A echo „<BR>$coloana”;
S echo „<BR>”;
S
Daca doriti sa obtineti acces la valoarea unei anumite coloane, puteti face
referire la elementul din tablou folosind un index. De exemplu, daca rezultatul
functiei mysql_fetch_row() este stocat in variabila $rand, puteti obtine
acces la prima coloana din setul de rezultate folosind sintaxa $randa0i, la
a doua coloana folosind sintaxa $randa1i etc.
Daca vi se pare incomod sa lucrati cu indici numerici, puteti obtine randurile
tabelului folosind functia mysql_fetch_array(), care returneaza un tablou asociativ.
Valorile indexurilor din tablou le reprezinta numele coloanelor din setul de
rezultate
Ca si functia mysql_fetch_row(), functia mysql_fetch_array() returneaza false
daca nu mai exista randuri in setul de rezultate.
Iata un exemplu de utilizare a functiei mysql_fetch_array():
$interogare = „SELECT * FROM angajat ”;
$rezultat = mysql_query($interogare); if (mysql_errno())
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
S
while ($rand = mysql_fetch_array($rezultat, MYSQL_ASSOC))
A if (mysql_errno())
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
S foreach ($rand as $coloana)
A echo „<BR>$nume=>$coloana”;
S echo „<BR>”;
S
La rulare, exemplul afiseaza numele si valoarea fiecarei coloane rezultate.
Daca doriti sa obtineri accesul la valoarea unei anumite coloane, folositi numele
coloanei ca index. De exemplu:
echo „<BR>” . $rowa„angajatnr”i;
<Sugestie>
Cel de-al doilea argument al functiei mysql_fetch_array() este optional. Totusi,
daca nu specificati MYSQL_ASSOC ca valoare a argumentului, PHP returneaza un
tablou asociativ, indexat cu numerele si numele coloanelor. </Sugestie>
<Test „la minut">
• Care este numele structurii de date asociate cu rezultatele unei interogari
SELECT?
• Care este functia PHP MySQL ce returneaza numarul randurilor dintr-un
set de rezultate?
• Care este functia PHP MySQL ce returneaza un tablou cu indexuri numerice,
care contine randul unui set de rezultate?
• Care este functia PHP MySQL ce returneaza un tablou asociativ, care
contine un rand al unui set de rezultate, indexat cu humele coloanelor
din setul de rezultate? </Test „la minut">
<nota>
Raspunsurila test:
• Set de rezultate
• mysql_num_rows()
• mysql_fetch_row()
• mysql_fetch_array()</nota>
<Sfatul specialistului>
Intrebare: Anterior in cadrul acestui modul, s-a precizat ca functia
mysql_insert_id() poate fi uneori nesigura. Cum este posibila o determinare
sigura a valorii atribuite de MySQL drept cheie primara cu auto-incrementare
a randului unui tabel?
Raspuns: Functia MySQL LAST_INSERT_ID() returneaza valoarea atribuita de MySQL
unei coloane AUTO_INCREMENT, indiferent de tipul coloanei. Mai mult, apelurile
ulterioare la functii MySQL nu invalideaza rezultatul returnat de LAST_INSERT_ID(),
care este afectat numai de operatiile INSERT in care sunt im¬plicate
coloane AUTO_INCREMENT.
Iata un exemplu care prezinta modul de obtinere a valorii LAST INSERT ID():
$interogare = "SELECT COUNT(*) LAST_INSERT_ID() FROM numetabel";
$rezultat = mysql_query($interogare); if (mysql_errno())
A die("<BR>" . mysql_errno().": ".mysql_error().”<BR>");
S
$rand = mysql_fetch_row($rezultat); if (mysql_errno())
A die("<BR>" . mysql_errno().": „.mysql_error()."<BR>”);
S echo "<BR>ID repartizat: $rowa0i";
Pentru a folosi aceste linii in propriul dumneavoastra program, inlocuiti
numetabel cu numele tabelului actualizat. </Sfatul specialistului>
<titlu>Lucrul cu seturi de rezultate</titlu>
Biblioteca de functii MySQL a limbajului PHP include un set de functii care
va permit sa obtineti informatii despre un set de rezultate, inclusiv:
• Numarul coloanelor din setul de rezultate
• Numarul fiecarei coloane
• Lungimea fiecarei coloane
• Indicatorii MySQL asociati coloanei
• Tipul MySQL al fiecarei coloane
• Numele tabelului MySQL care contine coloana, daca este cazul
De asemenea, biblioteca furnizeaza o functie care va permite sa obtineti acces
in mod non-secvential la randurile din setul de rezultate, prin
specificarea numarului unui rand.
<titlu>Obtinerea numarului coloanelor unui set de rezultate</titlu>
Pentru a obtine numarul coloanelor dintr-un set de rezultate, invocati functia
mysql_num_fields(), transferand ca argument valoarea returnata de functia
mysql_query().
De exemplu, programul urmator foloseste functia mysql_num_fields() pentru a
determina numarul coloanelor dintr-un set de rezultate care contin randurile
selectate folosind specificatorul SQL pentru campuri *:
$interogare = „SELECT * FROM angajat ”;
$rezultat = mysql_query($interogare); if (mysql_errno())
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
S
$numar_campuri = mysql_num_fields($rezultat);
<titlu>Obtinerea numelui unei coloane din setul de rezultate</titlu>
Functia mysql_field_name() returneaza numele coloanei din setul de rezultate
avand valoarea indexului data ca argument al functiei. Indexul asociat
cu prima coloana este 0, indexul asociat celei de-a doua coloane este l etc.
De exemplu, programul urmator foloseste functia mysql_field_name() pentru a
determina numele primei coloane din setul de rezultate:
$interogare = „SELECT * FROM angajat ”;
$rezultat = mysql_query($interogare); if (mysql_errno())
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
S
$nume = mysql_field_name($rezultat, 0);
<titlu>Obtinerea lungimii unei coloane dintr-un set de rezultate</titlu>
Functia mysql_field_len() returneaza lungimea maxima a coloanei dintr-un set
de rezultate, avand valoarea indexului data ca argument al functiei. Indexul
asociat primei coloane este 0, indexul asociat celei de-a doua coloane este
l etc.
De exemplu, programul urmator foloseste functia mysql_field_len() pentru a determina
lungimea maxima a primei coloane din setul de rezultate:
$interogare = „SELECT * FROM angajat ”;
$rezultat = mysql_query($interogare); if (mysql_errno())
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
S
$lungime = mysql_field_len($rezultat, 0);
<titlu>Obtinerea indicatorilor MySQL asociati unei coloane a setului
de rezultate</titlu>
Functia mysql_field_flags() returneaza indicatorii SQL asociati coloanei din
setul de rezultate al carei index este dat ca argument al functiei. Indexul
asociat primei coloane este 0, indexul asociat celei de-a doua coloane este
l etc. Functia mysql_field_flags() raporteaza urmatorii indicatori:
• AUTO_INCREMENT
• BINARY
• BLOB
• ENUM
• MULTIPLE_KEY
• NOT_NULL
• PRIMARY_KEY
• TIMESTAMP
• UNIQUE_KEY
• UNSIGNED
• ZEROFILL.
Daca la o coloana sunt asociati mai multi indicatori, fiecare indicator este
separat de vecinii sai prin intermediul unui singur spatiu.
De exemplu, programul urmator foloseste functia mysql_field_flags() pentru a
determina indicatorii asociati primei coloane din setul de rezultate:
$interogare = „SELECT * FROM angajat ”;
$rezultat = mysql_query($interogare); if (mysql_errno())
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
S
$indicatori = mysql_field_flangs($rezultat, 0);
<titlu>Obtinerea tipului MySQL al unei coloane din setul de rezultate</titlu>
Functia mysql_field_type() returneaza tipul MySQL al unei coloane din setul
de rezultate, coloana al carei index este dat ca argument al functiei. Indexul
asociat primei coloane este 0, indexul asociat celei de-a doua coloane este
l etc. Tabelul 13-1 descrie principalele tipuri MySQL returnate de aceasta functie.
De exemplu, programul urmator foloseste functia mysql_field_type() pentru a
determina tipul primei coloane din setul de rezultate:
$interogare = „SELECT * FROM angajat ”;
$rezultat = mysql_query($interogare); if (mysql_errno())
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
S
$tip = mysql_field_type($rezultat, 0);
<titlu>Determinarea tabelului MySQL asociat unei coloane din setul de
rezultate</titlu>
Functia mysql_field_table() returneaza tabelul MySQL, daca exista, asociat coloanei
din setul de rezultate al carei index este dat de argumentul functiei. Indexul
asociat primei coloane este , indexul asociat celei de-a doua coloane este l
etc. In cazul in care coloana contine o valoare calculata sau daca
respectiva coloana nu este asociata in alt mod cu un tabel MySQL, functia
returneaza un sir vid.
De exemplu, programul urmator foloseste functia mysql_field_table() pentru a
determina tabelul asociat primei coloane din setul de rezultate:
$interogare = „SELECT * FROM angajat ”;
$rezultat = mysql_query($interogare); if (mysql_errno())
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
S
$tabel = mysql_field_table($rezultat, 0);
<titlu>Obtinerea structurii complete a setului de rezultate</titlu>
Daca sunteti interesat in obtinerea mai multor caracteristici ale setului
de rezultate, functia mysql_fetch_field() poate fi utila. Aceasta functie returneaza
un obiect ale carui proprietati contin o varietate de informatii cu privire
la coloana unui set de rezultate. Proprietatile sunt urmatoarele:
• blob are valoarea 1 in cazul in care coloana este de tip
BLOB
• max_length — lungimea maxima a coloanei;
• multiple_key are valoarea 1 in cazul in care coloana este
o cheie non-unica
• name - numele coloanei
• not_null are valoarea 1 in cazul in care coloana nu poate
contine valoarea NULL
• numeric are valoarea 1 in cazul in care coloana este numerica
• primary_key are valoarea 1 in cazul in care coloana este
o cheie primara
• table - numele tabelului MySQL caruia ii apartine coloana
• type - tipul MySQL al coloanei
• unique_key are valoarea 1 in cazul in care coloana este
o cheie unica
• unsigned are valoarea 1 in cazul in care coloana este de
tip UNSIGNED
• zerofill are valoarea 1 in cazul in care coloana este completata
cu zerouri
Ca si functia conexa descrisa anterior in acest modul, functia mysql_fetch_field()
preia doua argumente: valoarea returnata de functia mysql_query() si indexul
coloanei din setul de rezultate care va fi descrisa. Ca de obicei, indexul
asociat primei coloane este , indexul asociat celei de-a doua coloane este l
etc.
Iata un exemplu care prezinta modul de obtinere a structurii complete a setului
de rezultate, inclusiv o descriere a fiecarei coloane din setul de rezultate:
$interogare = „SELECT * FROM angajat ”;
$rezultat = mysql_query($interogare); if (mysql_errno())
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
S
$numar_campuri = mysql_num_fields($rezultat); for ($i = 0; $i < $numa_campuri; $i++)
A echo „<BR>Coloana $i: „;
$info = mysql_fetch_field($rezultat); if ($info)
A echo „<PRE> blob: $info->blob max_length: $info->max_length multipe_key: $info->multipe_key name: $info->name not_null: $info->not_null numeric: $info->numeric primary_key: $info->primary_key table: $info->table type: $info->type unique_key: $info->unique_key unsigned: $info->unsigned zerofill: $info->zerofill
</PRE>”;
S else
A echo „Necunoscut”;
S
S
<titlu>Accesul non-secvential la coloanele unui set de rezultate</titlu>
Functiile mysql_fetch_row() si mysql_fetch_array() returneaza, in general,
randu¬rile dintr-un set de rezultate in mod secvential. Totusi,
functia mysql_data_seek() permite obtinerea accesului la randurile unui
set de rezultate intr-o maniera non-secventiala. Functia are forma:
mysql_data_seek(rezultat, numa_rand)
unde rezultat este valoarea returnata de functia mysql_query(), iar numar_rand
este indexul randului la care doriti sa obtineti accesul. Primul rand
al setului de rezultate este numerotat cu l, al doilea cu 2 etc. Functia returneaza
true daca executia reuseste, respectiv false in caz contrar. O invocare
ulterioara a functiei
mysql_fetch_row() sau a functiei mysql_fetch_array() va returna randul
din pozitia specificata a setului de rezultate.
De exemplu, urmatorul program obtine accesul la al doilea rand al setului
de rezultate returnat de o interogare anterioara:
$ok = mysql_data_seek($rezultat, 1); if ($ok)
A die(„<BR>” .mysql_errno().”: „.mysql_error().
„<BR>”);
S
$rand = mysql_fetch_array($rezultat, MYSQL_ASSOC);
<Test „la minut">
• Precizati functia MySQL din biblioteca PHP cate returneaza numele unei
coloane specificate dintr-un set de rezultate.
• Precizati functia MySQL din biblioteca PHP care returneaza tipul MySQL
al unei coloane specificate dintr-un set de rezultate.
• Precizati functia MySQL din biblioteca PHP care returneaza numarul coloanelor
dintr-un set de rezultate.
• Precizati functia MySQL din biblioteca PHP care permite accesul non-secvential
la un set de rezultate. </Test „la minut">
<titlu>Explorarea SGBD</titlu>
Biblioteca MySQL aferenta limbajului PHP include trei functii care va permit
sa determinati structura unei baze de date, in speta:
• Sa determinati bazele de date gazduite de serverul MySQL
• Sa determinati tabelele incluse intr-o baza de date specificata
• Sa determinati coloanele incluse intr-un tabel specificat dintr-o
baza de date, precum si caracteristicile acestor coloane
<Sfatul specialistului>
Intrebare: Daca am scris interogarea care a returnat setul de rezultate,
n-ar trebui sa cunosc deja structura acestuia? De ce trebuie sa invoc o functie
pentru a determina, de exemplu, numele unei coloane din setul de rezultate?
<nota>
Raspunsuri la test:
• mysql_field_name();
• mysql_field_type();
• mysql_num_fields();
• mysql_data_seek()</nota>
Raspuns: Exista numeroase circumstante in care functiile descrise in
aceasta sectiune se pot dovedi utile. O asemenea situatie apare cand formati
o interogare folosind forma SELECT *. Ordinea in care este aranjat continutul
unui set de rezultate nu este definita si poate varia in functie de versiunea
MySQL pe care o utilizati. De asemenea, continutul setului de rezultate se va
modifica la fiecare schimbare in structura tabelului supus interogarii.
Un alt exemplu de situatie in care functiile respective sunt utile este
o aplicatie care permite utiliza¬torilor sa emita interogari sau sa furnizeze
date folosite la formarea interogarilor. Intr-un asemenea caz, structura
setului de rezultate nu este cunoscuta in momen¬tul scrierii programului
PHP. </Sfatul specialistului>
<titlu>Determinarea bazelor de date gazduite de un server</titlu>
Pentru a determina bazele de date gazduite de un server MySQL de care programul
dumneavoastra este legat prin intermediul unei conexiuni active, invocati functia:
mysql_list_dbs()
Functia returneaza un set de rezultate special, alcatuit din numele bazelor
de date gazduite. Puteti determina numarul randurilor din setul de rezultate
invocand functia mysql_num_rows(), asa cum procedati in cazul unui
set de rezultate normal. Cu toate acestea, trebuie sa preluati randurile
folosind functia mysql_tablename(), care preia ca argumente valoarea returnata
de functia mysql_list_dbs() si numarul randurilor care vor fi preluate.
Randurile sunt numerotate incepand de la 0.
Iata un exemplu care prezinta modul de afisare a numelor bazelor de date gazduite:
$db = mysql_connect(„localhost”);
$dblist = mysql_list_dbs();
$n =mysql_num_rows($dblist); for ($i = 0; $i < $n; $i++)
A echo „<BR>” . mysql_tablename($dblist, $i);
S
Din motive de claritate, in exemplu nu se verifica aparitia unor eventuale
erori MySQL; inainte de a folosi acest program, trebuie sa adaugati instructiuni
adecvate de verificare a aparitiei erorilor.
<remarca>
PHP2 continea o functie, numita mysql_dbname(), folosita pentru regasirea numelor
bazelor de date din structura de date returnata de mysql_list_dbs(). Totusi,
in PHP4, pentru aceasta operatie trebuie folosita functia mysql_tablename
().</remarca>
<titlu>Determinarea tabelelor incluse intr-o baza de date</titlu>
Pentru a obtine o lista a tabelelor incluse intr-o baza de date specificata,
invocati functia mysql_list_tables(), transferandu-i ca argument numele
bazei de date. Programul dumneavoastra trebuie sa dispuna de o conexiune activa
cu serverul MySQL; in caz contrar, functia esueaza. Functia mysql_list_tables()
returneaza un set de rezultate special, similar celui returnat de mysql_list_dbs().
Pentru a obtine acces la lista cu tabele, parcurgeti prin iteratie setul de
rezultate, invocand in mod repetat functia mysql_tablename().
Iata un exemplu care prezinta modul de obtinere si afisare a listei tabelelor
asociate bazei de date testdb:
$db = mysql_connect(„localhost”), „php”, „salut”);
$tabele = mysql_list_tables(„testdb”);
$n =mysql_num_rows($tabele); for ($i = 0; $i < $n; $i++)
A echo „<BR>” . mysql_tablename($tabele, $i);
S
Din motive de claritate, in exemplu nu se verifica aparitia unor eventuale
erori MySQL; totusi, inainte de a folosi acest program, trebuie sa adaugati
instructiuni adecvate de verificare a aparitiei erorilor.
<Sugestie>
In cazul in care invocarea functiei mysql_num_rows() esueaza cu
mesajul „Warning: Supplied argument is not a valid MySQL result resource*",
probabil ca identificatorul de utilizator sau parola specificate la invocarea
functiei mysql_connect() nu au permisiunea de a obtine acces la baza de date
ale carei tabele incercati sa le afisati. </Sugestie>
<titlu>Determinarea coloanelor incluse intr-un tabel</titlu>
Pentru a obtine o lista a coloanelor incluse intr-un tabel, invocati functia
mysql_list_fields(), transferandu-i ca argument numele bazei de date si
numele tabelului. Programul dumneavoastra trebuie sa dispuna de o conexiune
activa cu serverul MySQL; in caz contrar, functia esueaza. Functia mysql_list_fields()
returneaza un set de rezultate similar celor returnate de functiile mysql_list_dbs()
si mysql_list_tables(). Pentru a obtine acces la lista coloanelor si la caracteristicile
acestora, invocati functia mysql_fetch_fields(). Alternativ, daca doriti sa
obtineri acces la o singura caracteristica a coloanelor, puteti invoca una din
functiile mysql_field_flags(), mysql_field_len(), mysql_field_name() sau mysql_field_type().
<nota>
*In traducere Avertisment: Argumentul furnizat nu constituie o resursa
de tip rezultat MySQL. corecta. - N.T. </nota>
Iata un exemplu care va prezinta modul de obtinere a listei coloanelor si a
caracteristicilor coloanelor din tabelul angajat al bazei de date testdb:
$db = mysql_connect(„localhost”), „php”, „salut”);
$campuri = mysql_list_fields(„testdb”, „angajat”);
$numar_campuri =mysql_num_fields($campuri); for ($i = 0; $i < $numar_campuri; $i++)
A echo „<BR>Coloana $i: ”;
$info = mysql_fetch_field($campuri); if ($info)
A echo „<PRE> blob: $info->blob max_length: $info->max_length multipe_key: $info->multipe_key name: $info->name not_null: $info->not_null numeric: $info->numeric primary_key: $info->primary_key table: $info->table type: $info->type unique_key: $info->unique_key unsigned: $info->unsigned zerofill: $info->zerofill
</PRE>”;
S else
A echo „Necunoscut”;
S
S
Din motive de claritate, in exemplu nu se verifica aparitia unor eventuale
erori MySQL. Din nou, inainte de a folosi acest program, trebuie sa adaugati
instructiuni adecvate de verificare a aparitiei erorilor.
<Sugestie>
In cazul in care invocarea functiei mysql_list_fields() esueaza
cu mesajul de eroare „1044: Access denied*", probabil ca identificatorul
de utilizator sau parola specificate la invocarea functiei mysql_connect() nu
au permisiunea de a obtine acces la tabelul din baza de date ale carui coloane
incercati sa le afisati. </Sugestie>
<Sfatul specialistului>
Intrebare: Pot rula programul mysql in mod interactiv, pentru a
vizualiza structura unei baze de date MySQL. Care ar fi, atunci, motivul pentru
care as folosi functiile descrise in aceasta sectiune?
Raspuns: Functiile descrise in aceasta sectiune va permit sa determinati
structura unei baze de date la rulare. Le puteti folosi, de exemplu, pentru
a crea
<nota>
In traducere: Acces interzis. - N.T. </nota>
utilitare care permit unui utilizator sa modifice structura unei baze de date
in mod interactiv. De asemenea, le puteti folosi pentru a crea formulare
ce permit utilizatorilor care nu cunosc SQL sa formeze interogari SQL care raporteaza
datele incluse intr-o baza de date MySQL. </Sfatul specialistului>
<Test Ia minut">
• Precizati numele functiei MySQL din biblioteca PHP care afiseaza numele
bazelor de date gazduite de un server.
• Precizati numele functiei MySQL din biblioteca PHP care afiseaza numele
tabelelor dintr-o baza de date MySQL.
• Precizati numele functiei MySQL din biblioteca PHP care mentioneaza
coloanele dintr-un tabel al unei baze de date MySQL. </Test Ia minut">
<titlu>Ghilimele si ghilimele magice</titlu>
Sa presupunem ca incercati sa executati o interogare MySQL care este asemanatoare
cu urmatoarea:
SELECT * FROM tabel WHERE text=’„Ce este asta?” intreba
ea’;
Dincolo de alte aspecte, veti intampina unele dificultati, deoarece
SQL nu permite inglobarea unor ghilimele simple in interiorul valorii
unui sir. Probleme similare pot aparea cand un utilizator neatent sau
cu intentii rele tasteaza un text ca acesta intr-o caseta cu text a unui
formular HTML:
<INPUT TYPE=”TEXT” NAME=”parola”>
Daca emiteti o instructiune de reflectare a continutului casetei text fara
sa va ganditi, veti descoperi ca pagina HTML rezultanta contine o caseta
cu text nedorita.
PHP include functii si facilitati pentru rezolvarea acestor situatii. Aceasta
sectiune prezinta unele tehnici pentru lucrul cu date utilizate la:
• Interogari SQL
• Pagini HTML
• Adrese URL
<titlu>Ghilimele magice</titlu>
Fisierul de initializare PHP, in speta php.ini, contine optiuni de configurare
care controleaza modul in care PHP controleaza datele provenite de la
o sursa externa, cum sunt un formular HTML, un fisier text sau o baza de date.
Aceste optiuni sunt
<nota>
Raspunsuri la test:
• mysql_list_dbs()
• mysql_list_tables()
• mysql_list_fields()</nota>
proiectate pentru a va ajuta sa va adaptati la modalitatile deseori contradictorii
in care browserele si bazele de date manipuleaza caracterele speciale,
in general, administratorul de sistem configureaza fisierul php.ini atunci
cand este instalat PHP; in general, utilizatorii obisnuiti nu trebuie
sa aiba posibilitatea de a aduce modificari in fisier.
Optiunea magic_quotes_gpc specifica modul in care PHP manipuleaza operatiile
HTTP GET si POST, precum si operatiile cu variabile cookie. Daca optiunea activata,
PHP ignora in mod automat ghilimelele simple, ghilimelele duble, caracterele
backslash si caracterele nule (caracterele a caror valoare ASCII este 0) care
apar intr-o variabila HTTP, prefixand fiecare aparitie a acestor
caractere cu un caracter backslash. In mod caracteristic, aceasta optiune este
activata intr-o instalare prestabilita.
Optiunea magic_quotes_runtime specifica modul in care PHP manipuleaza
datele de origine externa. Daca aceasta optiune este activata, PHP ignora automat
ghilimelele simple si duble care apar in datele externe, inclusiv datele
din formularele HTML, din fisiere si baze de date. In mod caracteristic,
aceasta optiune este dez¬activata intr-o instalare prestabilita.
Daca este activata, optiunea magic_quotes_sybase modifica efectul optiunilor
magic_quotes_gpc si magic_quotes_runtime, astfel incat un caracter
de tip ghilimele simple sa fie prefixat cu un alt caracter de tip ghilimele
simple, nu cu un backslas. Aceasta optiune respecta conventiile neobisnuite
de manipulare a sirurilor, folosite de sistemul Sybase de gestiune a bazelor
de date. In mod caracteristic, aceasta optiune este dezactivata intr-o
instalare prestabilita.
Functiile get_magic_quotes_gpc() si get_magic_quotes_runtime() returneaza fiecare
valoarea optiunii PHP corespunzatoare. Mai mult, puteti folosi functia set_magic_quotes_runtime()
pentru a specifica valoarea optiunii magic_quotes_runtime pentru restul duratei
scriptului PHP curent. De exemplu, pentru a dezactiva optiunea magic_quotes_runtime,
invocati functia
set_magic_quotes_runtime(0);
Alternativ, pentru a activa optiunea magic_quotes_runtime, invocati functia
set_magic_quotes_runtime(0);
PHP nu furnizeaza nici o functie corespunzatoare care sa anuleze optiunea magic_quotes_runtime,
deoarece optiunea respectiva este utilizata la transferul variabilelor HTTP
catre un script. Dupa ce scriptul si-a inceput executia, valoarea optiunii
respective nu mai este luata din nou in considerare.
<titlu>Conversia caracterelor speciale si anularea acesteia</titlu>
Cand PHP converteste* un sir, foloseste pentru aceasta functia addslashes().
Daca PHP nu este configurat astfel incat sa converteasca un text
in mod automat, atunci dumneavoastra trebuie sa executati manual aceasta
modificare. Pur si simplu invocati functia addslashes(), transferandu-i
ca argument sirul text. De exemplu, pentru a converti continutul sirului $text
si a plasa rezultatul in variabila $modificat, invocati functia dupa cum
urmeaza:
$modificat = addslashes($text);
Functia stripslashes() executa operatia complementara de anulare a conversiei,
adica elimina caracterele backslash inserate pentru conversia caracterelor de
tip ghilimele simple, ghilimele duble, backslash si caractere nule. Pentru a
anula con¬versia sirului $modificat si a plasa rezultatul in variabila
$nemodificat, invocati functia dupa cum urmeaza:
$nemodificat = stripslashes($modificat)
<Sugestie>
PHP mai include o functie utila pentru conversia caracterelor speciale. Functia
quotemeta() va insera un backslash inainte de fiecare aparitie a urmatoarelor
caractere: . \ + * ? a ^ i ( $ ). </Sugestie>
<titlu>Conversia textelor HTML</titlu>
Cand lucrati cu texte HTML, conversia executata de functia addslashes()
nu este suficienta, deoarece HTML este sensibil la alte caractere speciale decat
cele convertite de functia addslashes(). Functia htmlspecialchars() converteste
caracterele la care HTML este sensibil. Aceasta functie este utila pentru a
exista garantia ca un anumit sir nu contine marcaje HTML, ceea ce poate fi important
pentru a corecta modul de operare a unei aplicatii, cum ar fi o tabela de mesaje
Web. Functia executa urmatoarele conversii:
<tabel>
*Caracter
*Rezultat convertit •
*& (ampersand)
*&
*"(ghilimele duble)
*" (numait cand este specificata optiunea ENT_COMPAT sau
ENT_QUOTES)
*'(ghilimele simple)
*' (numai cand este specificata optiunea ENT_QUOTES)
*< (mai mic decat)
*<
*> (mai mare decat)
*>
</tabel>
<nota>
*Aceasta conversie nu trebuie confundata cu o alta, si anume conversia de tip.
Conversia mentionata in acest capitol consta, de fapt, din modificarea
semnificatiei anumitor caractere, pentru a preveni o interpretare eronata a
acestora de catre programele specia¬lizate. Din acest motiv, toate conversiile
mentionate in acest capitol vor face referire la modificarea semnificatiei
unor caractere, nu la conversiile de tip. - N.T. </nota>
Functia are urmatoarea forma:
htmlspecialchars(text a,stil_ghilimelei)
unde text specifica sirul care contine textul ce urmeaza a fi convertit, iar
argumen¬tul optional stil_ghilimele specifica modul de conversie a ghilimelelor
simple, respectiv duble. Valorile permise ale optiunii stil_ghilimele sunt
• ENT_COMPAT precizeaza ca trebuie convertite numai ghilimelele duble
• ENT_QUOTES precizeaza ca trebuie convertite ambele tipuri de ghilimele
• ENT_NOQUOTES precizeaza ca nu trebuie convertit nici un tip de ghilimele
De exemplu, pentru a converti toate caracterele HTML speciale, inclusiv ambele
tipuri de ghilimele, din sirul $htmltext, invocati functia dupa cum urmeaza:
$convertit = htmlspecialchars($htmltext);
<Sugestie>
O functie PHP conexa, si anume htmlentities(), converteste toate caracterele
cu echi¬valente in entitati HTML. in prezent, nu este acceptat
decat setul de caractere ISO-8859-1 . </Sugestie>
<Sugestie>
PHP include o alta functie utila pentru conversia textelor HTML Functia n12br()
insereaza caracterele <br> anterior fiecarui caracter de tip linie noua
din argumentul sau. Incepand de la PHP 4.0.5, functia insereaza
caracterele <br/>, in concordanta cu XHTML 1.0. </Sugestie>
<titlu>Conversia adreselor URL</titlu>
Cand PHP codifica date ca parte a unei adrese URL, asa cum procedeaza
la efectuarea unei operatii HTTP GET, foloseste functia urlencode(). Aceasta
functie inlocuieste fiecare caracter non-alfanumeric (cu exceptia spatiilor)
cu un simbol al procentului (%), urmat de doua cifre hexazecimale care contin
valoarea ASCII a caracterului. Spatiile sunt codificate sub forma de simboluri
ale adunarii (+).
O functie conexa, in speta rawurlencode(), executa o conversie similara;
cu toate acestea, functia respectiva inlocuieste spatiile cu %20, conform
RFC 1738, standardul Internet pentru codificarea adreselor URL (vezi www. rfc.net).
Functiile urldecode() si rawurldecode() executa operatii complementare. Aceste
functii sunt utile la crearea adreselor URL care includ perechi nume-valoare
inglobate. De exemplu, sa presupunem ca scriptul dumneavoastra PHP trebuie
sa creeze o pagina HTML care contine o hiperlegatura spre adresa URL a unui
motor de cautare. Termenul de cautare trebuie transmis in forma codificata
URL, pentru ca serverul Web si browserul sa nu se „impiedice"
de caracterele speciale. Pentru a codifica datele, folositi un program PHP ca
acesta:
echo ’A HREF=”www.mototdecautare.com?cuvantcheie=’, urlencode ($text), ’”> ’;
<Sfatul specialistului>
Intrebare: Sunt administratorul unui server PHP, Care sunt optiunile pentru
ghilimele magice pe care ar trebui sa le activez?
Raspuns: Optiunile adecvate constituie obiectul unor oarecare contro¬verse.
Interesele programatorilor PHP incepatori, care poate ca nu inteleg
in totalitate necesitatea incadrarii datelor intre ghilimele,
sunt cel mai bine reprezen¬tate prin activarea optiunilor magic_quotes_gpc
si magic_quotes_runtime. In acest caz, optiunea magic_quotes_sybase trebuie
activata numai daca principalul sistem de gestiune a bazelor de date folosit
cu PHP este Sybase.
Pe de alta parte, multi programatori PHP priceputi sunt de parere ca ghilimele
magice sunt o mare pacoste. Daca serverul dumneavoastra PHP este folosit mai
ales de catre programatori PHP experimentati, trebuie sa aveti in considerare
dezactivarea optiunilor legate de ghilimelele magice. </Sfatul specialistului>
<Test „la minut">
• Care este functia PHP folosita de catre ghilimelele magice din PHP pentru
incadrarea intre ghilimele a datelor provenite din surse externe?
• Care este functia PHP ce poate fi utilizata pentru a elimina caracterele
backslash adaugate prin caracteristica ghilimelelor magice?
• Care este optiunea de configurare PHP ce influenteaza datele transmise
prin intermediul operatiilor HTTP GET si POST? </Test „la minut">
<titlu>Alte facilitati PHP de gestiune a datelor</titlu>
Biblioteca PHP furnizeaza acces la numeroase alte instrumente de gestiune a
datelor. Sectiunea de fata trece in revista aceste instrumente, le descrie
caracteristicile si situatiile cand isi pot dovedi utilitatea. Aceasta
sectiune nu este menita a prezenta informatiile necesare pentru utilizarea instrumentelor
descrise. In schimb, furnizeaza, referinte la carti sau siruri Web care
va pot ajuta sa invatati mai multe despre fiecare instrument. Instrumentele
prezentate nu sunt disponibile intr-o instalare PHP prestabilita; in
general, administratorul dumneavoastra PHP trebuie sa le instaleze si sa le
configureze separat din PHP.
<nota>
Raspunsuri la test:
• addslashes()
• stripslashes()
• magic_quotes_gpc
<titlu>Postgresql</titlu>
Ca si MySQL, Postgresql (pronuntat POST-gres-q-1), este un sistem de gestiune
a bazelor de date provenit dintr-o sursa deschisa. Din perspectiva istorica,
MySQL a fost sistemul de baze de date preferat de amatorii de performante brute
si simplitate in utilizare, in timp ce Postgresql a fost optiunea
favorita a celor care prefera caracteristicile mai complexe si scalabilitatea.
Totusi, versiunile recente ale acestor sisteme au complicat problema, deoarece
MySQL a acumulat unele caracteristici mai complexe, iar performantele sistemului
Postgresql s-au imbunatatit.
Cu toate acestea, Postgresql continua sa accepte numeroase caracteristici care
nu sunt inca oferite de versiunile MySQL standard, intre care amintim:
• Chei externe. Acestea permit respingerea automata a modificarilor din
baza de date care nu respecta structura bazei de date.
• Subselectii. Acestea permit formarea unor interogari complexe, care
reduc la minimum dimensiunea seturilor de rezultate trimise prin retea.
• Tranzactii. Acestea permit evitarea aplicarii incomplete asupra unei
baze de date a unui set de modificari corelate, precum si alterarea datelor
care deriva din procesul respectiv.
• Declansatoare. Permit specificarea de actiuni executate de serverul
de baze de date ori de cate ori se produc anumite evenimente.
• Vederi. Permit furnizarea, in conditii convenabile, catre anumiti
utilizatori, de acces la sub-seturi ale bazei de date.
Mai mult, Postgresql pare sa se adapteze mai bine decat MySQL la aplicatii
carei implica mai multi utilizatori concurenti ai bazei de date. Daca sunteti
interesat de Postgresql, consultati situl Web aferent acestuia, la adresa www.postgresql.org.
<Sugestie>
Utilizatorii de Linux Red Hat 7.1 pot instala suportul PHP pentru Postgresql
prin instalarea pachetului RPM php-pgsql. </Sugestie>
<titlu>ODBC</titlu>
ODBC (Open Database Connectivity) este un standard creat de Microsoft, acum
adoptat pe scara larga atat in mediile Microsoft, cat si in
cele bazate pe UNIX/Linux. ODBC furnizeaza o facilitate minimala pentru accesul
la bazele de date. In esenta, fiecare sistem comercial de gestiune a bazelor
de date si majoritate sistemelor non-comerciale de gestiune a bazelor de date
furnizeaza programe driver ODBC care permit accesul la aceste sisteme prin intermediul
ODBC, nu numai prin intermediul unor programe driver native. ODBC este deosebit
de important pentru cei care doresc sa obtina accesul la o baza de date gazduita
de Microsoft dintr-un sistem UNIX/Linux.
Sistemele de operare create de Microsoft contin suport incorporat pentru
ODBC. Astfel, daca rulati PHP sub un sistem de operare Microsoft, veti descoperi
ca suportul ODBC este disponibil instantaneu. Totusi, sub UNIX/Linux trebuie
sa instalati o punte ODBC-ODBC sau o alta facilitate care accepta ODBC. Solutiile
comerciale le includ pe cele distribuite de Openlink (www.openlinksw.com) si
Easysoft (www.easysoft.com). O alternativa provenita dintr-o sursa deschisa,
in speta ODBCSocketServer, este disponibila la adresa sourceforge.net.
<titlu>LDAP</titlu>
Protocolul Lightweight Directory Access Protocol (LDAP) devine tot mai popular.
Ca o baza de date obisnuita, o baza de date LDAP stocheaza date. O baza de date
LDAP este insa foarte bine adaptata pentru stocarea cataloagelor, adica
a unor liste cu persoane si unitati de organizare, precum si a caracteristicilor
acestora. Bazele de date LDAP sunt proiectate pentru a stoca date relativ simple,
rareori modificate. Astfel, acestea sunt ideale pentru stocarea informatiilor
despre utiliza¬torii sistemului, in particular, LDAP accepta metode
de comunicare sigure, care permit bazelor de date LDAP sa stocheze nume de utilizator
si parole. LDAP furnizeaza mecanisme pentru replicarea bazelor de date LDAP
in vederea protectiei integritatii datelor si asigura echilibrarea incarcarii,
pentru a putea tolera sarcini de prelucrare de mari dimensiuni.
Pentru mai multe informatii despre LDAP, consultati volumul Implementing Directory
Services (Implementarea serviciilor de catalog), de Archie Reed (Osborne/ McGraw-Hill,
2000).
<Sugestie>
Daca folositi Red Hat Linux 7.1, puteti instala suportul PHP pentru LDAP prin
instalarea pachetului RPM php-pgsql. Apoi, modificati fisierul /etc/php.ini
astfel incat sa contina linia (ne-comentata) "extension=ldap.so".
Apoi, reporniti serviciul HTTP prin emiterea comenzii "service httpd restant".</Sugestie>
<titlu>XML</titlu>
Extensible Markup Language (XML) este un limbaj pentru descrierea datelor. Multi
se asteapta ca, intr-un tarziu, XML sa inlocuiasca HTML ca
limbaj dominant pentru schimbul informatiilor prin Internet, in timp ce
HTML descrie aspectul datelor, XML este capabil de a descrie structura datelor
(practic, XML este o moda¬litate de a trimite o mica baza de date prin Internet)
PHP accepta biblioteca xpat, bazata pe activitatea lui James Clark. Biblioteca
va permite sa construiti un analizor pentru documentele XML. Un analizor intelege
sintaxa unui document XML si poate identifica acele componente structurale care
alcatuiesc documentul. Asociind o functie cu fiecare tip de componenta, puteti
configura analizorul astfel incat sa prelucreze sau sa converteasca
un document XML.
<Sfatul specialistului>
Intrebare: Care sunt celelalte instrumente si caracteristici acceptate
de PHP?
Raspuns: Bibliotecile PHP sunt extrem de cuprinzatoare. Alte instrumente de
gestiune a datelor acceptate de PHP includ urmatoarele:
• dBase
• DBM
• dbx
• DOM XML
• FrontBase
• filePro
• Hyperwave Information Server
• Informix
• Interbase
• Ingres II
• Microsoft SQL Server
• mSQL
• Oracle si Oracle 8
• Extensia CORBA Satellite
• SESAM/SQL Server
• Sybase
• WDDX
• YAZ (protocolul Z39.50)
Pentru mai multe informatii despre aceste caracteristici ale limbajului PHP,
consultati referintele prezentate in manualul PHP pe suport electronic,
la adresa https://www.php.net. </Sfatul specialistului>
Pentru mai multe informatii despre XML, consultati pagina Web a organizatiei
World Wide Web Consortium (https://www.w3.org/XML/). De asemenea, consultati
volumul XML: The Complete Reference (XML - o referinta completa), de Heather
, Williamson (Osborne/McGraw-Hill, 2001).
<Sugestie>
Daca folositi Red Hat Linux 7.1, pachetul PHP standard include suport pentru