Sunteți pe pagina 1din 92

Programare Web

CUPRINS

CAP. III PROGRAMARE WEB UTILIZND


LIMBAJUL PHP ...........................................................2
3.1 Limbajul PHP - preliminarii ....................................................................2
3.2 Instalare i configurare ...........................................................................3
3.3 Comenzi PHP ..........................................................................................5
3.3.1 Sintaxa de baz ....................................................................................5
3.3.2 Tipuri de date .......................................................................................7
3.3.3 Structuri de control ..............................................................................9
3.4 Dezvoltare de aplicaii PHP cu baze de date MySQL .....................11
3.4.1 Interogare fr parametrii a unei baze de date ...................................14
3.4.2 Interogare cu parametrii a unei tabele a bazei de date .......................23
3.4.3 Adugare ntr-o tabel a bazei de date ...............................................34
3.4.4 tergere cu confirmare dintr-o tabel a bazei de date ........................38
3.4.5 Modificarea unei nregistrri dintr-o tabel a bazei de date...............43
3.4.6 Aplicatie exemplu cu operatii multiple ..............................................50
3.4.7 Interogare cu extragerea informaiei dintr-un cmp BLOB ...............53
3.5 Dezvoltare de aplicaii PHP cu baze de date Oracle.......................55
3.5.1 Interogare fr parametri....................................................................55
3.5.2 Interogare cu parametri pasai prin auto-apelare................................57
3.6 Grafic.....................................................................................................61
3.7 Funcii pentru lucrul cu fiiere..............................................................67
3.8 Alte cteva exemple de aplicaii..........................................................70
3.8.1 Informaii obinute pe baza variabilelor predefinite de mediu ..........70
3.8.2 Trimiterea unui e-mail dintr-un script PHP .......................................71
3.8.3 Informaii asupra datei i timpului curent ..........................................71
3.8.4 Transfer de fiiere prin UPLOAD......................................................73
3.8.5 Comenzile urlencode i urldecode.....................................................76
3.8.6 Variabile cu nume construite dinamic................................................77
3.8.7 Instrucia empty i eticheta checkbox ................................................78
3.9 Lucrul cu sesiuni (session) ..................................................................80
3.10 Programare PHP orientat pe obiecte.............................................83

BIBLIOGRAFIE ..........................................................92

Programare Web

CAP. III PROGRAMARE WEB UTILIZND


LIMBAJUL PHP
3.1 Limbajul PHP - preliminarii
O modalitate foarte eficient de dezvoltare a aplicaiilor
Web o ofer limbajul de scripting PHP (PHP: Hypertext
Preprocessor). Un avantaj incontestabil oferit de acesta,
const n faptul c programul script PHP este rulat pe serverul
de Web, iar utilizatorul (clientul) nu poate vedea codul surs al
programului, ci doar pagina HTML returnat spre browser-ul
client (codul paginii).
Un alt avantaj al PHP-ului const n faptul c suport o
mare varietate de tipuri de baze de date, cum ar fi MySQL,
Oracle, IBM DB2, InterBase, Sysbase, Microsoft SQL Server
(suportul pentru MySQL fiind ncorporat nativ n interpretorul
PHP), putnd rula att pe platforme Windows, ct i pe
platforme Linux. Astfel se pot crea foarte uor aplicaii Web
pentru accesarea bazelor de date, PHP-ul oferind suport fie
"nativ", fie un suport concretizat prin utilizarea unor biblioteci
.dll suplimentare (programatorul trebuind s utilizeze
biblioteci specifice tipului respectiv de baz de date). Alt
avantaj este faptul c suport o serie de protocoale de reea,
printre care SMTP, NNTP, POP3 i HTTP. n cadrul lucrrii
de fa s-a folosit versiunea PHP 5.2.3. n momentul redactrii,
ultima versiune PHP 5.2.6 era disponibil la adresa
www.php.net.
Limbajul de scripting PHP a fost implementat n 1994 de
Rasmus Lerdorf, la nceput fiind vorba de un proiect personal,
care includea cteva macro-uri i un modul care permitea
interpretarea lor, menite s urmreasc "activitatea" paginii
sale personale. n 1995 este disponibil sub numele Personal
Home Page. ncepnd cu versiunea 3, din 1997, a nceput s
fie dezvoltat de o echip de programatori, iar versiunea 4
dispune de engine-ul de scripting al firmei Zend Techologies.
Se estimeaz c n 2001, aproximativ 5.100.000 de site-uri din
2

Programare Web

lume foloseau PHP. n prezent, versiunea stabil curent este


PHP 5.2.6.
3.2 Instalare i configurare
Expunerea de fa i propune o prezentare de baz a
limbajului PHP, nsoit de o descriere a ctorva aspecte
generale, punndu-se accent pe o detaliere a funciilor pentru
accesarea bazelor de date de tip MySQL, respectiv Oracle,
nsoite de exemplificri pe aplicaii concrete.
Utilizarea PHP se face mpreun cu un server de WEB.
Toate exemplele prezentate n continuare au fost rulate
folosind ca server de WEB, fie Apache, fie Internet
Information Services (IIS), numit uneori formal i Internet
Information Server.
Cel mai simplu mod de a opera cu PHP-ul n tandem cu
MySQL este de a folosi pachetul WAMP, incluznd tripleta
PHP+MySQL+Apache
(disponibil
gratis
la
adresa
http://www.en.wampserver.com/). Dup simpla instalare a
acestuia, totul este deja pregtit pentru a scrie i rula scripturi
PHP (inclusiv cu apeluri la serverul de baze de date MySQL),
fr a fi necesar nici o alt setare suplimentar (n fiierele de
configurare). De remarcat faptul c, la un moment dat pe un
calculator poate rula doar un server de WEB, astfel nct, dac
un alt server este deja instalat i pornit, este necesar o oprire
prealabil a acestuia. De asemenea, pachetul WAMP mai
conine aplicaiile PHPMyAdmin i SQLiteManager, folosibile
pentru gestionarea cu uurin a bazelor de date. WAMP este
pachetul destinat operrii sub Windows. n mod similar se
poate folosi LAMP pentru operarea sub Linux.
n cazul n care se utilizeaz componente disparate
(interpretor PHP, server WEB, server SQL), iar pe computer
nu este instalat un server de WEB, este iniial necesar
instalarea unuia. Se presupune c s-a realizat instalarea
serverului Internet Information Server, dup care s-a realizat i
instalarea PHP-ului. Iat care sunt paii care trebuie parcuri
(de regul) pentru a asigura o funcionare corespunztoare a
tandemului PHP-IIS (desigur, pentru o platform Windows):
- Copierea fiierului php4ts.dll (plasat pe computer n
momentul
instalrii
PHP-ului),
la
locaia
C:\Windows\System32.
- n Control Panel se deschide Administrative Tools /
Internet Information Services.
3

Programare Web

- Se deruleaz structura arborescent, avnd ca etichet


principal numele computerului gazd, apoi n cadrul
ramuri Web Site se deschide Default Web Site.
- Click dreapta pe Default Web Site i se selecteaz
Properties.
- n fereastra care apare se alege ISAPI Filters, apoi Add. n
caseta Filter Name se scrie PHP, iar n caseta Executable,
folosind butonul Browse, se selecteaz fiierul
php4.isapi.dll (de asemenea din kitul PHP). Apoi se
valideaz (OK).
- n aceeai fereastr, de selecteaz Home Directory, apoi
Configuration, urmat de Mappings i Add. Ca executabil
se alege din nou fiierul php4isapi.dll, iar n caseta de
extensie se scrie .php (cu punct). Dac se dorete o
interpretare i a fiierelor PHP cu alte extensii (.php3,
.php4, .phtml), se repet operaia pentru fiecare tip de
extensie. Apoi se valideaz totul (cu OK) i se nchid toate
ferestrele deschise prin parcurgerea acestor pai.
- Se restarteaz serverul de WEB IIS (n aceeai fereastra
Internet Information Services, se selecteaz numele
computerului local, click dreapta, apoi All Tasks i Restart
IIS- spre exemplificare).
n acest moment PHP-ul ar trebui s fie funcional.
Totui, realizarea unor anumite aplicaii care necesit alte
resurse conexe kitului de baz PHP, implic o configurare a
PHP-ului (fiierul php.ini).
Spre exemplu, pentru accesarea bazelor de date de tip
Oracle este necesar ca extensie fiierul php_oci8.dll, iar pentru
InterBase (numai ncepnd cu versiunea 6), este necesar ca
extensie fiierul php_interbase.dll. La instalarea PHP-ului, este
necesar o configurare a acestuia, constnd n plasarea n
directorul Windows a fiierului php.ini (din kitul de instalare).
De asemenea, acest fiier necesit cteva modificri
(necomentarea sau completarea unor linii de configurare deja
scrise n fiier):
- pentru determinarea locaiei (calea) unde vor fi cutate
fiierele de extensie .dll:
; Directory in which the loadable extensions
;(modules) reside.
extension_dir=c:\php\extensions

(sau extension_dir = "c:/wamp/php/ext/")


- stabilirea fiierelor extensie care vor fi necesare, printr-o
simpl necomentare a liniilor pe care apar scrise aceste fiiere
(n cazul de fa php_interbase.dll sau php_oci8.dll):
4

Programare Web

;Windows Extensions
;Note that MySQL and ODBC support is now built
;in, so no dll is needed for it.
extension=php_interbase.dll
extension=php_oci8.dll

Toate exemplele urmtoare (opernd cu baze de date) au


fost rulate utiliznd pachetul WAMP5 versiunea 1.7.2 care
conine:
- Apache 2.2.4 (Win32)
- PHP 5.2.3
- MySQL 5.0.22
- PHPMyAdmin
- SQLiteManager
3.3 Comenzi PHP
3.3.1 Sintaxa de baz
Sintaxa comenzilor PHP este extrem de asemntoare cu
a altor limbaje structurate, precum C, JavaScript, Perl (mai
precis a oricrui limbaj derivat din C). Un script PHP const
ntr-o serie de comenzi, executate secvenial, una cte una de
ctre serverul de Web. Fiecare comand se ncheie cu
caracterul punct-i-virgul (;). Ca aplicaie introductiv, se
prezint listing-ului celui mai simplu program PHP, clasicul
Hello, World:
<html>
<body>
<?php echo Hello, World !!!; ?>
</body>
</html>
Se observ prezena unui tag special, <?php ?>, n
cadrul cruia programatorul poate scrie codul dorit. Funcia
echo asigur tiprirea pe ecran a irului specificat ca
parametru.
PHP permite specificarea i altor tag-uri, ca cele din
listing-ul urmtor:
<? Echo (acesta este un simplu test
1\n); ?>
<?php echo(acesta este un simplu test
2<br>);?>
5

Programare Web

<script language=php>
echo (some editors (like FrontPage)
dont like processing instructions);
</script>
Referitor la separarea comenzilor, dup cum s-a mai
menionat, se folosete ca terminator de linie caracterul ;, la
fel ca n C, sau Java. Comentariile, de asemenea, mprumut
sintaxa C, adic // sau /* */.
Se consider nc un exemplu pentru a evidenia cteva
din caracteristicile limbajului PHP:
<html>
<head>
<title>Data curenta</title>
</head>
<body>
<b>Data curenta este:
<?php
echo( date("d F Y, l. ") );
?></b>
</body>
</html>
Efectul rulrii acestui script este prezentat n figura
urmtoare:

Fig. 3.1 Data curent (n conformitatea cu data


serverului)
Mare parte a codului anterior descris este script HTML.
Linia dintre delimitatorii <?php i ?> este totui scris n
PHP. <?php nseamn nceputul codului PHP iar ?>
nseamn sfritul codului PHP. Serverului WEB (mai precis
interpretorului PHP instalat pe acelai host cu serverul Web) i
se cere s interpreteze codul dintre cei doi delimitatori i s l
6

Programare Web

converteasc n cod HTML, nainte de a trimite pagina Web


spre browser-ul client care a lansat cererea.
Browser-ului i se prezint un cod HTML curat, de
forma (vizualizat chiar din browser cu opiunea View source):
<html>
<head>
<title>Data curenta</title>
</head>
<body>
<b>Data curenta este: 26 June
2002,
Wednesday.</b>
</body>
</html>
De observat c orice urm de cod PHP dispare. n
locul acestuia, scriptul care apare este practic un cod HTML
standard. Exemplul ilustreaz cteva avantaje majore ale
script-urilor rulate pe partea de server:
a) Nu apar incompatibiliti legate de browser. Scriptul este
rulat pe partea de server unde este instalat i interpretorul
PHP-, deci nu pot aprea probleme legate de tipul de
browser folosit pe partea de client.
b) Acces la resursele de pe partea de server. Dac aceeai
aplicaie ar fi fost scris n JavaScript, data respectiv ar fi
fost data corespunztoare calculatorului client (pe care
ruleaz browser-ul). Poate exemplul prezentat (afiarea
datei curente) nu este cel mai elocvent pentru a ilustra
aceast proprietate. Dar, lund alt exemplu, o aplicaie Web
cu baze de date beneficiaz din plin de avantajele acestei
proprieti.
c) Reducerea ncrcrii clientului. Rularea unui script pe
partea de client (cazul JavaScript) poate fi destul de lent,
depinznd direct de performanele calculatorului care
gzduiete browser-ul client. Browser-ul clientului trebuie
s ruleze (interpreteze) scriptul nainte de a afia pagina
Web. n cazul script-urilor rulate pe partea de server,
performanele calculatorului client nu mai prezint o
importan decisiv privitor la viteza de accesare a paginii
Web.
3.3.2 Tipuri de date
Tipurile principale de date suportate de PHP sunt: array,
float, integer, object, string. Se remarc faptul c, tipul de dat
7

Programare Web

este decis la momentul execuiei unei operaii asupra


variabilei:
$var = "0";
// $var = "0"string
$var++;
// $var = "1"
$var+=1;
// $var = 2 ntreg
$var += 'c';
// $var = 2 ntreg
$var = $var + 1.3;
// $var = 3.3 real
$var = 5 + "10 Big Piggies"; // $var =15
$var = 5 + "Small Pigs";
// $var =5
ntreg
$var = "a";
// $var = "a"string
$var++;
// $var = "b"
Pentru exemplificare, rulnd urmtorul program PHP
(echo fiind o comand de afiare pe ecran), se obin chiar
valorile puse ca i comentarii (tag-ul <br> are ca efectul de
linie nou la afiare, iar operatorul . este folosit pentru
concatenarea a dou string-uri):

<?php
$var = "0";
echo $var."<br>";
$var++;
echo $var."<br>";
$var+=1;
echo $var."<br>";
$var += 'c';
echo $var."<br>";
$var = $var + 1.3;
echo $var."<br>";
$var = 5 + "10 Puisori;
echo $var."<br>";
$var = 5 + "Small Pigs";
echo $var."<br>";
$var = "a";
echo $var."<br>";
$var++;
echo $var."<br>";
?>

// $var = "0"string
// $var = "1"
// $var = 2 ntreg
// $var = 2 ntreg
// $var = 3.3 real
// $var =15 ntreg
// $var =5 ntreg
// $var = "a"string
// $var = "b"

Variabilele ncep ntotdeauna cu caracterul "$", fcnduse diferen ntre literele mari i mici folosite n cadrul
numelor de variabile:

$var = "Bob";
$Var = "Joe";
echo "$var, $Var";

//se afieaz: Bob, Joe

Pentru iruri (elementele unui ir putnd fi de tipuri


diferite), un exemplu edificator de utilizare ar putea fi
urmtorul:

$sir=array(1=>'ion', 2=>'adi', 3=>125);


8

Programare Web

echo $sir[1]."<br>";
echo $sir[2]."<br>";
echo $sir[3]."<br>";
$sir[3]++;
echo $sir[3]."<br>";

//
//
//
//
//

afieaz 'ion' (string)


afieaz 'adi' (string)
afieaz 125 (ntreg)
incrementeaz
afieaz 126 (ntreg)

3.3.3 Structuri de control


Ca orice alt limbaj de programare, PHP-ul dispune de o
serie de faciliti pentru controlul fluxului de desfurare al
unui script. Astfel, limbajul beneficiaz de aportul unor
instruciuni prin care este permis o deviere de la ordinea
fireasc de derulare a fluxului de comenzi ale
scriptului/programului (salt condiionat, ciclare). Trei astfel de
structuri de control a fluxului unui program sunt detaliate n
continuare la nivel de sintax, fiind nsoite fiecare de exemple
de utilizare: structura if-else, structura while i bucla for.
Una din cele mai folosite structuri de control este if-else,
n PHP avnd urmtoarea sintax:
if ( conditie ) {
// secvena care se execut dac
// condiia este adevrat.
} else
{
// (Opional) Se execut dac condiia este fals.
}
Aceast structur permite script-ului PHP s execute o
secven de instruciuni sau alta, n funcie de rezultatul,
adevrat sau fals, al evalurii unei condiii. Iat un mic
exemplu PHP de utilizare:
if ( $name == "Kevin" ) {
echo("Mesaj de afisat pentru: $name");
} else {
echo("Mesaj de afisat pentru altcineva");
}
O alt structur des utilizat este bucla while cu sintaxa:
while (conditie) {
// secvena de comenzi executat
// repetat, ct timp condiia este adevarat
}
Aceast bucl permite executarea repetat a unei
secvene de comenzi att timp ct este ndeplinit o condiie.
Un mic exemplu de afiare succesiv a numerelor de la 1 la 10,
utiliznd o bucl while are codul urmtor:
9

Programare Web

$count = 1;
while ($count <= 10) {
echo("$count");
// sau print ($count);
$count++;
}
i n sfrit, nu mai puin utilizat bucla for cu sintaxa:
for (initializare_contor; conditie;
actualizare_contor) {
// secvena de comenzi care se execut
// att timp ct condiia este adevrat
}
Un exemplu de implementare a unui numrtor printr-o
bucl for:
for ($count = 1; $count <= 10; $count++) {
echo("$count");
}
REZUMAT
Limbajul PHP suport o mare varietate de tipuri de baze de
date, cum ar fi MySQL, Oracle, IBM DB2, InterBase, Sysbase,
putnd rula att pe platforme Windows, ct i pe platforme
Unix/Linux. Astfel, se pot crea foarte uor aplicaii Web pentru
accesarea bazelor de date.
Avantajele limbajului PHP: nu apar incompatibiliti legate
de browser-ul client, acces la resursele de pe partea de server,
reducerea ncrcrii clientului.
Tipurile de date suportate de PHP sunt: array, float, integer,
object, string. Tipul de dat este decis la momentul execuiei
unei operaii asupra variabilei.
Comenzile echo i print() tipresc pe ecran (trimit spre ecran)
string-ul specificat ca parametru.
Variabilele ncep ntotdeauna cu caracterul "$", fcndu-se
diferena ntre litere mari i mici folosite n cadrul numelor de
variabile.
Operatorul . este utilizat pentru concatenarea unor iruri de
caractere.

10

Programare Web

Structurile principale de control a fluxului de execuie a


comenzilor PHP sunt: if, while i for.
NTREBRI
Rularea unui script PHP se face pe partea de client sau de
server?
Care este caracteristica principal a unei variabile PHP?
Ce comenzi pentru afiare pe ecran cunoatei? Dai cteva
exemple de utilizare a lor.
Ce tipuri de date, respectiv tipuri de baze de date, suport
limbajul PHP?
Care sunt principalele structurile de control a fluxului de
execuie a unui program PHP?
3.4 Dezvoltare de aplicaii PHP cu baze de date
MySQL
Pe lng setul standard de comenzi aferente limbajului
PHP, acesta dispune de o serie de funcii i variabile
predefinite care uureaz munca programatorului, unele dintre
ele fiind incluse implicit (built-in) n interpretor (spre exemplu,
suportul pentru MySQL, FTP, XML), iar altele sunt
disponibile prin utilizarea unor fiiere externe ca extensii
(biblioteci .dll). Aceste fiiere extensie de tip .dll (cu numele
generic php_*.dll) permit limbajului PHP s opereze cu o mare
diversitate de tehnologii conexe, inclusiv cu baze de date (n
acest ultim caz, ele nglobnd funciile necesare accesrii i
manipulrii unor baze de date de diverse tipuri).
MySQL este unul dintre cele mai folosite sisteme de
gestiune a bazelor de date client-server, fiind cel mai des
utilizat n combinaie cu scripturi PHP. Operarea cu baze de
date MySQL nu necesit utilizarea unei biblioteci suplimentare
(.dll), suportul pentru MySQL fiind inclus funcional n
motorul interpretorului PHP. Prezentul paragraf va prezenta
cele mai importante funcii PHP utilizate n lucrul cu bazele de
date MySQL (tabel 3.1), nsoite de aplicaii exemplificative.
Tabel 3.1
Tip_returnat Funcie(...)

resource
mysql_connect

Aciuni/caracteristici

- realizeaz conectarea la un server MySQL;


- funcia necesit minim trei parametri
11

Programare Web

resource
mysql_pconnect

bool mysql_close

bool mysql_select_db

bool mysql_create_db

obligatorii: nume server MySQL/ adres IP


server, nume utilizator MySQL i parola de
acces;
- returneaz valoarea logic FALSE n cazul
n care a euat conectarea la server-ul de
baze de date, respectiv un identificator
resurs de acces la conexiunea cu server-ul
MySQL n cazul n care conectarea a reuit.
- realizeaz o conexiune permanent la un
server MySQL (parametrii fiind aceiai ca la
funcia anterior);
- iniial, caut o conexiune permanent deja
existent, iar n cazul n care nu gsete,
creeaz una;
- nu nchide conexiunea la final de script;
- returneaz valoarea logic FALSE n cazul
n care a euat conectarea la server-ul de
baze de date, respectiv un identificator
resurs de acces la conexiunea cu server-ul
MySQL n cazul n care conectarea a reuit.
- primete ca parametru un identificator de
acces la o conexiune cu un server MySQL i
realizeaz nchiderea acesteia. n cazul n
care parametrul nu este specificat, se va
nchide conexiunea curent;
- returneaz valoarea logic TRUE n cazul
n care nchiderea conexiunii s-a realizat cu
succes, respectiv valoarea logica FALSE n
caz contrar;
- funcia este opional n cazul n care
conexiunea nu este permanent, aceasta
nchizndu-se automat la final de script.
- selecteaz/deschide o baza de date curent
(existnd deja o conexiune cu un server
MySQL) pentru interogrile/operaiile SQL
care vor urma;
- funcia are doi parametri: primul este de tip
ir de caractere, reprezentnd numele bazei
de date deschise/selectate, iar cel de-al
doilea parametru reprezint identificatorul
resurs de acces la conexiunea cu serverul
MySQL;
- returneaz valoarea logic TRUE n cazul
n care s-a reuit selectarea bazei de date,
respectiv valoarea logic FALSE n cazul n
care baza de date nu poete fi deschis (nu
exist, utilizatorul nu are drepturi de acces la
aceasta, etc).
- permite crearea unei noi baza de date
MySQL;
12

Programare Web

- funcia are doi parametri: primul este de tip


ir de caractere, reprezentnd numele bazei
de date care va fi creat, iar cel de-al doilea
parametru reprezint identificatorul aferent
conexiunii cu MySQL-ul;
- returneaz valoarea logic TRUE n cazul
n care a reuit s creeze baza de date,
respectiv valoarea logic FALSE n caz
contrar.
- permite tergerea unei baze de date
bool mysql_drop_db
MySQL;
- funcia are doi parametri: primul este de tip
ir de caractere, reprezentnd numele bazei
de date care va fi tears, iar cel de-al doilea
parametru reprezint identificatorul aferent
conexiunii cu MySQL-ul;
- returneaz valoarea logic TRUE n cazul
n care a reuit s tearg baza de date,
respectiv valoarea logic FALSE n caz
contrar.
resource mysql_query - trimite/paseaz o comand SQL spre
serverului MySQL;
- returneaz, n caz de succes, un
identificator resurs care va fi folosit n
continuare ca parametru n apelurile unor
eventuale funcii (care realizeaz extragerea
rezultatului comenzii/interogrii), iar n caz
contrar, returneaz valoarea logic FALSE.
array mysql_fetch_row - returneaz o nregistrare/linie extras din
tabela (sau jonciunea de tabele) interogat,
sub forma unui ir (array cu primul indice
de element 0).
- returneaz numrul de linii obinute n
int mysql_num_rows
urma executrii unei comenzi SQL de
interogare SELECT.
- returneaz numrul de coloane (cmpuri)
int mysql_num_fields
aferente setului de date obinut ca urmare a
execuiei unei comenzi SQL SELECT.
resource
- permite oferirea de informaii asupra unei
anumite tabele (jonciuni de tabele),
mysql_list_fields
returnnd ca rezultat un identificator resurs,
care poate fi folosit de ctre urmtoarele
funcii
conexe:
mysql_field_name,
mysql_field_len, mysql_field_type.
string
mysql_field_name
int mysql_field_len
string

- returneaz succesiv numele coloanelor


tabelei.
- returneaz succesiv lungimea coloanelor
tabelei.
- returneaz succesiv tipul coloanelor
13

Programare Web

mysql_field_type
int
mysql_affected_rows
int mysql_errno

string mysql_error

tip_variabil
mysql_result

tabelei.
- returneaz numrul de linii afectate de o
comand SQL anterioar de tip UPDATE,
INSERT, DELETE.
- permite identificarea erorii care s-a produs
n timpul execuiei de ctre serverul
MySQL a unei comenzi SQL;
- returneaz codul numeric al erorii n cazul
n care a aprut o eroare n timpul executrii
unei comenzii SQL, respectiv 0 n caz
contrar.
- permite identificarea erorii care s-a produs
n timpul executrii unei comenzi SQL;
- returneaz un mesaj n care eroarea este
descris explicit n cazul n care a aprut o
eroare n timpul executrii unei comenzii
SQL, respectiv un ir vid n caz contrar.
- preia valoarea unei celule din setul de date,
aferente unei anumite coloane dintr-un rnd
al unui cursor, rezultat ca urmare a unei
comenzi SQL SELECT.

bool mysql_free_result - realizeaz eliberarea zonei de memorie


ocupat de cursorul indicat ca argument,
rezultat ca urmare a unei comenzi SQL
SELECT;
- returneaz valoarea logic TRUE n caz de
succes, respectiv valoarea logic FALSE n
caz contrar.

Folosind funciile de mai sus, programatorul poate


realiza aplicaii complexe pentru accesarea bazelor de date de
tip MySQL.
3.4.1 Interogare fr parametrii a unei baze de date
Acest prim exemplu prezint o modalitate simpl de
interogare fr parametrii a unei tabele a unei baze de date
MySQL. Sunt exemplificate modurile de utilizare a
urmtoarelor funcii:
- funcii legate direct de lucrul cu baze de date MySQL:
mysql_connect(), mysql_select_db(), mysql_query(),
mysql_num_rows(), mysql_num_fields(), mysql_fetch_row( );
- funcii i comenzi PHP generale: print( ),echo, if( ),
while( ), foreach( ), die( ).
Tabela (considerat a fi inclus n baza de date persoane) a
fost creat cu MySQL, folosind comanda:
14

Programare Web

CREATE TABLE table1(


nume CHAR(10),
varsta INTEGER,
localitate CHAR(10));
Codul surs PHP al aplicaiei considerate este urmtorul
(rezultatul apelului acesteia, folosind un browser WEB, fiind
prezentat in fig. 3.2) :
<?php
//Conectare la server
//(n cazul de fa, server MySQL local, user root, parola
andreea)
mysql_connect("localhost","root","andreea")
or die ("Nu se poate conecta la serverul
MySQL");

//Selecie baza de date


mysql_select_db("persoane") or die("Nu se
poate deschide baza de date");
//Interogare tabel (comand SQL)
$query=mysql_query("select * from table1
where nume='ion'");
//Creeaz capul de tabel (se face o afiare tabelat)
print('<table align=center BORDER="2">');
print ("<tr>");
echo '<th BGCOLOR="Silver">Nume</th>';
echo '<th BGCOLOR="Silver">Virsta</th>';
echo '<th
BGCOLOR="Silver">Localitate</th>';
print ("</tr>");
//Iniializare variabil_contor coninnd numrul de
// elemente (celule) returnate prin interogarea tabelei
$nr_val=0;
//Cicleaz dup nr. nregistrri/linii gsite (realiznd o
// condiie logic i o atribuire prin returnarea elementelor
// unei linii/nregistrri n variabila ir (array) $row)
while ($row = mysql_fetch_row($query)){
// Variabila $row este un ir (array) coninnd succesiv, la
// un moment dat, elementele unei nregistrri (row[0] va
// conine elemente din coloana 1 a liniei curente, etc)
//Creeaz o linie nou n tabel
echo" <tr>\n";
//Cicleaz dup elementele unei nregistrri/linii
foreach ($row as $value) {
15

Programare Web

//Pune ntr-o celul din tabel elementul unei nregistrri


// (valoarea dintr-un cmp al nregistrrii)
// Creeaz o coloan nou n linia tabelului
echo "<td>$value</td>";
//Incrementeaz variabila_contor = nr.total elemente =
nr.inreg. X nr. cmpuri
$nr_val++;
} //nchide bucl foreach
echo "</tr>";
}
//nchide bucl while
//Calculeaz nr. de coloane returnate prin interogare
$coln=mysql_num_fields($query);
$nr_inreg=$nr_val/$coln; //calculeaz nr. de linii
echo "<br>";
echo "<center>";
if ($nr_inreg>0) //verific cte linii s-au gsit
echo "s-au gasit: ".$nr_inreg."
inregistrari";
// punctul (.) - rol de operator de concatenare ntre siruri
else
die ("Nu gasesc nici o inregistrare
...");
//Comanda die nchide programul i toate conexiunile
(ieire forat)
echo "</center>";
//Comanda urmtoare se va executa numai n caz de cutare
reuit
mysql_close();
?>
Funcia mysql_connect realizeaz conectarea la
serverul MySQL. Aceast funcie poate avea pn la cinci
parametri (toi putnd fi opionali), dintre care doar primi trei
sunt de regul necesari, iar ultimii doi mai puin folosii:
- Primul parametru reprezint numele server-ului MySQL sau
adresa de IP a computerului pe care rezid serverul. Dac
acest parametrul lipsete, caz n care i ceilali patru lipsesc
(mysql_connect()), se ncearc conectarea la un eventual
server MySQL de pe calculatorul curent (conectare pe local,
echivalent de altfel cu a scrie ca nume de server localhost -ca
n exemplul anterior- sau adresa IP 127.0.0.1). n acest caz, ca
nume de utilizator implicit se va considera root, fr parol
(user-ul implicit MySQL).
16

Programare Web

- Cel de-al doilea parametru reprezint numele utilizatorului,


iar n cazul n care lipsete (obligatoriu lipsind i ceilali
parametrii care l succed), se folosete ca substitut implicit

Fig. 3.2 Rezultatul afirii


numele de utilizator sub care ruleaz serverul MYSQL, adic
de regul root (mysql_connect("localhost"));
- Al treilea parametru reprezint parola utilizatorului, iar n caz
ca lipsete se folosete irul vid pe post de parol pentru
conectarea la server (mysql_connect ("localhost",
"user1"));
Observaie: Din motive de securitate, se recomand a se folosi
aceti primi trei parametrii cu valori concrete, ne lsndu-se
(prin lips lor) active valorile implicite care conduc la o
cretere substanial a gradului de vulnerabilitate al aplicaiei.
Pentru MySQL 5.0.22 (inclus n pachetul WAMP5), user-ul
implicit existent la instalare este root, fr parol.
- Al patrulea parametru este de tip logic, avnd rolul de a
indica motorului PHP ca, n cazul n care exist deja o
conexiune la acelai server MySQL, s creeze o nou
conexiune n loc s o reutilizeze pe cea existent;
- Ultimul parametru este de tip ntreg i reprezint proprietile
pe care le va avea conexiunea (spre exemplu, dac se folosete
compresia datelor).
Funcia mysql_connect returneaz (n cazul n care
conectarea a reuit) un identificator resurs de acces aferent
conexiunii cu server-ul MySQL. Funcia este absolut necesar
a fi folosit naintea oricrei alte funcii opernd cu MySQL,
asigurnd practic realizarea conexiunii/legturii cu serverul de
baze de date.
17

Programare Web

Funcia mysql_select_db selectez/deschide o baz de


date aferent serverului MySQL cu care s-a fcut conexiunea,
fiind absolut necesar pentru interogarile/comenzile SQL care
vor urma. Funcia are doi parametri: primul (obligatoriu), este
de tip ir de caractere i reprezint numele bazei de date pe
care se va opera, iar cel de-al doilea parametru (opional)
reprezint identificatorul de acces la conexiunea cu serverul
MySQL. Dac acesta nu este specificat explicit, se consider
conexiunea curent existent cu serverul MySQL. Funcia
returneaz valoarea logic TRUE n cazul n care s-a reuit
selectarea bazei de date, respectiv valoarea logica FALSE n
caz contrar(baz de date nu exist, utilizatorul nu are drepturi
de acces la aceasta etc.).
Funcia mysql_query este cea prin care se asigur
interaciunea efectiv cu elementele (datele) bazei de date,
permind operaiile SQL uzuale (interogare, adugare,
tergere, modificare etc). Funcia are doi parametri:
- Primul parametru este de tip ir de caractere i reprezint
cererea (comanda SQL) trimis spre execuie server-ului
MySQL (n exemplul de fa, o comand SELECT pe o
tabel);
- Al doilea parametru reprezint identificatorul de acces al
conexiuni cu serverul MySQL. n cazul n care acesta lipsete
se
ia
n
considerare
conexiunea
curent;
n exemplul anterior, cutarea n tabel s-a fcut dup o
valoare bine precizat: "select * from table1 where
nume='ion'". Exist ns situaii n care nu se cunoate
exact valoarea cheii de cutare, n acest caz, o alternativ
constituind-o folosirea operatorul like. Acesta, mpreun cu
wildcard-ul % permit realizarea unei interogri dup o masc
aproximativ (ceva ce seamn cu cheia de cutare). Spre
exemplu, dac se dorete afiarea tuturor persoanelor a cror
nume ncepe cu ion, se poate folosi comanda "select *
from table1 where nume like 'ion%'". n
cazul n care se cere afiarea tuturor persoanelor a cror vrst
se termin cu cifra 9, comanda select va arta n felul urmtor:
"select * from table1 where varsta like
'%9'"
Observaie: Evident, comanda SELECT poate fi i o interogare
pe mai multe tabele (jonciuni de tabele), spre exemplu:
select tabela1.col11, tabela1.col.12,
tabela2.col21, tabela2.col22 from tabela1,
18

Programare Web

tabela2 where tabela1.col.12 =


tabela2.col21
Bucla while($row=mysql_fetch_row($query)), utiliznd
funcia mysql_fetch_row, poate fi interpretat astfel: att
timp ct este gsit o linie (coninutul fiecrei linii gsite fiind
returnat succesiv de funcia mysql_fetch_row n variabila ir
$row) execut.
Funcia mysql_fetch_row va umple succesiv un ir
($row) cu datele unei linii returnate de interogare. Aceste date
sunt prelucrate succesiv (de regul afiate ntr-un tabel pe
ecran), ncepnd cu primul articol/linie, apoi se trece la al
doilea (coninutul irului $row fiind astfel suprascris succesiv)
i aa mai departe. Practic, bucla while() cicleaz dup
numrul de articole/linii gsite i returnate n urma interogrii.
Linia print('<table align=center BORDER="2">');
trimite spre ecran un ir HTML pentru crearea unui tabel n
care vor fi afiate datele gsite. Deci tag-ul <table> definete
un tabel de afiare, tag-ul <tr> se refer la construcia unei linii
din tabel, <th> la o linie-header (cap de tabel), <td> la o
coloan, toate fiind elemente HTML care permit construcia
unui format tabelat de afiare pe ecran.
Comanda foreach ($row as $value) este practic o bucl
intern buclei while(), ciclnd n cadrul fiecrui articol/linie
dup numrul de elemente ale articolului/liniei. Pentru fiecare
articol succesiv gsit (in ciclul while()), comanda foreach() ca
i bucl, extrage succesiv din irul $row cte un element i-l
trimite spre variabila $value (care la un moment dat conine o
valoare a unui articol corespunztoare unui anumit cmp, deci
practic valoarea unei celule).
Afiarea pe ecran (n celulele tabelului de afiare
construit) a coninutului variabilei $value (echo "<td
>$value</td>";), nseamn practic afiarea element
cu element a coninutului fiecrui articol gsit, n celule
succesiv create. Prin incrementarea variabile $nr_val, aceasta
va conine numrul total de elemente (spre exemplu dac
numrul de articole gsite este 3 (bucla while() se va executa
de 3 ori), iar numrul de cmpuri este 5 (bucla foreach()
se va executa de 5 ori), $nr_val=3X5=15.
Funcia mysql_num_fields returneaz numrul de
coloane (cmpuri) rezultat n urma interogrii cu comanda
mysql_query. Dac mysql_query conine o comand SQL de
forma SELECT * , practic va returna numrul total de
coloane (cmpuri) ale tabelei (sau jonciunii de tabele) referite.
19

Programare Web

mprind valoarea variabilei $nr_val la valoarea returnat de


funcia mysql_num_fields (oferind numrul de cmpuri
implicate n interogare), se obine numrul de nregistrri/linii
gsite i returnate de interogare.
Comanda die (executat pe ramura else a verificrii if(
)) nchide automat conexiunea i ncheie forat programul (nici
o alt comand care ar mai urma n script nu se mai execut) .
Comanda mysql_close nchide conexiunea cu serverul
MySQL (primind ca parametru un identificator de acces la o
conexiune spre un server MySQL). n cazul n care parametrul
nu este specificat, se nchide conexiunea curent. n exemplul
de fa, aceast comand se execut doar dac comanda die()
de pe latura else nu s-a executat n prealabil.
O variant alternativ de codare PHP a funcionalitilor
aceleiai aplicaii, este prezentat n continuare:
<?php
mysql_connect("localhost","root","andreea") or
die ("Nu se poate conecta la serverul MySQL");
mysql_select_db("persoane") or die("Nu se poate
selecta baza de date");
$query=mysql_query("select * from table1 where
nume='ion'");
//Calculeaz DIRECT nr. de inregistrari returnate prin interogare
$nr_inreg=@mysql_num_rows($query);
if ($nr_inreg>0){
echo "<center>";
echo "S-au gasit " . $nr_inreg . "
inregistrari";
echo"</center>";
echo"<table border='2' align='center'>";
echo"<tr bgcolor='silver'>";
echo"<th>Nume</th>";
echo"<th>Varsta</th>";
echo"<th>Localitate</th>";
echo"</tr>";
while($row=mysql_fetch_row($query)){
echo"<tr>";
foreach ($row as $value){
echo "<td>$value</td>";
}
echo"</tr>";
}
echo"</table>";

}
else{
echo"<center>";
echo "Nu s-a gasit nici o inregistrare!!!";
20

Programare Web

echo"</center>";

mysql_close();
?>

Aceasta variant este prezint o optimizare din punct de


vedere al operrii pe partea de interpretor PHP (practic
pseudo-clientul aplicaiei Web), ntruct pentru a calcula
numrul de nregistrri obinute n urma interogrii se
folosete funcia mysql_num_rows, pasndu-se aceast
sarcin serverului MySQL (care primete astfel o solicitare n
plus). Aceasta funcie returneaz numrul de linii obinute n
urma executrii unei comenzi SQL SELECT. Semnul @ (care
apare n faa funciei mysql_num_rows) are rolul de a suprima
afiarea pe ecran a unor eventuale warning-urilor
(avertismentelor) care pot aprea n timpul execuiei unor
comenzi.
n cele dou versiuni ale aplicaiei anterior prezentate,
capul de tabel pentru afiarea informaiilor din tabela bazei de
date s-a realizat n mod manual, presupunndu-se cunoscute
numele coloanelor i numrul lor.
PHP-ul dispune de funcii prin care se pot obine informaii
asupra structurii unei tabele, informaii care pot fi utilizate
pentru realizarea automat a unui cap de tabel pentru afiare
(coloanele lui fiind practic cmpuri ale tabelei bazei de date).
n continuare, sunt enumerate cteva dintre aceste funcii:
-mysql_list_fields() ofer informaii asupra structurii unei
anumite tabele, returnnd ca rezultat un identificator, care
poate fi folosit de ctre urmtoarele funcii, cu semnificaiile
aferent precizate :
-mysql_field_name()- returneaz succesiv numele coloanelor
tabelei;
-mysql_field_len() - returneaz succesiv lungimea coloanelor
tabelei;
-mysql_field_type()- returneaz succesiv tipul coloanelor
tabelei;
-mysql_num_fields() - returneaz numrul coloanelor tabelei.
Urmtorul exemplu comentat este destul de edificator
asupra modului de utilizare a acestor funcii, fr a mai fi
necesar o prezentare a sintaxei lor de baz:
<?php

//Conectare la serverul MySQL


21

Programare Web

$link = mysql_connect(localhost, root,


andreea);
// Informaii asupra structurii unei tabele din baza de date
$fields = mysql_list_fields("persoane",
"table1",$link);
// Numrare coloane ale tabelei referite
$columns = mysql_num_fields($fields);
// Pentru fiecare coloan, afieaz numele, tipul i lungimea ei
for ($i = 0; $i < $columns; $i++){
echo mysql_field_name($fields, $i);
echo mysql_field_type($fields, $i);
echo mysql_field_len($fields, $i);
echo <br>;
}
?>

Efectul rulrii scriptului anterior const n afiarea, pe


coloan, a numelui, tipului i lungimii fiecrui cmp al unei
anumite tabele a unei baze de date MySQL, tabel referit
printr-un identificator ($fields) n funciile specializate folosite.
Observaie: Fiecare din funciile returnnd numele, tipul i
lungimea unei coloane a tabelei are ca argumente un
identificator de pointare la tabel ($fields), respectiv un index
de coloan (pornind de la zero) reprezentnd poziia coloanei
referite (aa cum se poate observa i n scriptul anterior
prezentat).
REZUMAT
Orice program PHP ncepe cu <?php i se ncheie cu ?>.
Orice linie de program PHP se termin cu punct i virgul.
Principalele funcii folosite pentru lucrul cu baze de date
MySQL sunt:
- mysql_connect - permite conectarea la un server MySQL;
- mysql_select_db - permite selecia bazei de date MySQL;
- mysql_query - execut o comand SQL;
- mysql_fetch_row - returneaz o nregistrare din tabel;
- mysql_num_fields
returneaz
numrul
de
coloane(cmpuri) dintr-un set de rezultate creat ca urmare
a unei comenzi SQL SELECT;
- mysql_num_rows - returneaz numrul de linii obinute n
urma executrii unei comenzi SQL SELECT;
- mysql_list_fields - ofer informaii asupra unei anumite
tabele, returnnd ca rezultat un identificator, care poate fi
folosit de ctre urmtoarele funcii: mysql_field_name,
mysql_field_len, mysql_field_type;
22

Programare Web

- mysql_field_name - returneaz succesiv numele


cmpurilor tabelei;
- mysql_field_type - returneaz succesiv tipul cmpurilor
tabelei;
- mysql_field_len returneaz succesiv lungimea
cmpurilor tabelei;
- mysql_close - nchide o conexiune cu baza de date,
Comanda foreach( ) cicleaz n cadrul fiecrui
artico/liniel, dup numrul de elemente ale articolului/liniei.
NTREBRI
Care este rolul funciei mysql_connect?
n orice script PHP de lucru cu o baz de date MySQL este
absolut necesar funcia mysql_query? Argumentai.
S se scrie un script PHP prin care s afiai pe ecran
informaia din dou cmpuri ale unei tabele. Afiarea se va
face pe vertical (i nu pe orizontal, ca n exemplul
prezentat), adic n formatul tabelat urmtor:
NUME_CIMP1 | valoare_element1_articol1
NUME_CIMP2 | valoare_element2_articol1
NUME_CIMP1 | valoare_element1_articol2
NUME_CIMP2 | valoare_element2_articol2

S se creeze automat capul de tabel reprezentat de coloana


din stnga, folosind funciile mysql_list_fields i
mysql_field_name.
3.4.2 Interogare cu parametrii a unei tabele a bazei de date
Realizarea unei interogri a unei tabele aferente unei
baze de date, implic obligatoriu transmiterea unor parametrii
dup care se face cutarea. Exemplul anterior de interogare,
fr parametrii, este pur didactic (doar pentru exemplificarea
modului de utilizare a funciilor PHP de operare cu o baz de
date). n realitate, orice interogare pe Web necesit anumii
parametri de intrare.
a) Interogare cu cutare exact (cu toi parametrii
obligatoriu de introdus):
23

Programare Web

Acest prim exemplu presupune o interogare a unei


tabele a bazei de date, cu afiarea liniilor gsite, filtrarea
fcndu-se funcie de valorile introduse pentru un nume i o
varsta (cmpuri ale tabelei), ambele furnizate obligatoriu (ca
parametrii de intrare i implicit de interogare).
Un prim fiier script HTML necesar (fig.3.3), realizeaz
doar o preluare a acestor parametrii (de la tastatur) i o
"pasare" a lor (printr-un form nsoit de o aciune "POST") spre
pagina propriu-zis de interogare (scriptul PHP), plasat la
adresa local http://localhost/ex2.php:
<html>
<title>Interogare cu parametrii</title>
<center>
<head><H1>Interogare cu
parametrii</H1></head>
</center>
<form method="POST"
action="http://localhost/ex2.php">
<table border=10 align=center BGCOLOR="Silver">
<td>
Nume:<input type="text" name="nume"
size="10"><br>
Varsta:<input type="text" name="varsta"
size="4"><br>
<input type="SUBMIT" value="Cauta" >
<input type="RESET" value="Reset" >
</td>
</table>
</form>

</html>

Elementul esenial al fiierului HTML anterior, este


obiectul HTML <form action=POST , avnd rolul
de preluare de la tastatur a unor valori pentru cei doi
parametrii (nume i varsta simpl coinciden faptul c
numele lor este acelai cu al unor cmpuri ale tabelei bazei de
date) i pasarea lor spre scriptul PHP localizat de linia:
action="http://localhost/ex2.php"
ntreg coninutul formularului <form > </form>
a fost plasat n celula unei tabele (avnd culoarea de
background argintiu), fr a fi obligatorie aceast afiare
tabelat (mai reuit ns din punct de vedere al designului):
<table border=10 align=center
BGCOLOR="Silver">
<td>
24

Programare Web

.
.
.
.
.
.
</td>
</table>
Totui, nucleul esenialul a acestui fiier HTML este
urmtorul (putndu-se reduce doar la secvena urmtoare):
<form method="POST"
action="http://localhost/ex2.php">
Nume:<input type="text" name="nume"
size="10" ><br>
Varsta:<input type="text" name="varsta"
size="4" ><br>
<input type="SUBMIT" value="Cauta" >
<input type="RESET" value="Reset" >
</form>
Se pot remarca:
- cele dou tag-uri <input type="text" care creeaz
dou casete pentru preluarea datelor (fig.3.3) n cele dou
variabile-parametru, nume i varsta;
- tag-ul <input type="SUBMIT" care genereaz un
buton, la apsarea cruia valorile celor doi parametrii sunt
trimise ctre fiierul PHP localizat prin adresa:
action="http://localhost/ex2.php";
- tag-ul <input
type="RESET" care reseteaz
valorile parametrilor i anuleaz transmiterea lor;

Fig. 3.3 Ecran interogare


Observaie: Referirea ntr-un script a unei alte pagini WEB
(HTML PHP, etc.) se poate face, fie prin adresare direct (caz
n care se precizeaz inclusiv calea complet spre acea pagin,
spre exemplu "http://localhost/ex2.php"), fie prin
adresare relativ (fr a mai fi necesar calea complet spre
pagina referit). n acest ultim caz, dac scriptul apelant i
25

Programare Web

scriptul apelat/referit sunt n acelai director/locaie, ajunge


precizarea doar a numelui paginii apelate ("ex2.php").
Codul PHP al fiierul realiznd conectarea la baza de date
i interogarea tabelei table1 a bazei de date MySQL persoane
este urmtorul (acest fiier primete de la scriptul HTML
anterior prezentat - introduse de la tastatur-, valorile
parametrilor nume=valoare_tastata1, respectiv varsta=
valoare_tastata2):
<?php
mysql_connect("localhost","root","andreea") or
die ("Nu se poate conecta la serverul MySQL");

mysql_select_db("persoane") or die("Nu se
poate selecta baza de date");
echo"<br><br>";
// Preluarea cu metoda POST a parametrilor transmii de
// ctre fiierul HTML spre scriptul PHP
$nume=$_POST['nume'];
$varsta=$_POST['varsta'];
// Interogare cu parametri
$query=mysql_query("select * from table1
where nume='$nume' and varsta=$varsta");
//Calculeaza nr. de nregistrri returnate prin interogare
$nr_inreg=@mysql_num_rows($query);
if ($nr_inreg>0){
echo "<center>";
echo "S-au gasit " . $nr_inreg . "
inregistrari";
echo"</center>";
//creeaza capul de tabel
echo "<table border='2' align='center'>";
echo"<tr bgcolor='silver'>";
echo"<th>Nume</th>";
echo"<th>Varsta</th>";
echo"<th>Localitate</th>";
echo"</tr>";
// afiseaza inregistrarile gasite n urma interogarii
while($row=mysql_fetch_row($query)){
echo"<tr>";
foreach ($row as $value){
echo "<td>$value</td>";
}
echo"<?tr>";
26

Programare Web

}
echo"</table>";

}
else{
echo"<center>";
echo "Nu s-a gasit nici o
inregistrare!!!";
echo"</center>"; }
// inchide conexiunea cu serverul MySQL
mysql_close();
?>
Rezultatul apelului acestui script cu parametrii, i
implicit al interogrii este prezentat n fig.3.4.

Fig. 3.4 Rezultatul interogrii parametrizate exacte


Fa de exemplele prezentate n paragraful anterior,
singura deosebire major apare n linia:
$query=mysql_query("select * from table1
where nume='$nume' and varsta=$varsta");
reprezentnd o interogare parametrizat. (variabilele $nume i
$varsta, reprezentand valorile preluate de la tastatur i
transmise de fiierul HTML spre fiierul PHP apelat).
b) Parolarea accesului
n scriptul anterior, accesul la serverul MySQL se face
prin precizarea explicit a parolei direct n cod. n unele
situaii, din motive de restricionare a accesului, acest lucru nu
este ns de dorit. Parolarea accesului, n exemplul de fa, se
poate face prin transmiterea parolei ca un parametru de intrare,
introdus de la tastatur odat cu ceilali parametrii (afereni
interogrii). n acest sens, n fiierul care implementeaz
formularul de introducere a parametrilor de intrare se adaug
codul urmtor (practic un input suplimentar) pentru
introducerea parolei (fig. 3.5):
27

Programare Web

Parola: <input type="password" name="parola"


size="15">
<br>
<h4>Date de interogare:</h4><br>

Fig.3.5 Ecran de conectare i interogare


n acest caz, suplimentar n scriptul PHP propriu-zis pot
apare urmtoarele completri de cod (verificnd reuita sau
nereuita conectrii la serverul MySQL):
<?php
//Preluarea cu metoda POST a parametrilor transmii de
ctre fiierul HTML,
//scriptului PHP
$parola=$_POST['parola'];
$nume=$_POST['nume'];
$varsta=$_POST['varsta'];
// Conectare cu parol ca parametru
$con =
mysql_connect("localhost","root",$parola);
// Returnare ntr-o variabil a unui mesaj (string) de eroare,
// dac apare o eroare la conectare ->mesaj
$var=mysql_error();
if (!$con){
// Verific reuita conectrii
echo "<br><h3>".$var."</h3><br>";
//afeaz mesaj eroare (fig. 3.6)
echo "<h1><center> Parola este
incorecta!</center>
</h1>";
}
else {. .
.
.
.
// restul programului
28

Programare Web

.
}
?>

Fig. 3.6 Parol incorect


Dac serverul MySQL dispune de un cont utilizator fr
nume de user i password, comanda mysql_connect (din
exemplul anterior) este de forma:
mysql_connect("localhost"," "," ");
c) Interogare cu cutare aproximativ
Singura modificare din script apare n linia de specificare
a interogrii SQL efective (de remarcat folosirea n comanda
de interogare a ghilimelelor pentru ncadrarea variabilelor al
cror coninut este interpretat ca un string/ir de caractere,
respectiv lipsa acestor ghilimele n cazul variabelelor
coninnd valori numerice):
$query =mysql_query("SELECT * FROM table1
where nume>'$nume' and varsta>=$varsta");
Rezultatele pot fi urmtoarele:
- dac n caseta INPUT corespunzatoare numelui nu se
introduce nici o valoare, iar n cea corespunzatoare vrstei se
introduce valoarea 0, vor fi afiate toate nregistrrile bazei de
date;
- dac se introduce un ir de caractere pentru nume, iar dac n
caseta INPUT corespunzatoare varstei se intoduce valoarea 0,
se vor afia toate nregistrrile pentru care numele sunt
superioare alfabetic primului caracter din irul de caractere
introdus;
d) Interogare cu ignorarea parametrilor necompletai
29

Programare Web

n acest caz este necesar urmtoarea modificare n scriptul


PHP,
n
linia
de
interogare
efectiv
($query=mysql_query()), folosindu-se urmtoarea secven:
// dac nu s-a introdus nici un nume i nici o varsta
// (se folosete operatorul = = pentru comparare)
if ($nume==''and $varsta =='')
$query =mysql_query("SELECT * FROM
table1");
// dac s-a introdus doar un nume
//(operatorul !== nseamn diferit de)
if ($nume!==''and $varsta =='')
$query =mysql_query("SELECT * FROM table1
where nume='$nume'");
// dac s-a introdus o varsta
if ($nume==''and $varsta !=='')
$query =mysql_query("SELECT * FROM table1
where varsta= $varsta");
//// dac s-a introdus att un nume ct i o varsta
if ($nume!==''and $varsta !=='')
$query =mysql_query("SELECT * FROM table1
where nume= '$nume' and varsta=$varsta");
O situaie mai special de interogare o constituie cea n
care, interogarea se face dup o cheie mai lung, spre exemplu,
un set de cuvinte, grupate toate ntr-un acelai cmp/caset i
transmise (toate) ca un singur parametru.
Un formular de
tip FORM poate conine n acest caz o caset INPUT (avnd
atributul type=text, implicit de altfel), fie o caset de tip
TEXTAREA. Pentru exemplificare, n cadrul formularului
urmtor, o caset de tip TEXTAREA permite scrierea unei
informaii pe 3 rnduri i 10 coloane (fiind vorba de o
formatare a modului de afiare pe ecran a informaiei, i nu de
o limitare a cantitii de informaie):
<form action="unu.php" method="get">
Detalii: <textarea name="detalii"
cols="10" rows="3"></textarea>
<input type="submit" value="GO" />
</form>
Evident c utilizarea unei casete TEXTAREA este
necesar doar n situaia unui volum mare de informatie (mai
multe linii de text, spre exemplu). Dac nu este vorba de o
30

Programare Web

astfel de situaie, se poate folosi o simpl caset INPUT,


permind scrierea pe o singur linie.
Transferul valorii unui astfel de parametru citit ntr-o
caset TEXTAREA ridic cteva probleme. Acestea se
datoreaz faptului c, coninutul parametrului poate include
spaii, coduri de sfrit de linie sau alte caractere speciale, care
nu sunt permise ntr-un string primit ca parametru de ctre un
script. Aceste caractere speciale trebuie convertite n coduri
speciale specifice parametrizrii apelului unei pagini Web.
Se consider urmtorul exemplu de apel (printr-un link)
al unui script intitulat newpage.php, care primete ca
parametru de intrare coninutul variabilei $detalii, al crei
coninut a fost completat printr-un formular de genul celui
anterior prezentat (coninnd TEXTAREA). Se presupune c
variabila $detalii conine valoarea Exemplu de folosire a tagului Div, incluznd mai multe spaii, care nu sunt permise
ntr-un string de interogare, trimis explicit ca parametru de
intrare spre un script, prin intermediul unui link. Convertirea
acestor spaii ntr-un cod special acceptat ntr-un astfel de apel,
implic folosirea unei funcii PHP speciale, i anume
urlencode(). Iat codul aferent unui mod corect de apel cu
transfer al unui astfel de parametru (cod inclus n cadrul scriptului unu.php, care primete parametrul de intrare $detalii de la
formularul anterior):
<a href="newpage.php?detalii=<?php
echo(urlencode($detalii)); ?>">
O legatura parametrizata</a>
Se poate observa o includere de cod PHP n mijlocul
unei etichete HTML. O form i mai simpl de apelare,
similar ca efect cu cea anterioar, este urmtoarea:
<a
href="newpage.php?detalii=<?=urlencode($de
talii)?>"> O legatura parametrizata </a>
n ambele cazuri, funcia urlencode() preia
caracterele speciale (spre exemplu, spaiile) dintr-un string
pasat ca parametru i le convertete n coduri speciale necesare
i acceptate n cadrul unui apel parametrizat al unei pagini
Web. Pentru cazul unei valori particulare: $detalii=Exemplu
de folosire a tag-ului Div, aceast funcie convertete acest
coninut ntr-un string de forma Exemplu+de+
folosire+a+tag-ului+Div, acceptat ca parametru valid. Dup
apelul scriptului cu parametrul astfel codat, PHP realizeaz
automat conversia invers (n cadrul scriptului apelat 31

Programare Web

newpage.php-), la valoarea iniiala, n momentul utilizrii


variabilei $detalii.
Observaie: Funcia urlencode() se folosete doar n cadrul
unei pasri de parametrii direct printr-un link explicit (href,
evident folosind metoda GET), nefiind necesar utilizarea ei
explicit dac transmiterea parametrilor se face prin
intermediul unui formular FORM (codarea fcndu-se n acest
caz automat).
n situaia n care se doreste afiarea unui volum
compact mai mare de informaii (preluat, spre exemplu, dintrun cmp de tip TEXT al unei tabele MySQL), este necesar
uneori o formatare a acesteia. Figura 3.7 prezint afiarea unei
informaii neformatate (liniile ntinzndu-se pe toat limea
ecranului, iar dac ar depi-o, ar apare bara de scroll orizontal
pentru fereastr).

Fig. 3.7 Afiare informaie neformatat


O soluie simpl de rezolvare presupune utilizarea
etichetei DIV cu parametrii afereni setai corespunztor.
Astfel, dac n celulele aferente coloanei detalii a tabelului din
figura 3.7 se folosete o construcie de genul:
<td><div
style='height:
100px;width:
330px;
overflow:
auto'>....continutul
coloanei/variabila...</div></td>,
rezultatul formatrii este prezentat n figura 3.8, observndu-se
o mbuntaire evident a design-ului.

32

Programare Web

Fig. 3.8 Afiare informaie formatat cu eticheta DIV


REZUMAT
Realizarea unei interogri on-line a unei tabele a unei baze de
date, implic obligatoriu transmiterea unor parametrii dup
care se face cutarea.
Funcia mysql_query corespunztoare unei afiri (SELECT)
parametrizate are sintaxa:
$query=mysql_query("select * from table1
where nume_camp1=$nume_parametru1 and/or
nume_camp2=$nume_parametru2 and/or...");
Funcia mysql_error() poate fi folosit pentru precizarea
tipului unei erori aprute, sub forma $var=mysql_error(), n
variabila $var fiind transmis un string coninnd informaii
despre eroare (sau direct: echo mysql_error();) .
NTREBRI
Scriei un fiier HTML i un script PHP prin care s se afieze
pe ecran informaia doar din dou cmpuri ale unei tabele
(nume, varsta), interogarea fcndu-se parametrizat doar
dup varsta (se vor afia acele articole pentru care varsta este
egal cu o valoare introdus de la tastatur).
33

Programare Web

Prevedei o tratare i a cazului n care nu se introduce nici o


valoare pentru varsta. (spre exemplu, se vor afia toate
articolele) Afiai pe ecran un mesaj prin care precizai
explicit numrul de articole gsite.
3.4.3 Adugare ntr-o tabel a bazei de date
i n cazul operaiei de adugare a unei noi linii ntr-o
tablel a unei baze de date MySQL este necesar utilizarea
unui fiier HTML pentru transmiterea spre scriptul PHP
propriu-zis a valorilor corespunztoare liniei care va fi
adugat n tabel:
<html>
<title>Adaugare</title>
<center><head><H1>Adaugare</H1></head></ce
nter>
<form method="POST"
action="http://localhost/ex3.php">
<table border=10 align=center
BGCOLOR="Silver">
<td>
// &nbsp: realizeaz introducerea unor spaii suplimentare
// de formatare a afirii tag-ul <strong> bold-uiete textul
// ncadrat
<strong>Nr:</strong>&nbsp;&nbsp;&nbsp;&nbs
p;&nbsp;&nbsp;&nbsp;&nbsp
<input type="text" name="nr" size="4"
><br>
<strong>Nume:</strong>&nbsp;&nbsp;&nbsp;&n
bsp;&nbsp;
&nbsp;&nbsp;&nbsp
<input type="text" name="nume" size="10"
><br>
<strong>Varsta:</strong>&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp
<input type="text" name="varsta" size="4"
><br>
<strong>Localitate:</strong>&nbsp;&nbsp
34

Programare Web

<input type="text" name="localitate"


size="10" ><br>
<center>
<input type="SUBMIT" value="Adauga" >
<input type="RESET" value="Reset" >
</center>
</td>
</table>
</form>
</html>
Acest fiier HTML permite (n cazul de fa) transmiterea
valorilor a patru parametrii (nr, nume, varsta, localitate - cu
valori introduse de la tastatur) afereni datelor necesare
construciei unei noi linii care va fi adugat n tabela bazei de
date (s-a presupus existena unei tabele similare cu cea folosit
n exemplele anterioare, dar avnd n plus cmpul NR, cu
valori unice pentru fiecare articol, deci definit ca PRIMARY
KEY).
Scriptul PHP spre care sunt transmise valorile
parametrilor i care va realiza adugarea propriu-zis n tabela
bazei de date are urmtorul cod:
<?php
mysql_connect("localhost","root","andreea"
) or die ("Nu se poate conecta la serverul
MySQL");
mysql_select_db("persoane") or die("Nu se
poate selecta baza de date");
$nr=$_POST['nr'];
$nume=$_POST['nume'];
$varsta=$_POST['varsta'];
$localitate=$_POST['localitate'];
// adugare parametrizat
$query=mysql_query("insert into table1
values($nr,'$nume',$varsta,'$localitate')"
);
echo "Inserare reusita!!!";
// selectarea i afiarea doar a nregistrrii/liniei nou
adugate
35

Programare Web

$query=mysql_query("select * from table1


where nr=$nr");
//calculeaz nr. de nregistrri returnate prin interogare
$nr_inreg=@mysql_num_rows($query);
if ($nr_inreg>0){
echo "<center>";
echo "S-au gasit " . $nr_inreg . "
inregistrari";
echo"</center>";
echo "<table border='2'
align='center'>";
$coln=mysql_num_fields($query); //nr. de
campuri
echo"<tr bgcolor='silver'>";
// realizare automat a capului de tabel (coninnd toate
cmpurile)
for ($i=0; $i<$coln; $i++){
//numele cmpurilor ca i cap de tabel
$var=mysql_field_name($query,$i);
echo "<th> $var </th>";
}
echo"</tr>";
// afieaz nregistrrile gsite n urma interogarii
while($row=mysql_fetch_row($query)){
echo"<tr>";
foreach ($row as $value){
echo "<td>$value</td>";
}
echo"</tr>";
}
echo"</table>";

}
else{
echo"<center>";
echo "Nu s-a gasit nici o
inregistrare!!!";
echo"</center>";
}
mysql_close();
?>
36

Programare Web

Rezultatul vizibil pe ecran, produs n urma execuiei


comenzii SQL de afiare SELECT este prezentat n fig. 3.9.
Comanda INSERT nu genereaz un rezultat vizibil pe ecran,
mai precis nu va returna eventuale date care ar putea fi afiate,
cel mult aprnd un mesaj de eroare dac operaia de adugare
nu poate fi executat.

Fig. 3.9 Confirmare adugare


De
asemenea,
n
locul
unei
comenzi
mysql_query("SELECT compacte, se poate scrie
echivalent:
//string de interogare memorat ntr-o variabil
$com= 'select * from table1';
$query=mysql_query($com); //interogare
REZUMAT
Realizarea unei adugri parametrizate se face folosind o
comand mysql_query de genul:
$query =mysql_query("INSERT INTO TABLE1
(cimp1,cimp2, cimp3,) VALUES
($parametrul_1,$parametrul_2,
$parametrul_3,)");
Realizarea automat a unui cap de tabel pe baza numelui
cmpurilor tabelei bazei de date se poate face cu o secven de
genul:
//numrare cmpuri
$coln=mysql_num_fields($query);
echo "<tr bgcolor='silver'>";
//realizare automat a capului de tabel, (coninnd toate
cmpurile)
37

Programare Web

for($i=0;$i<$coln;$i++){
//afiare nume cmpuri ca i nume de coloane n capul de
tabel
$var=mysql_field_name($query,$i);
echo "<th>$var</th>;
}
NTREBRI
S se scrie un fiier HTML (pentru transferul parametrilor) i
un script PHP prin care s se adauge simultan dou noi
articole ntr-o tabel (fiierul HTML va conine suficiente
casete, astfel nct un ecran s permit introducerea de date
pentru dou articole/linii simultan). De asemenea, dup
adugare, s va afia pe ecran (tabelat) ntreaga informaie
din tabela bazei de date. Evident, operaia de adugare se va
face parametrizat.
3.4.4 tergere cu confirmare dintr-o tabel a bazei de date
tergerea unor articole/linii dintr-o tabel a unei baze de
date (tergere presupus a fi cu o confirmare prealabil)
implic dou operaii:
- realizarea unei interogri a bazei de date (pe baza unor
parametri de intrare pentru interogare) i afiarea
nregistrrilor gsite, care vor fi terse,
- respectiv, confirmarea (sau anularea) tergerii efective, pe
baza informaiilor anterior afiate n urma interogrii.
Fiierul HTML (ex4.html) pentru realizarea unei
interogri a tabelei n vederea tergerii (interogare fcut cu un
singur parametru -nume- introdus de la tastatur) este detaliat
n listingul urmtor (avnd rezultatul prezentat n fig. 3.10):
<html>
<title>Stergere</title>
<center>
<head><H1>Stergere</H1></head></center>
<form method="POST"
action="http://localhost/ex4.php">
<table border=20 bordercolor="red"
align=center BGCOLOR="Gold">
<td>
Nume:<input type="text" name="nume"
size="10" ><br>
<center>
<input type="SUBMIT" value="Sterge" >
38

Programare Web

<input type="RESET" value="Anulare" >


</center>
</td>
</table>
</form>
</html>

Fig. 3.10 Pagin HTML pentru tergere selectiv


Fiierul PHP pentru interogarea prealabil tergerii (cu
rolul: gsete i vizualizeaz ce se dorete a fi ters), este
prezentat n continuare (acest fiier primind ca parametru de
intrare valoarea pasat spre el de ctre scriptul HTML
anterior):
<?php
mysql_connect("localhost","root","andreea") or
die ("Nu se poate conecta la serverul MySQL");

mysql_select_db("persoane") or die("Nu se
poate selecta baza de date");
// transfer valoare parametru ntr-o variabil intern
$nume=$_POST['nume'];
// cutare dup cmpul nume a nregistrrilor care vor fi
terse
$query=mysql_query("select * from table1
where nume='$nume'");
//calculeaz nr. de nregistrri returnate prin interogare
$nr_inreg=@mysql_num_rows($query);
if ($nr_inreg>0){
echo "<center>";
echo "S-au gasit " . $nr_inreg . "
inregistrari";
echo"</center>";
39

Programare Web

// creare tabel pentru afiare rezultate


echo "<table border='2'
align='center'>";
//numrare cmpuri
$coln=mysql_num_fields($query);
echo"<tr bgcolor='silver'>";
// realizare automat a capului de tabel (coninnd toate
cmpurile)
for ($i=0; $i<$coln; $i++){
//numele cmpurilor ca i cap de tabel
$var=mysql_field_name($query,$i);
echo "<th> $var </th>";
}
echo"</tr>";
// extragere informaii i afiare

while(list ($nr,$nume,$varsta,$localitate)=
mysql_fetch_row($query)){

print (" <tr>\n".


" <td>$nr</td>\n".
" <td>$nume</td>\n".
" <td>$varsta</td>\n".
" <td>$localitate</td>\n".
" </tr>\n");

}
echo"</table>";

// Apelarea scriptului de tergere efectiv/anulare


// (cu transmitere mai departe a parametrilor de intrare,
// n cazul de fa nume dup care se face cutarea)
echo '<form method="POST"
action="http://localhost/ex44.php">';
// pasare, transmitere mai departe a parametrului nume
// ($nume) sub numele nume1
echo '<input type="hidden" name="nume1"
value='.$_POST['nume'].'>';
echo '<input type="SUBMIT"
value="Stergere efectiva
">';
echo '<br>';
echo '</form>';
// link pt. revenire la pagina de start i anulare tergere
echo '<a
HREF="http://localhost/ex4.html">
Renunt si revin...</a>';
40

Programare Web

}
else
die("Nu gasesc nici o inregistrare ...");
mysql_close();
?>
Pentru afisarea rezultatelor obinute n urma interogarii,
anterior s-a folosit comanda PHP list( ), care permite
asignarea de valori unei liste de variabile (asemntoare
practic unui ir), printr-o singur operaie, valorile asignate
fiind cele extrase cu ajutorul functiei mysql_fetch_row().
Dup cum se poate vedea i n fig. 3.11, fiierul PHP
anterior prezentat, realizeaz, ntr-o prim etap, o simpl
interogare a tabelei bazei de date, cu afiarea rezultatelor pe
ecran.

Fig. 3.11 Confirmare tergere


Ceea ce confer posibilitatea lurii deciziei de tergere a
articolelor astfel vizualizate se realizeaz prin partea de cod
inclus n bucla if (verificnd numrul de linii gsite),
constnd practic ntr-un formular HTML <form>. Aceast
parte este urmtoarea (PHP trimind practic spre ecran un
script HTML folosind comanda echo) :
echo '<form method="POST"
action="http://localhost/ex44.php">';
echo '<input type="hidden" name="nume1"
value=' .$_POST['nume']. '>';
echo '<input type="SUBMIT" value="Stergere
efectiva!
" >';
echo '<br>';
echo '</form>';
Secvena de cod prezentat, transmite valoarea
parametrului de interogare, memorat n variabila $nume
41

Programare Web

(utilizat aici pentru o simpl afiare cu SELECT), spre un alt


parametru (nume1) care va fi pasat spre fiierul PHP de
tergere efectiv. Se remarc n acest caz, tipul
type="hidden" utilizat pentru caseta de transfer a
parametrului, care face aceast caset invizibil pentru
utilizator.
Fiierul pentru tergere efectiv are n acest caz o
structur extrem de simpl:
<?php
mysql_connect("localhost","root","andreea")
or die ("Nu se poate conecta la serverul
MySQL");

mysql_select_db("persoane") or die("Nu se
poate selecta baza de date");
$nume1=$_POST['nume1'];
// tergere efectiv
$query =mysql_query("DELETE FROM table1
where nume='$nume1'");
echo "OK, am sters.";
mysql_close ();
?>
REZUMAT
Realizarea unei tergeri parametrizate se face folosind o
comand mysql_query de genul:
$query=mysql_query("DELETE
FROM
TABLE1
where nume_cimp=$nume_parametru");
Transmiterea/pasare mai departe a unui parametru primit se
face prin folosirea ntr-un obiect <form method=POST >
a unei comenzi de genul:
echo '<input type="hidden" name="nume1"
value='.$nume.'>';
unde, $nume este o variabil coninnd valoarea parametrului
primit i transferat mai departe sub numele nume1).
NTREBRI
S se scrie un fiier HTML (pentru transferul parametrilor) i
un script PHP prin care s se tearg articole dintr-o tabel
(direct, fr o confirmare prealabil), articole fiind selectate
dup un nume i o varsta (introduse de la tastatur). Dup
tergere se va afia pe ecran numrul de articole terse.
S se rezolve problema enunat anterior n maniera
urmtoare:
42

Programare Web

- dac se gsete un singur articol, acesta va fi afiat tabelat


pe ecran iar apoi va fi ters;
dac se gsesc mai multe articole, acestea vor fi terse toate..
3.4.5 Modificarea unei nregistrri dintr-o tabel a bazei de
date
Modul de modificare a unei nregistrri/linii dintr-o
tabel a unei baze de date (cu vizualizarea liniei care se
modific) presupune urmtoarele:
- o operaie de cutare parametrizat a nregistrrii care se
dorete a fi modificat i o afiare a ei
- modificarea efectiv (folosind afiarea realizat)
Fiierul pentru transmiterea parametrilor de cutare a
nregistrrii care se dorete a fi modificat (cutarea fcnduse dup doi parametrii vezi fig. 3.12) este urmtorul:
<html>
<title>Cautare pentru modificare</title>
<center> <head><H1>Cautare pentru
modificare</H1></head></center>
<form method="POST"
action="http://localhost/ex5.php">
<table border=10 align=center
BGCOLOR="Silver">
<td>
Nume:
<input type="text" name="nume"
size="10" ><br>
Virsta: <input type="text" name="virsta"
size="4" ><br>
<input type="SUBMIT" value="Cauta" >
<input type="RESET" value="Reset" >
</td>
</table>
</form>
</html>

43

Programare Web

Fig. 3.12 Cutare pentru modificare (practic o simpl cutare)


Fiierul pentru interogare n vederea modificrii are
urmtorul cod:
<?php
mysql_connect("localhost","root","andreea"
) or die ("Nu se poate conecta la serverul
MySQL");
mysql_select_db("persoane") or die("Nu se
poate selecta baza de date");
$nume=$_POST['nume'];
$varsta=$_POST['varsta'];
// cutarea nregistrrii care va fi modificat
$query=mysql_query("select * from table1
where nume='$nume' and varsta=$varsta");
$nr_inreg=@mysql_num_rows($query);
if ($nr_inreg>0){
echo "<center>";
echo "S-au gasit " . $nr_inreg . "
inregistrari";
echo"</center>";
echo "<table border='2'
align='center'>";
echo"<tr bgcolor='silver'>";
$coln=mysql_num_fields($query);
for ($i=0; $i<$coln; $i++){
$var=mysql_field_name($query,$i);
echo "<th> $var </th>";
}
echo"</tr>";
44

Programare Web

$nr_val=0; // contor indice array


while ($row = mysql_fetch_row($query)){
echo"<tr>";
foreach ($row as $value) {
echo "<td BGCOLOR='Yellow'>
$value</td>";
// memorare ntr-un ir (array) a datelor din articolul gsit
$nr_val++;
$sir[$nr_val]=$value;

}
echo "</tr>";

}
echo "</table>";

// Rezolvarea este valabil pentru o singur nregistrare


// gsit
// Pentru mai multe nregistrri gsite, modificrile
// efectuate se aplic asupra tuturor liniilor care corespund
// cutrii
echo '<br><hr>'; // trasarea grafic a unei linii
// apel script pentru modificarea efectiv
echo '<form method="POST"
action="http://localhost/ex55.php">';
// transfer (ascuns) spre script a parametrilor de cutare
echo '<input type="hidden" name="nume2"
value='.$sir[2].'>';
echo '<input type="hidden" name="varsta2"
value='.$sir[3].'>';
// transfer spre script ca parametrii a datelor care pot fi
modificate
echo '<input type="text" name="nr1"
value='.$sir[1].'>';
echo '<input type="text" name="nume1"
value='.$sir[2].'>';
echo '<input type="text" name="varsta1"
value='.$sir[3].'>';
echo '<input type="text"
name="localitate1" value='.$sir[4].'>';

45

Programare Web

echo '<input type="SUBMIT"


value="Modifica!" >';
echo '<br>';
echo '</form>';
// link de revenire i renunare la modificare
echo '<a HREF="http://localhost/ex5.html">
Renun i revin...</a>';
}
else
die ("Nu gasesc nici o inregistrare
...");
mysql_close();
?>
Rezultatul fiierului script PHP anterior, este prezentat
n figura 3.13. Ceea ce aduce nou acest script PHP, pe lng o
simpl interogare (cutare cu SELECT) i afiare a articolelor
gsite pe ecran (tabelat), const ntr-o afiare n casete
editabile a datelor gsite, permindu-se astfel i o modificare a
lor (vezi fig. 3.13). Cum se realizeaz acest lucru?

Fig. 3.13 Ecran pentru modificare


n primul rnd, n bucla foreach() ncuibat n bucla
while(), apare o secven de genul:
//incrementare contor numr elemente
$nr_val++;
// memorare ntr-un ir (array) a datelor din articolul gsit
$sir[$nr_val]=$value;
care permite memorarea tuturor elementelor gsite ntr-un ir
(arrary-ul $sir).
46

Programare Web

Spre exemplu, n cazul de fa (vezi fig. 3.13) s-a gsit


un singur articol cu 4 elemente, acestea memorndu-se ntr-un
ir avnd 4 elemente (cu indicii 1,2,3 i 4, deoarece contorul
$nr_val a fost iniializat pe 0, dar este incrementat nainte de
folosirea lui ca indice al unui element al irului $sir).
n al doilea rnd, este utilizat secvena urmtoare:
echo '<form method="POST"
action="http://localhost/ex55.php">';
// Transfer (ascuns) spre script a parametrilor de cutare
echo '<input type="hidden" name="nume2"
value='.$sir[2].'>';
echo '<input type="hidden" name="varsta2"
value='.$sir[3].'>';
// Transfer spre script ca parametrii a datelor care pot fi
modificate
echo '<input type="text" name="nr1"
value='.$sir[1].'>';
echo '<input type="text" name="nume1"
value='.$sir[2].'>';
echo '<input type="text" name="varsta1"
value='.$sir[3].'>';
echo '<input type="text"
name="localitate1" value='.$sir[4].'>';
echo '<input type="SUBMIT"
value="Modifica!" >';
echo '<br>';
echo '</form>';
Primele tag-uri
<INPUT type=hidden permit
transferul spre fiierul script PHP care realizeaz modificarea
efectiv a parametrilor iniiali de interogare (memorai n
primele dou elemente ale array-ului $sir), acest lucru fiind
necesar deoarece aceti parametrii pot fi alterai n urma unei
eventuale modificri permise n continuare, dup cum se va
vedea.
Urmtoarele 4 tag-uri <INPUT type=text permit
afiarea (n casete care permit att operaii de citire ct i de
scriere) i alterarea (modificarea) acestor patru parametrii,
care vor substitui informaia existent n cmpurile articolului
localizat (cu parametrii transmii din primele dou INPUT-uri
invizibile utilizatorului).
Cu alte cuvinte, aceast secvena transfer spre script-ul
PHP de modificare efectiv ase parametrii:
- doi parametrii pentru localizarea articolului de modificat;
47

Programare Web

- ali patru parametrii, pentru substituirea informaiei din cele


patru cmpuri ale articolului deja localizat.
Fiierului PHP care realizeaz modificarea propriu-zis,
utiliznd comanda SQL UPDATE, nu i mai revine dect o
sarcin banal:
<?php
mysql_connect("localhost","root","andreea") or
die ("Nu se poate conecta la serverul MySQL");
mysql_select_db("persoane") or die("Nu se poate
selecta baza de date");

$nr1=$_POST['nr1'];
$nume1=$_POST['nume1'];
$varsta1=$_POST['varsta1'];
$localitate1=$_POST['localitate1'];
$nume2=$_POST['nume2'];
$varsta2=$_POST['varsta2'];

// Modificare efectiv
$query =mysql_query("update table1 set
nr=$nr1,nume='$nume1',
varsta=$varsta1,localitate='$localitate1'
where nume='$nume2' and varsta=$varsta2");
// Afiare mesaj de eroare pentru date incorect introduse
(dac se dorete)
$var=mysql_error();
echo $var;
echo "OK, am modificat!";
mysql_close ();
?>
REZUMAT
Realizarea unei modificri parametrizate se face folosind o
comand mysql_query de genul:
$query=mysql_query("UPDATE table1 SET
cimp_1=$param_1,cimp_2=$param_2, WHERE
cimp_1=$param_n and cimp_2=$param_n_plus_1
");
n cadrul unei comenzi UPDATE se pot efectua i calcule.
Exemplu (incrementarea valorii unui cmp numeric cu o
anumit valoare):
$query =mysql_query("UPDATE table1 SET
cimp_1=$param_1,cimp_2=cimp_2+$param_2...
WHERE

48

Programare Web

cimp_1=$param_n and
cimp_2=$param_n_plus_1...");
Memorarea tuturor elementelor gsite n urma unei cutri
(SELECT ) se poate face printr-o secven:
$nr_val++;
//incrementare contor numr elemente
$sir[$nr_val]=$value; // memorare ntr-un ir a
datelor din articol
inclus ntr-o bucl foreach() (ciclnd dup numrul de
elemente ale unui articol), la rndul ei ncuibat ntr-o bucl
while() (ciclnd dup numrul de articole/linii gsite).
NTREBRI
Fie baza de date MySQL baza, cu tabela Table1 avnd
cmpurile: NR_CRT, PRODUS, BUCATI, PRET_BUC,
PRET_TOTAL (user ION, fr password). Se consider c pot
exista maximum dou produse cu acelai nume (PRODUS) i
acelai PRET_BUC. Cmpul NR_CRT are o valoare unic
(obinut incremental) pentru fiecare articol. Citind de la
tastatur un PRODUS, respectiv PRET_BUC (utiliznd un
fiier HTML care trebuie scris), prin apsarea unui buton se
vor efectua urmtoarele operaii (ntr-un fiier script PHP):
- cutarea n tabel a cte produse cu acelai nume
PRODUS i PRET_BUC exist;
- dac nu se gsete nici un articol, se va semnala acest
lucru printr-un mesaj (i se iese din program);
- dac se gsete un singur articol, se va afia acest articol
ntr-un tabel;
- dac se gsesc dou articole:
- se terge al doilea articol gsit, iar datele
corespunztoare lui (mai precis BUCATI) se transfer (se
adun) la articolul rmas (normal, tot n cmpul BUCATI);
- se reface NR_CRT pentru articolele urmtoare
articolului ters (pentru a avea o numerotare succesiv);
- se recalculeaz PRET_TOTAL pentru articolul rmas
i se afieaz articolul (PRET_TOTAL=BUCATI x
PRET_BUC)
Indicaii:
- se memoreaz elementele articolelor/liniilor gsite ntr-un
ir (innd cont c informaiile din ele sunt necesare i
dup tergerea celui de-al doilea articol);
n cazul a dou articole gsite, fiecare cerin se poate rezolva
printr-o comand SQL.
49

Programare Web

3.4.6 Aplicatie exemplu cu operatii multiple


Se consider baza de date MySQL angajati, coninnd
tabela salarii cu urmatoarele cmpuri:
- id integer primary key;
- nume varchar(14);
- salar_brut float;
- impozit float;
- salar_net float;
Se dorete implementarea unei aplicaii care:
- folosete un prim fiier HTML (exempluFinal.html) prin
intermediul cruia se preiau de la tastatura id-ul, numele i
salarul _brut al unui angajat, i sunt transmise valorile acestor
parametri catre un script PHP (exempluFinal.php). n cadrul
scriptului PHP se efectuez urmatoarele operatii:
- inserarea (adugarea) n tabela salarii a informaiilor
primite (ca linie nou);
- realizarea unui update pe tabel pentru calculul
impozitului i a salariului net al angajailor cu
urmtoarele formule:
- impozit=0.16*salar_brut;
- salar_net=salar_brut - impozit;
- afiarea tuturor angajailor existeni n tabel.
Tabela MySQL (considerat a fi inclus n baza de date
angajati) a fost creat cu folosind comanda:
CREATE TABLE salarii(
id integer primary key,
nume VARCHAR (14),
salar_brut FLOAT,
impozit FLOAT,
salar_net FLOAT);
Fiierul exempluFinal.html are urmtorul cod posibil
(fig. 3.14):
<html>

<form method="POST"
action="http://localhost/exempluFinal.php">

<table border=10 align=center


BGCOLOR="Silver">
<td>
Id: <input type="text" name="id"
size="4"><br>
Nume: <input type="text" name="nume"
size="10"><br>
Salar_brut: <input type="text"
name="salar_brut" size="4"><br>
50

Programare Web

<input type="SUBMIT" value="Insert" >


<input type="RESET" value="Reset" >
</td>
</table>
</form>
</html>

Fig. 3.14 Formular HTML pentru preluarea parametrilor de la


tastatur
Fiierul exempluFinal.php are codul urmtor (vezi i
fig.3.15):
<?php
mysql_connect(localhost,root,andreea)
or die (Nu se poate conecta la serverul
MySQL);
mysql_select_db(angajati) or die(Nu se
poate selecta baza de date);

echo<br><br>;

$id=$_POST[id];
$nume=$_POST[nume];
$salar_brut=$_POST[salar_brut];
// COMENZI SQL SUCCESIVE
$query=mysql_query(insert into salarii
(id,nume,salar_brut)
values($id,$nume,$salar_brut));
$query=mysql_query(update salarii set
impozit=0.16*salar_brut,salar_net=sal
ar_brut-impozit where id=$id);
51

Programare Web

$query=mysql_query(select * from
salarii);
$nr_inreg=@mysql_num_rows($query);
if ($nr_inreg>0){
echo <center>;
echo S-au gasit . $nr_inreg .
inregistrari;
echo</center>;
// cap tabel
echo <table border=2 align=center>;
$coln=mysql_num_fields($query);
echo<tr bgcolor=silver>;
for ($i=0; $i<$coln; $i++){
$var=mysql_field_name($query,$i);
echo <th> $var </th>;
}
echo</tr>;
// afiare date
while($row=mysql_fetch_row($query)){
echo<tr>;
foreach ($row as $value){
echo <td>$value</td>;
}
echo</tr>;
}
echo</table>;
}
else{
echo<center>;
echo Nu s-a gasit nici o
inregistrare!!!;
echo</center>;
}
mysql_close();
?>
Rolul acestui exemplu este de a arta c, un singur fiier
script PHP poate conine oricte comenzi SQL sunt necesare
pentru ndeplinirea funcionalitilor dorite. Se poate observa
de asemenea c, comenzi precum UPDATE (sau DELETE) pot
fi uneori folosite pentru realizarea unor modificri/actualizri
ntr-o tablel, fr nici o confirmare prealabil din partea
utilizatorului.

52

Programare Web

Fig. 3.15 Afiarea nregistrrilor gsite


3.4.7 Interogare cu extragerea informaiei dintr-un cmp
BLOB
O situaie mai deosebit de operare cu baze de date
MySQL o constituie interogarea cu extragerea unei imagini
dintr-un cmp de tip BLOB (Binary Large OBject), respectiv
afiarea acelei imagini. Se vor prezenta n continuare dou
soluii care rezolv aceast problem.
Un prim exemplu de script are urmtorul cod PHP:
<?php
// configurare MIME
header("Content-type: image/jpg");
$query="select imagine from tabela2 where
id=1";
mysql_connect("localhost", "root", "")or
die ("nu gasesc serverul MySQL");
// print ("Connected successfully");
// o linie de genul celei anterioare este INTERZISA
// NU SE REALIZEAZA NICI O ALT IEIRE DE ALT
TIP PE ECRAN
mysql_select_db ("ioji")or die ("Nu gasesc
baza");
$result = mysql_query($query);
// Extragere rezultat (binar)
$var=mysql_fetch_row($result);
// Trecere de la tip ir la tip variabila
$var1=$var[0];
print($var1);
// sau direct, print($var[0]);
?>
53

Programare Web

Esenial n acest caz este linia prin care este setat


specificaia MIME (Multipurpose Internet Mail Extension)
pentru afiarea unei imagine JPG. Aceasta nsemn c orice
ieire spre browser, va fi interpretat ca i coninut al unei
imagini jpg, i afiat corespunztor. Dup o astfel de setare,
realizat la nceputul scriptului, nu este permis nici o alt
ieire (de un alt tip) spre afiare la browser. Exemplul
prezentat presupune existena unui cmp imagine de tip
BLOB (sau LONGBLOB), ntr-o tabel referit n program.
Afiarea imaginii extrase din baza de date, se face
printr-o simpl directare spre browser a coninutului variabilei
(print), n care este salvat (n format binary) imaginea
propriu-zis.
n cazul (cel mai probabil) al unei interogri cu parametri,
linia de interogare se modific astfel:
$query="select imagine from tabela2 where
id=$id";
unde, $id este parametrul dup care se face interogarea, iar
id este un cmp identificator din tabel.
n cazul de fa, valoarea parametrului $id se transmite,
fie printr-un formular FORM, fie direct din linia de comand a
browser-ului, printr-un apel cu parametru, de forma (spre
exemplu, pentru o cale dat i un nume al fiierului script PHP
imag1.php):
http://localhost/imag1.php?id=1;
Un al doilea exemplu, folosete un fiier imagine
intermediar (temp1.jpg) n care este extras coninutul binar al
cmpului BLOB:
<?php
$query="select imagine from tabela2 where
id=2";
mysql_connect("localhost", "root", "")or
die ("nu gsesc serverul MySQL");
mysql_select_db ("ioji") or die ("Nu
gsesc baza");
$result = mysql_query($query);
// Verific dac gsete o astfel de nregistrare
if (mysql_num_rows()>0)
{
// mysql_num_rows() returneaz nr. de nregistrri gsite;
$var=mysql_fetch_row($result);
$var1=$var[0];
54

Programare Web

// Deschide un fiier pentru scriere n el


$fp=fopen("temp1.jpg","wb");
// Scrie n fiier
fwrite($fp,$var1);
fclose($fp);
// Afieaz coninutul fiierului ca imagine
echo '<image src="temp1.jpg">';
}
// Dac nu gsete nimic, terge fiierul
else {
unlink("TEMP1.JPG");
// sau
delete("TEMP1.JPG");
}
?>
n acest exemplu, se verific totodat existena unei
nregistrri care corespunde interogrii realizate (structura if).
Dac se gsete o astfel de nregistrare, se salveaz coninutul
cmpului BLOB ntr-un fiier (cu extensia jpg), i se afieaz
practic imaginea stocat de acest fiier. Pentru o nou
interogare reuit, acest fiier va fi suprascris. n caz de
interogare nereuit, fiierul intermediar va fi ters (pentru a
nu se afia ultima imagine gsit).
Verificarea gsirii unei nregistrri care corespunde
condiiei de interogare, este asigurat de funcia:
mysql_num_rows(). Aceast funcie returneaz numrul de
nregistrri gsite/afectate de o comand SQL.
Observaie: Asupra lucrului cu fiiere n PHP se va reveni ntrun paragraf ulterior.
Numrul funciilor PHP pentru lucrul cu baze de date
MySQL este mult mai mare. Prin exemplele prezentate i prin
funciile specifice exemplificate, s-a dorit doar o simpl
introducere n problematica lucrului cu astfel de baze de date.
Pentru mai multe detalii, resursele bibliografice n domeniu
sunt mai mult dect suficiente, n special cele oferite pe
Internet.
3.5 Dezvoltare de aplicaii PHP cu baze de date
Oracle
3.5.1 Interogare fr parametri
Pentru lucrul cu baze de date Oracle se utilizeaz ca
extensie PHP biblioteca php_oci8.dll. Scriptul urmtor
55

Programare Web

prezint o exemplificare a utilizrii ctorva dintre funciile


oferite de aceast bibliotec.
Conectarea la o baz de date Oracle se face utiliznd
funcia PHP OCILogon. Interogarea unei tabele a unei baze de
date Oracle (mai precis n exemplu de fa, tabela ANGAJATI
avnd coloanele ID, NUME, SALAR) se face utiliznd funciile
OCIParse i OCIExecute, fiind apoi extrase i afiate
succesiv pe ecran datele din liniile aceasteia (bucla while cu
OCIFetch). Apoi, n exemplul prezentat, nregistrarile din
tabela angajati sunt adugate ntr-o alt tabel evidenta,
utiliznd comanda SQL INSERT, mpreun cu comenzile
extensie PHP OCIParse i OCIExecute (practic, se face
un transfer al informaiilor din tabela angajati n tabela
evidenta). n final sunt eliberate resursele i este nchis
conexiunea cu baza de date Oracle. Se poate observa c,
procedura de lucru este practic identic cu cea din cazurile
anterioare (MySQL), doar numele funciilor utilizate i sintaxa
lor fiind specifice bibliotecii extensie OCI.
<?php
// Conectare la serverul Oracle (ultimul parametru se
// completeaza doar pentru un server Oracle la distan)
$connection = OCILogon("system",
"manager100","orcl");
// Interogare tabel
$stmt = OCIParse($connection, "SELECT *
FROM angajati");
// Executa comanda SQL
OCIExecute($stmt);
// Pregatirea tabelului pentru afiarea rezultatelor obinute
echo "<table border='4'
align='center'>";
echo "<tr>";
echo "<th>ID</th>";
echo "<th>NUME</th>";
echo "<th>SALAR</th>";
echo "</tr>";
// Bucla pentru extragerea rezultatelor
while(OCIFetch($stmt))
{
$id= OCIResult($stmt, "ID");
$nume= OCIResult($stmt, "NUME");
56

Programare Web

$salar= OCIResult($stmt, "SALAR");


print (" <tr>\n".
" <td>$id</td>\n".
" <td>$nume</td>\n".
" <td>$salar</td>\n".
" </tr>\n");
/ / Pregtete adugarea
$stmt1 = OCIParse($connection,"insert into
evidenta values($id,'$nume','$salar')");
// Executa comanda (adugare)
OCIExecute($stmt1);
}
// Elibereaz resursele i nchide conexiunea
OCIFreeStatement($stmt);
OCIFreeStatement($stmt1);
?>

OCILogoff($connection);

n situatia n care datele adugate sunt i de tip dat


calendaristic (de asemenea, un tip uzual), se va folosi o
funcie de conversie la un format Oracle corespunzator
(TO_DATE). Spre exemplificare:
$stmt1 = OCIParse($connection, "insert
into test values ($id,'$nume',
$salar,TO_DATE('$data','YY-MM-DD'))");
3.5.2 Interogare cu parametri pasai prin auto-apelare
Exemplul urmtor, coninnd o interogare parametrizat,
se caracterizeaza prin aceea c, att formularul de furnizare a
parametrilor, ct i partea de preluare a acestora i realizare a
interogrii, sunt incluse ntr-un acelai script (auto-apelare).
Practic, la un prim apel al scriptului se execut doar o parte a
acestuia, constnd ntr-un formular (FORM) pentru
preluarea/furnizarea unor valori de parametri. Prin apsarea
butonului din formular, se realizeaz o auto-apelare a aceluiai
script spre care este pasat i un parametru, i va fi executat o
alt parte a scriptului (interogarea efectiv fig. 3.16). Aceste
decizii sunt luate printr-o structur PHP if-else, ale crei
seciuni pot include att cod HTML n clar, ct i cod PHP
ncuibat (fiierul avnd n mod obligatoriu extensia .php). O
astfel de structur are forma urmtoare:
57

Programare Web

<?php
if ( condiie )
{
?>
cod HTML i/sau PHP (ncuibat, ncadrat n delimitatori)
<?php
}
else
{
?>
cod HTML i/sau PHP (ncuibat, ncadrat n delimitatori)
<?php
}
?>
Codul surs complet al unui script exemplificativ (cu
auto-apelare) este urmtorul:
<?php
// Secvena care se execut la primul apel al scriptului,
// situaie n care NU a fost nc transmis nc nici
// un parametru de la formular
if (!isset($_GET['nume'])){
?>
<center>
<form action="<?php $PHP_SELF ?>"
method="get">
Nume: <input type="text" name="nume">
<input type="submit" value="GO" />
</form>
</center>
<?php
}
// Secvena care se execut dup furnizarea unui
// parametru de interogare (autoapelare)
else{
?>
<table border="4" align=center>
<tr>
<th>ID</th>
<th>NUME</th>
<th>SALAR</th>
</tr>
<?php
58

Programare Web

$numePreluat=$_GET['nume'];
$connection = OCILogon("system",
"manager100", "orcl");
print ("Connected successfully");
$stmt = OCIParse($connection, "SELECT *
FROM angajati where NUME='$numePreluat'");
OCIExecute($stmt);
while(OCIFetch($stmt)) {
$id= OCIResult($stmt, "ID");
$nume= OCIResult($stmt, "NUME");
$salar= OCIResult($stmt, "SALAR");
print (" <tr>\n".
" <td>$id</td>\n".
" <td>$nume</td>\n".
" <td>$salar</td>\n".
" </tr>\n");
}
?>
</table>
<?php
OCIFreeStatement($stmt);
OCILogoff($connection);
}
?>

Fig. 3.16 Formular interogare (apel fr parametrii)


n cadrul script-ului de mai sus se putea utiliza, ca i
variant alternativ, o structur if-else-end if de forma
urmtoare, oarecum similar cu cea anterioar:
59

Programare Web

<?php if ( condiie ): ?>


cod HTML i/sau PHP (ncuibat, ncadrat n delimitatori)
<?php else: ?>
cod HTML i/sau PHP (ncuibat, ncadrat n delimitatori)
<?php endif; ?>
De remarcat utilizarea n cadrul FORM-ului a unei
variabile PHP speciale ($PHP_SELF), care furnizeaz o
hyper-legatur (link) spre scriptul care conine acest cod
(practic un auto-apel cu transferul unui parametru, lucru
observabil i n caseta Address a browser-ului - fig. 3.16).
Figura 3.17 prezint rezultatul aplicaiei (implementat n
maniera cu auto-apelare).
Observaie: Sintaxa action=<?php $_PHP_SELF ?> din
cadrul scriptului anterior poate fi nlocuit cu sintaxa
action=
sau
action=nume_script.php,
unde
nume_script.php reprezinta numele scriptului curent, care se
auto-apeleaz.
De remarcat de asemenea, funcia isset() care determin
dac unei variabile i s-a atribuit o valoare (a fost setat, deci
exist). n caz afirmativ, funcia returneaza valoarea logica
TRUE, altfel returneaz valoarea FALSE.

Fig.3.17 Rezultate interogare (auto-apel cu parametri)


Exemplul anterior arat c, att partea de cod specific
introducerii de la tastatur a parametrilor, ct i cea de preluare
i utilizare a lor n interogarea SQL efectiv, pot coexista n
cadrul unui aceluiai script PHP, acesta practic putndu-se
auto-apela n mod repetat, reacionnd de fiecare dat n mod
diferit funcie de contextul auto-apelului.

60

Programare Web

3.6 Grafic
PHP-ul dispune un set de funcii extrem de puternice
pentru crearea i manipularea imaginilor, oferind astfel
faciliti deosebite i n domeniul graficii.
Realizarea unor aplicaii grafice cu PHP implic utilizarea
unor biblioteci suplimentare (fisiere .dll). Astfel, n cazul de
fa, a fost necesar utilizarea bibliotecii PHP_GD.DLL,
configurnd
corespunztor
fiierul
php.ini
(extension=php_gd.dll). De regul, formatul imaginilor
manipulate (jpg, gif, png etc) depinde de versiunea bibliotecii
grafice suplimentar utilizate
n cele ce urmeaz, fr a detalia toate cele cteva zeci de
funcii dedicate crerii i manipulrii imaginilor, se va realiza
o trecere n revist a ctorva dintre ele, prin exemplificarea a
dou aplicaii.
O prim aplicaie face apel la cteva funcii privind
crearea/manipularea unei imagini .jpg. Codul complet este
prezentat n continuare, iar efectul rulrii acestui script este
descris n figura 3.18:
<?php
// setare ca fiier extensie activ (n php.ini): php_gd.dll
// creare imagine nou
$im = ImageCreate (500, 100) or die
(Cannot Initialize new GD image stream);
// deschiderea unei imagini existente
//
$im = ImageCreateFromJPEG(leopard.jpg)
//
or die (Cannot Initialize new GD image
stream);
// linia urmtoare nu-i are sensul pentru o imagine surs
dat
$background_color=ImageColorAllocate($im,1
,255,25);
$text_color = ImageColorAllocate ($im,
230, 14, 191);
//ImageString dimensiunea scrisului,- poziia pe orizontal
(pixeli), poziia
//pe vertical (pixeli)
ImageString($im,10,100,35, A Simple Text
String, $text_color);
61

Programare Web

// Salvare imagine prelucrat sau creat i afiare


ImageJpeg ($im,tinta.jpg);
echo <img src=tinta.jpg
>;
// Creare funcie
function LoadJpeg($imagine, $text)
{
$im1 = ImageCreateFromJPEG($imagine)
or die (Cannot Initialize new GD image
stream);
$text_color = ImageColorAllocate ($im1,
23, 14, 191);
ImageString ($im1, 10, 10, 35, $text,
$text_color);
ImageJpeg ($im1,a.jpg);
echo <img src=a.jpg >;
}
// Apel funcie
LoadJpeg(leopard.jpg,Ceva de afisat);
?>

Fig. 3.18 Crearea i afiarea a dou imagini


Practic, n cadrul exemplului prezentat sunt create i
afiate dou imagini, peste fiecare fiind suprascris un text (ir
de caractere).
Prima imagine este creat cu un fundal verde, fr a porni
de la o surs iniial, iar a doua imagine este creat pornind de
la un fiier imagine jpeg ca surs. Ambele imagini astfel create
sunt salvate, iar afiarea lor se face utiliznd eticheta HTML
<img>. Cea de-a doua imagine a fost creat pe baza apelului
unei funcii, necesitnd ca parametrii iniiali fiierul surs jpeg,
respectiv textul de afiat.
62

Programare Web

O a doua aplicaie, puin mai complex, permite


realizarea graficului scalat al unei funcii matematice oarecare.
Codul surs comentat este redat n continuare, iar efectul script
este prezentat n figura 3.19.
<?php
//definire constante (dimensiuni axe)
define(xmax,500);
define(ymax,200);
//creare imagine (se puteau folosi i constantele anterior
definite)
$im=ImageCreate (500, 200)or die (Cannot
Initialize new GD image stream);
//fundal imagine (rgb-galben)
$background_color = ImageColorAllocate ($im, 255, 255, 0);
//culoare axe (verde)
$axe=ImageColorAllocate ($im, 0, 255,
0);
//culoare text (negru)
$text_color = ImageColorAllocate ($im,
0, 0, 0);
//titlu grafic
ImageString ($im, 5, 200, 10, Grafic
test, $text_color);
//trasare axe
imageline($im,0,100,500,100,$axe);
imageline($im,0,0,0,200,$axe);
//afiare text pe axe
ImageString($im, 4, 425, 104, timp [s],
$text_color);
ImageStringup($im, 4, 4, 25, val,
$text_color);
//culoare histograme (albastru)
$abc=imagecolorallocate($im,255,0,0);
//culoare grafic (albastru)
$grafic=imagecolorallocate($im,0,0,255);
//histograme (dreptunghiuri)
imagefilledrectangle($im,200,100,220,140,$
abc);
imagefilledrectangle($im,300,50,320,100,$a
bc);
// coordonate iniiale
$x0=1;
$y0=0;
63

Programare Web

// calcul coordonate grafic i afiare grafic


for($x=1;$x<500;$x+=1)
{
// generare numr aleator ntreg ntr-un interval prestabilit
$a=rand(-30,30);
// calcularea succesiv a coordonatei y a funciei
$y=(2*sin($x)+log($x*10+10))*15-100+$a;
//trasare grafic linie cu linie
if ($x0!=1)
imageline($im,$x0,ymax/2-$y0,$x,ymax/2$y,$grafic);
$x0=$x;
$y0=$y;
}
//salvare imagine ntr-un fiier i afiare
ImageJpeg ($im,tinta.jpg);
echo <img src=tinta.jpg
>;
?>

Fig. 3.19 Graficul unei funcii matematice


Analiznd aplicaia, se poate observa parcurgerea urmtoarelor
etape:
- crearea imaginilor i stabilirea culorii fundalului
(ImageCreate, ImageColorAllocate);
- stabilirea
culori
axelor
i
a
textului
(ImageColorAllocate);
64

Programare Web

- afiarea titlului, trasare axe, scriere text pe axe


(ImageString, ImageLine);
- realizarea unor histograme (exemplificative, fr legtur
cu graficul funciei: ImageFilledRectangle);
- stabilirea culorii graficului (ImageColorAllocate);
- calculul funcie i afiarea prin linii succesive (For,
ImageLine);
- salvare i afiare imagine grafic (ImageJpeg, <img>).
Observaie: Pentru afiarea imaginii graficului, fr o salvare
prealabil ntr-un fiier a acesteia, se poate utiliza n finalul
script-ului o secven de genul:
// setarea tipului coninutului (MIME)
header(Content-type: image/jpeg);
// afiare imagine
@ imagejpeg($im);
//caracterul @ care prefixeaz o funcie, face ca mesajele de
eroare aferente execuiei acelei funcii s nu fie afiate de
browser; eventualele mesaje de eroare pot fi consultate prin
analiza coninutului variabilei globale $php_errormsg.
Exemplele prezentate arat c PHP-ul dispune de
puternice faciliti grafice, permind o manipulare i
prelucrare facil a imaginilor, generarea dinamic a acestora
precum i salvarea lor n cteva formate standard consacrate.
REZUMAT
Se face n continuare o trecere n revist a funciilor grafice
utilizate n exemplele precedente i a altor cteva n plus (n
faa fiecrei funcii este precizat tipul de data/identificator
returnat):
int ImageCreate( ) creeaz o imagine cu dimensiuni
precizate, returnnd un identificator de imagine de tip ntreg
int ImageCreateFromJpeg( ) creeaz o imagine pornind de
la un fiier de tip JPEG (returneaz un identificator ntreg n
caz de succes sau 0 n caz de eec). Pentru alte tipuri de fiiere
imagine: ImageCreateFromGif( ), ImageCreateFromPng( ).

65

Programare Web

Int ImageColorAllocate( ) creeaz un identificator de


culoare pentru o imagine, pe baza paletei RGB, culoare care
poate fi alocat fundalului, unui text etc.
int ImageString( ) insereaz un ir de caractere de o
anumit dimensiune n cadrul imaginii, pe orizontal, la
coordonatele precizate. Identic, ImageStringUp( ) pentru
scriere pe vertical.
Int ImageJPEG( ) afieaz imaginea desemnat printr-un
identificator, sau o salveaz ntr-un fiier specificat n format
JPEG (idem pentru formatele GIF, PNG).
Int ImageLine( ) afieaz un segment de dreapt identificat
de coordonatele a dou puncte, cu o anumit coloare
(ImageDashedLine( ) pentru linii ntrerupte).
Int ImageRectangle( ) deseneaz o forma rectangular.
Int ImagePolygon( ) deseneaz un poligon (coordonatele
precizate printr-un ir)
int ImageArc( ) deseneaz un arc de cerc.
Int ImageSetPixel( ) deseneaz un pixel de o anumit
culoare, la anumite coordonate.
Int ImageFilledRectangle( ) umple cu o anumit culoare o
zon rectangular (identic pentru o zon poligonal:
ImageFilledPolygon( )) .
int ImageDestroy( ) distruge un identificator de imagine i
elibereaz memoria alocat acestuia.
NTREBRI
Scriei un program pentru afiarea graficului funciei
y=sin(x), unde x=010, cu pasul 0.1.
Care este funcia PHP pentru salvarea unui grafic ntr-un
fiier? Comentai.
Care este deosebirea ntre funciile ImageCreate( ) i
ImageCreateFromJpeg( )?
66

Programare Web

Care este condiia de utilizare n PHP a funciilor de


manipulare a imaginilor?
Ce returneaz funcia ImageCreateFromJpeg( ) n caz de
reuit, respectiv eec? Care ar putea fi cauza eecului?
3.7 Funcii pentru lucrul cu fiiere
PHP-ul dispune de un puternic set de funcii dedicat
operaiilor de intrare/ieire cu fiiere: creare/tergere de fiiere,
citire/scriere/adugare n fiiere (att pentru fiiere n format
text, ct i pentru format binar). Exemplul urmtor,
implementnd practic un contor al acceselor realizate de ctre
clieni la scriptul n cauz, ncearc o exemplificare a doar
cteva dintre aceste funcii, considerate ca fiind mai
importante.
<?php
// Declarare nume pentru fiier
$filename = counter.nr;
// Deschidere fiier doar pentru citire (avertisment, dac nu
exist)
$fp = fopen($filename,r);
// Citire din fiier (se citesc 26 bytes)- citire contor existent
$hits = fread($fp,26);
// Incrementare contor (cu forare la tip ntreg)
$hits = (int)$hits+1;
// nchidere fiier
fclose($fp);
// Deschidere fiier doar pentru scriere
$fp = fopen($filename,w);
// Scrie n fiier (suprascriere) sau fputs($theFile, $hits);
$a=fwrite($fp,$hits,26);
echo <p> Sunteti vizitatorul cu nr: ;
echo $hits;
?>
Aplicaia debuteaz prin precizarea unui nume pentru
fiierul (de tip text) care va memora contorul de accese (practic
un numr ntreg, incrementat dup fiecare acces). n exemplul
67

Programare Web

de fa, numele ales pentru acest fiier este counter.nr


($filename=counter.nr;).
n cazul n care localizarea fiierului nu este implicit n
directorul curent, este necesar precizarea cii complete de
localizare a fiierului. Spre exemplu:
$filename=http://localhost/scripts/test/c
ounter.nr;
//sau
$filename =c:\\text\\counter.nr;
Urmeaz apoi deschiderea pentru citire a acestui fiier,
utiliznd funcia fopen(). Fiierul trebui s fie creat anterior,
n caz contrar (adic fiierul nu exist) operaia terminndu-se
printr-un avertisment (warning). Deja s-a fcut apel la o prim
funcie de lucru cu fiiere, cu sintaxa uzual:
int fopen (string filename, string mode);
Funcia returneaz un identificator de tip ntreg. Primul
parametru al funciei este un string reprezentnd numele
fiierului care va fi deschis (putnd include i calea spre
acesta), iar al doilea parametru reprezint modul n care se face
deschiderea fiierului, putnd lua urmtoarele valori:
Tabel 3.2
r
deschidere numai pentru citire, pointerul de fiier fiind
plasat la nceputul fiierului
r+
deschidere pentru citire i scriere, pointerul de fiier fiind
plasat la nceputul fiierului
w
deschidere numai pentru scriere, pointerul de fiier fiind
plasat la nceputul fiierului, iar coninutul iniial al
fiierului este ters; dac fiierul nu exist este creat ca
fiier nou
w+ deschidere pentru citire i scriere, pointerul de fiier fiind
plasat la nceputul fiierului, iar coninutul iniial al
fiierului este ters; dac fiierul nu exist, se ncearc
crearea lui
a
deschidere numai pentru scriere, pointerul de fiier fiind
plasat la sfritul fiierului (practic o operaie de
adugare); dac fiierul nu exist, se ncearc crearea lui
a+
deschidere pentru citire i scriere, pointerul de fiier fiind
plasat la sfritul fiierului (practic o operaie de
adugare); dac fiierul nu exist, se ncearc crearea lui
Acest al doilea parametru poate lua i valoarea b, util
n cazul n care se realizeaz operaii cu fiiere binare. Aceast
68

Programare Web

valoare se utilizeaz n combinaie cu cele precedente. Spre


exemplu, wb semnific scriere ntr-un fiier n format binar.
n continuarea programului se citete contorul existent
ntr-o variabil. Se utilizeaz n acest sens funcia fread ( ) cu
sintaxa:
string fread (int fp, int length)
unde primul parametru reprezint identificatorul fiierului din
care se citete, iar al doilea parametru -numrul de bytes citii.
n cazul de fa, numrul 26 s-a ales pur aleator. Se observ c
funcia returneaz chiar string-ul pe care l citete.
Se realizeaz apoi o incrementare a contorului (mai
precis a coninutului variabilei n care s-a memorat contorul
citit din fiier). De remarcat modul n care se foreaz la tip
ntreg coninutul variabilei ((int)$hits)), operaie care
permite startarea procesului de contorizare fr ca n fiierul
creat s existe o valoare iniial (zero). Dac se dorete o
forare la tipul float, se utilizeaz o construcie de forma
(float)$variabila.
Urmeaz nchiderea fiierului: fclose($fp)(acesta
fiind deschis iniial doar pentru citire). n acest moment se
dispune (ntr-o variabil) de numrul de accesri ale paginii
curente. Ceea ce mai rmne de fcut este o actualizare a
contorului i n fiierul n care acesta este pstrat i eventual, o
afiare a acestuia pe ecran. Pentru aceasta, este necesar o
redeschidere a fiierului, dar de data asta, pentru o operaie de
scriere (mai precis, o operaie de suprascriere):
$fp = fopen($filename,w);
Se scrie variabila contor actualizat n fiier, utiliznd
funcia fwrite() cu sintaxa urmtoare:
int fwrite (int fp, string string
[,int length])
Primul parametru al funciei reprezint identificatorul
fiierului n care se va face scrierea, al doilea parametru irul
de caractere scris, iar ultimul parametru (opional) numrul de
bytes scrii (dac acest numr este mai mare dect lungimea
string-ului de scris, scrierea se oprete cnd se ajunge la finalul
string-ului). n locul funciei fwrite() se putea folosi
funcia fputs(), cu aceeai parametrii i cu o aciune
identic.

69

Programare Web

n finalul scriptului s-a fcut i o afiare pe ecran a


numrului de accese la pagina curent.
n exemplul prezentat s-a realizat o suprascriere a
coninutului fiierului la fiecare accesare a scriptului. Secvena
urmtoare prezint o operaie de adugare a unui text ntr-un
fiier, pe un rnd nou (simbolul \n), rndurile fiind separate
ntre ele printr-o linie liber:
// deschidere pentru scriere (adugare)
$fp = fopen($filename1,a+);
// adugare cu cte un rnd gol
fwrite($fp,\Nadaugat\n,20);
3.8 Alte cteva exemple de aplicaii
3.8.1 Informaii obinute pe baza variabilelor predefinite
de mediu
n exemplul din paragraful anterior s-a realizat o
contorizare a numrului de accese la o pagin Web. O alt
informaie util, referitoare la accesarea unei pagini Web,
rezid din ntrebarea Cine a accesat pagina Web? Acest
cine nsemn mai precis Care este adresa IP a clientului
care s-a conectat la pagina Web curent?.
Pentru a rspunde la aceast ntrebare i nu numai, s
analizm scriptul prezentat n continuare:
<?php
//obinere informaii de mediu
$I=getenv(REMOTE_ADDR);
$j=getenv(SERVER_NAME);
//afiare informaii de mediu
printf( Your IP number is : %s\n,$I);
printf( The server name is : %s\n,$j);
?>
Funcia getenv cu sintaxa:
string getenv (string nume_variabil)
are ca parametru de intrare o variabil predefinit de mediu. n
cazul de fa, cele dou variabile au urmtoarea semnificaie:
REMOTE_ADDR adresa IP a clientului
SERVER_NAME numele serverului
Evident, utilizarea funciei getenv ( ) avnd ca
parametru o variabil predefinit de mediu, are ca rezultat

70

Programare Web

returnarea unui string coninnd nsi informaia asociat


semnificaiei acelei variabile.
Afiarea rezultatelor pentru exemplul considerat s-a
realizat folosind o funcie de afiare formatat: printf().
n cazul de fa %s nsemn c, coninutul variabilei de
afiat va fi tratat i formatat ca un string (\n nsemn deja
cunoscutul linie nou). Alte argumente de formatare posibile
pentru printf(): %d ntreg cu semn n reprezentare
zecimal, %f numr n virgul flotant, %b ntreg n
reprezentare binar etc.
3.8.2 Trimiterea unui e-mail dintr-un script PHP
Realizarea operaiei de trimitere a unui e-mail utiliznd
un script PHP implic n primul rnd existena unei conexiuni
la un server de mail SMTP, urmat de o configurare
corespunztoare a ctorva opiuni din fiierul php.ini.
Presupunnd c, numele serverului SMTP este
aut.utt.ro, iar adresa de e-mail a emitentului este
adm@gigi.ro, configurarea fiierului php.ini implic
urmtoarele (pentru o platforma Win32):
[mail function]
; For Win32 only.
SMTP= aut.utt.ro ; for Win32 only
; For Win32 only.
Sendmail_from= adm@gigi.ro; for Win32 only
n acest moment, totul se rezum la utilizarea funciei
mail(), aa cum se poate observa i n scriptul urmtor:
<?php
$a=mail(vcristi@aut.utt.ro, Acesta e un
subject!!!, Asta este continutul);
echo $a.\n;
//\n pune un spatiu; 1- pt. Reuit, 0 pt. Nereuit
?>
n exemplul prezentat, s-a utilizat o form sintactic
redus a funciei mail(), avnd doar 3 argumente de intrare:
adresa destinatarului, subjectul mail-ului, coninutul propriuzis. Funcia returneaz 1 n caz de reuit, respectiv 0 n caz
de nereuit.
3.8.3 Informaii asupra datei i timpului curent

71

Programare Web

Sunt prezentate cteva funcii utile pentru obinerea datei


i timpului curent al sistemului (time( ), strftime( ), getdate( ))
i de asemenea, pentru formatarea afirii: strtoupper( ),
strtolower( ). Codul surs al unui exemplu de utilizare este
urmtorul:
<?php
$date=strftime(%Y%m%d,time());
//data curent ca string
// funcia strftime( ) convertete timpul curent ntr-o dat
formatat
echo timpul ca string: .time().<hr>;
//timp (ca numr ntreg)
echo Data ca string an, luna, zi:
.$date.<br>;
$data1=getdate(time());
//data ca ir (array)
echo Data formatata:
.$data1[mday].\n;
echo $data1[mon].\n;
echo $data1[year].\n.<hr>;
// funcia strftime( ) convertete timpul curent ntr-un timp
formatat
$time=strftime(%H%M,time());
$time1=$time/100;
echo Timpul (ora, minut):
.$time1.\n.<hr>;
$var=Date:
.$data1[mday]...$data1[mon]..
.$data1[year]. .Time:
.$time1..;
print ($var.<br>);
// afiare
// funcia strtoupper( ) face conversie la caractere mari
echo <strong>.strtoupper($var); // afiare
?>
Figura 3.20 este elocvent asupra efectului fiecrei
funcii utilizate.
Funcia time( ) returneaz timpul n secunde, scurs de la
nceputul Epocii Unix (1 Ian. 1970). Funcia este util, prin
utilizarea mpreun cu alte funcii, pentru determinarea datei
sau timpului curent.
72

Programare Web

Fig.3.20 Rezultate ale informrii asupra datei i timpului


Funcia strftime( ) formateaz timpul/data, conform unui
ablon dat ca argument, returnnd un string, pe baza
informaiei furnizate de time( ).
Funcia getdate( ) returneaz un ir cu data sau timpul,
ntr-o afiare formatat.
Funciile strtoupper( ), strtolower( ) realizeaz o
conversie a unui ir de caractere (furnizat ca argument) la
caractere mari, respectiv mici.
3.8.4 Transfer de fiiere prin UPLOAD
PHP este capabil s recepioneze fiiere asupra crora s-a
realizat o operaie de upload de ctre un browser client (minim
Netscape 3, Explorer 3). Aceast caracteristic permite
clienilor s realizeze upload-uri asupra fiierelor text sau
binare.
Upload este operaia invers a download-ului. Dac prin
download se pot descrca (transfera) fiiere de pe server pe un
host client, prin upload se poate realiza un transfer n sens
invers: de pe un computer client pe hostul server (cu condiia
ca drepturile de scriere pe server sa permit acest lucru.
Un ecran pentru realizarea unui upload de fiier, poate fi
realizat printr-un FORM special cu structura urmtoare (spre
exemplu):
<FORM ENCTYPE=multipart/form-data
ACTION=upload.php METHOD=POST>
<INPUT TYPE=hidden name=MAX_FILE_SIZE
value=1000000>
73

Programare Web

Send this file: <INPUT NAME=userfile


TYPE=file>
<INPUT TYPE=submit VALUE=Send File>
</FORM>
Parametrul MAX_FILE_SIZE are doar o valoare
informativ pentru browser (limita fiind impus de setrile
browser-ului). De remarcat tipul special de FORM folosit,
precum i tipul file folosit pentru una din casetele INPUT.
Efectul acestui FORM pe ecran este prezentat n figura 3.21.
Urmtoarele nume de variabile sunt definite i se
presupun a fi utilizate n legtur direct cu numele userfile
al fiierului de upload-uit din exemplul iniiat:
-$userfile numele fiierului temporar n care fiierul de
transferat este stocat pe server (acelai cu cel al casetei INPUT
de tip FILE)
-$userfile_name numele original, inclusiv calea spre fiierul
de pe sistemul transmitor
-$userfile_size dimensiunea fiierului de transferat n bytes
-$userfile_type - tipul MIME al fiierului, dac browserul
ofer aceast informaie (spre exemplu image/gif).

Fig. 3.21 Formular FORM pentru upload


n acest caz (legat direct de exemplul dat), coninutul
variabilei sistem $HTTP_POST_FILES este urmtorul:
$HTTP_POST_FILES[userfile][name]- numele
original al fiierului pe maina client

74

Programare Web

$HTTP_POST_FILES[userfile][type](MIME) al fiierului

tipul

$HTTP_POST_FILES[userfile][size]dimensiunea fiierului upload n bytes


$HTTP_POST_FILES[userfile][tmp_name]numele temporar al fiierului n care este transferat i stocat pe
server
Fiierele sunt stocate implicit n directorul temporar
implicit al serverului (dac nu este precizat un alt director
temporar al PHP-ului, prin fiierul de configurare php.ini).
Iat un exemplu concret (n dou variante):
- prima variant:
<?php
// verificarea operaie upload valid
if(is_uploaded_file($HTTP_POST_FILES[user
file][tmp_name]))
{
// transfer efectiv
copy($HTTP_POST_FILES[userfile][tmp_nam
e],
c:\\php\\loaded\\.$HTTP_POST_FILES[user
file][name]);
echo OK upload valid;
}
else
{
echo operaie euata;
}
?>
- a doua variant:
<?php
// upload direct
move_uploaded_file($HTTP_POST_FILES[userf
ile][tmp_name],
c:\\php\\loaded\\.$HTTP_POST_FILES[user
file][name]);
?>
n prima variant, funcia is_uploaded_file() cu
sintaxa:
bool is_uploaded_file (string filename)
75

Programare Web

returneaz TRUE dac fiierul filename a fost transferat printro operaie valid de upload via HTTP POST.
Funcia COPY realizeaz un transfer al fiierului
temporar upload-uit la o locaie dorit.
n a doua variant, funcia move_uploaded_file()
cu sintaxa:
bool move_uploaded_file (string filename,
string destination)
nglobeaz ambele operaii executate n varianta unu, fcnd i
verificarea anterior menionat, i transferul la o locaie dorit.
Dac verificarea de upload nu este valid (FALSE), nici o
aciune nu este efectuat.
3.8.5 Comenzile urlencode i urldecode
Comenzile urlencode i urldecode sunt utilizate pentru
pasarea unor parametrii al caror continut include mai multe
cuvinte (i deci implicit spaii). n cadrul coninutului unui
asemenea parametru, utiliznd urlencode, spaiile vor fi
inlocuite cu semnul +, specific construciei unui ir URL
(Uniform Resource Locator).
Spre exemplificare, fie scriptul urmtor cu numele a.php:
<?php
echo $produsa;
$produsa1=urlencode($produsa);
echo "<form name='myform' method='post'
action='b.php'>";
echo "<input type='text' name='produs'
value=$produsa>";
echo "<input type='text' name='produs1'
value=$produsa1>";
echo "<input type='SUBMIT' value='Validez
selectiile' >";
echo "</form>";
?>
Un apel al acestui script (i o apsare a butonului
SUBMIT), din linia de comanda a browser-ului, cu un
parametru de forma unui string format din mai multe cuvinte:
a.php?produsa=un sir ceva mai lung
va avea efectul din figura 3.22. Se poate observa o trunchiere a
valorii parametrului transmisa spre prima caseta de tip input, n

76

Programare Web

timp ce a doua caset conine irul ntreg (cu semnul + ntre


cuvintele distincte)

Fig. 3.22 Transfer parametri


O afiare a valorilor pasate i prelucrate de un script
int b.php (apelat n cadrul formularului form din cadrul
scriptului anterior):
<?php
echo 1 .$produs;
echo "<p>";
echo 2 .$produs1;
echo "<p>";
$produs1=urldecode($produs1);
echo 3 .$produs1;
?>
are urmtorul rezultat:
1 un
2 un+sir+ceva+mai+lung
3 un sir ceva mai lung
Se poate observa ca functia urldecode permite o refacere
exact a irului (string-ului) iniial i preluarea coninutului
exact al parametrului astfel transmis.
3.8.6 Variabile cu nume construite dinamic
Variabilele cu nume construite dinamic sunt utile n
special n cazul n care este necesar utilizarea unui numar
mare, variabil, necunoscut apriori, de variabile, ca soluie
alternativ la utilizarea irurilor.
77

Programare Web

Exemplu:
$fluctuant=5;
for ($i=1;$i<$fluctuant;$i++)
{
$var="var".$i;
// nume variabile (var1, var2, ,var5)
$$var=$i;
// atribuire valori ($var1=1, $var2=2,)
echo $$var."=";
// referire si afisare continut atribuit
variabilelor
echo $var."<p>";
// referire si afisare nume variabile
}
3.8.7 Instrucia empty i eticheta checkbox
Eticheta checkbox permite selectarea (bifarea) sau nu a
unei anumite casete de selecie (careia i se ataeaz o anumit
valoare). Lucrul cu o astfel de etichet implica utilizarea unei
casete de tip input, al carei tip este precizat ca fiind checkbox.
Dac caseta respectiv este bifat, variabilei cu numele
precizat de parametru name i se atribuie valoarea parametrului
value. Dac nu, variabila cu numele dat de parametrul name nu
este creat. Spre exemplificare, se consider scriptul urmtor
care utilizeaz, ntr-un form, o astfel de caset de selectie
checkbox (fig.3.23).
<?php
echo "<form name='myform' method='post'
action='a.php'>";
echo "Selecteaza:<input type='checkbox'
name='check' value='id' >";
echo "<input type='SUBMIT' value='Validez
selectiile' >";
echo "<form>";
?>
Observaie: Dac se utilizeaz i atributul checked, linia 3 a
scriptului fiind de forma:
echo "Selecteaza:<input type='checkbox'
name='check' value='id' checked >";
checkbox-ul este implicit selectat (bifat)

78

Programare Web

Fig. 3.23 Caset CHECKBOX


Formularul astfel construit, trimite - n caz de selectie
(bifare) a casetei checkbox - variabila $check=id
(name=check, value=id) spre un alt script. Ce se ntmpl n
caz de neselectare a casetei? Scriptul urmtor arat modul n
care poate fi interpretat rezultatul aciunii asupra unei casete
checkbox (selecie sau neselectie). n script apare instrucia
empty care permite o verificare practic a selectrii sau nu a
casetei de tip checkbox. Comanda empty verific dac o
variabil este setat (deci exist), iar funcie de aceast
verificare, se poate afla dac respectiva caset de selecie a fost
bifat sau nu.
<?php
echo $check;
if (empty($check))
echo "Variabila nu este setata <br>"; //
No Warning
?>
REZUMAT
Funcii uzuale pentru lucrul cu fiiere:
int fopen (string filename, string mode)deschidere fiier
string fread (int fp, int length)- citire dintrun fiier
int fwrite (int fp, string string [,int
length]) scriere ntr-un fiier.
Funcia getenv cu sintaxa:
string getenv (string varname)
permite obinerea de informaii pe baza variabilelor de mediu
predefinite.
79

Programare Web

Pentru afiarea formatat a unei informaii: printf().


Trimiterea unui e-mail implic utilizarea funciei mail() cu
sintaxa minimal:
bool
mail
(string
adresa_destinatar,
string subject, string message)
Cu ajutorul funciilor time( ), strftime( ),
getdate( ) se pot obtine informaii asupra date i orei
curente.
Printr-un download se pot descrca (transfera) fiiere de pe
server pe un host client, iar prin upload se poate realiza un
transfer n sens invers: de pe un computer client pe hostul
server
Realizarea unei operatii de upload implic utilizarea funciilor
is_uploaded_file()
i
copy(),
sau
move_uploaded_file. Transferul se realizeaz pe baza
variabilei sistem $HTTP_POST_FILES.
NTREBRI
S se scrie o aplicaie care s preia o informaie (text)
introdus pe baza unui formular de la tastatur i o
memoreaz ntr-un fiier (adugnd-o la coninutul acestuia).
S se scrie un script PHP care permite salvarea automat
ntr-un fiier a adreselor de IP ale tuturor clienilor care
acceseaz pagina.
Dezvoltai aplicaia anterioar astfel nct, la fiecare acces
din partea unui client, adresa lui de IP s fie trimis printr-un
mail la o adres de e-mail prestabilit.
Care este efectul unei operaii upload n cazul n care, att
clientul ct i serverul, sunt gzduite de un acelai calculator
(cu platform Windows)?

3.9 Lucrul cu sesiuni (session)

80

Programare Web

Crearea unei sesiuni (sesiune client n componenta de


fa) este asigurat de ctre limbajul PHP prin utilizarea n
cadrul unui script a unui aa numit mecanism SESSION,
startat printr-o linie de program (spre exemplu) de forma:
session_register ("global");
Ce nseamna modul de lucru sesiune i care este
utilitatea lui? Dou ntrebri eseniale, la care se va ncerca un
rspuns n continuare. n momentul executrii liniei de cod
session_register("global"), interpretorul PHP
starteaza o sesiune de lucru valabil pentru clientul Web
curent, att timp ct acesta nu inchide browser-ul din care a
apelat respectivul script coninnd aceast linie de cod (sau
dac setarile interpretorului PHP privind o anumit durat de
via pentru o sesiune de lucru, atta timp ct este prevazut
aceast durat de via). Fizic, startarea unei sesiuni nsemn
crearea unui fiier sesiune (implicit n directorul
PHP\SESSIONDATA sau WAMP\TMP), cu un nume aleator,
unic, pentru fiecare sesiune pornit, spre exemplificare de
forma: sess_1b308801f20323d7713880f389f2489e
n cadrul comenzii session_register, parametrul
cu numele (n cazul particular de fa) global este practic o
variabil (sau ir, tablou etc.) ale crei/crui valori (initializate
prin comenzi PHP uzuale) sunt vizibile i deci apelabile /
utilizabile n orice alt script referit de browser pe parcursul
sesiunii de lucru. Cu alte cuvinte, coninutul acestei variabile
(de regul ir sau tablou monodimensional sau bidimensional)
devine public pentru orice script apelat pe parcursul duratei de
via a sesiunii, cu condiia ca fiecare un astfel de script sa
contina, obligatoriu la inceputul codului lui, linia de cod
session_register("global").
O sesiune de lucru se incheie in momentul inchiderii
browser-ului
sau
prin
cod
program
(comanda
session_destroy()). La oprirea browser-ului, datele din
fiierul sesiune ramn stocate n acesta, iar o ncheiere prin cod
program a sesiunii conduce la tergerea fiierul sesiune.
Exemplu: Fie urmtoarele dou fiiere script PHP, prezentate
n tabelul 3.3. Primul script starteaz o sesiune, crendu-se un
fisier sesiune cu numele specificat, in care se va memora
continutul unei variabile $var (atribuit explicit ulterior startarii
sesiunii in cadrul scriptului). In acest moment, fisierul sesiune
va contine (vezi tabelul anterior): numele variabilei (var),
81

Programare Web

tipul si lungimea continutului (s:4) string 4 -, precum si


continut efectiv: stringul ceva.
In scriptul a.php este prevazut un hypelink catre un al doilea
script b.php, in care, sesiunea fiind in continuare activa (
comanda session_register("var")), se asigura
disponibilitatea continutului variabile $var (care de altfel este
si afisat pe ecran).
Tabel 3.3
Script a.php
Script b.php
<?php
session_register("var");
$var="ceva";
echo "<a href='b.php'>mai
departe";
?>

<?php
session_register("var");
echo $var;
echo "<a
href='a.php'>back";
session_destroy();
?>

Nume fiier sesiune:


sess_1b308801f20323d7713880f389f2489e
Coninutul fiierului sesiune:
var|s:4:"ceva";
La finalul scriptului b.php sesiunea este distrus,
fiierul sesiune fiind ters, prin utilizarea comenzii
session_destroy(). De asemenea, n al doilea script este
prevazut un hyperlink de revenire spre scriptul apelant (a.php),
care restarteaz aceeasi sesiune (creind un fisier sesiune cu
acelasi nume!) i ntreg procesul se reia nc o dat. Cu alte
cuvinte, cele doua scripturi implementeaza o bucla repetitiva
de (re)creare/distrugere succesiva a unei sesiuni.
Mentinerea disponibilitatii si accesabilitatii unor
informatii (date utile) pe toata durata navigarii prin mai multe
pagini Web constituind o aplicatie unitara (in diverse scopuri
particularizate la specificul aplicatiei) constituie principalul
beneficiu conferit de lucrul cu sesiuni.
Observatie: Transferul de parametrii de la un script spre altul,
n vederea asigurrii disponibilitii acelor parametrii n mai
multe pagini Web, se poate realiza i utilizind casete de tip
INPUT cu atributul type=hidden. Metoda este eficient
atunci cnd trebuie transferat un numr fix, redus, de
parametrii, dar devine greoaie atunci cnd numrul
parametrilor de transferat crete.
O alt tehnic de lucru cu sesiuni, care se poate folosi n
versiunile mai noi de PHP (ulterioare versiunii 4.0), implic
utilizarea unor variabile de tip $_SESSION[]. Un posibil
scenariu de folosire a acestei tehnici presupune urmtoarele:
82

Programare Web

- pentru deschiderea unei noi sesiuni PHP, scriptul


trebuie s nceap cu apelarea functiei
session_start(). Aceasta funcie verific, mai nti,
dac exist un identificator (ID) de sesiune. Dac nu
exista, se va crea unul, i astfel se va deschide o nou
sesiune. Dac exist, atunci funcia ncarc
variabilele de sesiune nregistrate pe server, ele fiind
astfel gata de utilizare. Atunci cnd se lucreaz cu
sesiuni, trebuie apelat aceasta funcie la inceputul
tuturor scripturilor care folosesc sesiunea n cauz.
- variabilele de sesiune sunt stocate n tabloul
superglobal numit $_SESSION[], n versiunile de
anterioare de PHP numit $HTTP_SESSION_VARS[].
- variabilele de sesiune sunt urmarite i pot fi folosite
pn la tergerea lor voluntar sau pn la ncheierea
sesiunii.
- pentru a crea o variabil de sesiune trebuie s se
introduc un element n tabloul $_SESSION[] (se
consider c se lucreaz cu o versiune mai nou de
PHP, n care se utilizeaza tabloul $_SESSION[]):
$_SESSION[variabila_noua]=10;
- pentru a vedea dac o anumit variabil este
nregistrat ca variabil de sesiune n acest tablou, se
foloseste functia isset() care returneaz true sau false,
ca n exemplul urmtor:
if(isset ( $_SESSION[variabila_noua]))... n
funcie de valoarea logic a condiiei scrise cu
funcia isset(), execuia programului urmeaz o
cale sau alt.
Pentru exemplificare, se prezint o rescriere a
scripturilor anterioare, utiliznd aceast nou tehnic de
operare cu sesiuni (tabel 3.4):
Tabel 3.4
Script a.php
Script b.php
<?php
session_start();
$_SESSION[var]="ceva";
echo "<a href='b.php'>mai
departe";
?>

<?php
session_start();
$var=$_SESSION[var];
echo $var;
session_destroy();
?>

3.10 Programare PHP orientat pe obiecte


83

Programare Web

Programarea orientata pe obiecte (OOP Object Oriented


Programming) a aprut ca o necesitate n contextul creterii
complexitii codului aplicaiilor software. Pentru aplicaiile
de mari dimensiuni, o dezvoltare structurat a codului
(orientat pe funcii/proceduri) implicnd existena unui numr
foarte mare de linii de cod (uneori puternic redundant), prin
modul de organizare a codului conduce la o lizibilitate
sczuta a acestuia i implicit, la mari dificulti privind
realizarea unor modificri ulterioare n cadrul aplicaiei.
OOP ofer o modalitate diferit de organizare a codului
i a datelor n cadrul unui program.
Din acest punct de vedere, elementele constructive de cod
specifice OOP sunt clasa, respectiv obiectul. Clasa reprezint
definiia unui obiect (planul obiectului). Prin instanierea
unei clase este creat un obiect (evident se pot face instanieri
multiple, construindu-se mai multe obiecte ale aceleiai clase).
n cadrul clasei (definiia obiectului) sunt precizate
- atribute sau proprieti (practic partea de date a
obiectului) reprezentate prin declaratii de variabile,
inclusiv posibile initializari ale acestora;
- metode (partea de cod a obiectului) reprezentate prin
funcii (sau proceduri) constituind totodat i interfaa
obiectului destinata manipulrii datelor acestuia.
OOP este fundamentat pe 3 principii de baz:
- ncapsulare fiecare obiect este de sine stttor i
complet autonom (coninnd att date -proprieti-, ct
i cod metode). Un obiect are o interfaa clar, bine
definit, folosit pentru a manipula obiectul;
- motenire;
- polimorfism.
Asupra ultimelor dou se va reveni n contextul
programrii n PHP (existnd cteva particulariti specifice
acestuia). Particularizat la PHP, n continuare sunt tratate
urmtoarele aspecte:
- Crearea unei clase (proprieti, metode)
- Crearea unui obiect (instanierea clasei)
- Utilizarea proprietilor obiectului
- Apelul metodelor obiectului
- Motenirea
- Polimorfismul
n limbajul PHP, crearea unei clase se face utiliznd
instruciunea class. O definire minimala a unei clase, este
prezentata mai jos:
84

Programare Web

class denumire_clasa {
}
n vederea atribuirii unei funcionaliti clasei. este
necesar definirea unor proprieti i metode. Proprietile se
creeaz prin declararea unor variabilelor la nceputul definiiei
unei clase folosind instruciunea var. Urmtoarea secven
PHP creeaz o clas denumit Clasa1 avnd dou atribute
(proprieti): $message, $data (ultimul fiind i iniializat).
class Clasa1 {
var $message;
var $data=initializat;
}
Metodele se creeaz prin declararea unor funcii PHP n
definiia clasei. Codul urmtor va crea (pentru clasa Clasa1)
doua metode:
- metoda setMessage, avnd un parametru de intrare
($param) i permind o setare a valorii proprietii
$message. De remarcat c, n cadrul definiiei clasei,
referirea unei proprieti a acesteia se face folosind
operatorul $this care precede numele proprietii (nume
utilizat fr $ n fa). n cazul de fata: $this->message.
- metoda getMessage, fr parametrii de intrare, care
afieaz un mesaj, respectiv returneaz valoarea
proprietii $message.
<?php
class Clasa1
{
var $message;
var $data=initializat;
function setMessage($param)
{
$this->message = $param;
}
function getMessage()
{
echo "Mesajul pentru obiectul 1 este:<br>";
return $this->message;
}
}
// cod
?>
85

Programare Web

Evident s-a inclus codul n tag-urile de delimitare


specifice PHP. Dup ce a fost creata clasa, n continuare se
prezint modul de instaniere a clasei n vederea crerii unui
obiect, precum i modul de setare a proprietilor acestuia i de
apel al metodelor (prin completarea secvenei anterioare, dup
ncheierea definiiei clasei):
$Obiect1 =new Clasa1();
$Obiect1->setMessage("Setarea proprietate folosind o
metoda");
echo $Obiect1->getMessage();
$var=$Obiect1->getMessage();
echo $var;
$Obiect1->message="Setare directa a proprietatii printr-o
atribuire ";
echo $Obiect1->getMessage();
echo $Obiect1->data;
Rezultatul rulrii scriptului este urmtorul:
Mesajul pentru obiectul 1 este:
Setarea proprietate folosind o metoda
Mesajul pentru obiectul 1 este:
Setarea proprietate folosind o metoda:
Mesajul pentru obiectul 1 este:
Setare directa a proprietatii printr-o atribuire
initializat
Ulterior declarrii unei clase, este necesara crearea un
obiect cu care acesta sa opereze. Operaia este denumita
instanierea unei clase sau crearea unei instane. In limbajul
PHP pentru aceasta operaie, se utilizeaz instruciunea,
cuvntul cheie new.
- Deci prima linie din secvena de cod anterioara creeaz
un nou obiect Obiect1 prin instanierea clasei Clasa1.
- n continuarea se face un apel al metodei setMessage
($Obiect1->setMessage) pasndu-i un parametru, metoda care
permite setarea proprietii message. Linia urmtoare apeleaz
metoda getMessage (fr parametrii), care afieaz un mesaj i
returneaz o valoare (a proprietii message, afiat pe ecran
folosind echo).
86

Programare Web

- Valoarea returnat putea fi evident memorat ntr-o


variabil ($var n cazul de fa).
- n acest caz, setarea proprietii message a fost
realizat prin apelul unei metode. Setarea unei proprieti a
unui obiect se poate face i prin atribuirea direct a unei valori
ctre proprietatea referit ($Obiect1->message="Setare directa
a proprietatii) sau chiar printr-o iniializare n definiia clasei
(vezi proprietatea $data). Toate comenzile de afiare (echo) au
fost utilizate doar pentru a evidenia modul de referire a
atributelor/metodelor obiectului.
Observaie: n cazul limbajul PHP nu se limiteaz accesul la
proprieti. Implicit toate proprietile sunt de tip public,
neputnd fi declarate private sau protected. Orice proprietate
declarat n definiia clasei poate fi referit n exteriorul ei
printr-o construcie de tipul:
$Obiect->nume_proprietate;
O metod special a unei clase este aa numita metoda
constructor. O metoda constructor are acelai nume cu al
clasei, fiind apelata automat la crearea unui obiect (realiznd
operaii de iniializare, crearea de alte obiecte necesare
obiectului n cauza etc.). Un constructor se declara similar cu
celelalte metode, singura deosebire fiind ca are acelai nume
ca i clasa. In PHP definirea unei metode constructor nu este
obligatorie. Clasa anterior creata nu avea definit un constructor
(unele proprieti fiind ns iniializare direct odat cu
declararea lor).
Pentru exemplificare, se va crea un constructor pentru
Clasa1, care va afia un mesaj i va iniializa proprietatea
$message. Definiia anterioara a clasei se va completa cu nc
o metod (avnd acelai nume cu al clasei):
function Clasa1()
{
echo "Obiect creat<br>";
$this->message = "initializare_obiect1";
}
O simpl secven de creare a obiectului va apela
imediat metoda constructor:
$Obiect1 =new Clasa1();
echo $Obiect1->data;
iar rezultatul va fi:
Obiect creat
initializare_obiect1
87

Programare Web

Pentru ca o clasa deja creat s poate fi instaniat n


mai multe scripturi PHP, fr a se face o replicare (copiere) a
codului clasei n fiecare script, de regul definiiile claselor
sunt pstrate n fiiere distincte de cele n care sunt create
obiectele. Pentru cazul de fata, spre exemplu, intr-un fiier
clase.php este salvat definiia clasei, n timp ce ntr-un alt
fiier PHP (obiect.php spre exemplu) se face instanierea clasei
(i utilizarea obiectului):
<?php
// fiier obiect.php
include("clase.php");
$Obiect1 =new Clasa1();
echo $Obiect1->data;
?>
Evident fiierul clase.php poate conine definiiile mai
multor clase.
O caracteristic important a OOP o reprezint
motenirea care permite crearea unei relaii ierarhice ntre
clase, folosind subclase. O subclasa, practic motenete
proprietile i metodele unei superclase. Prin intermediul
motenirii, pe lng elementele motenite (proprieti i
metode), n cadrul noii clase se pot construi i aduga noi
elemente (proprieti sau metode). Astfel, pornind de la clase
de baza simple se pot deriva clase mai complexe i mai
specializate pentru o anumit aplicaie. Utilizarea motenirii
crete gradul de reutilizare i lizibililtate al codului surs,
avantaj important al OOP (reducndu-se substanial munca
programatorului n cazul n care aceleai metode pot fi scrise
doar o singura data ntr-o superclas, n loc sa fie scrise de mai
multe ori n subclase separate). Pe baza superclasei Clasa1 (in
acelai fiier script), se construiete prin derivarea acesteia o
noua subclasa Clasa2 (utiliznd cuvntul cheie extends), care
motenete toate proprietile i metodele superclasei, dar n
acelai timp are i alte noi proprieti i metode:
class Clasa2 extends Clasa1
{
var $message2="gama";
function getMessage()
{
echo "mesajul nou pentru obiectul 2 este<br>";
return $this->message2;
}
88

Programare Web

function plus()
{
echo "<br>ceva nou<br>";
}
}
De remarcat c, n cadrul subclasei Clasa2 se definete o
metoda avnd un nume similar cu al unei metode din
superclasa (getMessage), realizndu-se n cadrul subclasei o
suprascriere a metodei motenite, precum i o noua metoda
(plus). De asemenea noua clasa are i o proprietate n plus
($message1).
O secven de instaniere i utilizare a obiectelor
subclasei:
$Obiect2 =new Clasa2();
$Obiect2->plus();
$Obiect2->setMessage("beta");
echo $Obiect2->message."<br>";
echo $Obiect2->getMessage();
are rezultatul urmtor:
Obiect creat
ceva nou
beta
mesajul nou pentru obiectul 2 este
gama
Crearea obiectului prin instanierea subclasei Clasa2
conduce i la motenirea constructorului corespunztor
(afindu-se Obiect creat). Apelul metodei plus conduce la
afiarea mesajului ceva nou. Apelul metodei motenite
setMessage permite setarea proprietii motenite message.
Apelul metodei suprascrise getMessage (plasat ntr-un echo),
conduce la afiarea ultimelor dou rnduri.
Observaie: Mecanismul de motenire funcioneaz ntr-un
singur sens, subclasa (copil) motenete de la superclasa
(printe). Orice modificare a clasei printe este automat
preluat i de clasa copil.
O alt caracteristic important a OOP o reprezint
polimorfismul, prin intermediul cruia clase diferite pot
conine metode cu acelai nume, dar cu comportamente
diferite. Chiar n exemplul cu motenire, superclasa respectiv
subclasa conin metode cu acelai nume (getMessage) dar
89

Programare Web

funcionaliti diferite. Se consider nc un exemplu, n


acelai script cu definiia clasei Clasa1, fie definiia unei clase
Clasa3:
class Clasa3 {
var $message;
function setMessage($param)
{
$this->message = $param;
echo "Clasa 3";
return $this->message;
}
}
La o instaniere a claselor i folosire a obiectelor create:
$Obiect1 =new Clasa1();
$Obiect3 =new Clasa3();
$Obiect1->setMessage("Setarea proprietate folosind o
metoda:");
echo $Obiect1->getMessage();
$Obiect3->setMessage("Setarea proprietate clasei 3");
rezultatele sunt:
Obiect creat
Mesajul pentru obiectul 1 este:
Setarea proprietate folosind o metoda:
Clasa 3
Observaie: n PHP 4 nu este permis suprancrcarea
metodelor (suprancrcare overload- o aceeai metod avnd
n cadrul aceleai clase definiii multiple, fiecare cu un numr
diferit de parametrii de intrare). n PHP 5 este introdus
experimental o funcie overload() pentru a putea beneficia de
acest avantaj.
REZUMAT
n limbajul PHP, crearea unei clase se face utiliznd
instruciunea class. O definire minimala a unei clase, este
prezentata mai jos:
class denumire_clasa {
}

90

Programare Web

Orice proprietate declarat n definiia clasei poate fi referita


n exteriorul ei printr-o construcie de tipul:
$Obiect->nume_proprietate;
Instanierea unei clase n vederea crerii unui obiect:
$Obiect1 =new Clasa1();
NTREBRI
S se scrie o aplicaie PHP n care se creeze o clas care
permite conectarea la o anumit baz de date MySQL,
permind precizarea (prin setare unor proprieti) a locaiei
serverului, user-ului, parolei i numelui bazei de date. Dai un
exemplu de instaniere a ei (crearea unui obiect) i utilizare
ntr-o aplicaie cu o tabel MySQL.

91

Programare Web

BIBLIOGRAFIE
1. Stig Sther Bakke, Alexander Aulbach s.a. PHP
Manual, Copyright
2001, PHP Documentation Group
(http://www.php.net/docs.php)
2. Peter Belesis, Arman Danesh s.a. Dynamic HTML,
Copyright 1998, Sams.net Publishing, Indianapolis, USA
3. http://www.mysql.com
4. http://www.php.net
5. http://www.en.wampserver.com/
6. Kris Jamsa, Ken Cope -"Programarea aplicatiilor Internet",
Editura All Educational SA 1998, Bucuresti
7. Louis Kahn, Laura Logan - "Build Your Own Web Site",
Microsoft Press 1996.
8. MySQL Reference Manual, Copyright 2001 MySQL AB
9. Kevin Yank - Build Your Own Database Driven Web Site
Using PHP & MySQL, Copyright 2002 SitePoint Pty.
Ltd., USA, (www.sitepoint.com)

92