CAP. III PROGRAMARE WEB UTILIZÂND LIMBAJUL PHP …………………………………………………..2 3.1 Limbajul PHP – preliminarii… [631527]
Programare Web
1
CUPRINS
CAP. III PROGRAMARE WEB UTILIZÂND
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 aplica ții PHP cu baze de date MySQL …………………11
3.4.1 Interogare f ără parametrii a unei baze de date ……………………………..14
3.4.2 Interogare cu parametrii a unei tabele a bazei de date …………………..23
3.4.3 Adăugare î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 înregistr ări dintr-o tabel ă a bazei de date……………43
3.4.6 Aplicatie exemplu cu operatii multiple……………………………………….50 3.4.7 Interogare cu extragerea informa ției dintr-un câmp BLOB ……………53
3.5 Dezvoltare de aplica ții PHP cu baze de date Oracle …………………..55
3.5.1 Interogare f ără parametri…………………………………………………………..55
3.5.2 Interogare cu parametri pasa ți prin auto-apelare…………………………..57
3.6 Grafic ă………………………………………………………………………………………..61
3.7 Func ții pentru lucrul cu fi șiere……………………………………………………..67
3.8 Alte câteva exemple de aplica ții………………………………………………….70
3.8.1 Informa ții obținute pe baza variabilelor predefinite de mediu……….70
3.8.2 Trimiterea unui e-mail dintr-un script PHP …………………………………71 3.8.3 Informa ții asupra datei și timpului curent ……………………………………71
3.8.4 Transfer de fi șiere prin UPLOAD………………………………………………73
3.8.5 Comenzile urlencode și urldecode ……………………………………………..76
3.8.6 Variabile cu nume construite dinamic…………………………………………77 3.8.7 Instruc ția empty și eticheta checkbox …………………………………………78
3.9 Lucrul cu sesiuni ( session )…………………………………………………………80
3.10 Programare PHP orientat ă
pe obiecte ………………………………………83
BIBLIOGRAFIE ………………………………………………….92
Programare Web
2
CAP. III PROGRAMARE WEB UTILIZÂND
LIMBAJUL PHP
3.1 Limbajul PHP – preliminarii
O modalitate foarte eficient ă de dezvoltare a aplica țiilor
Web o ofer ă limbajul de scripting PHP (PHP: Hypertext
Preprocessor ). Un avantaj incontestabil oferit de acesta,
constă în faptul c ă programul script PHP es te rulat pe serverul
de Web, iar utilizatorul (clie ntul) 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 b aze de date, cum ar fi MySQL,
Oracle, IBM DB2, InterBase, Sy sbase, Microsoft SQL Server
(suportul pentru MySQL fiind înco rporat nativ în interpretorul
PHP), putând rula atât pe platforme Windows, cât și pe
platforme Linux. Astfel se pot crea foarte u șor aplicații 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 re țea,
printre care SMTP, NNTP, POP3 și HTTP. În cadrul lucr ării
de față s-a folosit versiunea PHP 5.2.3. În momentul redact ării,
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 fii nd vorba de un proiect personal,
care includea câteva macro-uri și un modul care permitea
interpretarea lor, menite s ă urmărească "activitatea" paginii
sale personale. În 1995 este disponibil sub numele Personal
Home Page. Începând cu versi unea 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
Programare Web
3lume 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, înso țită de o descriere a câtorva aspecte
generale, punându-se accent pe o detaliere a func țiilor pentru
accesarea bazelor de date de tip MySQL, respectiv Oracle,
însoțite de exemplific ări pe aplica ții 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 , incluzând tripleta
PHP+MySQL+Apache (disponibil gratis la adresa
http://www.en.wampserver.com /). După simpla instalare a
acestuia, totul este deja preg ătit pentru a scrie și rula scripturi
PHP (inclusiv cu apeluri la serverul de baze de date MySQL ),
fără a fi necesar ă nici o alt ă setare suplimentar ă (în fișierele de
configurare). De remarcat faptul c ă, la un moment dat pe un
calculator poate rula doar un server de WEB, astfel încât, dac ă
un alt server este deja instalat și pornit, este necesar ă o oprire
prealabilă a acestuia. De asemenea, pachetul WAMP mai
conține aplica țiile PHPMyAdmin și SQLiteManager , folosibile
pentru gestionarea cu u șurință a bazelor de date. WAMP este
pachetul destinat oper ării 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 ini țial 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 pa șii care trebuie parcur și
(de regul ă) pentru a asigura o func ționare corespunz ătoare a
tandemului PHP-IIS (desigur, pentru o platform ă Windows):
– Copierea fi șierului php4ts.dll (plasat pe computer în
momentul instal ării PHP-ului), la loca ția
C:\Windows\System32 .
– În Control Panel se deschide Administrative Tools /
Internet Information Services .
Programare Web
4- Se deruleaz ă structura arborescent ă, având 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 ă fișierul
php4.isapi.dll (de asemenea din kitul PHP). Apoi se
validează (OK).
– În aceeași fereastr ă, de selecteaz ă Home Directory , apoi
Configuration , urmată de Mappings și Add. Ca executabil
se alege din nou fi șierul php4isapi.dll , iar în caseta de
extensie se scrie .php (cu punct). Dac ă se dore ște o
interpretare și a fișierelor PHP cu alte extensii (. php3,
.php4, .phtml ), se repet ă operația pentru fiecare tip de
extensie. Apoi se valideaz ă totul (cu OK) și se închid toate
ferestrele deschise pr in parcurgerea acestor pa și.
– Se restarteaz ă serverul de WEB IIS (în aceea și 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 func țional.
Totuși, realizarea unor anumite aplica ții care necesit ă alte
resurse conexe kitului de baz ă PHP, implic ă o configurare a
PHP-ului (fi șierul php.ini ).
Spre exemplu, pentru accesar ea bazelor de date de tip
Oracle este necesar ca extensie fi șierul php_oci8.dll , iar pentru
InterBase (numai începând cu versiunea 6), este necesar ca
extensie fi șierul php_interbase.dll . La instalarea PHP-ului, este
necesară o configurare a acestuia, constând în plasarea în
directorul Windows a fișierului php.ini (din kitul de instalare).
De asemenea, acest fi șier necesit ă câteva modific ări
(necomentarea sau completarea unor linii de configurare deja
scrise în fi șier):
– pentru determinarea loca ției (calea) unde vor fi c ăutate
fișierele de extensie .dll:
; Directory in which the loadable extensions
;(modules) reside.
extension_dir=c:\php\extensions
(sau extension_dir = " c:/wamp/php/ext/ ")
– stabilirea fi șierelor extensie care vor fi necesare, printr-o
simplă necomentare a liniilor pe care apar scrise aceste fi șiere
(în cazul de fa ță php_interbase.dll sau php_oci8.dll ):
Programare Web
5;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 urm ătoare (operând cu baze de date) au
fost rulate utilizând pachetul WAMP5 versiunea 1.7.2 care
conține:
– 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 asem ănătoare cu
a altor limbaje structurate, pr ecum C, JavaScript, Perl (mai
precis a oric ărui limbaj derivat din C). Un script PHP const ă
într-o serie de comenzi, executate secven țial, una câte una de
către serverul de Web. Fiecare comand ă se încheie cu
caracterul punct- și-virgulă (;). Ca aplica ție introductiv ă, se
prezintă listing-ului celui mai simplu program PHP, clasicul
”Hello, World ”:
<html>
<body>
<?php echo ”Hello, World !!!”; ?>
</body>
</html>
Se observ ă prezența unui tag special, <?php … ?>, în
cadrul căruia programatorul poate scrie codul dorit. Func ția
echo asigură tipărirea pe ecran a șirului specificat ca
parametru.
PHP permite specificarea și altor tag-uri, ca cele din
listing-ul urm ător:
<? Echo („acesta este un simplu test
1\n”); ?>
<?php echo(„acesta este un simplu test
2<br>”);?>
Programare Web
6
<script language=”php”>
echo („some editors (like FrontPage)
don’t like processing instructions”);
</script>
Referitor la separarea comenzilor, dup ă cum s-a mai
menționat, se folose ște ca terminator de lin ie caracterul „;”, la
fel ca în C, sau Java ™. Comentariile, de asemenea, împrumut ă
sintaxa C, adic ă „//” sau „/* …*/”.
Se consider ă încă un exemplu pentru a eviden ția câteva
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 rul ării acestui script este prezentat în figura
următoare:
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 totu și scrisă în
PHP. <?php înseamnă “începutul codului PHP” iar ?>
înseamnă “sfârșitul codului PHP”. Serverului WEB (mai precis
interpretorului PHP instalat pe acela și host cu serverul Web) i
se cere să interpreteze codul dintre cei doi delimitatori și să îl
Programare Web
7converteasc ă î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 op țiunea 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 ap are este practic un cod HTML
standard. Exemplul ilustreaz ă câteva avantaje majore ale
script-urilor rulate pe partea de server: a) Nu apar incompatibilit ăți legate de browser. Scriptul este
rulat pe partea de server – unde este instalat și interpretorul
PHP-, deci nu pot ap ărea probleme legate de tipul de
browser folosit pe partea de client.
b) Acces la resursele de pe partea de server. Dacă aceeași
aplicație ar fi fost scris ă în JavaScript, data respectiv ă ar fi
fost data corespunz ătoare calculatorului client (pe care
rulează browser-ul). Poate exemplul prezentat (afi șarea
datei curente) nu este cel ma i elocvent pentru a ilustra
această proprietate. Dar, luâ nd alt exemplu, o aplica ție Web
cu baze de date beneficiaz ă din plin de avantajele acestei
proprietăți.
c) Reducerea înc ărcării clientului. Rularea unui script pe
partea de client (cazul JavaScri pt) poate fi destul de lent ă,
depinzând direct de performan țele calculatorului care
găzduiește browser-ul client. Brow ser-ul clientului trebuie
să ruleze (interpreteze) scri ptul înainte de a afi șa pagina
Web. În cazul script-urilor ru late pe partea de server,
performan țele 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 ă
Programare Web
8este decis la momentul execu ției unei opera ții 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, rulând urm ătorul program PHP
(echo fiind o comand ă de afișare pe ecran), se ob țin chiar
valorile puse ca și comentarii ( tag-ul <br> are ca efectul de
‘linie nou ă’ la afișare, iar operatorul ‘.’ este folosit pentru
concatenarea a dou ă string -uri):
<?php
$var = "0"; // $var = "0"string
echo $var."<br>";
$var++; // $var = "1"
echo $var."<br>";
$var+=1; // $var = 2 întreg
echo $var."<br>";
$var += 'c'; // $var = 2 întreg
echo $var."<br>";
$var = $var + 1.3; // $var = 3.3 real
echo $var."<br>";
$var = 5 + "10 Puisori; // $var =15 întreg
echo $var."<br>";
$var = 5 + "Small Pigs"; // $var =5 întreg
echo $var."<br>";
$var = "a"; // $var = "a"string
echo $var."<br>";
$var++; // $var = "b"
echo $var."<br>";
?>
Variabilele încep întotd eauna cu caracterul " $", făcându-
se diferen ță între literele mari și mici folosite în cadrul
numelor de variabile:
$var = "Bob";
$Var = "Joe";
echo "$var, $Var"; //se afi șează: Bob, Joe
Pentru șiruri (elementele unui șir putând fi de tipuri
diferite), un exemplu edificator de utilizare ar putea fi următorul:
$sir=array(1=>'ion', 2=>'adi', 3=>125);
Programare Web
9echo $sir[1]."<br>"; // afi șează 'ion' (string)
echo $sir[2]."<br>"; // afi șează 'adi' (string)
echo $sir[3]."<br>"; // afi șează 125 (întreg)
$sir[3]++; // incrementeaz ă
echo $sir[3]."<br>"; // afi șează 126 (întreg)
3.3.3 Structuri de control
Ca orice alt limbaj de progr amare, PHP-ul dispune de o
serie de facilit ăți pentru controlul fluxului de desf ășurare al
unui script. Astfel, limbajul beneficiaz ă de aportul unor
instrucțiuni prin care este permis ă o deviere de la ordinea
firească de derulare a fluxul ui de comenzi ale
scriptului/programului (salt condi ționat, ciclare). Trei astfel de
structuri de control a fluxului unui program sunt detaliate în
continuare la nivel de sintax ă, fiind înso țite 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 având urm ătoarea sintax ă:
if ( conditie ) {
// secvența care se execut ă dacă
// condiția este adev ărată.
} else
{
// (Opțională) Se execut ă dacă condiția este fals ă.
}
Această structură permite script-ului PHP s ă execute o
secvență de instruc țiuni sau alta, în func ție de rezultatul,
adevărat sau fals, al evalu ării unei condi ții. 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) {
// secvența de comenzi executat ă
// repetat, cât timp condi ția este adevarat ă
}
Această buclă permite executarea repetat ă a unei
secvențe de comenzi atât timp cât este îndeplinit ă o condiție.
Un mic exemplu de afi șare succesiv ă a numerelor de la 1 la 10,
utilizând o bucl ă while are codul urm ător:
Programare Web
10$count = 1;
while ($count <= 10) {
echo("$count");
// sau print (’$count’);
$count++;
}
Și în sfârșit, nu mai pu țin utilizat ă bucla for cu sintaxa:
for (initializare_contor; conditie;
actualizare_contor) {
// secvența de comenzi care se execut ă
// atât timp cât condi ția este adev ărată
}
Un exemplu de implementare a unui num ărător 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,
putând rula atât pe platforme Windows, cât și pe platforme
Unix/Linux. Astfel, se pot crea foarte u șor aplicații Web pentru
accesarea bazelor de date.
Avantajele limbajului PHP: nu apar incompatibilit ăți legate
de browser-ul client, acces la re sursele de pe partea de server,
reducerea înc ărcării clientului.
Tipurile de date suportate de PH P sunt: array, float, integer,
object, string. Tipul de dat ă este decis la momentul execu ției
unei opera ții asupra variabilei.
Comenzile echo și print() tipăresc pe ecran (trimit spre ecran)
string-ul specificat ca parametru.
Variabilele încep întotde auna cu caracterul "$", f ăcându-se
diferența între litere mari și mici folosite în cadrul numelor de
variabile.
Operatorul ‘.’ este utilizat pentru concatenarea unor șiruri de
caractere.
Programare Web
11Structurile principale de control a fluxului de execu ție a
comenzilor PHP sunt: if, while și for.
ÎNTREBĂRI
Rularea unui script PHP se face pe partea de client sau de
server?
Care este caracteristica principal ă a unei variabile PHP?
Ce comenzi pentru afi șare pe ecran cunoa șteți? Dați câteva
exemple de utilizare a lor.
Ce tipuri de date, respectiv ti puri de baze de date, suport ă
limbajul PHP?
Care sunt principalele structur ile de control a fluxului de
execuție a unui program PHP?
3.4 Dezvoltare de aplica ții PHP cu baze de date
MySQL
Pe lângă setul standard de come nzi aferente limbajului
PHP, acesta dispune de o serie de func ții și variabile
predefinite care u șurează 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 fi șiere externe ca extensii
(biblioteci .dll ). Aceste fi șiere extensie de tip . dll (cu numele
generic php_*.dll) permit limbajului PHP s ă opereze cu o mare
diversitate de tehnolog ii conexe, inclusiv cu baze de date (în
acest ultim caz, ele înglobând func țiile necesare acces ării și
manipulării unor baze de date de diverse tipuri).
MySQL este unul dintre cele mai folosite sisteme de
gestiune a bazelor de date c lient-server, fiind cel mai des
utilizat în combina ție cu scripturi PHP. Operarea cu baze de
date MySQL nu necesit ă utilizarea unei biblioteci suplimentare
(.dll), suportul pentru MySQL fiind inclus func țional în
motorul interpretorului PHP. Prezentul paragraf va prezenta
cele mai importante func ții PHP utilizate în lucrul cu bazele de
date MySQL (tabel 3.1), înso țite de aplica ții exemplificative.
Tabel 3.1
Tip_returnat Funcție(…) Acțiuni/caracteristici
resource
mysql_connect – realizeaz ă conectarea la un server MySQL;
– funcția necesit ă minim trei parametri
Programare Web
12obligatorii: nume server MySQL/ adres ă IP
server, nume utilizator MySQL și parola de
acces; – returneaz ă valoarea logic ă FALSE în cazul
în care a e șuat 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 reu șit.
resource
mysql_pconnect – realizeaz ă o conexiune permanent ă la un
server MySQL (parametrii fiind aceia și ca la
funcția anterior);
– inițial, caută o conexiune permanent ă deja
existentă, iar în cazul în care nu g ăsește,
creează una;
– nu închide conexiunea la final de script; – returneaz ă valoarea logic ă FALSE în cazul
în care a e șuat 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 reu șit.
bool mysql_close – primește 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; – funcția este op țională în cazul în care
conexiunea nu este permanent ă, aceasta
închizându-se automat la final de script.
bool mysql_select_db – selecteaz ă/deschide o baza de date curent ă
(existând deja o conexiune cu un server MySQL) pentru interog ările/opera țiile SQL
care vor urma; – funcția are doi parametri: primul este de tip
șir de caractere, reprezentând 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 reu șit 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).
bool mysql_create_db – permite crearea unei noi baza de date
MySQL;
Programare Web
13- funcția are doi parametri: primul este de tip
șir de caractere, reprezentând 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 reu șit să creeze baza de date,
respectiv valoarea logic ă FALSE în caz
contrar.
bool mysql_drop_db – permite ștergerea unei baze de date
MySQL; – funcția are doi parametri: primul este de tip
șir de caractere, reprezentând 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 reu șit 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 func ții (care realizeaz ă extragerea
rezultatului comenzii/interog ării), iar în caz
contrar, returneaz ă valoarea logic ă FALSE.
array mysql_fetch_row – returneaz ă o înregistrare/linie extras ă din
tabela (sau jonc țiunea de tabele) interogat ă,
sub forma unui șir (array cu primul indice
de element 0).
int mysql_num_rows – returneaz ă numărul de linii ob ținute în
urma execut ării unei comenzi SQL de
interogare SELECT.
int mysql_num_fields – returneaz ă numărul de coloane (câmpuri)
aferente setului de date ob ținut ca urmare a
execuției unei comenzi SQL SELECT.
resource
mysql_list_fields – permite oferirea de informa ții asupra unei
anumite tabele (jonc țiuni de tabele),
returnând ca rezultat un identificator resurs ă,
care poate fi folosit de c ătre următoarele
funcții conexe: mysql_field_name ,
mysql_field_len, mysql_field_type .
string
mysql_field_name – returneaz ă succesiv numele coloanelor
tabelei.
int mysql_field_len – returneaz ă succesiv lungimea coloanelor
tabelei.
string – returneaz ă succesiv tipul coloanelor
Programare Web
14mysql_field_type tabelei.
int
mysql_affected_rows – returneaz ă numărul de linii afectate de o
comandă SQL anterioar ă de tip UPDATE,
INSERT, DELETE.
int mysql_errno – permite identificarea erorii care s-a produs
în timpul execu ției de c ătre serverul
MySQL a unei comenzi SQL; – returneaz ă codul numeric al erorii în cazul
în care a ap ărut o eroare în timpul execut ării
unei comenzii SQL, respectiv 0 în caz contrar.
string mysql_error – permite identificarea erorii care s-a produs
în timpul execut ării unei comenzi SQL;
– returneaz ă un mesaj în care eroarea este
descrisă explicit în cazul în care a ap ărut o
eroare în timpul execut ării unei comenzii
SQL, respectiv un șir vid în caz contrar.
tip_variabil
mysql_result – preia valoarea unei celule din setul de date,
aferente unei anumite coloane dintr-un rând 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 func țiile de mai sus, programatorul poate
realiza aplica ții complexe pentru accesar ea bazelor de date de
tip MySQL.
3.4.1 Interogare f ără parametrii a unei baze de date
Acest prim exemplu prezint ă o modalitate simpl ă de
interogare f ără parametrii a unei tabele a unei baze de date
MySQL. Sunt exemplificat e modurile de utilizare a
următoarelor func ții:
– funcții legate direct de lucrul cu baze de date MySQL:
mysql_connect(), mysql_select_db(), mysql_query(),
mysql_num_rows(), mysql_num_fie lds(), mysql_fetch_row( );
– funcții ș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:
Programare Web
15CREATE TABLE table1(
nume CHAR(10),
varsta INTEGER,
localitate CHAR(10));
Codul surs ă PHP al aplica ției considerate este urm ătorul
(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");
//Selecție 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 afi șare 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>");
//Inițializare variabil ă_contor con ținând num ărul de
// elemente (celule) returnate prin interogarea tabelei
$nr_val=0;
//Ciclează după nr. înregistr ări/linii găsite (realizând o
// condiție logică și o atribuire prin returnarea elementelor
// unei linii/înregistr ări în variabila șir (array) $row)
while ($row = mysql_fetch_row($query)){
// Variabila $row este un șir (array) con ținând succesiv, la
// un moment dat, elementele unei înregistr ări (row[0] va
// conține elemente din coloana 1 a liniei curente, etc)
//Creează o linie nou ă în tabel
echo" <tr>\n";
//Ciclează după elementele unei înregistr ări/linii
foreach ($row as $value) {
Programare Web
16//Pune într-o celul ă din tabel elementul unei înregistr ări
// (valoarea dintr-un câmp al înregistr ării)
// Creează o coloan ă nouă în linia tabelului
echo "<td>$value</td>";
//Incrementeaz ă variabila_contor = nr.total elemente =
nr.inreg. X nr. câmpuri
$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ă câte linii s-au g ăsit
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
(ieșire forțată)
echo "</center>";
//Comanda urm ătoare se va executa numai în caz de c ăutare
reușită
mysql_close();
?>
Funcția mysql_connect realizează conectarea la
serverul MySQL. Aceast ă funcție poate avea pân ă la cinci
parametri (to ți putând fi op ționali), dintre care doar primi trei
sunt de regul ă necesari, iar ultimii doi mai pu țin folosiți:
– Primul parametru reprezint ă numele server-ului MySQL sau
adresa de IP a comput erului pe care rezid ă serverul. Dac ă
acest parametrul lipse ște, caz în care și ceilalți patru lipsesc
(mysql_connect() ), se încearc ă conectarea la un eventual
server MySQL de pe calculatoru l curent (conectare pe local,
echivalent ă de altfel cu a scrie ca nume de server localhost -ca
în exemplul anterior- sau adre sa IP 127.0.0.1). În acest caz, ca
nume de utilizator implicit se va considera root, fără parolă
(user-ul implicit MySQL).
Programare Web
17
– Cel de-al doilea parametru reprezint ă numele utilizatorului,
iar în cazul în care lipse ște (obligatoriu lipsind și ceilalți
parametrii care îl succed), se folose ște ca substitut implicit
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 lipsește se folose ște șirul vid pe post de parol ă pentru
conectarea la server ( mysql_connect ("localhost",
"user1" ));
Observație
: Din motive de securitate, se recomand ă a se folosi
acești primi trei parametrii cu valori concrete, ne l ăsându-se
(prin lips ă lor) active valorile im plicite care conduc la o
creștere substan țială a gradului de vulne rabilitate al aplica ției.
Pentru MySQL 5.0.22 (inclus în pachetul WAMP5 ), user-ul
implicit existent la instalare este root , fără parolă.
– Al patrulea parametru este de tip logic, având rolul de a
indica motorului PHP ca, în cazul în care exist ă deja o
conexiune la acela și server MySQL, s ă creeze o nou ă
conexiune în loc s ă o reutilizeze pe cea existent ă;
– Ultimul parametru este de tip întreg și reprezint ă proprietățile
pe care le va avea conexi unea (spre exemplu, dac ă se folose ște
compresia datelor).
Funcția mysql_connect returneaz ă (în cazul în care
conectarea a reu șit) un identificator resurs ă de acces aferent
conexiunii cu server-ul MySQL. Func ția este absolut necesar ă
a fi folosit ă înaintea oric ărei alte func ții operând cu MySQL,
asigurând practic realizarea conexiunii/leg ăturii cu serverul de
baze de date.
Fig. 3.2 Rezultatul afi șării
Programare Web
18 Func ția mysql_select_db selecteză/deschide o baz ă de
date aferent ă serverului MySQL cu care s-a f ăcut conexiunea,
fiind absolut necesar ă pentru interogarile/comenzile SQL care
vor urma. Func ția 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 (op țional)
reprezintă identificatorul de acces la conexiunea cu serverul
MySQL. Dac ă acesta nu este specificat explicit, se consider ă
conexiunea curent existent ă cu serverul MySQL. Func ția
returnează valoarea logic ă TRUE în cazul în care s-a reu șit
selectarea bazei de date, resp ectiv valoarea logica FALSE în
caz contrar(baz ă de date nu exist ă, utilizatorul nu are drepturi
de acces la aceasta etc.).
Funcția mysql_query este cea prin care se asigur ă
interacțiunea efectiv ă cu elementele (datele) bazei de date,
permițând opera țiile SQL uzuale (interogare, ad ăugare,
ștergere, modificare etc). Func ția are doi parametri:
– Primul parametru este de tip șir de caractere și reprezint ă
cererea (comanda SQL) trimis ă spre execu ție 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 lipse ște
se ia în considerare conexiunea curent ă;
În exemplul anterior, c ăutarea în tabel ă s-a făcut după o
valoare bine precizat ă: "select * from table1 where
nume='ion'". Există însă situații în care nu se cunoa ște
exact valoarea cheii de c ăutare, în acest caz, o alternativ ă
constituind-o folosirea operatorul like. Acesta, împreun ă cu
wildcard-ul % permit realizarea unei interog ări după o mască
aproximativ ă (ceva ce seam ănă cu cheia de c ăutare). Spre
exemplu, dac ă se dorește afișarea tuturor persoanelor a c ăror
nume începe cu ion, se poate folosi comanda "select *
from table1 where nume like 'ion%'". În
cazul în care se cere afi șarea tuturor persoanelor a c ăror vârstă
se termină cu cifra 9, comanda select va ar ăta în felul urm ător:
"select * from table1 where varsta like
'%9'"
Observație: Evident, comanda SELECT poate fi și o interogare
pe mai multe tabele (jonc țiuni de tabele), spre exemplu:
select tabela1.col11, tabela1.col.12,
tabela2.col21, tabela2.col22 from tabela1,
Programare Web
19tabela2 where tabela1.col.12 =
tabela2.col21
Bucla while($row=mysql_fetch_row($query)) , utilizând
funcția mysql_fetch_row , poate fi interpretat ă astfel: “atât
timp cât este g ăsită o linie (con ținutul fiec ărei linii g ăsite fiind
returnat succesiv de func ția mysql_fetch_row în variabila șir
$row ) execută…”.
Funcția mysql_fetch_row va ‘umple’ succesiv un șir
($row) cu datele unei linii return ate de interogare. Aceste date
sunt prelucrate succesiv (de regul ă afișate într-un tabel pe
ecran), începând cu primul artic ol/linie, apoi se trece la al
doilea (con ținutul șirului $row fiind astfel suprascris succesiv)
și așa mai departe. Practic, bucla while() ciclează după
numărul de articole/linii g ăsite și returnate în urma interog ării.
Linia print('<table align=center BORDER="2">');
trimite spre ecran un șir HTML pentru crearea unui tabel în
care vor fi afi șate datele g ăsite. Deci tag-ul <table…> define ște
un tabel de afi șare, tag-ul <tr> se refer ă la construc ția unei linii
din tabel, <th> la o linie-header (cap de tabel), <td> la o
coloană, toate fiind elemente HTML care permit construc ția
unui format tabelat de afi șare pe ecran.
Comanda foreach ($row as $value) este practic o bucl ă
internă buclei while() , ciclând în cadrul fiec ărui articol/linie
după numărul de elemente ale articolului/liniei. Pentru fiecare
articol succesiv g ăsit (in ciclul while() ), comanda foreach() ca
și buclă, extrage succesiv din șirul $row câte un element și-l
trimite spre variabila $value (care la un moment dat con ține o
valoare a unui articol corespunz ătoare unui anumit câmp, deci
practic valoarea unei celule). Afi șarea pe ecran (în celul ele tabelului de afi șare
construit) a con ținutului variabilei $value (echo "<td
>$value</td>"; ), înseamn ă practic afi șarea element
cu element a con ținutului fiec ărui articol g ăsit, în celule
succesiv create. Prin in crementarea variabile $nr_val , aceasta
va conține numărul total de elemente (spre exemplu dac ă
numărul de articole g ăsite este 3 (bucla while() se va executa
de 3 ori), iar num ărul de câmpuri este 5 (bucla foreach()
se va executa de 5 ori),
$nr_val=3X5=15.
Funcția mysql_num_fields returneaz ă numărul de
coloane (câmpuri) rezu ltat în urma interog ării cu comanda
mysql_query . Dacă mysql_query conține o comand ă SQL de
forma SELECT * …, practic va returna num ărul total de
coloane (câmpuri) ale tabelei (sau jonc țiunii de tabele) referite.
Programare Web
20Împărțind valoarea variabilei $nr_val la valoarea returnat ă de
funcția mysql_num_fields (oferind num ărul de câmpuri
implicate în interogare), se ob ține numărul de înregistr ări/linii
găsite și returnate de interogare.
Comanda die (executat ă pe ramura else a verific ării if(
)) închide automat conexiunea și încheie for țat 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 în chide 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 func ționalităților
aceleiași aplicații, 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!!!";
Programare Web
21 echo"</center>";
}
mysql_close();
?>
Aceasta variant ă este prezint ă o optimizare din punct de
vedere al oper ării pe partea de interpretor PHP (practic
pseudo-clientul aplica ției Web), întrucât pentru a calcula
numărul de înregistr ări obținute în urma interog ării se
folosește funcția mysql_num_rows , pasându-se aceast ă
sarcină serverului MySQL (care prime ște astfel o solicitare în
plus). Aceasta func ție returneaz ă numărul de linii ob ținute în
urma execut ării unei comenzi SQL SELECT. Semnul @ (care
apare în fa ța funcției mysql_num_rows ) are rolul de a suprima
afișarea pe ecran a unor eventuale warning -urilor
(avertismentelor) care pot ap ărea în timpul execu ției unor
comenzi.
În cele dou ă versiuni ale aplica ției anterior prezentate,
capul de tabel pentru afi șarea informa țiilor din tabela bazei de
date s-a realizat în mod ma nual, presupunându-se cunoscute
numele coloanelor și numărul lor.
PHP-ul dispune de func ții prin care se pot ob ține informa ții
asupra structurii unei tabele, informa ții care pot fi utilizate
pentru realizarea ‘automat ă’ a unui cap de tabel pentru afi șare
(coloanele lui fiind practic câmpur i ale tabelei bazei de date).
În continuare, sunt enumerate câteva dintre aceste func ții:
-mysql_list_fields() – oferă informații asupra structurii unei
anumite tabele, returnând ca rezultat un identificator, care
poate fi folosit de c ătre următoarele func ții, cu semnifica țiile
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 ă numărul coloanelor tabelei.
Următorul exemplu comentat este destul de edificator
asupra modului de utilizare a acestor func ții, fără a mai fi
necesară o prezentare a sintaxei lor de baz ă:
<?php
//Conectare la serverul MySQL
Programare Web
22$link = mysql_connect(“localhost”, “root”,
“andreea”);
// Informa ții asupra structurii unei tabele din baza de date
$fields = mysql_list_fields("persoane",
"table1",$link);
// Numărare coloane ale tabelei referite
$columns = mysql_num_fields($fields);
// Pentru fiecare coloan ă, afișează 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 rul ării scriptului anterior const ă în afișarea, pe
coloană, a numelui, tipului și lungimii fiec ărui câmp al unei
anumite tabele a unei baze de date MySQL, tabel ă referită
printr-un identificator ( $fields ) în funcțiile specializate folosite.
Observație: Fiecare din func țiile returnând 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) reprezentând pozi ția coloanei
referite (a șa 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 func ții folosite pentru lucrul cu baze de date
MySQL sunt:
– mysql_connect – permite conectarea la un server MySQL;
– mysql_select_db – permite selec ția bazei de date MySQL;
– mysql_query – execută o comand ă SQL;
– mysql_fetch_row – returneaz ă o înregistrare din tabel ă;
– mysql_num_fields – returneaz ă numărul de
coloane(câmpuri) dintr-un set de rezultate creat ca urmare
a unei comenzi SQL SELECT;
– mysql_num_rows – returneaz ă numărul de linii ob ținute în
urma execut ării unei comenzi SQL SELECT;
– mysql_list_fields – oferă informații asupra unei anumite
tabele, returnând ca rezulta t un identificator, care poate fi
folosit de c ătre următoarele func ții: mysql_field_name ,
mysql_field_len, mysql_field_type;
Programare Web
23- mysql_field_name – returneaz ă succesiv numele
câmpurilor tabelei;
– mysql_field_type – returneaz ă succesiv tipul câmpurilor
tabelei;
– mysql_field_len – returneaz ă succesiv lungimea
câmpurilor tabelei;
– mysql_close – închide o conexiune cu baza de date,
Comanda foreach( ) cicleaz ă în cadrul fiec ărui
artico/liniel, dup ă numărul de elemente ale articolului/liniei.
ÎNTREBĂRI
Care este rolul func ției mysql_connect ?
În orice script PHP de lucru cu o baz ă de date MySQL este
absolut necesar ă funcția mysql_query? Argumenta ți.
Să se scrie un script PHP prin care s ă afișați pe ecran
informația din dou ă câmpuri ale unei tabele. Afi șarea se va
face pe vertical ă (și nu pe orizontal ă, ca în exemplul
prezentat), adic ă în formatul tabelat urm ător:
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 stânga, folosind func țiile mysql_list_fields și
mysql_field_name .
3.4.2 Interogare cu parametrii a unei tabele a bazei de date
Realizarea unei interog ări a unei tabele aferente unei
baze de date, implic ă obligatoriu transmiterea unor parametrii
după care se face c ăutarea. Exemplul anterior de interogare,
fără parametrii, este pur didactic (doar pentru exemplificarea
modului de utilizare a func țiilor PHP de operare cu o baz ă de
date). În realitate, orice interogare pe Web necesit ă anumiți
parametri de intrare.
a) Interogare cu c ăutare exact ă (cu toți parametrii
obligatoriu de introdus):
Programare Web
24
Acest prim exemplu pres upune o interogare a unei
tabele a bazei de date, cu afi șarea liniilor g ăsite, filtrarea
făcându-se func ție de valorile introduse pentru un nume și o
varsta (câmpuri ale tabelei), ambele furnizate obligatoriu (ca
parametrii de intrare și implicit de interogare).
Un prim fi șier script HTML necesar (fig.3.3), realizeaz ă
doar o preluare a acestor pa rametrii (de la tastatur ă) și o
"pasare" a lor (printr-un form însoțit de o acțiune " 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 esen țial al fișierului HTML anterior, este
obiectul HTML <form action=”POST” …, având rolul
de preluare de la tastatur ă a unor valori pentru cei doi
parametrii ( nume și varsta – simplă coinciden ță faptul c ă
numele lor este acela și cu al unor câmpuri ale tabelei bazei de
date) și pasarea lor spre scriptul PHP localizat de linia:
action="http://localhost/ex2.php"
Întreg con ținutul formularului <form… > …</form>
a fost plasat în celula une i tabele (având culoarea de
background argintiu), f ără a fi obligatorie aceast ă afișare
tabelată (mai reușită însă din punct de vedere al designului):
<table border=10 align=center
BGCOLOR="Silver">
<td>
Programare Web
25. . .
. . .
</td>
</table>
Totu și, nucleul esen țialul a acestui fi șier HTML este
următorul (putându-se reduce doar la secven ța următoare):
<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 ap ăsarea căruia valorile celor doi parametrii sunt
trimise c ătre fișierul 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
Observație
: Referirea într-un script a unei alte pagini WEB
(HTML PHP, etc.) se poate f ace, 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 ă (fără a mai fi necesar ă calea complet ă spre
pagina referit ă). În acest ultim caz, dac ă scriptul apelant și
Programare Web
26scriptul apelat/referit sunt în acela și director/loca ție, ajunge
precizarea doar a numelui paginii apelate ( "ex2.php" ).
Codul PHP al fi șierul realizând conectarea la baza de date
și interogarea tabelei table1 a bazei de date MySQL persoane
este următorul (acest fi șier prime ște 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 transmi și de
// către fișierul 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 înregistr ări 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>";
Programare Web
27 }
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 interog ării este prezentat în fig.3.4.
Fig. 3.4 Rezultatul interog ării 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" );
reprezentând o interogare parametrizat ă. (variabilele $nume și
$varsta, reprezentand valorile prel uate de la tastatur ă și
transmise de fi șierul HTML spre fi șierul PHP apelat ).
b) Parolarea accesului
În scriptul anterior, accesul la serverul MySQL se face
prin precizarea explicit ă a parolei direct în cod. În unele
situații, din motive de restric ționare a accesului, acest lucru nu
este însă de dorit. Parolarea accesul ui, în exemplul de fa ță, se
poate face prin transmiterea paro lei ca un parametru de intrare,
introdus de la tastatur ă odată cu ceilal ți parametrii (aferen ți
interogării). În acest sens, în fi șierul care implementeaz ă
formularul de introducere a para metrilor de intrare se adaug ă
codul urm ător (practic un input suplimentar) pentru
introducerea parolei (fig. 3.5):
Programare Web
28Parola: <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 sc riptul PHP propriu-zis pot
apare urm ătoarele complet ări de cod (verificând reu șita sau
nereușita conect ării la serverul MySQL):
<?php
//Preluarea cu metoda POST a parametrilor transmi și de
către fișierul 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ă reușita conect ării
echo "<br><h3>".$var."</h3><br>";
//afșează mesaj eroare (fig. 3.6)
echo "<h1><center> Parola este
incorecta!</center>
</h1>";
}
else {. . . . . // restul programului
Programare Web
29. . . . . .
}
?>
Fig. 3.6 Parol ă incorectă
Dacă serverul MySQL dispune de un cont utilizator f ără
nume de user și password , comanda mysql_connect (din
exemplul anterior) este de forma:
mysql_connect("localhost"," "," ");
c) Interogare cu c ăutare aproximativ ă
Singura modificare din script ap are în linia de specificare
a interogării SQL efective (de remar cat folosirea în comanda
de interogare a ghilimelelor pentru încadrarea variabilelor al căror conținut este interpretat ca un string/ șir de caractere,
respectiv lipsa acestor ghilim ele în cazul variabelelor
conținând valori numerice):
$query =mysql_query("SELECT * FROM table1
where nume>'$nume' and varsta>=$varsta");
Rezultatele pot fi urm ătoarele:
– dacă în caseta INPUT corespunzatoare numelui nu se
introduce nici o valoare, iar în cea corespunzatoare vârstei se
introduce valoarea 0, vor fi afi șate toate înregistr ările 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 afi șa toate înregistr ările pentru care numele sunt
superioare alfabetic primului caracter din șirul de caractere
introdus;
d) Interogare cu ignorarea parametrilor necompleta ți
Programare Web
30În acest caz este necesar ă următoarea modificare în script-
ul PHP, în linia de interogare efectiv ă
($query=mysql_query(…) ), folosindu-se urm ătoarea secven ță:
// dacă nu s-a introdus nici un nume și nici o varsta
// (se folose ște 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 atât un nume cât și o varsta
if ($nume!==''and $varsta !=='')
$query =mysql_query("SELECT * FROM table1
where nume= '$nume' and varsta=$varsta");
O situație mai special ă de interogare o constituie cea în
care, interogarea se face dup ă o cheie mai lung ă, spre exemplu,
un set de cuvinte, grupa te toate într-un acela și câmp/caset ă și
transmise (toate) ca un singur parametru. Un formular de tip FORM poate con ține în acest caz o caset ă INPUT (având
atributul type=“text”, implicit de altfel), fie o caset ă de tip
“TEXTAREA”. Pentru exemplifi care, în cadrul formularului
următor, o caset ă de tip TEXTAREA permite scrierea unei
informații pe 3 rânduri și 10 coloane (fiind vorba de o
formatare a modului de afi șare pe ecran a informa ției, și nu de
o limitare a cantit ății de informa ție):
<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 situa ția unui volum mare de informatie (mai
multe linii de text, spre exemplu). Dac ă nu este vorba de o
Programare Web
31astfel de situa ție, se poate folosi o simpl ă casetă INPUT ,
permițând scrierea pe o singur ă linie.
Transferul valorii unui astfel de parametru citit într-o
casetă TEXTAREA ridic ă câteva probleme. Acestea se
datorează faptului c ă, conținutul parametrului poate include
spații, coduri de sfâr șit de linie sau alte caractere speciale, care
nu sunt permise într-un string primit ca parametru de c ătre un
script. Aceste caractere special e trebuie convertite în coduri
speciale specifice parametriz ării apelului unei pagini Web.
Se consider ă următorul exemplu de apel (printr-un link)
al unui script intitulat “ newpage.php ”, care prime ște ca
parametru de intrare con ținutul variabilei $detalii , al cărei
conținut a fost completat printr-un formular de genul celui
anterior prezentat (con ținând TEXTAREA). Se presupune c ă
variabila $detalii conține valoarea “ Exemplu de folosire a tag-
ului Div ”, incluzând mai multe spa ții, care nu sunt permise
într-un string de interogare, tr imis explicit ca parametru de
intrare spre un script, prin in termediul unui link. Convertirea
acestor spa ții într-un cod special acceptat într-un astfel de apel,
implică folosirea unei func ții PHP speciale, și anume
urlencode() . Iată codul aferent unui mod corect de apel cu
transfer al unui astfel de parame tru (cod inclus în cadrul script-
ului unu.php , care prime ște 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 include re de cod PHP în mijlocul
unei etichete HTML. O form ă și mai simpl ă de apelare,
similară ca efect cu cea anterioar ă, este urm ătoarea:
<a
href="newpage.php?detalii=<?=urlencode($de
talii)?>"> O legatura parametrizata </a>
În ambele cazuri, func ția urlencode() preia
caracterele speciale (s pre exemplu, spa țiile) dintr-un string
pasat ca parametru și le converte ște î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ă funcție converte ște acest
conținut într-un string de forma “ Exemplu+de+
folosire+a+tag-ului+Div ”, acceptat ca parametru valid. Dup ă
apelul scriptului cu parametr ul astfel codat, PHP realizeaz ă
automat conversia invers ă (în cadrul scriptului apelat –
Programare Web
32newpage.php -), la valoarea ini țiala, în momentul utiliz ării
variabilei $detalii.
Observație: Funcția urlencode() se folose ște doar în cadrul
unei pasări 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 f ăcându-se în acest
caz automat). În situa ția în care se doreste afi șarea unui volum
compact mai mare de informa ții (preluat ă, spre exemplu, dintr-
un câmp de tip TEXT al unei tabele MySQL), este necesar ă
uneori o formatare a acesteia. Figura 3.7 prezint ă afișarea unei
informații neformatate (liniile întinzându-se pe toat ă lățimea
ecranului, iar dac ă ar depăși-o, ar apare bara de scroll orizontal
pentru fereastr ă).
Fig. 3.7 Afi șare informa ție neformatat ă
O solu ție simplă de rezolvare presupune utilizarea
etichetei DIV cu parametrii aferen ți setați corespunz ător.
Astfel, dac ă în celulele aferente coloanei detalii a tabelului din
figura 3.7 se folose ște o construc ție de genul:
<td><div style='height: 100px;width:
330px; overflow: auto'>…. continutul
coloanei/variabila …</div></td> ,
rezultatul format ării este prezentat în figura 3.8, observându-se
o îmbunătațire evident ă a design-ului.
Programare Web
33
Fig. 3.8 Afi șare informa ție formatat ă cu eticheta DIV
REZUMAT
Realizarea unei interog ări on-line a unei tabe le a unei baze de
date, implic ă obligatoriu transmiterea unor parametrii dup ă
care se face c ăutarea.
Funcția mysql_query corespunz ătoare unei afi șări (SELECT)
parametrizate are sintaxa:
$query=mysql_query("select * from table1
where nume_camp1=$nume_parametru1 and/or
nume_camp2=$nume_parametru2 and/or…");
Funcția mysql_error() poate fi folosit ă pentru precizarea
tipului unei erori ap ărute, sub forma $var=mysql_error(), în
variabila $var fiind transmis un string conținând informa ții
despre eroare (sau direct: echo mysql_error(); ) .
ÎNTREBĂRI
Scrieți un fișier HTML și un script PHP prin care s ă se afișeze
pe ecran informa ția doar din dou ă câmpuri ale unei tabele
(nume , varsta ), interogarea f ăcându-se parametrizat doar
după varsta (se vor afi șa acele articole pentru care varsta este
egală cu o valoare introdus ă de la tastatur ă).
Programare Web
34
Prevedeți o tratare și a cazului în care nu se introduce nici o
valoare pentru varsta . (spre exemplu, se vor afi șa toate
articolele) Afi șați pe ecran un mesaj prin care preciza ți
explicit num ărul de articole g ăsite.
3.4.3 Adăugare într-o tabel ă a bazei de date
Și în cazul opera ției de adăugare a unei noi linii într-o
tablelă a unei baze de date MySQL este necesar ă utilizarea
unui fișier HTML pentru transmiterea spre scriptul PHP
propriu-zis a valorilor corespunz ătoare liniei care va fi
adăugată î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>
//  : realizeaz ă introducerea unor spa ții suplimentare
// de formatare a afi șării tag-ul <strong> bold-uie ște textul
// încadrat
<strong>Nr:</strong> &nbs
p;  
<input type="text" name="nr" size="4"
><br>
<strong>Nume:</strong> &n
bsp;
 
<input type="text" name="nume" size="10"
><br>
<strong>Varsta:</strong>
 
<input type="text" name="varsta" size="4"
><br>
<strong>Localitate:</strong>  
Programare Web
35<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 fișier HTML permite (în cazul de fa ță) transmiterea
valorilor a patru parametrii ( nr, nume, varsta, localitate – cu
valori introduse de la tastatur ă) aferenți datelor necesare
construcției unei noi linii care va fi ad ăugată în tabela bazei de
date (s-a presupus existen ța unei tabele similare cu cea folosit ă
în exemplele anterioare, dar având în plus câmpul NR, cu
valori unice pentru fiecare articol, deci definit ca PRIMARY
KEY).
Scriptul PHP spre care sunt transmise valorile parametrilor și care va realiza ad ăugarea propriu-zis ă în tabela
bazei de date are urm ătorul 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'];
// adăugare parametrizat ă
$query=mysql_query("insert into table1
values($nr,'$nume',$varsta,'$localitate')"
);
echo "Inserare reusita!!!";
// selectarea și afișarea doar a înregistr ării/liniei nou
adăugate
Programare Web
36$query=mysql_query("select * from table1
where nr=$nr");
//calculeaz ă nr. de înregistr ări 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 (con ținând toate
câmpurile)
for ($i=0; $i<$coln; $i++){
//numele câmpurilor ca și cap de tabel
$var=mysql_field_name($query,$i);
echo "<th> $var </th>";
}
echo"</tr>";
// afișează înregistr ările găsite î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();
?>
Programare Web
37Rezultatul vizibil pe ecran, produs în urma execu ției
comenzii SQL de afi șare SELECT… este prezentat în fig. 3.9.
Comanda INSERT nu genereaz ă un rezultat vizibil pe ecran,
mai precis nu va returna eventu ale date care ar putea fi afi șate,
cel mult ap ărând un mesaj de eroare dac ă operația de adăugare
nu poate fi executat ă.
Fig. 3.9 Confirmare ad ăugare
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 ad ăugări 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 tabe l pe baza numelui
câmpurilor tabelei bazei de date se poate face cu o secven ță de
genul:
//numărare câmpuri
$coln=mysql_num_fields($query);
echo "<tr bgcolor='silver'>";
//realizare automat ă a capului de tabel, (con ținând toate
câmpurile)
Programare Web
38for($i=0;$i<$coln;$i++){
//afișare nume câmpuri ca și nume de coloane în capul de
tabel
$var=mysql_field_name($query,$i);
echo "<th>$var</th>;
}
ÎNTREBĂRI
Să se scrie un fi șier HTML (pentru transferul parametrilor) și
un script PHP prin care s ă se adauge ‘simultan’ dou ă noi
articole într-o tabel ă (fișierul HTML va con ține suficiente
casete, astfel încât un ecran s ă permită introducerea de date
pentru dou ă articole/linii simultan). De asemenea, dup ă
adăugare, să va afișa pe ecran (tabelat) întreaga informa ție
din tabela bazei de date. Evident, opera ția de adăugare 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ă operații:
– realizarea unei interog ări a bazei de date (pe baza unor
parametri de intrare pentru interogare) și afișarea
înregistrărilor găsite, care vor fi șterse,
– respectiv, confirmarea (sau anularea) ștergerii efective, pe
baza informa țiilor anterior afi șate în urma interog ării.
Fișierul HTML ( ex4.html ) pentru realizarea unei
interogări a tabelei în vederea ștergerii (interogare f ăcută cu un
singur parametru – nume – introdus de la tastatur ă) este detaliat
în listingul urm ător (având 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" >
Programare Web
39<input type="RESET" value="Anulare" >
</center>
</td>
</table>
</form>
</html>
Fig. 3.10 Pagin ă HTML pentru ștergere selectiv ă
Fișierul PHP pentru interogarea prealabil ă ștergerii (cu
rolul: “ găsește și vizualizeaz ă ce se dore ște a fi șters”), este
prezentat în continuare (acest fi șier primind ca parametru de
intrare valoarea pasat ă s p r e e l d e c ătre 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'];
// căutare dup ă câmpul nume a înregistrărilor care vor fi
șterse
$query=mysql_query("select * from table1
where nume='$nume'");
//calculeaz ă nr. de înregistr ări returnate prin interogare
$nr_inreg=@mysql_num_rows($query);
if ($nr_inreg>0){
echo "<center>";
echo "S-au gasit " . $nr_inreg . "
inregistrari";
echo"</center>";
Programare Web
40 // creare tabel pentru afi șare rezultate
echo "<table border='2'
align='center'>";
//numărare câmpuri
$coln=mysql_num_fields($query);
echo"<tr bgcolor='silver'>";
// realizare automat ă a capului de tabel (con ținând toate
câmpurile)
for ($i=0; $i<$coln; $i++){
//numele câmpurilor ca și cap de tabel
$var=mysql_field_name($query,$i);
echo "<th> $var </th>";
}
echo"</tr>";
// extragere informa ții și afișare
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 c ăutarea)
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>';
Programare Web
41}
else
die("Nu gasesc nici o inregistrare …");
mysql_close();
?>
Pentru afisarea rezultatelor ob ținute în urma interogarii,
anterior s-a folosit comanda PHP list( ) , care permite
asignarea de valori unei liste de variabile (asem ănătoare
practic unui șir), printr-o singur ă operație, valorile asignate
fiind cele extrase cu ajutorul functiei mysql_fetch_row( ).
Dup ă cum se poate vedea și în fig. 3.11, fi șierul PHP
anterior prezentat, realizeaz ă, într-o prim ă etapă, o simpl ă
interogare a tabelei bazei de date, cu afi șarea rezultatelor pe
ecran.
Fig. 3.11 Confirmare ștergere
Ceea ce confer ă posibilitatea lu ării deciziei de ștergere a
articolelor astfel vizualizate se realizeaz ă prin partea de cod
inclusă în bucla if (verificând num ărul de linii g ăsite),
constând practic într-un formular HTML <form…> . Această
parte este urm ătoarea (PHP ‘trimi țând’ 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>';
Secven ța de cod prezentat ă, transmite valoarea
parametrului de interogare, memorat ă în variabila $nume
Programare Web
42(utilizat aici pentru o simpl ă afișare cu SELECT), spre un alt
parametru ( nume1 ) care va fi pasat spre fi șierul PHP de
ștergere efectiv ă. Se remarc ă în acest caz, tipul
type="hidden" utilizat pentru caset a de transfer a
parametrului, care face aceast ă casetă invizibil ă pentru
utilizator.
Fișierul 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 ă conținând valoarea parametrului
primit și transferat mai departe sub numele ‘ nume1’ ).
ÎNTREBĂRI
Să se scrie un fi șier HTML (pentru transferul parametrilor) și
un script PHP prin care s ă se șteargă articole dintr-o tabel ă
(direct, fără o confirmare prealabil ă), articole fiind selectate
după un nume și o varsta (introduse de la tastatur ă). După
ștergere se va afi șa pe ecran num ărul de articole șterse.
Să se rezolve problema enun țată anterior în maniera
următoare:
Programare Web
43- dacă se găsește un singur articol, acesta va fi afi șat tabelat
pe ecran iar apoi va fi șters;
dacă se găsesc mai multe articole, acestea vor fi șterse toate..
3.4.5 Modificarea unei înregistr ări dintr-o tabel ă a bazei de
date
Modul de modificare a unei înregistr ări/linii dintr-o
tabelă a unei baze de date (cu vizualizarea liniei care se
modifică) presupune urm ătoarele:
– o operație de căutare parametrizat ă a înregistr ării care se
dorește a fi modificat ă și o afișare a ei
– modificarea efectiv ă (folosind afi șarea realizat ă)
Fișierul pentru transmiterea parametrilor de c ăutare a
înregistrării care se dore ște a fi modificat ă (căutarea făcându-
se după doi parametrii – vezi fig. 3.12) este urm ătorul:
<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>
Programare Web
44
Fig. 3.12 C ăutare pentru modificare (practic o simpl ă căutare)
Fișierul pentru interogare în vederea modific ării are
următorul 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'];
// căutarea înregistr ării 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>";
Programare Web
45
$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 g ăsit
$nr_val++;
$sir[$nr_val]=$value;
}
echo "</tr>";
}
echo "</table>";
// Rezolvarea este valabil ă pentru o singur ă înregistrare
// găsită
// Pentru mai multe înregistr ări găsite, modific ările
// efectuate se aplic ă asupra tuturor liniilor care corespund
// căutării
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 c ăutare
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].'>';
Programare Web
46echo '<input type="SUBMIT"
value="Modifica!" >';
echo '<br>';
echo '</form>';
// link de revenire și renunțare la modificare
echo '<a HREF="http://localhost/ex5.html">
Renunț și revin…</a>';
}
else
die ("Nu gasesc nici o inregistrare
…");
mysql_close();
?>
Rezultatul fi șierului script PHP anterior, este prezentat
în figura 3.13. Ceea ce aduce nou acest script PHP, pe lâng ă o
simplă interogare (c ăutare cu SELECT) și afișare a articolelor
găsite pe ecran (tabelat), const ă într-o afi șare în casete
editabile a datelor g ăsite, permi țându-se astfel și o modificare a
lor (vezi fig. 3.13). Cum se realizeaz ă acest lucru?
Fig. 3.13 Ecran pentru modificare
În primul rând, în bucla foreach(…) încuibată în bucla
while(…) , apare o secven ță de genul:
//incrementare contor num ăr elemente
$nr_val++;
// memorare într-un șir (array) a datelor din articolul g ăsit
$sir[$nr_val]=$value;
care permite memorarea tuturor elementelor g ăsite într-un șir
(arrary -ul $sir).
Programare Web
47 Spre exemplu, în cazul de fa ță (vezi fig. 3.13) s-a g ăsit
un singur articol cu 4 elemente , acestea memorându-se într-un
șir având 4 elemente (cu indicii 1,2,3 și 4, deoarece contorul
$nr_val a fost ini țializat pe 0, dar este incrementat înainte de
folosirea lui ca indice al unui element al șirului $sir).
În al doilea rând, este utilizat ă secvența următoare:
echo '<form method="POST"
action="http://localhost/ex55.php">';
// Transfer (ascuns) spre script a parametrilor de c ăutare
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 fi șierul script PHP care realizeaz ă modificarea
efectivă a parametrilor ini țiali de interogare (memora ți în
primele dou ă elemente ale array -ului $sir), acest lucru fiind
necesar deoarece ace ști parametrii pot fi ‘altera ți’ în urma unei
eventuale modific ări permise în continuare, dup ă cum se va
vedea.
Următoarele 4 tag-uri <INPUT type=”text” permit
afișarea (în casete care permit atât opera ții de citire cât și de
scriere) și alterarea (modificarea) acestor patru parametrii,
care vor substitui informa ția existent ă în câmpurile articolului
localizat (cu parametrii transmi și din primele dou ă INPUT -uri
invizibile utilizatorului). Cu alte cuvinte, aceast ă secvența transfer ă spre script-ul
PHP de modificare efectiv ă șase parametrii:
– doi parametrii pentru localizarea articolului de modificat;
Programare Web
48- alți patru parametrii, pentru substituirea informa ției din cele
patru câmpuri ale articolului deja localizat.
Fișierului PHP care realizeaz ă modificarea propriu-zis ă,
utilizând comanda SQL UPDATE , nu îi mai revine decât 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");
// Afișare mesaj de eroare pentru date incorect introduse
(dacă se dorește)
$var=mysql_error();
echo $var;
echo "OK, am modificat!";
mysql_close ();
?>
REZUMAT
Realizarea unei modific ări 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 valo rii unui câmp numeric cu o
anumită valoare):
$query =mysql_query("UPDATE table1 SET
cimp_1=$param_1, cimp_2=cimp_2+$param_2…
WHERE
Programare Web
49cimp_1=$param_n and
cimp_2=$param_n_plus_1…");
Memorarea tuturor elementelor g ăsite în urma unei c ăutări
(SELECT …) se poate face printr-o secven ță:
$nr_val++; //incrementare contor num ăr elemente
$sir[$nr_val]=$value; // memorare într-un șir a
datelor din articol
inclusă într-o bucl ă foreach(…) (ciclând dup ă numărul de
elemente ale unui articol), la rândul ei încuibat ă într-o bucl ă
while(…) (ciclând dup ă numărul de articole/linii g ăsite).
ÎNTREBĂRI
Fie baza de date MySQL baza, cu tabela Table1 având
câmpurile: NR_CRT, PRODUS, BUCATI, PRET_BUC,
PRET_TOTAL (user ION, f ără password). Se consider ă că pot
exista maximum dou ă produse cu acela și nume (PRODUS) și
același PRET_BUC. Câmpul NR_CRT are o valoare unic ă
(obținută incremental) pentru fieca re articol. Citind de la
tastatură un PRODUS, respectiv PRET_BUC (utilizând un
fișier HTML care trebuie scris), prin ap ăsarea unui buton se
vor efectua urm ătoarele opera ții (într-un fi șier script PHP):
– căutarea în tabel ă a câte produse cu acela și nume
PRODUS și PRET_BUC exist ă;
– dacă nu se g ăsește nici un articol, se va semnala acest
lucru printr-un mesaj ( și se iese din program);
– dacă se găsește un singur articol, se va afi șa acest articol
într-un tabel;
– dacă se găsesc două articole:
– se șterge al doilea articol g ăsit, iar datele
corespunz ătoare lui (mai precis BUCATI) se transfer ă (se
adună) la articolul r ămas (normal, tot în câmpul BUCATI);
– se reface NR_CRT pentru articolele urm ătoare
articolului șters (pentru a avea o numerotare succesiv ă);
– se recalculeaz ă PRET_TOTAL pentru articolul r ămas
și se afi șează articolul (PRET_TOTAL=BUCATI x
PRET_BUC)
Indicații:
– se memoreaz ă elementele articolelor/liniilor g ăsite într-un
șir (ținând cont c ă informațiile din ele sunt necesare și
după ștergerea celui de-al doilea articol);
în cazul a dou ă articole g ăsite, fiecare cerin ță se poate rezolva
printr-o comand ă SQL.
Programare Web
503.4.6 Aplicatie exemplu cu operatii multiple
Se consider ă baza de date MySQL angajati , conținând
tabela salarii cu urmatoarele câmpuri:
– id integer primary key;
– nume varchar(14);
– salar_brut float;
– impozit float;
– salar_net float;
Se dorește implementarea unei aplica ții care:
– folosește un prim fi șier HTML ( exempluFinal.html) prin
intermediul c ăruia se preiau de la tastatur a 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 (ad ăugarea) în tabela salarii a informa țiilor
primite (ca linie nou ă);
– realizarea unui update pe tabel ă pentru calculul
impozitului și a salariului net al angaja ților cu
următoarele formule:
– impozit=0.16*salar_brut;
– salar_net=salar_brut – impozit;
– afișarea tuturor angaja ților existen ți î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);
Fișierul exempluFinal.html are următorul 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>
Programare Web
51
<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ă
Fișierul exempluFinal.php are codul urm ător (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”);
Programare Web
52$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>“;
// afișare 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 ar ăta că, un singur fi șier
script PHP poate con ține oricâte comenzi SQL sunt necesare
pentru îndeplinirea func ționalităților dorite. Se poate observa
de asemenea c ă, comenzi precum UPDATE (sau DELETE) pot
fi uneori folosite pentru realizarea unor modific ări/actualiz ări
într-o tablel ă, fără nici o confirmare prealabil ă din partea
utilizatorului.
Programare Web
53
Fig. 3.15 Afi șarea înregistr ărilor găsite
3.4.7 Interogare cu extragerea informa ției dintr-un câmp
BLOB
O situație mai deosebit ă de operare cu baze de date
MySQL o constituie interogar ea cu extragerea unei imagini
dintr-un câmp de tip BLOB ( Binary Large OBject ), respectiv
afișarea acelei imagini. Se vor prezenta în continuare dou ă
soluții care rezolv ă această problemă.
Un prim exemplu de script are urm ătorul 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 Ă IEȘIRE 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]);
?>
Programare Web
54 Esen țială în acest caz este linia prin care este setat ă
specificația MIME ( Multipurpose Internet Mail Extension )
pentru afi șarea unei imagine JPG. Aceasta însemn ă că orice
ieșire spre browser, va fi interpretat ă ca și conținut al unei
imagini jpg, și afișată corespunz ător. După o astfel de setare,
realizată la începutul scriptului, nu este permis ă nici o alt ă
ieșire (de un alt tip) spre afi șare la browser. Exemplul
prezentat presupune existen ța unui câmp ‘imagine’ de tip
BLOB (sau LONGBLOB ), într-o tabel ă referită în program.
Afi șarea imaginii extrase din baza de date, se face
printr-o simpl ă directare spre browser a con ținutului variabilei
(print ), în care este salvat ă (în format binary ) imaginea
propriu-zis ă.
În cazul (cel mai probabil) al unei interog ări 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 câmp 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 fi șierului script PHP
imag1.php ):
http://localhost/imag1.php?id=1;
Un al doilea exemplu, folose ște un fi șier imagine
intermediar ( temp1.jpg ) în care este extras con ținutul binar al
câmpului BLOB:
<?php
$query="select imagine from tabela2 where
id=2";
mysql_connect("localhost", "root", "")or
die ("nu g ăsesc serverul MySQL");
mysql_select_db ("ioji") or die ("Nu
găsesc baza");
$result = mysql_query($query);
// Verifică dacă găsește o astfel de înregistrare
if (mysql_num_rows()>0)
{
// mysql_num_rows() – returneaz ă nr. de înregistr ări găsite;
$var=mysql_fetch_row($result);
$var1=$var[0];
Programare Web
55// Deschide un fi șier pentru scriere în el
$fp=fopen("temp1.jpg","wb");
// Scrie în fi șier
fwrite($fp,$var1);
fclose($fp);
// Afișează conținutul fișierului ca imagine
echo '<image src="temp1.jpg">';
}
// Dacă nu găsește nimic, șterge fișierul
else {
unlink("TEMP1.JPG"); // sau
delete("TEMP1.JPG");
}
?>
În acest exemplu, se verific ă totodată existența unei
înregistrări care corespunde interog ării realizate (structura if).
Dacă se găsește o astfel de înregistrare, se salveaz ă conținutul
câmpului BLOB într-un fi șier (cu extensia jpg), și se afișează
practic imaginea stocat ă de acest fi șier. Pentru o nou ă
interogare reu șită, acest fi șier va fi suprascris. În caz de
interogare nereu șită, fișierul intermediar va fi șters (pentru a
nu se afișa ultima imagine g ăsită).
Verificarea g ăsirii unei înregistr ări care corespunde
condiției de interogare, este asigurat ă de func ția:
mysql_num_rows(). Această funcție returneaz ă numărul de
înregistrări găsite/afectate de o comand ă SQL.
Observație: Asupra lucrului cu fi șiere în PHP se va reveni într-
un paragraf ulterior. Num ărul funcțiilor PHP pentru lucrul cu baze de date
MySQL este mult mai mare. Prin exemplele prezentate și prin
funcțiile 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 decât suficiente , în special cele oferite pe
Internet.
3.5 Dezvoltare de aplica ții PHP cu baze de date
Oracle
3.5.1 Interogare f ără parametri
Pentru lucrul cu baze de date Oracle se utilizeaz ă ca
extensie PHP biblioteca php_oci8.dll . Scriptul urm ător
Programare Web
56prezintă o exemplificare a utiliz ării câtorva dintre func țiile
oferite de aceast ă bibliotec ă.
Conectarea la o baz ă de date Oracle se face utilizând
funcția PHP OCILogon. Interogarea unei tabele a unei baze de
date Oracle (mai preci s în exemplu de fa ță, tabela ANGAJATI
având coloanele ID, NUME , SALAR ) se face utilizând func țiile
OCIParse și OCIExecute , fiind apoi extrase și afișate
succesiv pe ecran datele din liniile aceasteia (bucla while cu
OCIFetch ). Apoi, în exemplul prezentat, înregistrarile din
tabela angajati sunt ad ăugate într-o alt ă tabelă evidenta ,
utilizând comanda SQL INSERT , împreun ă cu comenzile
extensie PHP OCIParse și OCIExecute (practic, se face
un transfer al informa țiilor 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 func țiilor 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 afi șarea rezultatelor ob ținute
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");
Programare Web
57 $salar= OCIResult($stmt, "SALAR");
print (" <tr>\n".
" <td>$id</td>\ n".
" <td>$nume</td>\n".
" <td>$salar</td>\n".
" </tr>\n");
/ / Pregătește adăugarea
$stmt1 = OCIParse($connection,"insert into
evidenta values($id,'$nume','$salar')");
// Executa comanda (ad ăugare)
OCIExecute($stmt1);
}
// Elibereaz ă resursele și închide conexiunea
OCIFreeStatement($stmt);
OCIFreeStatement($stmt1);
OCILogoff($connection);
?>
În situatia în care datele ad ăugate sunt și de tip dat ă
calendaristic ă (de asemenea, un tip uzual), se va folosi o
funcție 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 pasa ți prin auto-apelare
Exemplul urm ător, conținând o interogare parametrizat ă,
se caracterizeaza ă prin aceea c ă, atât formularul de furnizare a
parametrilor, cât și partea de preluare a acestora și realizare a
interogării, sunt incluse într-un acela și script (auto-apelare).
Practic, la un prim apel al scriptului se execut ă doar o parte a
acestuia, constând într-un formular ( FORM ) pentru
preluarea/furnizarea unor valori de parametri. Prin ap ăsarea
butonului din formular, se realizeaz ă o auto-apelare a aceluia și
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 cărei
secțiuni pot include atât cod HTML ‘în clar’, cât și cod PHP
încuibat (fi șierul având în mod obligatoriu extensia . php). O
astfel de structur ă are forma urm ătoare:
Programare Web
58<?php
if ( condi ție ) {
?>
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 urm ătorul:
<?php
// Secven ța care se executã la primul apel al scriptului,
// situație î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
}
// Secven ța 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
Programare Web
59$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 f ără parametrii)
În cadrul script-ului de mai sus se putea utiliza, ca și
variantă alternativ ă, o structur ă if-else-end if de forma
următoare, oarecum similar ă cu cea anterioar ă:
Programare Web
60<?php if ( condi ție ): ?>
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 con ține acest cod
(practic un auto-apel cu tran sferul unui parametru, lucru
observabil și în caseta ‘ Address’ a browser-ului – fig. 3.16).
Figura 3.17 prezint ă rezultatul aplica ției (implementat ă în
maniera cu auto-apelare).
Observație: 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, func ția isset() care determin ă
dacă unei variabile i s-a atribu it o valoare (a fost setat ă, deci
există). În caz afirmativ, func ția returneaza valoarea logica
TRUE, altfel returneaz ă valoarea FALSE.
Fig.3.17 Rezultate interogare (auto-apel cu parametri)
Exemplul anterior arat ă că, atât partea de cod specific ă
introducerii de la tastatur ă a parametrilor, cât și cea de preluare
și utilizare a lor în in terogarea SQL efectiv ă, pot coexista în
cadrul unui aceluia și script PHP, acesta practic putându-se
auto-apela în mod repetat, reac ționând de fiecare dat ă în mod
diferit func ție de contextul auto-apelului.
Programare Web
613.6 Grafic ă
PHP-ul dispune un set de func ții extrem de puternice
pentru crearea și manipularea imaginilor, oferind astfel
facilități deosebite și în domeniul graficii.
Realizarea unor aplica ții grafice cu PHP implic ă utilizarea
unor biblioteci suplimentare (fisiere . dll). Astfel, în cazul de
față, a fost necesar ă utilizarea bibliotecii PHP_GD.DLL ,
configurând corespunz ător fi șierul 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 ă, fără a detalia toate cele câteva zeci de
funcții dedicate cre ării și manipul ării imaginilor, se va realiza
o trecere în revist ă a câtorva dintre ele, prin exemplificarea a
două aplicații.
O primă aplicație face apel la câteva func ții privind
crearea/manipularea unei imagini . jpg. Codul complet este
prezentat în continuare, iar efectul rul ării acestui script este
descris în figura 3.18:
<?php
// setare ca fi șier 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 urm ătoare 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,- pozi ția pe orizontal ă
(pixeli), pozi ția
//pe vertical ă (pixeli)
ImageString($im,10,100,35, “A Simple Text
String”, $text_color);
Programare Web
62// Salvare imagine prelucrat ă sau creat ă și afișare
ImageJpeg ($im,”tinta.jpg”);
echo ‘<img src=”tinta.jpg”
>’;
// Creare func ție
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 func ție
LoadJpeg(“leopard.jpg”,”Ceva de afisat”);
?>
Fig. 3.18 Crearea și afișarea a dou ă imagini
Practic, în cadrul exemplului prezentat sunt create și
afișate două imagini, peste fiecare f iind suprascris un text ( șir
de caractere).
Prima imagine este creat ă cu un fundal verde, f ără a porni
de la o surs ă inițială, iar a doua imagine este creat ă pornind de
la un fișier imagine jpeg ca sursă. Ambele imagini astfel create
sunt salvate, iar afi șarea lor se face utilizând eticheta HTML
<img…> . Cea de-a doua imagine a fost creat ă pe baza apelului
unei func ții, necesitând ca parametrii ini țiali fișierul sursă jpeg,
respectiv textul de afi șat.
Programare Web
63O a doua aplica ție, puțin mai complex ă, permite
realizarea graficului scalat al unei func ții 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);
//afișare 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 ini țiale
$x0=1;
$y0=0;
Programare Web
64
// calcul coordonate grafic și afișare grafic
for($x=1;$x<500;$x+=1)
{
// generare num ăr aleator întreg într-un interval prestabilit
$a=rand(-30,30);
// calcularea succesiv ă a coordonatei ‘ y’ a func ției
$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 fi șier și afișare
ImageJpeg ($im,”tinta.jpg”);
echo ‘<img src=”tinta.jpg”
>’;
?>
Fig. 3.19 Graficul unei func ții matematice
Analizând aplica ția, se poate observa parcurgerea urm ătoarelor
etape: – crearea imaginilor și stabilirea culorii fundalului
(ImageCreate, ImageColorAllocate );
– stabilirea culori axelor și a textului
(ImageColorAllocate );
Programare Web
65- afișarea titlului, trasare axe, scriere text pe axe
(ImageString, ImageLine );
– realizarea unor histograme (exemplificative, f ără legătură
cu graficul func ției: ImageFilledRectangle );
– stabilirea culorii graficului ( ImageColorAllocate );
– calculul func ție și afișarea prin linii succesive ( For,
ImageLine );
– salvare și afișare imagine grafic ( ImageJpeg, <img…> ).
Observație: Pentru afi șarea imaginii graficului, f ără o salvare
prealabilă într-un fi șier a acesteia, se poate utiliza în finalul
script-ului o secven ță de genul:
// setarea tipului con ținutului (MIME)
header(“Content-type: image/jpeg”);
// afișare imagine
@ imagejpeg($im);
//caracterul @ care prefixeaz ă o funcție, face ca mesajele de
eroare aferente execu ției acelei func ții să nu fie afi șate de
browser; eventualele mesaje de er oare pot fi consultate prin
analiza con ținutului variabilei globale $php_errormsg .
Exemplele prezentate arat ă că PHP-ul dispune de
puternice facilit ăți grafice, permi țând o manipulare și
prelucrare facil ă a imaginilor, generarea dinamic ă a acestora
precum și salvarea lor în câteva form ate standard consacrate.
REZUMAT
Se face în continuare o trecere în revist ă a funcțiilor grafice
utilizate în exemplele precedente și a altor câteva în plus (în
fața fiecărei funcții este precizat tipul de data/identificator
returnat):
int ImageCreate( ) — creeaz ă o imagine cu dimensiuni
precizate, returnând un identificator de imagine de tip întreg
int ImageCreateFromJpeg( ) — creeaz ă o imagine pornind de
la un fișier de tip JPEG (returneaz ă un identificator întreg în
caz de succes sau 0 în caz de e șec). Pentru alte tipuri de fi șiere
imagine: ImageCreateFromGif( ), ImageCreateFromPng( ).
Programare Web
66 Int ImageColorAllocate( ) — creeaz ă un identificator de
culoare pentru o imagine, pe baz a 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( ) — afișează imaginea desemnat ă printr-un
identificator, sau o salveaz ă într-un fi șier specificat în format
JPEG (idem pentru formatele GIF, PNG).
Int ImageLine( ) — afișează 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.
ÎNTREBĂRI
Scrieți un program pentru afi șarea graficului func ției
y=sin(x), unde x=0…10, cu pasul 0.1.
Care este func ția PHP pentru salvarea unui grafic într-un
fișier? Comenta ți.
Care este deosebirea între func țiile ImageCreate( ) și
ImageCreateFromJpeg( ) ?
Programare Web
67
Care este condi ția de utilizare în PHP a func țiilor de
manipulare a imaginilor?
Ce returneaz ă funcția ImageCreateFromJpeg( ) în caz de
reușită, respectiv e șec? Care ar putea fi cauza e șecului?
3.7 Func ții pentru lucrul cu fi șiere
PHP-ul dispune de un puternic set de func ții dedicat
operațiilor de intrare/ie șire cu fișiere: creare/ ștergere de fi șiere,
citire/scriere/ad ăugare în fi șiere (atât pentru fi șiere în format
text, cât și pentru format binar). Exemplul urm ător,
implementând practic un contor al acceselor realizate de c ătre
clienți la scriptul în cauz ă, încearcă o exemplificare a doar
câteva dintre aceste func ții, considerate ca fiind mai
importante.
<?php
// Declarare nume pentru fi șier
$filename = “counter.nr”;
// Deschidere fi șier doar pentru citire (avertisment, dac ă nu
există)
$fp = fopen($filename,”r”);
// Citire din fi șier (se citesc 26 bytes)- citire contor existent
$hits = fread($fp,26);
// Incrementare contor (cu for țare la tip întreg)
$hits = (int)$hits+1;
// Închidere fi șier
fclose($fp);
// Deschidere fi șier doar pentru scriere
$fp = fopen($filename,”w”);
// Scrie în fi șier (suprascriere) sau fputs($theFile, $hits);
$a=fwrite($fp,$hits,26);
echo “<p> Sunteti vizitatorul cu nr: “;
echo $hits;
?>
Aplicația debuteaz ă prin precizarea unui nume pentru
fișierul (de tip text) care va memo ra contorul de accese (practic
un număr întreg, incrementat dup ă fiecare acces). În exemplul
Programare Web
68de față, numele ales pentru acest fi șier este “ counter.nr ”
($filename=”counter.nr”; ).
În cazul în care localizarea fi șierului nu este implicit ă în
directorul curent, este necesar ă precizarea c ăii complete de
localizare a fi șierului. Spre exemplu:
$filename=”http://localhost/scripts/test/c
ounter.nr;
//sau
$filename =”c:\\text\\counter.nr” ;
Urmează apoi deschiderea pentru citire a acestui fi șier,
utilizând func ția fopen() . Fișierul trebui s ă fie creat anterior,
în caz contrar (adic ă fișierul nu exist ă) operația terminându-se
printr-un avertisment ( warning ). Deja s-a f ăcut apel la o prim ă
funcție de lucru cu fi șiere, cu sintaxa uzual ă:
int fopen (string filename, string mode);
Funcția returneaz ă un identificator de tip întreg. Primul
parametru al func ției este un string reprezentând numele
fișierului care va fi deschis (putând include și calea spre
acesta), iar al doilea parametru reprezint ă modul în care se face
deschiderea fi șierului, putând lua urm ătoarele valori:
Tabel 3.2
”r” deschidere numai pentru citire, pointerul de fi șier fiind
plasat la începutul fi șierului
”r+” deschidere pentru citire și scriere, pointerul de fi șier fiind
plasat la începutul fi șierului
”w” deschidere numai pentru scriere, pointerul de fi șier fiind
plasat la începutul fi șierului, iar con ținutul ini țial al
fișierului este șters; dacă fișierul nu exist ă –este creat ca
fișier nou
”w+” deschidere pentru citire și scriere, pointerul de fi șier fiind
plasat la începutul fi șierului, iar con ținutul ini țial al
fișierului este șters; dacă fișierul nu exist ă, se încearc ă
crearea lui
”a” deschidere numai pentru scriere, pointerul de fi șier fiind
plasat la sfâr șitul fișierului (practic o opera ție de
adăugare); dac ă fișierul nu exist ă, se încearc ă crearea lui
”a+” deschidere pentru citire și scriere, pointerul de fi șier fiind
plasat la sfâr șitul fișierului (practic o opera ție de
adăugare); dac ă fișierul nu exist ă, se încearc ă crearea lui
Acest al doilea parametru poate lua și valoarea “ b”, utilă
în cazul în care se realizeaz ă operații cu fișiere binare. Aceast ă
Programare Web
69valoare se utilizeaz ă în combina ție cu cele precedente. Spre
exemplu, ”wb” semnific ă scriere într-un fi șier în format binar.
În continuarea programului se cite ște contorul existent
într-o variabil ă. Se utilizeaz ă în acest sens func ția fread ( ) cu
sintaxa:
string fread (int fp, int length)
unde primul parametru reprezint ă identificatorul fi șierului din
care se cite ște, iar al doilea parametru -num ărul de bytes citiți.
În cazul de fa ță, numărul 26 s-a ales pur aleator. Se observ ă că
funcția returneaz ă chiar string -ul pe care îl cite ște.
Se realizeaz ă apoi o incrementare a contorului (mai
precis a con ținutului variabilei în care s-a memorat contorul
citit din fi șier). De remarcat modul în care se for țează la tip
întreg conținutul variabilei ( (int)$hits )), operație care
permite startarea procesului de contorizare f ără ca în fișierul
creat să existe o valoare ini țială (zero). Dac ă se dorește o
forțare la tipul float, se utilizeaz ă o construc ție de forma
(float)$variabila .
Urmează închiderea fi șierului: fclose($fp) (acesta
fiind deschis ini țial doar pentru citire). În acest moment se
dispune (într-o variabil ă) de num ărul de acces ări ale paginii
curente. Ceea ce mai r ămâne de f ăcut este o actualizare a
contorului și în fișierul în care acesta este p ăstrat și eventual, o
afișare a acestuia pe ecran. Pe ntru aceasta, este necesar ă o
redeschidere a fi șierului, dar de data asta, pentru o opera ție de
scriere (mai precis, o opera ție de suprascriere):
$fp = fopen($filename,”w”);
Se scrie variabila contor actualizat ă în fișier, utilizând
funcția fwrite() cu sintaxa urm ătoare:
int fwrite (int fp, string string
[,int length])
Primul parametru al func ției reprezint ă identificatorul
fișierului în care se va face sc rierea, al doilea parametru – șirul
de caractere scris, iar ultimul parametru (op țional) num ărul de
bytes scriși (dacă acest num ăr este mai mare decât lungimea
string -ului de scris, scrierea se opre ște când se ajunge la finalul
string -ului). În locul func ției fwrite() se putea folosi
funcția fputs() , cu aceea și parametrii și cu o ac țiune
identică.
Programare Web
70 În finalul scriptului s-a f ăcut și o afișare pe ecran a
numărului de accese la pagina curent ă.
În exemplul prezentat s-a realizat o suprascriere a
conținutului fi șierului la fiecare accesar e a scriptului. Secven ța
următoare prezint ă o operație de adăugare a unui text într-un
fișier, pe un rând nou (simbolul \n ), rândurile fiind separate
între ele printr-o linie liber ă:
// deschidere pentru scriere (ad ăugare)
$fp = fopen($filename1,”a+”);
// adăugare cu câte un rând gol
fwrite($fp,”\Nadaugat\n,20);
3.8 Alte câteva exemple de aplica ții
3.8.1 Informa ții obținute pe baza variabilelor predefinite
de mediu
În exemplul din paragraful anterior s-a realizat o
contorizare a num ărului de accese la o pagin ă Web. O alt ă
informație 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 r ăspunde la aceast ă întrebare și nu numai, s ă
analizăm scriptul prezentat în continuare:
<?php
//obținere informa ții de mediu
$I=getenv(“REMOTE_ADDR”);
$j=getenv(“SERVER_NAME”);
//afișare informa ții de mediu
printf(“ Your IP number is : %s\n”,$I);
printf(“ The server name is : %s\n”,$j);
?>
Funcția 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 urm ătoarea semnifica ție:
REMOTE_ADDR – adresa IP a clientului
SERVER_NAME – numele serverului
Evident, utilizarea func ției getenv ( ) având ca
parametru o variabil ă predefinit ă de mediu, are ca rezultat
Programare Web
71returnarea unui string conținând îns ăși informa ția asociat ă
semnifica ției acelei variabile.
Afișarea rezultatelor pentru exemplul considerat s-a
realizat folosind o func ție de afișare formatat ă: printf() .
În cazul de fa ță %s însemnă că, conținutul variabilei de
afișat 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 – număr în virgul ă flotantă, %b – întreg în
reprezentare binar ă etc.
3.8.2 Trimiterea unui e-mail dintr-un script PHP
Realizarea opera ției de trimitere a unui e-mail utilizând
un script PHP implic ă în primul rând existen ța unei conexiuni
la un server de mail SMTP, urmat ă de o configurare
corespunz ătoare a câtorva op țiuni din fi șierul php.ini .
Presupunând c ă, numele serverului SMTP este
aut.utt.ro , iar adresa de e-ma il a emitentului este
adm@gigi.ro, configurarea fi șierului php.ini implică
următoarele (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 func ției
mail() , așa cum se poate observa și în scriptul urm ător:
<?php
$a=mail(“vcristi@aut.utt.ro”, “Acesta e un
subject!!!”, “Asta este continutul”);
echo $a.”\n”;
//”\n” pune un spatiu; 1- pt. Reu șită, 0 – pt. Nereu șită
?>
În exemplul prezentat, s-a utilizat o form ă sintactic ă
redusă a funcției mail() , având doar 3 argumente de intrare:
adresa destinatarului, subjectul mail-ului, con ținutul propriu-
zis. Funcția returneaz ă ’1’ în caz de reu șită, respectiv ‘ 0’ în caz
de nereușită.
3.8.3 Informa ții asupra datei și timpului curent
Programare Web
72Sunt prezentate câteva func ții utile pentru ob ținerea datei
și timpului curent al sistemului ( time( ), strftime( ), getdate( ))
și de asemenea, pentru formatarea afi șării: strtoupper( ),
strtolower( ) . Codul surs ă al unui exemplu de utilizare este
următorul:
<?php
$date=strftime(“%Y%m%d”,time());
//data curent ă ca string
// funcția strftime( ) converte ște timpul curent într-o dat ă
formatată
echo “timpul ca string: “.time().”<hr>”;
//timp (ca num ăr î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>”;
// funcția strftime( ) converte ște 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>”); // afișare
// funcția strtoupper( ) face con versie la caractere mari
echo “<strong>”.strtoupper($var); // afișare
?>
Figura 3.20 este elocvent ă asupra efectului fiec ărei
funcții utilizate.
Func ția time( ) returneaz ă timpul în secunde, scurs de la
începutul “Epocii Unix” (1 Ian. 1970). Func ția este util ă, prin
utilizarea împreun ă cu alte func ții, pentru determinarea datei
sau timpului curent.
Programare Web
73
Fig.3.20 Rezultate ale inform ării asupra datei și timpului
Func ția strftime( ) formateaz ă timpul/data, conform unui
șablon dat ca argument, retu rnând un string, pe baza
informației furnizate de time( ) .
Func ția getdate( ) returneaz ă un șir cu data sau timpul,
într-o afișare formatat ă.
Func țiile strtoupper( ), strtolower( ) realizeaz ă o
conversie a unui șir de caractere (furnizat ca argument) la
caractere mari, respectiv mici.
3.8.4 Transfer de fi șiere prin UPLOAD
PHP este capabil s ă recepționeze fișiere asupra c ărora s-a
realizat o opera ție de upload de c ătre un browser client (minim
Netscape 3, Explorer 3). Aceast ă caracteristic ă permite
clienților să realizeze upload -uri asupra fi șierelor text sau
binare.
Upload este opera ția inversă a download-ului. Dac ă prin
download se pot desc ărca (transfera) fi șiere de pe server pe un
host client, prin upload se poate realiza un transfer în sens
invers: de pe un computer clie nt pe hostul server (cu condi ția
ca drepturile de scriere pe server sa permit ă acest lucru.
Un ecran pentru realizarea unui upload de fi șier, poate fi
realizat printr-un FORM special cu structura urm ătoare (spre
exemplu):
<FORM ENCTYPE=”multipart/form-data”
ACTION=”upload.php” METHOD=”POST”>
<INPUT TYPE=”hidden” name=”MAX_FILE_SIZE”
value=”1000000”>
Programare Web
74Send 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 setările
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.
Următoarele nume de variabile sunt definite și se
presupun a fi utilizate în leg ătură directă cu numele ‘userfile’
al fișierului de upload -uit din exemplul ini țiat:
-$userfile – numele fi șierului temporar în care fi șierul de
transferat este stocat pe server (acela și cu cel al casetei INPUT
de tip FILE) -$userfile_name – numele original, inclusiv calea spre fi șierul
de pe sistemul transmi țător
-$userfile_size – dimensiunea fi șierului de transferat în bytes
-$userfile_type – t i p u l M I M E a l f i șierului, dac ă browserul
oferă această informație (spre exemplu “image/gif”).
Fig. 3.21 Formular FORM pentru upload
În acest caz (legat direct de exemplul dat), con ținutul
variabilei sistem $HTTP_POST_FILES este următorul:
$HTTP_POST_FILES[‘userfile’][‘name’] – numele
original al fi șierului pe ma șina client
Programare Web
75$HTTP_POST_FILES[‘userfile’][‘type’] – tipul
(MIME) al fi șierului
$HTTP_POST_FILES[‘userfile’][‘size’] –
dimensiunea fi șierului upload în bytes
$HTTP_POST_FILES[‘userfile’][‘tmp_name’] –
numele temporar al fi șierului în care este transferat și stocat pe
server
Fișierele sunt stocate implicit în directorul temporar
implicit al serverului (dac ă nu este precizat un alt director
temporar al PHP-ului, prin fi șierul de configurare php.ini ).
Iată un exemplu concret (în dou ă variante):
– prima variant ă:
<?php
// verificarea opera ție 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 “opera ție eșuata”;
}
?>
– 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 ă, funcția is_uploaded_file() cu
sintaxa:
bool is_uploaded_file (string filename)
Programare Web
76returnează TRUE dac ă fișierul filename a fost transferat printr-
o operație validă de upload via HTTP POST.
Func ția COPY realizeaz ă un transfer al fi șierului
temporar upload -uit la o loca ție dorită.
În a doua variant ă, funcția move_uploaded_file()
cu sintaxa:
bool move_uploaded_file (string filename,
string destination)
înglobeaz ă ambele opera ții executate în varianta unu, f ăcând și
verificarea anterior men ționată, și transferul la o loca ție dorită.
Dacă verificarea de upload nu este valid ă (FALSE), nici o
acțiune 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 spa ții). În cadrul con ținutului unui
asemenea parametru, utilizând urlencode , spațiile vor fi
inlocuite cu semnul +, specific construc ției unui șir URL
(Uniform Resource Locator ).
Spre exemplificare, fie scriptul urm ător 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 apăsare a butonului
SUBMIT ), din linia de comanda a browser-ului, cu un
parametru de forma unui string fo rmat 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 transmis a spre prima caseta de tip input , în
Programare Web
77timp ce a doua caset ă conține șirul întreg (cu semnul + între
cuvintele distincte)
Fig. 3.22 Transfer parametri
O afișare 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 următorul 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) ini țial și preluarea con ținutului
exact al parametrului astfel transmis.
3.8.6 Variabile cu nume construite dinamic
Variabilele cu nume constru ite dinamic sunt utile în
special în cazul în care este necesar ă utilizarea unui numar
mare, variabil, necunoscut apriori, de variabile, ca solu ție
alternativ ă la utilizarea șirurilor.
Programare Web
78 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 Instruc ția empty și eticheta checkbox
Eticheta checkbox permite selectarea (bifarea) sau nu a
unei anumite casete de selec ție (careia i se ata șează 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 urm ător
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>";
?>
Observație: 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)
Programare Web
79
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 întâmpl ă în
caz de neselectare a cas etei? Scriptul urm ător arată modul în
care poate fi interpretat rezultatul ac țiunii asupra unei casete
checkbox (selecție sau neselectie). În script apare instruc ția
empty care permite o verificare practic a select ării sau nu a
casetei de tip checkbox . Comanda empty verifică dacă o
variabilă este setat ă (deci exist ă), iar func ție de aceast ă
verificare, se poate afla dac ă respectiva caset ă de selecție a fost
bifată sau nu.
<?php
echo $check;
if (empty($check))
echo "Variabila nu este setata <br>"; //
No Warning
?>
REZUMAT
Funcții uzuale pentru lucrul cu fi șiere:
int fopen (string filename, string mode) –
deschidere fi șier
string fread (int fp, int length) – citire dintr-
un fișier
int fwrite (int fp, string string [,int
length]) –scriere într-un fi șier.
Funcția getenv cu sintaxa:
string getenv (string varname)
permite ob ținerea de informa ții pe baza variabilelor de mediu
predefinite.
Programare Web
80
Pentru afi șarea formatat ă a unei informa ții: printf() .
Trimiterea unui e-mail implic ă utilizarea func ției mail() cu
sintaxa minimal ă:
bool mail (string adresa_destinatar,
string subject, string message)
Cu ajutorul func țiilor time( ), strftime( ),
getdate( ) se pot obtine informa ții asupra date și orei
curente.
Printr-un download se pot desc ărca (transfera) fi șiere 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 func țiilor
is_uploaded_file() și copy(), sau
move_uploaded_file. Transferul se realizeaz ă pe baza
variabilei sistem $HTTP_POST_FILES .
ÎNTREBĂRI
Să se scrie o aplica ție care s ă preia o informa ție (text)
introdusă pe baza unui formular de la tastatur ă și o
memoreaz ă într-un fi șier (adăugând-o la con ținutul acestuia).
Să se scrie un script PHP ca re permite salvarea automat ă
într-un fi șier a adreselor de IP ale tuturor clien ților care
accesează pagina.
Dezvolta ți aplicația anterioar ă astfel încât, 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 opera ții upload în cazul în care, atât
clientul cât și serverul, sunt g ăzduite de un acela și calculator
(cu platform ă Windows)?
3.9 Lucrul cu sesiuni ( session )
Programare Web
81Crearea unei sesiuni (‘sesiune client’ în componenta de
față) este asigurat ă de către limbajul PHP prin utilizarea în
cadrul unui script a unui a șa 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 ă întrebări esențiale, la care se va încerca un
răspuns în continuare. În momentul execut ării liniei de cod
session_register("global"), interpretorul PHP
starteaza o sesiune de lucru valabil ă pentru clientul Web
curent, atât timp cât acesta nu inchide browser-ul din care a
apelat respectivul script con ținând aceastî linie de cod (sau
dacă setarile interpretoru lui PHP privind o anumit ă durată de
viață pentru o sesiune de lucru, atâta timp cât este prevazut ă
această durată de viață). Fizic, startarea unei sesiuni însemn ă
crearea unui fi șier sesiune (implicit în directorul
PHP\SESSIONDATA sau WAMP\TM P), 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 c ărei/cărui valori (initializate
prin comenzi PHP uzuale) sunt vizibile și deci apelabile /
utilizabile în orice alt script re ferit de browse r pe parcursul
sesiunii de lucru. Cu alte cuvinte, con ținutul acestei variabile
(de regulă șir sau tablou monodimensional sau bidimensional)
devine public pentru orice script apelat pe parcursul duratei de
viață a sesiunii, cu condi ția ca fiecare un astfel de script sa
contina, obligatoriu la inceput ul 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 browse r-ului, datele din
fișierul sesiune ramân stocate în acesta, iar o încheiere prin cod
program a sesiunii conduce la ștergerea fi șierul sesiune.
Exemplu: Fie următoarele dou ă fișiere script PHP, prezentate
în tabelul 3.3. Primul script starteaz ă o sesiune, creându-se un
fisier sesiune cu numele speci ficat, 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 an terior): numele variabilei ( var),
Programare Web
82tipul 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 fi șier sesiune:
sess_1b308801f20323d7713880f389f2489e
Conținutul fișierului sesiune:
var|s:4:"ceva";
La finalul scriptului b.php sesiunea este distrus ă,
fișierul 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 aplica tie unitara (in diverse scopuri
particularizate la specificul ap licatiei) constituie principalul
beneficiu conferit de lucrul cu sesiuni.
Observatie : Transferul de parametrii de la un script spre altul,
în vederea asigur ării disponibilit ății acelor parametrii în mai
multe pagini Web, se poate realiza și utilizind casete de tip
INPUT cu atributul type= ’hidden’ . Metoda este eficient ă
atunci când trebuie transferat un num ăr fix, redus, de
parametrii, dar devine greoaie atunci când num ărul
parametrilor de transferat cre ște.
O alt ă tehnică de lucru cu sesiuni, car e se poate folosi în
versiunile mai noi de PHP (ulte rioare versiunii 4.0), implic ă
utilizarea unor variabile de tip $_SESSION[] . Un posibil
scenariu de folosire a acestei tehnici presupune urm ătoarele:
Programare Web
83- pentru deschiderea unei noi sesiuni PHP, scriptul
trebuie s ă înceap ă cu apelarea functiei
session_start() . Aceasta func ție verific ă, mai întâi,
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 func ția încarc ă
variabilele de sesiune înregi strate pe server, ele fiind
astfel gata de utilizare. Atunci când se lucreaz ă cu
sesiuni, trebuie apelat ă aceasta func ție la inceputul
tuturor scripturilor care folosesc sesiunea în cauz ă.
– variabilele de sesiune s unt 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
până la ștergerea lor voluntar ă sau până 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 urm ător:
if(isset ( $_SESSION[’variabila_noua’]))… În
funcție de valoarea logic ă a condiției scrise cu
funcția isset() , execuția programului urmeaz ă o
cale sau alt ă.
Pentru exemplificare, se prezint ă o rescriere a
scripturilor anterioare, utilizând 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
Programare Web
84Programarea orientata pe obiecte (OOP –Object Oriented
Programming) a ap ărut ca o necesitate în contextul creșterii
complexit ății codului aplicațiilor software. Pentru aplica țiile
de mari dimensiuni, o dezvoltare structurat ă a codului
(orientată pe funcții/proceduri) implicând existen ța unui num ăr
foarte mare de linii de cod (uneori puternic redundant ), prin
modul de organizare a codului conduce la o lizibilitate
scăzuta a acestuia și implicit, la mari dificultăți privind
realizarea unor modificări ulterioare în cadrul aplica ției.
OOP ofer ă o modalitate diferit ă de organizare a codului
și a datelor în cadrul unui program.
Din acest punct de vedere, elem entele constructive de cod
specifice OOP sunt clasa , respectiv obiectul . Clasa reprezint ă
definiția unui obiect (“planul obiectului”). Prin instanțierea
unei clase este creat un obiect (evident se pot face instan țieri
multiple, construindu-se mai multe obiecte ale aceleia și clase).
În cadrul clasei (defini ția obiectului) sunt precizate
– atribute sau proprietăți – (practic partea de date a
obiectului) reprezentate prin declaratii de variabile,
inclusiv posibile initializari ale acestora;
– metode – (partea de cod a obiectului) reprezentate prin
funcții (sau proceduri) constituind totodat ă și interfața
obiectului destinata manipul ării datelor acestuia.
OOP este fundamentat ă pe 3 principii de baz ă:
– încapsulare – fiecare obiect este de sine st ătător și
complet autonom (con ținând atât date -propriet ăți-, cât
și cod –metode). Un obiect are o interfa ța clară, bine
definită, folosită pentru a manipula obiectul;
– moștenire;
– polimorfism.
Asupra ultimelor dou ă se va reveni în contextul
programării în PHP (existând câteva particularit ăți specifice
acestuia). Particularizat la PHP, în continuare sunt tratate
următoarele aspecte:
– Crearea unei clase (propriet ăți, metode)
– Crearea unui obiect (instan țierea clasei)
– Utilizarea propriet ăților obiectului
– Apelul metodelor obiectului
– Moștenirea
– Polimorfismul
În limbajul PHP, crearea unei clase se face utilizând
instrucțiunea class . O definire minimala a unei clase, este
prezentata mai jos:
Programare Web
85class denumire_clasa {
}
În vederea atribuirii unei func ționalități clasei. este
necesară definirea unor propriet ăți și metode. Propriet ățile se
creează prin declararea unor variabilelor la începutul defini ției
unei clase folosind instruc țiunea var. Următoarea secven ță
PHP creeaz ă o clasă denumit ă Clasa1 având dou ă atribute
(proprietăți): $message, $data (ultimul fiind și inițializat).
class Clasa1 {
var $message;
var $data=“initializat”;
}
Metodele se creeaz ă prin declararea unor func ții PHP în
definiția clasei. Codul urm ător va crea (pentru clasa Clasa1 )
doua metode:
– metoda setMessage , având un parametru de intrare
($param ) și permițând o setare a valorii propriet ății
$message . De remarcat c ă, în cadrul defini ției clasei,
referirea unei propriet ăți a acesteia se face folosind
operatorul $this care precede numele propriet ății (nume
utilizat fără $ în față). În cazul de fata: $this->message .
– metoda getMessage , fără parametrii de intrare, care
afișează un mesaj, respectiv returneaz ă valoarea
proprietății $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
?>
Programare Web
86Evident s-a inclus codul în tag-urile de delimitare
specifice PHP. Dup ă ce a fost creata clasa, în continuare se
prezintă modul de instan țiere a clasei în vederea cre ării unui
obiect, precum și modul de setare a propriet ăților acestuia și de
apel al metodelor (p rin completarea secven ței anterioare, dup ă
încheierea defini ției clasei):
$Obiect1 =new Clasa1();
$Obiect1->setMessage("Setar ea 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 rul ării scriptului este urm ătorul:
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 declar ării unei clase, este necesara crearea un
obiect cu care acesta sa opereze. Opera ția este denumita
instanțierea unei clase sau crearea unei instan țe. In limbajul
PHP pentru aceasta opera ție, se utilizeaz ă instrucțiunea,
cuvântul cheie new.
– Deci prima linie din secven ța de cod anterioara creeaz ă
un nou obiect Obiect1 prin instan țierea clasei Clasa1 .
– În continuarea se face un apel al metodei setMessage
($Obiect1->setMessage) pasându- i un parametru, metoda care
permite setarea propriet ății message . Linia urm ătoare apeleaz ă
metoda getMessage (fără parametrii), care afi șează un mesaj și
returnează o valoare (a propriet ății message , afișată pe ecran
folosind echo ).
Programare Web
87- Valoarea returnat ă putea fi evident memorat ă într-o
variabilă ($var în cazul de fa ță).
– În acest caz, setarea propriet ății message a fost
realizată prin apelul unei metode. Setarea unei propriet ăți a
unui obiect se poate face și prin atribuirea direct ă a unei valori
către proprietatea referit ă ($Obiect1->message="Setare directa
a proprietatii”) sau chiar printr-o ini țializare în defini ția clasei
(vezi proprietatea $data ). Toate comenzile de afi șare (echo ) au
fost utilizate doar pentru a eviden ția modul de referire a
atributelor/metodelor obiectului.
Observație: În cazul limbajul PHP nu se limiteaz ă accesul la
proprietăți. Implicit toate propriet ățile sunt de tip public ,
neputând fi declarate private sau protected. Orice proprietate
declarată în defini ția clasei poate fi referit ă în exteriorul ei
printr-o construc ție de tipul:
$Obiect->nume_proprietate;
O metodă specială a unei clase este a șa numita metoda
constructor . O metoda constructor are acela și nume cu al
clasei, fiind apelata automat la crearea unui obiect (realizând
operații de ini țializare, crearea de alte obiecte necesare
obiectului în cauza etc.). Un cons tructor se declara similar cu
celelalte metode, singura de osebire fiind ca are acela și nume
ca și clasa. In PHP definirea une i metode constructor nu este
obligatorie. Clasa anterior creat a nu avea definit un constructor
(unele propriet ăți fiind îns ă inițializare direct odat ă cu
declararea lor).
Pentru exemplificare, se va crea un constructor pentru
Clasa1 , care va afi șa un mesaj și va inițializa proprietatea
$message. Defini ția anterioara a clasei se va completa cu înc ă
o metodă (având acela și 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
Programare Web
88Pentru ca o clasa deja creat ă să poate fi instan țiată în
mai multe scripturi PHP, f ără a se face o replicare (copiere) a
codului clasei în fiecare script, de regul ă definițiile claselor
sunt păstrate în fi șiere distincte de cel e în care sunt create
obiectele. Pentru cazul de fata , spre exemplu, intr-un fi șier
clase.php este salvat ă definiția clasei, în timp ce într-un alt
fișier PHP ( obiect.php spre exemplu) se face instan țierea clasei
(și utilizarea obiectului):
<?php
// fișier obiect.php
include("clase.php");
$Obiect1 =new Clasa1();
echo $Obiect1->data;
?>
Evident fi șierul clase.php poate con ține defini țiile mai
multor clase.
O caracteristic ă important ă a OOP o reprezint ă
moștenirea care permite crearea unei rela ții ierarhice între
clase, folosind subclase . O subclasa, practic mo ștenește
proprietățile și metodele unei superc lase. Prin intermediul
moștenirii, pe lâng ă elementele mo ștenite (propriet ăți și
metode), în cadrul noii clase se pot construi și adăuga noi
elemente (propriet ăți sau metode). Astfel, pornind de la clase
de baza simple se pot deriva clase mai complexe și mai
specializate pentru o anumit ă aplicație. Utilizarea mo ștenirii
crește gradul de reutilizare și lizibililtate al codului surs ă,
avantaj important al OOP (reducându-se substan țial munca
programatorului în cazul în care acelea și metode pot fi scrise
doar o singura data într-o superclas ă, în loc sa fie scrise de mai
multe ori în subclase sepa rate). Pe baza superclasei Clasa1 (in
același fișier script), se construie ște prin derivarea acesteia o
noua subclasa Clasa2 (utilizând cuvântul cheie extends ), care
moștenește toate propriet ățile și metodele superclasei, dar în
același timp are și alte noi propriet ăți și metode:
class Clasa2 extends Clasa1
{
var $message2="gama";
function getMessage()
{
echo "mesajul nou pentru obiectul 2 este<br>";
return $this->message2;
}
Programare Web
89
function plus()
{
echo "<br>ceva nou<br>";
}
}
De remarcat c ă, în cadrul subclasei Clasa2 se define ște o
metoda având un nume similar cu al unei metode din superclasa ( getMessage ), realizându-se în cadrul subclasei o
suprascriere a metodei mo ștenite, precum și o noua metoda
(plus). De asemenea noua clasa are și o proprietate în plus
($message1 ).
O secven ță de instan țiere și utilizare a obiectelor
subclasei:
$Obiect2 =new Clasa2();
$Obiect2->plus();
$Obiect2->setMessage("beta");
echo $Obiect2->message."<br>";
echo $Obiect2->getMessage(); are rezultatul urm ător:
Obiect creat
ceva nou beta mesajul nou pentru obiectul 2 este gama
Crearea obiectului prin instan țierea subclasei Clasa2
conduce și la mo ștenirea constructorului corespunz ător
(afișându-se Obiect creat ). Apelul metodei plus conduce la
afișarea mesajului ceva nou . Apelul metodei mo ștenite
setMessage permite setarea propriet ății moștenite message .
Apelul metodei suprascrise getMessage (plasat într-un echo ),
conduce la afi șarea ultimelor dou ă rânduri.
Observație: Mecanismul de mo ștenire func ționează într-un
singur sens, subclasa (copil) mo ștenește de la superclasa
(părinte). Orice modificare a clasei p ărinte este automat
preluată și de clasa copil.
O altă caracteristic ă important ă a OOP o reprezint ă
polimorfismul , prin intermediul c ăruia clase diferite pot
conține metode cu acela și nume, dar cu comportamente
diferite. Chiar în exemplul cu mo ștenire, superclasa respectiv
subclasa con țin metode cu acela și nume ( getMessage ) dar
Programare Web
90funcționalități diferite. Se consider ă încă un exemplu, în
același script cu defini ția clasei Clasa1 , fie defini ția unei clase
Clasa3 :
class Clasa3 {
var $message;
function setMessage($param)
{
$this->message = $param;
echo "Clasa 3";
return $this->message;
}
}
La o instan țiere a claselor și folosire a obiectelor create:
$Obiect1 =new Clasa1();
$Obiect3 =new Clasa3();
$Obiect1->setMessage("Setar ea 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
Observație: În PHP 4 nu este permis ă supraînc ărcarea
metodelor (supraînc ărcare – overload – o aceeași metodă având
în cadrul acelea și clase defini ții multiple, fiecare cu un num ăr
diferit de parametrii de intr are). În PHP 5 este introdus ă
experimental o func ție overload () pentru a putea beneficia de
acest avantaj.
REZUMAT
În limbajul PHP, crearea unei clase se face utilizând
instrucțiunea class. O definire minimala a unei clase, este
prezentata mai jos:
class denumire_clasa {
}
Programare Web
91Orice proprietate declarat ă în definiția clasei poate fi referita
în exteriorul ei printr-o construc ție de tipul:
$Obiect->nume_proprietate;
Instanțierea unei clase în vederea cre ării unui obiect:
$Obiect1 =new Clasa1();
ÎNTREBĂRI
Să se scrie o aplica ție PHP în care se creeze o clas ă care
permite conectarea la o anumit ă bază de date MySQL,
permițând precizarea (prin setare unor propriet ăți) a locației
serverului, user-ului, parolei și numelui bazei de date. Da ți un
exemplu de instan țiere a ei (crearea unui obiect) și utilizare
într-o aplica ție cu o tabel ă MySQL.
Programare Web
92
BIBLIOGRAFIE
1. Stig Sæther Bakke, Alex ander Aulbach s.a. – “PHP
Manual”, Copyright 2001, PHP Documentation Group
(http://www.php.net/docs.php) 2. Peter Belesis, Arman Dane sh 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 -"Pr ogramarea 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)
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: CAP. III PROGRAMARE WEB UTILIZÂND LIMBAJUL PHP …………………………………………………..2 3.1 Limbajul PHP – preliminarii… [631527] (ID: 631527)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
